TheKoguryo's 기술 블로그

 Version 2024.11.15

1.2.1.1 OCI Load Balancer로 서비스하기

앱 배포해보기
  1. 가장 흔한 형태인 Public Container Registry인 Docker Hub에서 이미지를 가져와서 OKE 클러스터에 배포를 해봅니다.

    kubectl create deployment nginx-docker-hub --image=nginx:latest
    
  2. 배포 결과를 확인해보면 정상적으로 배포된 것을 알 수 있습니다.

    $ kubectl create deployment nginx-docker-hub --image=nginx:latest
    deployment.apps/nginx-docker-hub created
    $ kubectl get all
    NAME                                    READY   STATUS    RESTARTS   AGE
    pod/nginx-docker-hub-5bfd857f89-9rh8q   1/1     Running   0          31s
    
    NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)             AGE
    service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP,12250/TCP   80m
    
    NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/nginx-docker-hub   1/1     1            1           31s
    
    NAME                                          DESIRED   CURRENT   READY   AGE
    replicaset.apps/nginx-docker-hub-5bfd857f89   1         1         1       31s
    
Load Balancer 타입으로 서비스 만들기
  1. 클라이언트 서비스를 위해 LoadBalancer Type으로 서비스를 생성합니다.

  2. 서비스 생성 결과를 확인하면 아래와 같이 LoadBalancer 타입으로 생성되어 Public IP가 할당 된 것을 볼 수 있습니다.

    $ kubectl expose deployment nginx-docker-hub --port 80 --type LoadBalancer --name nginx-docker-hub-svc
    service/nginx-docker-hub-svc exposed
    $ kubectl get svc
    NAME                   TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)             AGE
    kubernetes             ClusterIP      10.96.0.1       <none>           443/TCP,12250/TCP   82m
    nginx-docker-hub-svc   LoadBalancer   10.96.209.198   150.230.xxx.xx   80:32298/TCP        62s
    
  3. 서비스 주소인 Public IP로 접속하면, 연결되는 것을 볼 수 있습니다.

    $ curl http://150.230.xxx.xx
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>
    html { color-scheme: light dark; }
    body { width: 35em; margin: 0 auto;
    font-family: Tahoma, Verdana, Arial, sans-serif; }
    </style>
    </head>
    <body>
    <h1>Welcome to nginx!</h1>
    <p>If you see this page, the nginx web server is successfully installed and
    working. Further configuration is required.</p>
    
    <p>For online documentation and support please refer to
    <a href="http://nginx.org/">nginx.org</a>.<br/>
    Commercial support is available at
    <a href="http://nginx.com/">nginx.com</a>.</p>
    
    <p><em>Thank you for using nginx.</em></p>
    </body>
    </html>
    $
    
OCI 콘솔에서 Load Balancer 확인하기
  1. 콘솔에서 Networking > Load Balancers 로 이동합니다. OKE 클러스터가 있는 Compartment로 이동합니다.

  2. 아래 그림과 같이 kubernetes 상에 생성된 서비스와 동일한 Public IP로 Load Balancer가 생성된 것을 알 수 있습니다.

    image-20230516181811499

  3. Load Balancer 이름을 클릭하여 상세 화면으로 이동합니다.

  4. 상세화면에서 좌측 하단 Resources > Listeners로 이동합니다.

    kubernetes에서 Load Balancer 생성시 지정한 (kubectl expose ~~~~ --port 80) 명령에 따라 80 포트로 Listen 하고 있는 걸 알 수 있습니다.

    image-20230516181912138

  5. Resources > Backend Set으로 이동합니다. 생성된 Backend Set을 클릭하여 상세화면으로 이동합니다.

  6. 좌측 하단 Resources > Backends로 이동합니다.

    세 개의 백엔드 노드의 NodePort 32298 포트로 부하 분산하는 것을 볼 수 있습니다.

    image-20230516182018206

  7. 다시 터미널로 이동하여 서비스와 노드 정보를 조회합니다.

    kubectl get svc
    kubectl get nodes -o wide
    
    • 조회결과

      조회 해보면 OCI Load Balancer 가 Worker Nodes 3개로, 각 노드의 Node Port인 32298으로 부하 분산 되는 것을 알 수 있습니다. 이처럼 kubernetes에서 Load Balancer Type 서비스를 생성하면, OCI Load Balancer와 연동되어 자동으로 자원이 생성됩니다.

    $ kubectl get svc
    NAME                   TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)             AGE
    kubernetes             ClusterIP      10.96.0.1       <none>           443/TCP,12250/TCP   91m
    nginx-docker-hub-svc   LoadBalancer   10.96.209.198   150.230.xxx.xx   80:32298/TCP        9m51s
    $ kubectl get nodes -o wide
    NAME          STATUS   ROLES   AGE   VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE                  KERNEL-VERSION                  CONTAINER-RUNTIME
    10.0.10.107   Ready    node    87m   v1.25.4   10.0.10.107   <none>        Oracle Linux Server 8.7   5.15.0-6.80.3.1.el8uek.x86_64   cri-o://1.25.1-111.el8
    10.0.10.143   Ready    node    87m   v1.25.4   10.0.10.143   <none>        Oracle Linux Server 8.7   5.15.0-6.80.3.1.el8uek.x86_64   cri-o://1.25.1-111.el8
    10.0.10.39    Ready    node    87m   v1.25.4   10.0.10.39    <none>        Oracle Linux Server 8.7   5.15.0-6.80.3.1.el8uek.x86_64   cri-o://1.25.1-111.el8
    
OCI 콘솔에서 Security List 확인하기
  1. 콘솔에서 Networking > Virtual Cloud Networks 로 이동합니다. OKE 클러스터가 있는 Compartment로 이동합니다.

  2. OKE 클러스터가 사용하는 VCN으로 이동합니다.

  3. Subnet을 보면 그림과 같이, 3개의 서브넷이 있습니다.

    • oke-k8sApiEndpoint-subnet~~: Kubernetes API Endpoint를 위한 서브넷
    • oke-svclbsubnet-~~: Load Balancer가 사용하는 서브넷
    • oke-nodesubnet-~~: Worker Node 들이 사용하는 서브넷

    image-20230516182525468

  4. Resources > Security Lists로 이동하면, 위 3개의 서브넷이 사용하는 3개의 Security List가 있습니다.

    image-20230516182603081

  5. Load Balancer용 서브넷 확인

    먼저 oke-svclbsubnet-~~ 의 상세화면으로 이동합니다. Ingress/Egress Rule을 확인해 보면, 외부에서 80 포트로 수신하고, Worker Node들의 Node Port로 송신할 수 있도록 자동으로 추가된 것을 볼수 있습니다.

    image-20230516182752588

    image-20230516182844930

  6. 다시 VCN 상세 화면으로 이동하여, Worker Nodes용 Security List를 확인합니다.

    OCI Load Balancer에서 Node Port로 요청을 수신할 수 있도록 자동으로 규칙이 추가된 것을 볼수 있습니다.

    image-20230516183113809

  7. 위와 같이 OKE 클러스터에 kubernetes 명령으로 Load Balancer 서비스 타입을 생성하면, 그에 따라 OCI Load Balancer가 생성되고, 관련 Security List에도 등록되는 것을 알 수 있습니다.



이 글은 개인으로서, 개인의 시간을 할애하여 작성된 글입니다. 글의 내용에 오류가 있을 수 있으며, 글 속의 의견은 개인적인 의견입니다.

Last updated on 7 Jan 2024