Support for OCI Network Load Balancers
OKE에서 Service Type을 Load Balancer를 사용할때 이제는 OCI Network Load Balancer을 추가적으로 지원합니다.
릴리즈 노트를 기준으로 Network Load Balancer를 사용하면 다음과 같은 것이 가능합니다.
-
Load-balance traffic among Kubernetes pods with high throughput and low latency.
=> OSI layer 3 and layer 4 (TCP/UDP/ICMP)기반 pass-through 방식으로 데이터를 열어보지 않고 분배하게 되어 보다 낮은 응답지연과 높은 처리량을 제공합니다.
-
Preserve source and destination IP addresses and ports.
=> Source, Destination IP와 Port가 그대로 보존됩니다. Pod에서 Client IP를 알 수 있습니다.
-
Handle TCP and UDP traffic in the applications you deploy.
=> TCP 뿐만 아니라, UDP도 지원합니다.
OCI Load Balancer와 OCI Network Load Balancer의 차이는 다음 블로그를 참고합니다.
Network Load Balancer 사용하기
OCI Load Balancer 사용하기
-
테스트를 위해 아래와 같이 nginx를 배포합니다.
- Service Type - Load Balancer에서 oci.oraclecloud.com/load-balancer-type를 지정하지 않으면, 기본값으로 OCI Load Balancer를 사용합니다.
apiVersion: apps/v1 kind: Deployment metadata: name: my-nginx labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: my-nginx-lb labels: app: nginx annotations: oci.oraclecloud.com/load-balancer-type: "lb" spec: type: LoadBalancer ports: - port: 80 selector: app: nginx
-
배포 결과 확인
$ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 26m my-nginx-lb LoadBalancer 10.96.197.58 129.154.54.161 80:32258/TCP 8m21s $ curl http://129.154.54.161 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> ...
OCI Network Load Balancer 사용하기
-
앞서 배포된 Pod에 Network Load Balancer를 추가합니다.
- Service Type - Load Balancer에서 oci.oraclecloud.com/load-balancer-type=“nlb"로 지정하면 OCI Network Load Balancer를 사용합니다.
apiVersion: v1 kind: Service metadata: name: my-nginx-nlb labels: app: nginx annotations: oci.oraclecloud.com/load-balancer-type: "nlb" spec: type: LoadBalancer ports: - port: 80 selector: app: nginx
-
배포 결과 확인
- OCI Load Balancer 쓸때와는 다르게 curl로 접속이 안 됩니다..
- OCI Network Load Balancer를 OKE에서 사용할 때는 Security Rule을 직접 등록을 해줘야 합니다.
$ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 43m my-nginx-lb LoadBalancer 10.96.197.58 129.154.54.161 80:32258/TCP 24m my-nginx-nlb LoadBalancer 10.96.159.81 10.0.20.59,144.24.68.55 80:30350/TCP 31m $ curl http://138.2.117.137 ...
-
Security Rule 등록
-
Quick Create 모드로 생성한 클러스터를 기준으로 아래 규칙 추가가 필요합니다. (현재 my-nginx-nlb가 사용하는 Node Port는 30350 기준 설정입니다~
-
svclb subnet의 Security List 규칙 추가 설정
-
Ingress
-
Egress
svclb subnet -> node subnet:port(10.0.10.0/24:30350)으로 나갈 수 있게 추가
-
-
node subnet의 Security List 규칙 추가 설정
-
Ingress
svclb subnet -> node subnet:port(10.0.10.0/24:30350)로 들어올 수 있게 추가
-
-
-
Security Rule 추가후 다시 테스트하면 잘 동작합니다.
$ curl http://144.24.68.55 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title>
컨테이너에서 Client IP 주소 가져오기
-
웹브라우저로 NLB를 통해 배포된 nginx를 접속합니다. 기존 nginx 컨테이너 로그에서 Client IP 확인하면 10.x.x.x의 OCI 내부 IP가 보이는 것을 볼 수 있습니다.
$ kubectl logs -lapp=nginx -f ... 10.244.0.128 - - [21/Mar/2022:06:32:27 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.80 Safari/537.36" "10.179.87.76"
-
Source IP를 유지하는 기능을 활용하여, 컨테이너 상에서 접속한 클라이언트 IP를 알 수 있습니다. externalTrafficPolicy: Local을 아래와 같이 추가하면 됩니다.
- 해당 설정 적용을 위해 기존 Service를 삭제하고 다시 적용합니다.
apiVersion: v1 kind: Service metadata: name: my-nginx-nlb labels: app: nginx annotations: oci.oraclecloud.com/load-balancer-type: "nlb" spec: loadBalancerIP: 144.24.68.55 type: LoadBalancer externalTrafficPolicy: Local ports: - port: 80 selector: app: nginx
-
Security Rule 등록
-
svclb subnet의 Security List 규칙 추가 설정
- 서비스 재배포로 인한 NodePort 변경시 변경 적용
- 또는 Kubernetes NodePort 대역 30000-32767을 사전에 적용
-
node subnet의 Security List 규칙 추가 설정
-
Ingress
svclb subnet -> node subnet:port 설정한 부분이, 이제 Source IP가 Load Balancer 내부 IP에서 인터넷상에서 오는 실제 Client IP가 그대로 오기 때문에, 이를 허용하기 위해 0.0.0.0/0으로 설정합니다.
-
-
-
테스트전 자신의 IP를 확인합니다.
-
웹브라우저로 NLB를 통해 배포된 nginx를 접속합니다.
-
기존 nginx 컨테이너 로그에서 Client IP 확인하면 아래와 같이 Client IP가 정상적으로 보이는 것을 볼 수 있습니다.
$ kubectl logs -lapp=nginx -f ... 202.45.129.186 - - [21/Mar/2022:07:00:24 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.80 Safari/537.36" "10.179.87.76"
UDP로 서비스 하기
-
Load Balancer의 기본 프로토콜이 TCP이며, OCI Network Load Balancer를 사용하는 경우 UDP도 지원합니다.
-
앞선 설정에서
protocal: UDP
만 다음과 같이 추가하면 됩니다.apiVersion: v1 kind: Service metadata: name: my-nginx-nlb labels: app: nginx annotations: oci.oraclecloud.com/load-balancer-type: "nlb" spec: type: LoadBalancer ports: - port: 80 protocol: UDP selector: app: nginx
이 글은 개인으로서, 개인의 시간을 할애하여 작성된 글입니다. 글의 내용에 오류가 있을 수 있으며, 글 속의 의견은 개인적인 의견입니다.