로드 밸런서 생성 및 삭제
로드 밸런서(Load Balancer)는 시스템으로 유입되는 대량의 트래픽을 다수의 서버로 분산시켜 안정적인 서비스 운영을 지원합니다. Kubernetes Engine 서비스에서 로드 밸런서 유형의 서비스 생성 시 annotation 옵션에 따라, Network Load Balancer(NLB) 또는 Application Load Balancer(ALB)이 생성됩니다.
로드 밸런서 생성
Kubernetes Engine 서비스에서 로드 밸런서를 생성하는 방법은 다음과 같습니다.
kr-central-2 리전에서는 서로 다른 가용 영역을 사용하도록 클러스터 네트워크를 설정하여, 가용성 높은 Multi-AZ 클러스터를 생성할 수 있습니다. 클러스터의 서브넷이 서로 다른 가용 영역을 사용하는 Multi-AZ 클러스터에 로드 밸런서를 생성할 경우, 클러스터 네트워크가 설정되어 있는 모든 AZ에 로드 밸런서가 기본 생성됩니다.
Multi-AZ 클러스터의 노드 풀이 특정 1개의 AZ에만 설정된 경우에도, 클러스터의 로드 밸런서는 모든 AZ에 생성됩니다. 로드 밸런서 유형(NLB 또는 ALB)의 구분 없이 모두 과금 대상에 포함되니 유의해 주세요.
사전 작업
Step 1. kubectl 설치 및 제어 설정하기
Kubernetes에서 Service 객체를 생성하기 위해서는 kubectl을 설치하고, 클러스터에 대한 kubectl 제어를 설정해야 합니다. kubectl 설치 및 제어 설정에 대한 자세한 설명은 kubectl 제어 설정을 참고하시기 바랍니다.
Step 2. SSL 인증서 등록 및 관리하기
Kubernetes에서 Application Load Balancer(ALB)를 생성하고 로드 밸런서의 리스너를 TERMINATED_HTTPS로 설정할 경우, SSL 인증서가 필요합니다. Kubernetes에서 생성한 Application Load Balancer에 사용할 SSL 인증서는 아래와 같이 등록 및 관리합니다.
인증서 등록하기
-
카카오클라우드 콘솔에서 Container Pack > Kubernetes Engine > Certification 탭으로 이동합니다.
-
Certification 메뉴에서 [인증서 등록하기] 버튼을 클릭합니다.
-
인증서 등록하기 팝업창에서 필요한 정보를 입력 후, [등록하기] 버튼을 클릭합니다.
-
인증서 목록에서 등록한 인증서 정보를 확인합니다.
인증서 삭제하기
-
카카오클라우드 콘솔에서 Container Pack > Kubernetes Engine > Certification 탭으로 이동합니다.
-
Certification 메뉴에서 삭제할 인증서의 [더 보기] 아이콘 > 인증서 삭제를 선택합니다.
-
인증서 삭제 팝업창에서 정보를 입력하고, [삭제] 버튼을 클릭합니다.
Step 1. 로드 밸런서 유형 서비스 명세 확인하기
로드 밸런서 유형 서비스의 명세를 확인합니다. app: nginx
와 연동된 로드 밸런서 유형 서비스 YAML 파일 예시에서 아래의 2개 항목을 확인합니다.
확인 필요 항목 | 설정값 및 설명 |
---|---|
spec.type | 설정값:LoadBalancer ㄴ 로드 밸런서 생성을 위한 서비스 유형 설정 |
metadata.annotations 하위의 annotations | 로드 밸런서 유형 설정 설정값 loadbalancer.ke.kakaocloud.com/load-balancer-type ㄴ NLB (기본값) : Network Load Balancer 생성 ㄴ ALB : Application Load Balancer 생성 ㄴ annotation 미설정 시, Network Load Balancer로 기본 생성됩니다. 퍼블릭 IP 사용 설정 설정값 service.beta.kubernetes.io/openstack-internal-load-balancer ㄴ true (기본값): 프라이빗 IP를 사용 ㄴ false : 퍼블릭 IP를 사용 |
NLB 로드 밸런서 유형 서비스 명세 확인
kind: Service
apiVersion: v1
metadata:
name: default-http-nginx-service
annotations:
service.beta.kubernetes.io/openstack-internal-load-balancer: 'true'
loadbalancer.ke.kakaocloud.com/load-balancer-type: 'NLB'
spec:
selector:
app: nginx
type: LoadBalancer
ports:
- name: http
port: 80
targetPort: 80
ALB 로드 밸런서 유형 서비스 명세 확인
kind: Service
apiVersion: v1
metadata:
name: default-http-nginx-service
annotations:
service.beta.kubernetes.io/openstack-internal-load-balancer: 'true'
loadbalancer.ke.kakaocloud.com/load-balancer-type: 'ALB'
loadbalancer.openstack.org/default-tls-container-ref: 'https://key-manager.{해당 리전의 인증서 path 입력}/v1/secrets/{인증서 ID 입력}'
spec:
selector:
app: nginx
type: LoadBalancer
ports:
- name: http
port: 80
targetPort: 80
Step 2. 로드 밸런서 유형 설정하기
로드 밸런서 유형 설정에 따라, Network Load Balancer(NLB) 또는 Application Load Balancer(ALB)가 생성됩니다.
- 'Network Load Balancer(NLB)' 생성하기
- 'Application Load Balancer(ALB)' 생성하기
Kubernetes Engine 서비스에서 로드 밸런서 유형의 서비스를 생성하면 OSI 4계층인 네트워크 계층에서 트래픽을 처리하는 Network Load Balancer(NLB)가 기본적으로 생성됩니다.
metadata.annotations 하위의 annotations
을 아래와 같이 설정합니다.
annotation 항목 | 설정값 및 설명 |
---|---|
loadbalancer.ke.kakaocloud.com/load-balancer-type | Network Load Balancer(NLB) 생성 - "NLB" 로 지정 |
Kubernetes Engine 서비스에서 Application Load Balancer(ALB)를 생성해 OSI 7계층인 애플리케이션 계층에서 트래픽을 처리할 수 있습니다. metadata.annotations 하위의 annotations
을 아래와 같이 설정합니다.
- kr-central-1
- kr-central-2
annotation 항목 | 설정값 및 설명 |
---|---|
loadbalancer.ke.kakaocloud.com/load-balancer-type | Application Load Balancer(ALB) 생성 - "ALB" 로 지정 |
loadbalancer.openstack.org/default-tls-container-ref | Listener 프로토콜이 **'TERMINATED_HTTPS'**로 설정되며, SSL 인증서 설정 필요 - "https://key-manager.kr-central-1.kakaoi.io/v1/secrets/{secret UUID 값}" 입력 ㄴ {secret UUID} 영역에 적용할 인증서의 ‘인증서 ID 입력 ㄴ 콘솔의 certification 탭에서 인증서 사전 등록 후, 인증서 ID 확인 가능 ㄴ ALB에 인증서가 적용되지 않으면, Listener 프로토콜이 **'HTTP'**로 설정됨 |
annotation 항목 | 설정값 및 설명 |
---|---|
loadbalancer.ke.kakaocloud.com/load-balancer-type | Application Load Balancer(ALB) 생성 - "ALB" 로 지정 |
loadbalancer.openstack.org/default-tls-container-ref | Listener 프로토콜이 **'TERMINATED_HTTPS'**로 설정되며, SSL 인증서 설정 필요 - "https://key-manager.kr-central-2.kakaoi.io/v1/secrets/{secret UUID 값}" 입력 ㄴ {secret UUID} 영역에 적용할 인증서의 ‘인증서 ID 입력 ㄴ콘솔의 certification 탭에서 인증서 사전 등록 후, 인증서 ID 확인 가능 ㄴ ALB에 인증서가 적용되지 않으면, Listener 프로토콜이 'HTTP' 로 설정됨 |
- ALB annotation 설정 시 리전별로 인증서 설정 path가 다르니, 로드 밸런서를 생성하는 리전에 해당하는 annotation을 입력하세요.
- ALB에 적용하는 인증서는 최초 ALB를 생성할 때, 인증서 설정 annotation을 함께 적용해야 합니다.
- 인증서 설정 변경이 필요할 경우, Service 객체를 삭제한 후 다시 생성해야 합니다. 이 때 기존 로드 밸런서가 연결 해제 또는 삭제된 후 신규 로드 밸런서가 생성되니 유의해 주세요.
Step 3. 로드 밸런서 퍼블릭 IP 설정하기
로드 밸런서 생성 시, 퍼블릭 IP 사용 여부를 설정할 수 있습니다.
metadata.annotations 하위의 service.beta.kubernetes.io/openstack-internal-load-balancer
값을 설정하여 로드 밸런서의 퍼블릭 IP 사용을 설정합니다.
- 프라이빗 IP를 갖는 로드 밸런서를 생성하려면 값을
true
로 설정 (기본값) - 퍼블릭 IP를 갖는 로드 밸런서를 생성하려면 값을
false
로 설정
service.beta.kubernetes.io/openstack-internal-load-balancer
설정값에 따라, 로드 밸런서의 퍼블릭 IP가 새로운 퍼블릭 IP를 생성하여 연결 또는 연결 해제됩니다. false로 설정하여 로드 밸런서에 사용한 퍼블릭 IP가 있었다면, 이후 true로 설정값을 변경하여도 퍼블릭 IP 연결 해제 상태가 되어 퍼블릭 IP 과금 대상에 포함되니 유의해 주세요.- Kubernetes Engine 로드 밸런서에 사용한 퍼블릭 IP 삭제는 카카오클라우드 콘솔의 VPC 메뉴의 퍼블릭 IP 메뉴에서 가능합니다. 자세한 설명은 퍼블릭 IP 생성 및 관리를 참고하시기 바랍니다.
부록. 로드 밸런서 상세 옵션 설정하기
Kubernetes Engine 서비스에서 로드 밸런서를 생성할 때 추가 옵션을 설정할 수 있습니다. 로드 밸런서 유형 서비스 YAML 파일 예시의 annotations
항목을 확인하여 설정합니다.
옵션 설정 항목 | 설정값 및 설명 |
---|---|
metadata.annotations 하위의 annotations | 퍼블릭 IP 삭제 설정 설정값: - loadbalancer.ke.kakaocloud.com/delete-floatingip ㄴ true : 로드 밸런서 삭제 시, 해당 로드 밸런서에 연결되어 있던 퍼블릭 IP를 삭제함 ㄴ false (기본값): 로드 밸런서 삭제 시, 해당 로드 밸런서에 연결되어 있던 퍼블릭 IP를 연결 해제함 Health Check (상태 확인) 조건 설정 설정값: - loadbalancer.openstack.org/health-monitor-timeout ㄴ 로드 밸런서 헬스 체크 최대 응답시간을 설정 ㄴ (기본값): 상세 옵션 미지정 시 30 적용됨 ㄴ 조건: 초 단위로 설정하며, 설정값은 제한 없음 - loadbalancer.openstack.org/health-monitor-delay ㄴ 로드 밸런서 헬스 체크 주기를 설정 ㄴ (기본값): 상세 옵션 미지정 시 60 적용됨 ㄴ 조건: 초 단위로 설정하며, timeout 값보다 큰 값이 설정되어야 함 - loadbalancer.openstack.org/health-monitor-max-retries ㄴ 설명: 로드 밸런서 헬스 체크 최대 재시도 횟수를 설정 ㄴ (기본값): 상세 옵션 미지정 시 5 로 적용됨 ㄴ 조건: 1~10 범위 이내의 값으로 설정되어야 함 |
부록. NLB 로드 밸런서 유형 서비스 생성 예제
예제를 통해 간단한 Nginx 애플리케이션을 로드 밸런서 유형 서비스로 생성하는 방법을 설명합니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: internal-http-nginx-deployment
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
---
kind: Service
apiVersion: v1
metadata:
name: default-http-nginx-service
annotations:
service.beta.kubernetes.io/openstack-internal-load-balancer: "true"
loadbalancer.ke.kakaocloud.com/load-balancer-type: "NLB"
spec:
selector:
app: nginx
type: LoadBalancer
ports:
- name: http
port: 80
targetPort: 80
-
다음의 명령어를 통해 배포를 진행합니다. 실행 시 카카오클라우드의 로드 밸런서가 자동으로 생성됩니다. 로드 밸런서 생성까지 약 5분 정도 소요될 수 있습니다.
배포 진행 명령어kubectl --kubeconfig=$KUBE_CONFIG apply -f https://raw.githubusercontent.com/kakaoicloud-guide/kubernetes-engine/main/guide-samples/createLB/lb-nginx.yml
-
생성된 로드 밸런서의 IP 주소를 확인하기 위해 다음의 명령어를 실행하여
EXTERNAL-IP
열을 확인합니다. 생성 전까지 Pending 상태가 지속될 수 있습니다.로드 밸런서 IP 주소 확인kubectl --kubeconfig=$KUBE_CONFIG get svc default-http-nginx-service
주소 확인 실행 결과NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default-http-nginx-service LoadBalancer {CLUSTER-IP} {EXTERNAL-IP} 80:32245/TCP 7h15m -
다음 명령어를 통해
EXTERNAL-IP
로 트래픽이 정상적으로 수신되는지 확인할 수 있습니다.EXTERNAL-IP로 트래픽 수신 확인curl {EXTERNAL-IP}
트래픽 수신 확인 실행 결과<!doctype html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
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 service 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>
service.beta.kubernetes.io/openstack-internal-load-balancer
값을false
로 설정하고 kubectl 명령어로 로드 밸런서와 연결된 서비스를 조회하면,EXTERNAL-IP
열에 로드 밸런서에 연결된 퍼블릭 IP가 표시되고 클라이언트는 해당 퍼블릭 IP로 접속할 수 있습니다.kr-central-2
리전의 클러스터에 로드 밸런서를 생성한 경우,EXTERNAL-IP
열에 로드 밸런서에 연결된 DNS가 표시되며, 클라이언트는 해당 DNS를 통해 접속할 수 있습니다.
로드 밸런서 삭제
더 이상 사용하지 않는 로드 밸런서를 삭제할 수 있습니다. 로드 밸런서 유형으로 생성된 Service 객체는 자동으로 생성된 카카오클라우드 로드 밸런서와 연동됩니다. 해당 Service를 삭제하는 경우 연동된 로드 밸런서도 함께 삭제됩니다.
kubectl --kubeconfig=$KUBE_CONFIG delete svc default-http-nginx-service