로드밸런서 상품 연동 가이드

Kubernetes의 서비스를 통한 로드밸런서 상품 연동

네이버 클라우드 플랫폼의 Kubernetes Service는 Kubernetes 서비스 생성 시 타입을 LoadBalancer로 지정한 경우, 로드밸런서 인스턴스를 자동으로 생성합니다. 로드밸런서의 설정은 서비스 매니페스트(Manifest)의 어노테이션(Annotation)을 통해 지원합니다.

다음의 로드밸런서 설정을 위한 어노테이션들을 제공합니다.

설정 값 설명 비고
service.beta.kubernetes.io/ncloud-load-balancer-size 로드밸런서 부하 처리 성능.
다음 값 중 하나 선택 : SMALL, MEDIUM, LARGE
기본값 SMALL, 사설 네트워크 타입의 로드밸런서인 경우 SMALL로만 생성 가능.
service.beta.kubernetes.io/ncloud-load-balancer-internal 사설 네트워크 타입의 로드밸런서 생성 설정.
다음의 값 중 하나 선택 : true/false
기본값 false
service.beta.kubernetes.io/ncloud-load-balancer-description 생성될 로드밸런서 인스턴스에 대한 메모 입력
service.beta.kubernetes.io/ncloud-load-balancer-termination-protection 타입이 LoadBalancer로 지정된 Service 제거 시 로드밸런서 자동 제거 방지 옵션 기본값 false
service.beta.kubernetes.io/ncloud-load-balancer-inbound-source ACG 규칙의 Inbound 접근 소스로 사용할 값. e.g. "119.194.195.143/32,143.248.12.77/32" 기본값 0.0.0.0/0
service.beta.kubernetes.io/ncloud-load-balancer-subnet-id 로드밸런서 생성을 위한 로드밸런서 전용 서브넷의 ID 값 기본값으로 kube-system내의 ncloud-config 이름의 configmaplbSubnetNo 사용

로드밸런서 인스턴스 생성

Kubernetes의 서비스를 통해 로드밸런서 인스턴스를 생성하려면 서비스 매니페스트의 타입을 다음과 같이 지정합니다.

"type": "LoadBalancer"

다음은 해당 타입이 적용된 yaml 설정 파일 예제입니다. 사설 네트워크 타입의 로드밸런서 인스턴스를 생성하기 위한 어노테이션이 추가되었음을 확인합니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      run: my-nginx
  template:
    metadata:
      labels:
        run: my-nginx
    spec:
      containers:
      - name: my-nginx
        image: nginx
        ports:
        - containerPort: 80
---

kind: Service
apiVersion: v1
metadata:
  name: my-nginx
  annotations:
    service.beta.kubernetes.io/ncloud-load-balancer-internal: "true"
    service.beta.kubernetes.io/ncloud-load-balancer-size: "SMALL"
spec:
  ports:
  - port: 80
    targetPort: 80
  selector:
    run: my-nginx
  type: LoadBalancer

위의 내용을 nks-lb.yml로 만들고, kubectl apply -f nks-lb.yml을 통해 배포하면, 네이버 클라우드 플랫폼의 로드밸런서 인스턴스가 자동으로 생성됩니다. 생성에는 일정 시간이 소요될 수 있습니다.

생성된 로드밸런서 인스턴스의 사설 IP 주소를 확인하기 위해서는 다음 명령어를 이용합니다. IP 주소는 EXTERNAL-IP 열에서 확인할 수 있습니다.

$ kubectl --kubeconfig $KUBE_CONFIG get svc example-service
NAME              TYPE           CLUSTER-IP       EXTERNAL-IP    PORT(S)          AGE
example-service   LoadBalancer   172.16.101.104   10.39.10.118   8765:30365/TCP   2m11s

어노테이션(Annotation) 이용한 로드밸런서 인스턴스 속성 설정 예

Kubernetes는 오브젝트에 키/값 형태의 메타데이터를 첨부할 수 있습니다. 타입이 LoadBalancer인 Service 오브젝트를 생성할 때 metadata.annotations의 값을 입력하는 경우, 커스터마이즈된 로드밸런서를 생성 할 수 있습니다.

1. 로드밸런서 생성 시 ACG 규칙의 Inbound Source 설정

