4.1.1 NGINX Ingress Controller 설치하기
OKE에서 Kubernetes에서 사용가능한 여러가지 오픈 소스 ingress controller를 사용할 수 있습니다. 본 문서에서는 그중에서 가장 많이 사용되며, OKE 문서에서 예제로 설명하고 있는 nginx-ingress-controller를 테스트 해보겠습니다.
공식 문서
설치 버전
2023년 6월 기준, OKE는 Kubernetes 1.24, 1.25, 1.26 버전을 지원합니다.
2023년 6월 기준, NGINX Ingress Controller의 지원 버전
- https://github.com/kubernetes/ingress-nginx#support-versions-table
Ingress-NGINX version k8s supported version Alpine Version Nginx Version v1.8.0 1.27,1.26, 1.25, 1.24 3.18.0 1.21.6 v1.7.1 1.27,1.26, 1.25, 1.24 3.17.2 1.21.6 v1.7.0 1.26, 1.25, 1.24 3.17.2 1.21.6 v1.6.4 1.26, 1.25, 1.24, 1.23 3.17.0 1.21.6
- https://github.com/kubernetes/ingress-nginx#support-versions-table
Kubernetes 1.24, 1.25, 1.26 모두를 지원하는 버전 중 가장 최신 버전인 v1.8.0로 설치하겠습니다.
NGINX Ingress Controller 설치
kubectl 사용이 가능한 Cloud Shell 또는 작업환경에 접속합니다.
nginx ingress controller 설치할 파일 deploy.yaml을 다운로드 받습니다.
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.0/deploy/static/provider/cloud/deploy.yaml
ingress-nginx-controller의 Load Balancer Service 유형에 대한 설정을 annotation으로 추가합니다.
metadata 하위에 Load balancer를 위한 annotations 들을 추가합니다.
--- apiVersion: v1 kind: Service metadata: labels: ... name: ingress-nginx-controller namespace: ingress-nginx annotations: service.beta.kubernetes.io/oci-load-balancer-shape: "flexible" service.beta.kubernetes.io/oci-load-balancer-shape-flex-min: "10" service.beta.kubernetes.io/oci-load-balancer-shape-flex-max: "10" spec: loadBalancerIP: 152.69.xxx.xxx ... type: LoadBalancer
설정값 설명
항목 값 설명 service.beta.kubernetes.io/oci-load-balancer-shape
"flexible"
Default: "100Mbps"
flexible 유형을 선택service.beta.kubernetes.io/oci-load-balancer-shape-flex-min
"10"
flexible 유형인 경우 최소 용량 지정 service.beta.kubernetes.io/oci-load-balancer-shape-flex-max
"10"
flexible 유형인 경우 최대 용량 지정 loadBalancerIP: Reserved Public IP를 사전에 만들어 가지고 있는 경우, 해당 IP를 직접 입력하여, 원하는 IP를 부여합니다.
다음 명령으로 NGINX Ingress Controller를 설치합니다.
kubectl apply -f deploy.yaml
설치 확인
ingress-nginx namespace에 아래와 같이 설치된 것을 확인할 수 있습니다.
$ kubectl get all -n ingress-nginx NAME READY STATUS RESTARTS AGE pod/ingress-nginx-admission-create-5prnf 0/1 Completed 0 49s pod/ingress-nginx-admission-patch-cz55s 0/1 Completed 0 48s pod/ingress-nginx-controller-7d98bbddbd-chlvn 1/1 Running 0 50s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/ingress-nginx-controller LoadBalancer 10.96.29.183 152.xx.xxx.xxx 80:30456/TCP,443:31096/TCP 51s service/ingress-nginx-controller-admission ClusterIP 10.96.71.153 <none> 443/TCP 50s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/ingress-nginx-controller 1/1 1 1 51s NAME DESIRED CURRENT READY AGE replicaset.apps/ingress-nginx-controller-7d98bbddbd 1 1 1 51s NAME COMPLETIONS DURATION AGE job.batch/ingress-nginx-admission-create 1/1 10s 51s job.batch/ingress-nginx-admission-patch 1/1 13s 50s
Load Balancer IP 확인
Ingress Controller 서비스의 로드밸런서 IP인 EXTERNAL-IP를 확인합니다.
$ kubectl get svc -n ingress-nginx NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ingress-nginx-controller LoadBalancer 10.96.29.183 152.xx.xxx.xxx 80:30456/TCP,443:31096/TCP 111s ...
Load Balancer 자원 확인
아래 내용은 Nginx Ingress Controller 설정변경으로, Worker Node가 둘 이상인 경우, 배포가 성공한 경우에도 OCI 콘솔상에서 Load Balancer의 Health 상태가 Critical로 표시되는 것을 설명하기 위한 내용으로 참고사항입니다.
Load Balancer의 UID를 확인합니다.
$ kubectl get svc ingress-nginx-controller -o jsonpath='{.metadata.uid}{"\n"}' 07f0c122-6f5c-4f68-839f-df63af59f2f0
OCI 콘솔에 로그하여, Load Balancer 화면으로 이동합니다.
목록중에서 확인한 UID가 이름으로 생성된 Load Balancer가 보일 것입니다. 고정 IP를 할당한 경우, 해당 IP로 찾아도 됩니다.
해당 Load Balancer를 클릭하여 상세화면으로 이동합니다.
왼쪽 아래 Resource > Backend sets 메뉴로 이동합니다.
Backend sets의 상태 또한 Critical 인 걸 볼 수 있습니다.
Backend set 중 하나를 클릭합니다. 여기서는 TCP-80을 클릭합니다.
설정된 Backends를 확인합니다. 여기서 Backend는 Worker Node들입니다. 노드 하나쪽만 OK 상태이고 나머지는 Critical 상태인 걸 알 수 있습니다.
Ingress-nginx pod가 위치한 Worker Node를 조회해 봅니다.
$ kubectl get pod -n ingress-nginx -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES ingress-nginx-admission-create-kxgrx 0/1 Completed 0 40m 10.244.0.12 10.0.10.97 <none> <none> ingress-nginx-admission-patch-ng5lw 0/1 Completed 1 40m 10.244.0.13 10.0.10.97 <none> <none> ingress-nginx-controller-7d98bbddbd-2rrct 1/1 Running 0 40m 10.244.0.14 10.0.10.97 <none> <none>
실제 Pod가 위치한 Worker Node(10.0.10.97)만 Health가 OK 상태입니다. 배포한 NGINX Ingress Controller의 deploy.yaml 파일에 다음 설정의 영향입니다. 해당 설정은 Ingress Controller에 접속하는 클라이언트의 IP를, 서비스 애플리케이션 Pod에서도 유지하여, 애플리케이션 Pod에서 로그 등에서 클라이언트를 추적이 필요한 경우 사용됩니다. 아래 Kubernetes 공식 문서의 관련 내용을 참고하세요.
externalTrafficPolicy: Local
출처 - Kubernetes 공식 문서 - 외부 로드 밸런서 생성하기 > Preserving the client source IP
.spec.externalTrafficPolicy
- 이 서비스가 외부 트래픽을 노드-로컬 또는 클러스터-전체 엔드포인트로 라우팅할지 여부를 나타낸다. 두 가지 옵션이 있다.Cluster
(기본) 그리고Local
.Cluster
는 클라이언트 소스 IP를 가리고 다른 노드에 대한 두 번째 홉(hop)을 발생시킬 수 있지만, 전체적인 부하 분산에서 이점이 있다.Local
은 클라이언트 소스 IP를 보존하고LoadBalancer
와NodePort
타입의 서비스에서 두 번째 홉(hop) 발생을 피할 수 있지만, 트래픽 분산이 불균형적인 잠재적인 위험이 있다.
이 글은 개인으로서, 개인의 시간을 할애하여 작성된 글입니다. 글의 내용에 오류가 있을 수 있으며, 글 속의 의견은 개인적인 의견입니다.