해당 문서의 쿠버네티스 버전: v1.21
Kubernetes v1.21 문서는 더 이상 적극적으로 관리되지 않음. 현재 보고있는 문서는 정적 스냅샷임. 최신 문서를 위해서는, 다음을 참고. 최신 버전.
IPv4/IPv6 이중 스택
Kubernetes v1.21 [beta]IPv4/IPv6 이중 스택 네트워킹을 사용하면 파드와 서비스에 IPv4와 IPv6 주소를 모두 할당할 수 있다.
IPv4/IPv6 이중 스택 네트워킹은 1.21부터 쿠버네티스 클러스터에 기본적으로 활성화되어 있고, IPv4 및 IPv6 주소를 동시에 할당할 수 있다.
지원되는 기능
쿠버네티스 클러스터의 IPv4/IPv6 이중 스택은 다음의 기능을 제공한다.
- 이중 스택 파드 네트워킹(파드 당 단일 IPv4와 IPv6 주소 할당)
- IPv4와 IPv6 지원 서비스
- IPv4와 IPv6 인터페이스를 통한 파드 오프(off) 클러스터 이그레스 라우팅(예: 인터넷)
필수 구성 요소
IPv4/IPv6 이중 스택 쿠버네티스 클러스터를 활용하려면 다음의 필수 구성 요소가 필요하다.
- 쿠버네티스 1.20 이상 이전 버전과 함께 이중 스택 서비스를 사용하는 방법에 대한 정보 쿠버네티스 버전, 쿠버네티스 해당 버전에 대한 문서 참조
- 이중 스택 네트워킹을 위한 공급자의 지원(클라우드 공급자 또는 다른 방식으로 쿠버네티스 노드에 라우팅 가능한 IPv4/IPv6 네트워크 인터페이스를 제공할 수 있어야 한다.)
- 이중 스택(예: Kubenet 또는 Calico)을 지원하는 네트워크 플러그인
IPv4/IPv6 이중 스택 구성
IPv4/IPv6 이중 스택을 사용하려면, 클러스터의 관련 구성 요소에 대해 IPv6DualStack 기능 게이트를 활성화한다. (1.21부터 IPv4/IPv6 이중 스택이 기본적으로 활성화된다.)
IPv4/IPv6 이중 스택을 구성하려면, 이중 스택 클러스터 네트워크 할당을 설정한다.
- kube-apiserver:
--service-cluster-ip-range=<IPv4 CIDR>,<IPv6 CIDR>
- kube-controller-manager:
--cluster-cidr=<IPv4 CIDR>,<IPv6 CIDR>--service-cluster-ip-range=<IPv4 CIDR>,<IPv6 CIDR>--node-cidr-mask-size-ipv4|--node-cidr-mask-size-ipv6IPv4의 기본값은 /24 이고 IPv6의 기본값은 /64 이다.
- kube-proxy:
--cluster-cidr=<IPv4 CIDR>,<IPv6 CIDR>
참고:IPv4 CIDR의 예:
10.244.0.0/16(자신의 주소 범위를 제공하더라도)IPv6 CIDR의 예:
fdXY:IJKL:MNOP:15::/64(이 형식으로 표시되지만, 유효한 주소는 아니다 - RFC 4193을 본다.)1.21부터, IPv4/IPv6 이중 스택은 기본적으로 활성화된다. 필요한 경우 kube-apiserver, kube-controller-manager, kubelet 및 kube-proxy 커맨드 라인에
--feature-gates="IPv6DualStack=false"를 지정하여 비활성화할 수 있다.
서비스
IPv4, IPv6 또는 둘 다를 사용할 수 있는 서비스를 생성할 수 있다.
서비스의 주소 계열은 기본적으로 첫 번째 서비스 클러스터 IP 범위의 주소 계열로 설정된다. (--service-cluster-ip-range 플래그를 통해 kube-apiserver에 구성)
서비스를 정의할 때 선택적으로 이중 스택으로 구성할 수 있다. 원하는 동작을 지정하려면 .spec.ipFamilyPolicy 필드를
다음 값 중 하나로 설정한다.
SingleStack: 단일 스택 서비스. 컨트롤 플레인은 첫 번째로 구성된 서비스 클러스터 IP 범위를 사용하여 서비스에 대한 클러스터 IP를 할당한다.PreferDualStack:- 서비스에 IPv4 및 IPv6 클러스터 IP를 할당한다. (클러스터에
--feature-gates="IPv6DualStack=false"가 있는 경우, 이 설정은SingleStack과 동일한 동작을 따른다.)
- 서비스에 IPv4 및 IPv6 클러스터 IP를 할당한다. (클러스터에
RequireDualStack: IPv4 및 IPv6 주소 범위 모두에서 서비스.spec.ClusterIPs를 할당한다..spec.ipFamilies배열의 첫 번째 요소의 주소 계열을 기반으로.spec.ClusterIPs목록에서.spec.ClusterIP를 선택한다.
단일 스택에 사용할 IP 계열을 정의하거나 이중 스택에 대한 IP 군의 순서를 정의하려는 경우, 서비스에서 옵션 필드 .spec.ipFamilies를 설정하여 주소 군을 선택할 수 있다.
참고:.spec.ipFamilies필드는 이미 존재하는 서비스에.spec.ClusterIP를 재할당할 수 없기 때문에 변경할 수 없다..spec.ipFamilies를 변경하려면 서비스를 삭제하고 다시 생성한다.
.spec.ipFamilies를 다음 배열 값 중 하나로 설정할 수 있다.
["IPv4"]["IPv6"]["IPv4","IPv6"](이중 스택)["IPv6","IPv4"](이중 스택)
나열한 첫 번째 군은 레거시.spec.ClusterIP 필드에 사용된다.
이중 스택 서비스 구성 시나리오
이 예제는 다양한 이중 스택 서비스 구성 시나리오의 동작을 보여준다.
새로운 서비스에 대한 이중 스택 옵션
- 이 서비스 사양은
.spec.ipFamilyPolicy를 명시적으로 정의하지 않는다. 이 서비스를 만들 때 쿠버네티스는 처음 구성된service-cluster-ip-range에서 서비스에 대한 클러스터 IP를 할당하고.spec.ipFamilyPolicy를SingleStack으로 설정한다. (셀렉터가 없는 서비스 및 헤드리스 서비스와 같은 방식으로 동작한다.)
apiVersion: v1
kind: Service
metadata:
name: my-service
labels:
app: MyApp
spec:
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
이 서비스 사양은
.spec.ipFamilyPolicy에PreferDualStack을 명시적으로 정의한다. 이중 스택 클러스터에서 이 서비스를 생성하면 쿠버네티스는 서비스에 대해 IPv4 및 IPv6 주소를 모두 할당한다. 컨트롤 플레인은 서비스의.spec을 업데이트하여 IP 주소 할당을 기록한다. 필드.spec.ClusterIPs는 기본 필드이며 할당된 IP 주소를 모두 포함한다..spec.ClusterIP는 값이.spec.ClusterIPs에서 계산된 보조 필드이다..spec.ClusterIP필드의 경우 컨트롤 플레인은 첫 번째 서비스 클러스터 IP 범위와 동일한 주소 계열의 IP 주소를 기록한다.- 단일 스택 클러스터에서
.spec.ClusterIPs및.spec.ClusterIP필드는 모두 하나의 주소만 나열한다. - 이중 스택이 활성화된 클러스터에서
.spec.ipFamilyPolicy에RequireDualStack을 지정하면PreferDualStack과 동일하게 작동한다.
apiVersion: v1
kind: Service
metadata:
name: my-service
labels:
app: MyApp
spec:
ipFamilyPolicy: PreferDualStack
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
- 이 서비스 사양은
.spec.ipFamilies에IPv6과IPv4를 명시적으로 정의하고.spec.ipFamilyPolicy에PreferDualStack을 정의한다. 쿠버네티스가.spec.ClusterIPs에 IPv6 및 IPv4 주소를 할당할 때.spec.ClusterIP는.spec.ClusterIPs배열의 첫 번째 요소이므로 IPv6 주소로 설정되어 기본값을 재정의한다.
apiVersion: v1
kind: Service
metadata:
name: my-service
labels:
app: MyApp
spec:
ipFamilyPolicy: PreferDualStack
ipFamilies:
- IPv6
- IPv4
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
기존 서비스의 이중 스택 기본값
이 예제는 서비스가 이미 있는 클러스터에서 이중 스택이 새로 활성화된 경우의 기본 동작을 보여준다. (--feature-gates="IPv6DualStack=false" 가 설정되지 않은 경우 기존 클러스터를 1.21로 업그레이드하면 이중 스택이 활성화된다.)
- 클러스터에서 이중 스택이 활성화된 경우 기존 서비스 (
IPv4또는IPv6)는 컨트롤 플레인이.spec.ipFamilyPolicy를SingleStack으로 지정하고.spec.ipFamilies를 기존 서비스의 주소 계열로 설정한다. 기존 서비스 클러스터 IP는.spec.ClusterIPs에 저장한다.
apiVersion: v1
kind: Service
metadata:
name: my-service
labels:
app: MyApp
spec:
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
kubectl을 사용하여 기존 서비스를 검사하여 이 동작을 검증할 수 있다.
kubectl get svc my-service -o yaml
apiVersion: v1
kind: Service
metadata:
labels:
app: MyApp
name: my-service
spec:
clusterIP: 10.0.197.123
clusterIPs:
- 10.0.197.123
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: MyApp
type: ClusterIP
status:
loadBalancer: {}
- 클러스터에서 이중 스택이 활성화된 경우, 셀렉터가 있는 기존 헤드리스 서비스는
.spec.ClusterIP가None이라도 컨트롤 플레인이.spec.ipFamilyPolicy을SingleStack으로 지정하고.spec.ipFamilies는 첫 번째 서비스 클러스터 IP 범위(kube-apiserver에 대한--service-cluster-ip-range플래그를 통해 구성)의 주소 계열으로 지정한다.
apiVersion: v1
kind: Service
metadata:
name: my-service
labels:
app: MyApp
spec:
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
kubectl을 사용하여 셀렉터로 기존 헤드리스 서비스를 검사하여 이 동작의 유효성을 검사 할 수 있다.
kubectl get svc my-service -o yaml
apiVersion: v1
kind: Service
metadata:
labels:
app: MyApp
name: my-service
spec:
clusterIP: None
clusterIPs:
- None
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: MyApp
단일 스택과 이중 스택 간 서비스 전환
서비스는 단일 스택에서 이중 스택으로, 이중 스택에서 단일 스택으로 변경할 수 있다.
서비스를 단일 스택에서 이중 스택으로 변경하려면 원하는 대로
.spec.ipFamilyPolicy를SingleStack에서PreferDualStack또는RequireDualStack으로 변경한다. 이 서비스를 단일 스택에서 이중 스택으로 변경하면 쿠버네티스는 누락된 주소 계열의 것을 배정하므로 해당 서비스는 이제 IPv4와 IPv6 주소를 갖게된다..spec.ipFamilyPolicy를SingleStack에서PreferDualStack으로 업데이트하는 서비스 사양을 편집한다.
이전:
spec:
ipFamilyPolicy: SingleStack
이후:
spec:
ipFamilyPolicy: PreferDualStack
- 서비스를 이중 스택에서 단일 스택으로 변경하려면
.spec.ipFamilyPolicy를PreferDualStack에서 또는RequireDualStack을SingleStack으로 변경한다. 이 서비스를 이중 스택에서 단일 스택으로 변경하면 쿠버네티스는.spec.ClusterIPs배열의 첫 번째 요소 만 유지하고.spec.ClusterIP를 해당 IP 주소로 설정하고.spec.ipFamilies를.spec.ClusterIPs의 주소 계열로 설정한다.
셀렉터가 없는 헤드리스 서비스
셀렉터가 없는 서비스 및 .spec.ipFamilyPolicy가 명시적으로 설정되지 않은 경우 .spec.ipFamilyPolicy 필드의 기본값은 RequireDualStack 이다.
로드밸런서 서비스 유형
서비스에 이중 스택 로드밸런서를 프로비저닝하려면
.spec.type필드를LoadBalancer로 설정.spec.ipFamilyPolicy필드를PreferDualStack또는RequireDualStack으로 설정
참고: 이중 스택LoadBalancer유형 서비스를 사용하려면 클라우드 공급자가 IPv4 및 IPv6로드 밸런서를 지원해야 한다.
이그레스(Egress) 트래픽
비공개로 라우팅할 수 있는 IPv6 주소를 사용하는 파드에서 클러스터 외부 대상 (예: 공용 인터넷)에 도달하기 위해 이그레스 트래픽을 활성화하려면 투명 프록시 또는 IP 위장과 같은 메커니즘을 통해 공개적으로 라우팅한 IPv6 주소를 사용하도록 파드를 활성화해야 한다. ip-masq-agent 프로젝트는 이중 스택 클러스터에서 IP 위장을 지원한다.
참고: CNI 공급자가 IPv6를 지원하는지 확인한다.