Service 타입이 LoadBalancer인 경우, 외부와의 통신을 위해 기본값으로 Inbound 접근 소스에 0.0.0.0/0인 ACG 규칙이 설정됩니다. 다른 IP Block을 접근 소스로 설정이 필요한 경우 service.beta.kubernetes.io/ncloud-load-balancer-inbound-source의 어노테이션을 이용할 수 있습니다. 여러 개의 접근 소스가 필요한 경우에는 콤마(,)로 구분하여 입력할 수 있습니다.

kind: Service
apiVersion: v1
metadata:
  name: my-nginx
  annotations:
    service.beta.kubernetes.io/ncloud-load-balancer-inbound-source: "10.120.0.0/16,143.248.12.77/32"
spec:
  ports:
  - port: 80
    targetPort: 80
  selector:
    run: my-nginx
  type: LoadBalancer

2. 로드밸런서가 생성될 로드밸런서 전용 서브넷 선택

로드밸런서 생성 시 기본값으로 kube-system내의 ncloud-config 이름의 configmaplbSubnetNo을 사용합니다. 다른 로드밸런서 전용 서브넷에 로드밸런서를 생성해야 하는 경우 service.beta.kubernetes.io/ncloud-load-balancer-subnet-id 어노테이션을 사용할 수 있습니다.

설정된 기본값의 로드밸런서 전용 서브넷을 변경하기 위해서는 아래 절에 있는 문제 해결의 "로드밸런서 전용 서브넷의 IP 주소 부족으로 인한 생성 문제"를 참고해 주세요.

kind: Service
apiVersion: v1
metadata:
  name: my-nginx
  annotations:
    service.beta.kubernetes.io/ncloud-load-balancer-subnet-id: "452772"
spec:
  ports:
  - port: 80
    targetPort: 80
  selector:
    run: my-nginx
  type: LoadBalancer

kubectl expose 명령을 이용한 로드밸런서 인스턴스 생성

앞서 언급한 방법 외에도 kubectl expose 명령어와 --type=LoadBalancer 플래그를 이용하여 로드밸런서 인스턴스를 생성할 수 있습니다.

로드밸런서 인스턴스 생성 예제를 위해 다음과 같은 명령어를 이용하여 my-nginx 이름을 가지는 Deployment를 배포합니다. 해당 배포를 통해 Nginx 파드를 구동할 수 있습니다.

$ kubectl --kubeconfig $KUBE_CONFIG create deployment --image nginx my-nginx

다음 명령어를 이용하여 로드밸런서 인스턴스를 생성할 수 있습니다.

$ kubectl --kubeconfig $KUBE_CONFIG expose deployment my-nginx --port=80 --type=LoadBalancer

로드밸런서 인스턴스 삭제하기

로드밸런서 타입으로 생성된 kubernetes 서비스 리소스는 자동으로 생성된 네이버 클라우드 플랫폼의 로드밸런서(Load Balancer) 인스턴스와 연동됩니다. kerbernetes에서 해당 타입의 서비스를 삭제하는 경우 자동으로 로드밸런서 인스턴스 또한 제거됩니다.

다음 명령어들을 통해 생성된 서비스를 확인할 수 있습니다. 서비스들에 대한 타입은 TYPE 열에서 확인할 수 있습니다.

$ kubectl --kubeconfig $KUBE_CONFIG get service
NAME         TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
my-nginx     LoadBalancer   172.16.188.167   10.1.9.6     80:32681/TCP   21s

로드밸런서 타입의 kubernetes 서비스 리소스를 삭제하기 위해 다음의 명령어를 이용합니다.

$ kubectl --kubeconfig $KUBE_CONFIG delete service my-nginx
service "my-nginx" deleted

kubernetes 서비스 리소스가 삭제됨과 동시에 로드밸런서 인스턴스 또한 삭제됩니다. 해당 작업에는 일정 시간이 소요될 수 있습니다.


문제 해결

아래 절은 Kubernetes의 Service 오브젝트 타입을 "LoadBalancer"로 지정하여, 로드밸런서를 생성하고자 하는 경우 발생할 수 있는 문제를 설명합니다.

로드밸런서 전용 서브넷의 IP 주소 부족으로 인한 생성 문제

