type LoadBalancer 서비스 사용하기
서비스 구성 방법
Service 매니페스트 파일(예시:
my-lb-svc.yaml
)을 작성하여 적용하면 LoadBalancer 형식(type)의 Service를 구성할 수 있습니다.
주의
- LoadBalancer는 기본적으로 클러스터 Subnet에 생성됩니다.
- 다른 Subnet에 LoadBalancer를 생성하려면 어노테이션 service.beta.kubernetes.io/scp-load-balancer-subnet-id를 사용하세요. 자세한 내용은 어노테이션 상세 설정 참고
type LoadBalancer Service를 작성해 적용하려면 다음 절차를 따르세요.
Service 매니페스트 파일
my-lb-svc.yaml을 작성합니다.배경색 변경apiVersion: v1 kind: Service metadata: name: my-service spec: selector: app.kubernetes.io/name: MyApp ports: - protocol: TCP port: 80 targetPort: 9376 appProtocol: tcp # LB 서비스 프로토콜 유형 설정 문단 참고 type: LoadBalancerapiVersion: v1 kind: Service metadata: name: my-service spec: selector: app.kubernetes.io/name: MyApp ports: - protocol: TCP port: 80 targetPort: 9376 appProtocol: tcp # LB 서비스 프로토콜 유형 설정 문단 참고 type: LoadBalancer코드 블럭. Service 매니페스트 파일 my-lb-svc.yaml 작성 예시 kubectl apply 명령어를 사용해 Service 매니페스트를 배포합니다.
배경색 변경kubectl apply -f my-lb-svc.yamlkubectl apply -f my-lb-svc.yaml코드 블럭. kubectl apply 명령어로 Service 매니페스트 배포
주의
- type LoadBalancer Service가 생성되면, 그에 대응되는 Load Balancer 서비스가 자동으로 생성됩니다. 구성이 완료될 때까지 몇 분 가량 소요될 수 있습니다.
- 자동으로 생성된 Load Balancer 서비스 및 LB 서버그룹을 임의로 변경하지 마세요. 변경 사항이 원복되거나 예기치 않은 동작이 발생할 수 있습니다.
- 설정 가능한 상세 기능에 대해서는 어노테이션 상세 설정을 참고하세요.
kubectl get service명령어를 사용하여 Load Balancer 구성을 확인합니다.배경색 변경# kubectl get service my-lb-svc NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE default my-lb-svc LoadBalancer 172.20.49.206 123.123.123.123 80:32068/TCP 3m# kubectl get service my-lb-svc NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE default my-lb-svc LoadBalancer 172.20.49.206 123.123.123.123 80:32068/TCP 3m코드 블럭. kubectl get service 명령어로 Load Balancer 구성 확인
프로토콜 유형
Service 매니페스트를 작성하여 사용할 수 있습니다. 다음은 간단한 예시입니다.
배경색 변경
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
...
ports:
- port: 80
targetPort: 9376
protocol: TCP # 필수 (TCP, UDP 중 택일)
appProtocol: tcp # 선택 (입력하지 않거나 tcp, http, https 중 택일)
type: LoadBalancer # 타입 로드밸런서apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
...
ports:
- port: 80
targetPort: 9376
protocol: TCP # 필수 (TCP, UDP 중 택일)
appProtocol: tcp # 선택 (입력하지 않거나 tcp, http, https 중 택일)
type: LoadBalancer # 타입 로드밸런서Kubernetes Engine의 type Load Balancer Service에서 지원하는 프로토콜(protocol과 appProtocol) 목록과 그에 따라 Load Balancer 서비스에 적용되는 설정은 다음과 같습니다.
| 구분 | (k8s) protocol | (k8s) appProtocol | (LB) 서비스 구분 | (LB) LB Listener | (LB) LB 서버그룹 | (LB) 헬스체크 |
|---|---|---|---|---|---|---|
| L4 TCP | TCP | (tcp) | L4 | TCP {port} | TCP {nodePort} | TCP {nodePort} |
| L4 UDP | UDP | - | L4 | UDP {port} | UDP {nodePort} | TCP {nodePort} |
| L7 HTTP | TCP | http | L7 | HTTP {port} | TCP {nodePort} | TCP/HTTP {nodePort} |
| L7 HTTPS | TCP | https | L7 | HTTPS {port} | TCP {nodePort} | TCP/HTTP {nodePort} |
표. k8s Service 매니페스트와 Load Balancer 서비스 적용 설정
- k8s Service 매니페스트 스펙에 따라 하나의 서비스에 여러 포트를 지정할 수 있습니다.
주의
Load Balancer 서비스 구분(L4, L7)에 따라 하나의 Service 내에서 protocol의 Layer를 혼용해 사용할 수 없습니다.
- 즉 L4(TCP, UDP)와 L7(HTTP, HTTPS)은 하나의 Service에서 함께 사용할 수 없습니다.
L4 Service 매니페스트 작성 예시
배경색 변경
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app.kubernetes.io/name: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 9376
type: LoadBalancerapiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app.kubernetes.io/name: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 9376
type: LoadBalancerL7 Service 매니페스트 작성 예시
배경색 변경
apiVersion: v1
kind: Service
metadata:
annotations:
service.beta.kubernetes.io/scp-load-balancer-layer-type: "L7" # 필수
service.beta.kubernetes.io/scp-load-balancer-client-cert-id: "24da35de187b450eb0cf09fb6fa146de" # 필수
name: my-service
spec:
selector:
app.kubernetes.io/name: MyApp
ports:
- appProtocol: http # 필수
protocol: TCP
port: 80
targetPort: 9376
- appProtocol: https # 필수
protocol: TCP
port: 443
targetPort: 9898
type: LoadBalancer
apiVersion: v1
kind: Service
metadata:
annotations:
service.beta.kubernetes.io/scp-load-balancer-layer-type: "L7" # 필수
service.beta.kubernetes.io/scp-load-balancer-client-cert-id: "24da35de187b450eb0cf09fb6fa146de" # 필수
name: my-service
spec:
selector:
app.kubernetes.io/name: MyApp
ports:
- appProtocol: http # 필수
protocol: TCP
port: 80
targetPort: 9376
- appProtocol: https # 필수
protocol: TCP
port: 443
targetPort: 9898
type: LoadBalancer
어노테이션 상세 설정
서비스 매니페스트에 어노테이션을 추가해 상세 기능을 설정할 수 있습니다.
배경색 변경
apiVersion: v1
kind: Service
metatdata:
name: my-lb-svc
annotations:
service.beta.kubernetes.io/scp-load-balancer-public-ip-enabled: "true"
service.beta.kubernetes.io/scp-load-balancer-health-check-interval: "5"
service.beta.kubernetes.io/scp-load-balancer-health-check-timeout: "5"
service.beta.kubernetes.io/scp-load-balancer-health-check-count: "3"
service.beta.kubernetes.io/scp-load-balancer-session-duration-time: "300"
spec:
type: LoadBalancer
...
apiVersion: v1
kind: Service
metatdata:
name: my-lb-svc
annotations:
service.beta.kubernetes.io/scp-load-balancer-public-ip-enabled: "true"
service.beta.kubernetes.io/scp-load-balancer-health-check-interval: "5"
service.beta.kubernetes.io/scp-load-balancer-health-check-timeout: "5"
service.beta.kubernetes.io/scp-load-balancer-health-check-count: "3"
service.beta.kubernetes.io/scp-load-balancer-session-duration-time: "300"
spec:
type: LoadBalancer
...
참고
- 서비스에 별도의 어노테이션을 추가하지 않은 경우 어노테이션 기본값이 적용 됩니다.
- 서비스에 추가한 어노테이션이 허용값을 만족하지 않은 경우에도 어노테이션 기본값이 적용 됩니다.
아래는 type LoadBalancer 서비스에서 사용가능한 모든 어노테이션에 대한 설명 입니다.
| 어노테이션 | 프로토콜 | 기본값 | 허용값 | 예시 | 설명 |
|---|---|---|---|---|---|
| service.beta.kubernetes.io/scp-load-balancer-source-ranges-firewall-rules | All | false | true, false | false | 방화벽 규칙( LB source ranges → LB 서비스 IP )을 자동으로 추가 |
| service.beta.kubernetes.io/scp-load-balancer-snat-healthcheck-firewall-rules | All | false | true,false | false | 방화벽 규칙( LB Source NAT IP, HealthCheck IP → 멤버 IP:Port )을 자동으로 추가
|
표. Kubernetes 어노테이션에서 Firewall 관련 설정
| 어노테이션 | 프로토콜 | 기본값 | 허용값 | 예시 | 설명 |
|---|---|---|---|---|---|
| service.beta.kubernetes.io/scp-load-balancer-security-group-id | All | - | UUID | 92d84b44-ee71-493d-9782-3a90481ce5f3 | 지정한 ID에 해당하는 Security Group에 규칙을 자동으로 추가
|
| service.beta.kubernetes.io/scp-load-balancer-security-group-name | All | - | 문자열 | security-group-1 | 지정한 Name에 해당하는 Security Group에 규칙을 자동으로 추가
|
표. Kubernetes 어노테이션에서 Security Group 관련 설정
| 어노테이션 | 프로토콜 | 기본값 | 허용값 | 예시 | 설명 |
|---|---|---|---|---|---|
| service.beta.kubernetes.io/scp-load-balancer-layer-type | All | L4 | L4, L7 | L4 | Load Balancer의 서비스 구분을 지정
|
| service.beta.kubernetes.io/scp-load-balancer-subnet-id | All | - | ID | 7f05eda5e1cf4a45971227c57a6d60fa | Load Balancer의 Service Subnet을 지정
|
| service.beta.kubernetes.io/scp-load-balancer-service-ip | All | - | IP 주소 | 192.168.10.7 | Load Balancer의 Service IP를 지정
|
| service.beta.kubernetes.io/scp-load-balancer-public-ip-enabled | All | false | true, false | false | Load Balancer의 Public NAT IP 사용 여부를 지정
|
| service.beta.kubernetes.io/scp-load-balancer-public-ip-id | All | - | ID | 4119894bd9614cef83db6f8dda667a20 | Load Balancer의 Public NAT IP로 사용할 Public IP의 ID를 지정
|
표. Kubernetes 어노테이션에서 Load Balancer 관련 설정
| 어노테이션 | 프로토콜 | 기본값 | 허용값 | 예시 | 설명 |
|---|---|---|---|---|---|
| service.beta.kubernetes.io/scp-load-balancer-idle-timeout | HTTP, HTTPS | - | 60 - 3600(60초 단위) | 600 | LB Listener의 idle-timeout(초)을 지정
|
| service.beta.kubernetes.io/scp-load-balancer-session-duration-time | All | L4: 120L7: - | L4 TCP: 60 - 3600(60초 단위)L4 UDP: 60 - 180(60초 단위)L7: 0 - 120 | 120 | LB Listener의 session-duration-time(초)을 지정
|
| service.beta.kubernetes.io/scp-load-balancer-response-timeout | HTTP, HTTPS | - | 0 - 120 | 60 | LB Listener의 response-timeout(초)을 지정
|
| service.beta.kubernetes.io/scp-load-balancer-insert-client-ip | TCP | false | true, false | false | LB Listener의 Insert Client IP를 지정 |
| service.beta.kubernetes.io/scp-load-balancer-x-forwarded-proto | HTTP, HTTPS | false | true, false | false | LB Listener의 X-Forwarded-Proto 헤더 사용 여부를 지정 |
| service.beta.kubernetes.io/scp-load-balancer-x-forwarded-port | HTTP, HTTPS | false | true, | false | LB Listener의 X-Forwarded-Port 헤더 사용 여부를 지정 |
| service.beta.kubernetes.io/scp-load-balancer-x-forwarded-for | HTTP, HTTPS | false | true, false | false | LB Listener의 X-Forwarded-For 헤더 사용 여부를 지정 |
| service.beta.kubernetes.io/scp-load-balancer-support-http2 | HTTP, HTTPS | false | true, false | false | LB Listener의 HTTP 2.0 지원 여부를 지정 |
| service.beta.kubernetes.io/scp-load-balancer-persistence | TCP, HTTP, HTTPS | "" | "", source-ip, cookie | source-ip | LB Listener의 지속성(선택 안함, 소스 IP, 쿠키 중 하나)을 지정
|
| service.beta.kubernetes.io/scp-load-balancer-client-cert-id | HTTPS | - | UUID | 78b9105e00324715b63700933125fa83 | LB Listener의 클라이언트 SSL 인증서의 ID를 지정
|
| service.beta.kubernetes.io/scp-load-balancer-client-cert-level | HTTPS | HIGH | HIGH, NORMAL, LOW | HIGH | LB Listener의 클라이언트 SSL 인증서의 보안 수준을 지정 |
| service.beta.kubernetes.io/scp-load-balancer-server-cert-level | HTTPS | - | HIGH, NORMAL, LOW | HIGH | LB Listener의 서버 SSL 인증서의 보안 수준을 지정 |
표. Kubernetes 어노테이션에서 LB Listener 관련 설정
| 어노테이션 | 프로토콜 | 기본값 | 허용값 | 예시 | 설명 |
|---|---|---|---|---|---|
| service.beta.kubernetes.io/scp-load-balancer-lb-method | All | ROUND_ROBIN | ROUND_ROBIN, LEAST_CONNECTION, IP_HASH | ROUND_ROBIN | LB 서버 그룹의 부하 분산 정책을 지정 |
표. Kubernetes 어노테이션에서 LB 서버 그룹 관련 설정
| 어노테이션 | 프로토콜 | 기본값 | 허용값 | 예시 | 설명 |
|---|---|---|---|---|---|
| service.beta.kubernetes.io/scp-load-balancer-health-check-enabled | All | true | true, false | true | LB 헬스 체크의 사용 여부를 지정 |
| service.beta.kubernetes.io/scp-load-balancer-health-check-protocol | All | TCP | TCP, HTTP | TCP | LB 헬스 체크의 프로토콜을 지정 |
| service.beta.kubernetes.io/scp-load-balancer-health-check-port | All | {nodeport} | 1 - 65534 | 30000 | LB 헬스 체크의 헬스 체크 포트를 지정
|
| service.beta.kubernetes.io/scp-load-balancer-health-check-count | All | 3 | 1 - 10 | 3 | LB 헬스 체크의 탐지 횟수를 지정 |
| service.beta.kubernetes.io/scp-load-balancer-health-check-interval | All | 5 | 1 - 180 | 5 | LB 헬스 체크의 주기를 지정 |
| service.beta.kubernetes.io/scp-load-balancer-health-check-timeout | All | 5 | 1 - 180 | 5 | LB 헬스 체크의 대기 시간을 지정 |
| service.beta.kubernetes.io/scp-load-balancer-health-check-http-method | HTTP | GET | GET, POST | GET | LB 헬스 체크의 HTTP method를 지정 |
| service.beta.kubernetes.io/scp-load-balancer-health-check-url | HTTP | / | 문자열 | /healthz | LB 헬스 체크의 URL을 지정 |
| service.beta.kubernetes.io/scp-load-balancer-health-check-response-code | HTTP | 200 | 200 - 500 | 200 | LB 헬스 체크의 응답 코드를 지정 |
| service.beta.kubernetes.io/scp-load-balancer-health-check-request-data | HTTP | - | 문자열 | username=admin&password=1234 | LB 헬스 체크의 요청 문자열을 지정
|
| service.beta.kubernetes.io/scp-load-balancer-port-{port}-health-check-enabled | All | true | true, false | true | Service의 {port} 포트 번호에 대한 LB 헬스 체크 사용 여부를 지정 |
| service.beta.kubernetes.io/scp-load-balancer-port-{port}-health-check-protocol | All | TCP | TCP, HTTP | TCP | Service의 {port} 포트 번호에 대한 LB 헬스 체크 프로토콜을 지정 |
| service.beta.kubernetes.io/scp-load-balancer-port-{port}-health-check-port | All | - | 1 - 65534 | 30000 | Service의 {port} 포트 번호에 대한 LB 헬스 체크 헬스 체크 포트를 지정 |
| service.beta.kubernetes.io/scp-load-balancer-port-{port}-health-check-count | All | 3 | 1 - 10 | 3 | Service의 {port} 포트 번호에 대한 LB 헬스 체크 탐지 횟수를 지정 |
| service.beta.kubernetes.io/scp-load-balancer-port-{port}-health-check-interval | All | 5 | 1 - 180 | 5 | Service의 {port} 포트 번호에 대한 LB 헬스 체크 주기를 지정 |
| service.beta.kubernetes.io/scp-load-balancer-port-{port}-health-check-timeout | All | 5 | 1 - 180 | 5 | Service의 {port} 포트 번호에 대한 LB 헬스 체크 대기 시간을 지정 |
| service.beta.kubernetes.io/scp-load-balancer-port-{port}-health-check-http-method | HTTP | GET | GET, POST | GET | Service의 {port} 포트 번호에 대한 LB 헬스 체크 HTTP method를 지정 |
| service.beta.kubernetes.io/scp-load-balancer-port-{port}-health-check-url | HTTP | / | 문자열 | /healthz | Service의 {port} 포트 번호에 대한 LB 헬스 체크 URL을 지정 |
| service.beta.kubernetes.io/scp-load-balancer-port-{port}-health-check-response-code | HTTP | 200 | 200 - 500 | 200 | Service의 {port} 포트 번호에 대한 LB 헬스 체크 응답 코드를 지정 |
| service.beta.kubernetes.io/scp-load-balancer-port-{port}-health-check-request-data | HTTP | - | 문자열 | username=admin&password=1234 | Service의 {port} 포트 번호에 대한 LB 헬스 체크 요청 문자열을 지정
|
표. Kubernetes 어노테이션에서 LB 헬스 체크 관련 설정
제약사항
Kubernetes 어노테이션 사용 시에 고려해야 할 제약사항은 다음과 같습니다.
| 제약사항 | 관련 어노테이션 |
|---|---|
| Security Group을 변경할 경우, 기존 Security Group에 생성된 규칙들은 자동 삭제되지 않음 | service.beta.kubernetes.io/scp-load-balancer-security-group-id service.beta.kubernetes.io/scp-load-balancer-security-group-name |
| Load Balancer의 서비스 구분(L4/L7)을 변경할 수 없음 | service.beta.kubernetes.io/scp-load-balancer-layer-type |
| 동일 k8s Service 내에서 L4과 L7을 함께 사용할 수 없음 | service.beta.kubernetes.io/scp-load-balancer-layer-type |
| Load Balancer 서브넷을 변경할 수 없음 | service.beta.kubernetes.io/scp-load-balancer-subnet-id |
| Load Balancer의 Service IP를 변경할 수 없음 | service.beta.kubernetes.io/scp-load-balancer-service-ip |
| LB Listener idle-timeout 은 사용 후 미사용으로 변경할 수 없음 | service.beta.kubernetes.io/scp-load-balancer-idle-timeout |
| LB Listener session-duration-time 은 사용 후 미사용으로 변경할 수 없음 | service.beta.kubernetes.io/scp-load-balancer-session-duration-time |
| LB Listener response-timeout 은 사용 후 미사용으로 변경할 수 없음 | service.beta.kubernetes.io/scp-load-balancer-response-timeout |
| LB Listener idle-timeout 은 session-duration-time 또는 response-timeout 과 동시에 설정할 수 없음 | service.beta.kubernetes.io/scp-load-balancer-idle-timeout service.beta.kubernetes.io/scp-load-balancer-session-duration-time service.beta.kubernetes.io/scp-load-balancer-response-timeout |
| 동일 k8s Service 내에서 같은 포트 번호로 TCP와 UDP를 함께 사용할 수 없음 | - |
L7 Listener 의 라우팅 규칙은 LB서버그룹 전달 방식의 기본 URL 경로만 지원함
| - |
표. Kubernetes 어노테이션 사용 시 제약사항