노드포트 서비스는 포트를 중복 사용 할 수 없기때문에 1개의 노드포트에 1개의 디플로이먼트만 적용이 가능합니다. 만약 여러개의 디플로이먼트를 사용하게된다면 그만큼 노드포트 서비스를 실행시켜야하고, 이러한 방법은 자원의 낭비입니다. 때문에 쿠버네티스에서는 인그레스를 사용합니다.
인그레스
인그레스는 고유한 주소를 제공하여 사용 목적에 따라 다른 응답을 제공하고 L4/L7 로드밸런서와 보안인증서를 처리하는 기능을 제공합니다.
인그레스를 사용하려면 인그레스 컨트롤러가 필요합니다. 본 문서에서는 쿠버네티스에서 지원하는 NGINX 인그레스 컨트롤러를 구성해보도록 하겠습니다.
NGINX 인그레스 컨트롤러
NginX인그레스 컨트롤러는 다음 단계로 작동하게 됩니다.
- 유저는 노드마다 설정된 노드포트를 통하여 노드포트 서비스로 접속합니다.
- 노드포트 서비스는 NginX 인그레스 컨트롤러로 구성합니다.
- NginX 인그레스 컨트롤러는 사용자의 접속 경로에 따라 적합한 클러스터 IP서비스로 경로를 제공합니다.
- 클러스터 IP서비스는 사용자를 해당 파드로 연결해줍니다.
테스트용 디플로이먼트 2개를 배포하도록 하겠습니다.
ubuntu@master001:~$ k create deployment in-hname-pod --image=sysnet4admin/echo-hname
deployment.apps/in-hname-pod created
ubuntu@master001:~$ k create deployment in-ip-pod --image=sysnet4admin/echo-ip
deployment.apps/in-ip-pod created
ubuntu@master001:~$ k get pods
NAME READY STATUS RESTARTS AGE
in-hname-pod-569d4fb498-6hz44 1/1 Running 0 32s
in-ip-pod-7d9bfddc4d-48fm6 1/1 Running 0 10s
ubuntu@master001:~$
NginX 인그레스 컨트롤러를 설치하도록 하겠습니다. 오브젝트 스펙은 다음과 같습니다.
ubuntu@master001:~$ k apply -f ingress-nginx.yaml
namespace/ingress-nginx created
configmap/nginx-configuration created
configmap/tcp-services created
configmap/udp-services created
serviceaccount/nginx-ingress-serviceaccount created
clusterrole.rbac.authorization.k8s.io/nginx-ingress-clusterrole created
role.rbac.authorization.k8s.io/nginx-ingress-role created
rolebinding.rbac.authorization.k8s.io/nginx-ingress-role-nisa-binding created
clusterrolebinding.rbac.authorization.k8s.io/nginx-ingress-clusterrole-nisa-binding created
deployment.apps/nginx-ingress-controller created
limitrange/ingress-nginx configured
ubuntu@master001:~$
인그레스 컨트롤러의 파드가 배포되었는지 확인해보겠습니다. nginx 인그레스 컨트롤러는 default 네임스페이스가 아닌 ingress-nginx 네임스페이스에 속하기때문에 -n 옵션을 지정해주어야합니다.
ubuntu@master001:~$ helm repo add bitnami <https://charts.bitnami.com/bitnami>
"bitnami" has been added to your repositories
ubuntu@master001:~$ helm install nginx-ingress-controller bitnami/nginx-ingress-controller
NAME: nginx-ingress-controller
LAST DEPLOYED: Mon Aug 21 07:55:14 2023
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: nginx-ingress-controller
CHART VERSION: 9.7.9
APP VERSION: 1.8.1
** Please be patient while the chart is being deployed **
The nginx-ingress controller has been installed.
Get the application URL by running these commands:
NOTE: It may take a few minutes for the LoadBalancer IP to be available.
You can watch its status by running 'kubectl get --namespace default svc -w nginx-ingress-controller'
export SERVICE_IP=$(kubectl get svc --namespace default nginx-ingress-controller -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
echo "Visit {SERVICE_IP} to access your application via HTTP."
echo "Visit {SERVICE_IP} to access your application via HTTPS."
An example Ingress that makes use of the controller:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example
namespace: default
spec:
ingressClassName: nginx
rules:
- host: www.example.com
http:
paths:
- backend:
service:
name: example-service
port:
number: 80
path: /
pathType: Prefix
# This section is only required if TLS is to be enabled for the Ingress
tls:
- hosts:
- www.example.com
secretName: example-tls
If TLS is enabled for the Ingress, a Secret containing the certificate and key must also be provided:
apiVersion: v1
kind: Secret
metadata:
name: example-tls
namespace: default
data:
tls.crt:
tls.key:
type: kubernetes.io/tls
ubuntu@master001:~$
이번에는 인그레스의 경로와 작동을 정의해보도록 하겠습니다. 정의는 다음과 같습니다.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-nginx
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: hname-svc-default
port:
number: 80
- path: /ip
pathType: Prefix
backend:
service:
name: ip-svc
port:
number: 80
- path: /your-directory
pathType: Prefix
backend:
service:
name: your-svc
port:
number: 80
인그레스설정이 제대로 등록되었는지 확인하겠습니다.
ubuntu@master001:~$ k get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
ingress-nginx <none> * 80 34s
아웃풋으로 yaml 을 지정하면, 적용된 내용을 출력해 확인 할 수 있습니다.
ubuntu@master001:~$ k get ingress -o yaml
apiVersion: v1
items:
- apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"networking.k8s.io/v1","kind":"Ingress","metadata":{"annotations":{"nginx.ingress.kubernetes.io/rewrite-target":"/"},"name":"ingress-nginx","namespace":"default"},"spec":{"rules":[{"http":{"paths":[{"backend":{"service":{"name":"hname-svc-default","port":{"number":80}}},"path":"/","pathType":"Prefix"},{"backend":{"service":{"name":"ip-svc","port":{"number":80}}},"path":"/ip","pathType":"Prefix"},{"backend":{"service":{"name":"your-svc","port":{"number":80}}},"path":"/your-directory","pathType":"Prefix"}]}}]}}
nginx.ingress.kubernetes.io/rewrite-target: /
creationTimestamp: "2023-09-11T01:06:29Z"
generation: 1
name: ingress-nginx
namespace: default
resourceVersion: "5562128"
uid: a33495e9-1216-43a3-aedc-e994ec766dc4
spec:
rules:
- http:
paths:
- backend:
service:
name: hname-svc-default
port:
number: 80
path: /
pathType: Prefix
- backend:
service:
name: ip-svc
port:
number: 80
path: /ip
pathType: Prefix
- backend:
service:
name: your-svc
port:
number: 80
path: /your-directory
pathType: Prefix
status:
loadBalancer: {}
kind: List
metadata:
resourceVersion: ""
nginx인그레스 컨트롤러와 인그레스를 설정했으므로, 이제 외부에서 nginx컨트롤러에 접속할 수 있도록 노드포트 서비스를 사용하여 nginx컨트롤러를 외부에 노출합니다.
apiVersion: v1
kind: Service
metadata:
name: nginx-ingress-controller
spec:
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
nodePort: 30100
- name: https
protocol: TCP
port: 443
targetPort: 443
nodePort: 30101
selector:
app.kubernetes.io/name: ingress-nginx
type: NodePort
ubuntu@master001:~$ k apply -f ingress.yaml
service/nginx-ingress-controller created
expose명령을 사용하여 디플로이먼트 또한 서비스로 노출하겠습니다.
'Kubernetes' 카테고리의 다른 글
K8s from scratch - 5. 외부와의 연결담당 (서비스) (0) | 2023.10.25 |
---|---|
K8s from scratch - 4. 노드 유지관리 및 보수 (0) | 2023.10.25 |
K8s from scratch - 3. 파드 생성 및 삭제, Self-Healing (0) | 2023.10.25 |
K8s from scratch - 2. 쿠버네티스 구성 요소 (0) | 2023.10.25 |
K8s from scratch - 1. AWS 에서 쿠버네티스 환경 구축하기 (0) | 2023.10.25 |