로드밸런서 전용 서브넷에서 더 이상 사용 가능한 IP 주소가 없는 경우 EXTERNAL-IP 항목은 <pending> 상태로 머무릅니다.

$ kubectl --kubeconfig $KUBE_CONFIG get svc
NAME         TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)        AGE
my-nginx    LoadBalancer   172.19.113.34    <pending>       80:32225/TCP   18h

아래 명령어를 통해 이벤트 목록에서 관련 내용을 확인할 수 있습니다.

$ kubectl --kubeconfig $KUBE_CONFIG describe svc my-nginx
Name: my-nginx
Namespace: default
Selector: app=my-nginx
Type: LoadBalancer
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal EnsuringLoadBalancer 16s (x4 over 52s) service-controller Ensuring load balancer
Warning SyncLoadBalancerFailed 16s (x4 over 51s) service-controller Error syncing load balancer: failed to ensure load balancer: Not Enough Available IP

로드밸런서 전용 서브넷에 가용 IP 주소가 없는 경우 아래 방법으로 추가 생성될 로드밸런서 전용 서브넷을 변경할 수 있습니다.

다음 명령어를 통해 kube-system namespace에 ncloud-config 이름을 가지는 configmap을 조회합니다.

$ kubectl --kubeconfig $KUBE_CONFIG get configmap ncloud-config -n kube-system
NAME            DATA   AGE
ncloud-config   9      131m

$ kubectl --kubeconfig $KUBE_CONFIG get configmap ncloud-config -n kube-system -o yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: ncloud-config
  namespace: kube-system
data:
  acgNo: "12345"
  apiUrl: https://nks.apigw.ntruss.com
  basePath: /ncloud-api/v1
  lbSubnetNo: "12345"
  regionCode: KR
  regionNo: "11"
  vpcNo: "12345"
  zoneNo: "110"
  • data.acgNo: 쿠버네티스 워커 노드의 eth0 인터페이스에 할당된 acg의 instanceID를 입력합니다.
  • data.apiUrl: https://nks.apigw.ntruss.com를 입력합니다.
  • data.basePath: /ncloud-api/v1를 입력합니다.
  • data.lbSubnetNo: 쿠버네티스 워커 노드가 할당된 VPC 내 로드밸런서 전용 서브넷의 SubnetID를 입력합니다.
  • data.regionCode: 쿠버네티스 워커 노드가 위치한 리전 코드를 입력합니다. (예: "FKR")
  • data.regionNo: 쿠버네티스 워커 노드의 리전 번호를 입려합니다. (예: "11")
  • data.vpcNo: 쿠버네티스 워커 노드가 할당된 VPC의 VPC ID를 입력합니다.
  • data.zoneNo: 쿠버네티스 워커 노드가 위치한 존 번호를 입력합니다. (예: "110")

Kubernetes Worker 노드가 생성된 VPC 내 로드밸런서 전용 서브넷의 Subnet ID를 사용해야 합니다.
올바르지 않은 값을 입력하는 경우 로드밸런서가 정상적으로 생성되지 않습니다.

다음 명령어를 이용하여 로드밸런서 전용 서브셋을 변경합니다. 입력 값으로 data.lbSubnetNo 필드에 Subnet ID를 입력합니다.
다음과 같이 value에 Subnet ID를 입력합니다. 예제에서 Subnet ID를 94465로 사용했습니다.

kubectl --kubeconfig $KUBE_CONFIG -n kube-system patch configmap ncloud-config --type='json' -p='[{"op":"replace", "path":"/data/lbSubnetNo", "value": "94465"}]'

변경 후 다시 configmap을 조회하여 변경 사항이 적용됐는지 확인합니다.

$ kubectl --kubeconfig $KUBE_CONFIG get configmap ncloud-config -n kube-system -o yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: ncloud-config
  namespace: kube-system
data:
  acgNo: "12345"
  apiUrl: https://nks.apigw.ntruss.com
  basePath: /ncloud-api/v1
  lbSubnetNo: "94465"
  regionCode: FKR
  regionNo: "11"
  vpcNo: "12345"
  zoneNo: "110"

""에 대한 건이 검색되었습니다.

    ""에 대한 검색 결과가 없습니다.

    처리중...