클라우드 네이티브 Contrail Networking NodePort 서비스 지원
주니퍼 네트웍스 Kubernetes 오케스트레이션 환경에서 클라우드 네이티브 Contrail® Networking 릴리스 22.1 이상 을™ 사용하여 환경에서 Kubernetes NodePort 서비스를 지원합니다.
Kubernetes에서 서비스는 논리적 포드 세트와 해당 포드에 액세스할 수 있는 정책을 정의하는 추상화입니다. 서비스를 구현하는 포드 집합은 서비스 정의의 개체를 LabelSelector
기반으로 선택됩니다. NodePort 서비스는 정적 포트에서 각 노드의 IP에 서비스를 노출합니다. 각 노드의 정적 포트를 포드에서 애플리케이션 포트로 매핑합니다.
Contrail Networking Kubernetes NodePort 서비스는 리소스와 FloatingIP
리소스를 InstanceIP
사용하여 구현되며 이 두 가지 모두 서비스와 유사 ClusterIP
합니다.
Kubernetes는 모든 포드가 서로 대화할 수 있는 플랫 네트워킹 모델을 제공합니다. 네트워크 정책이 추가되어 포드 간에 보안을 제공합니다. Kubernetes와 통합된 Contrail Networking 멀티 테넌시, 네트워크 격리, 네트워크 정책을 통한 마이크로세그먼테이션, 로드 밸런싱 등 추가적인 네트워킹 기능을 추가합니다.
다음 표에는 Kubernetes 개념과 Contrail Networking 리소스 간의 매핑이 나와 있습니다.
Kubernetes 개념 | Contrail Networking 리소스 |
---|---|
네임 스페이스 | 공유 또는 단일 프로젝트 |
포드 | 가상 머신 |
서비스 | ECMP(Equal-cost multipath) LoadBalancer |
진입 | URL용 HAProxy LoadBalancer |
네트워크 정책 | Contrail Security |
Contrail Networking Load Balancer 객체
그림 1 과 다음 목록은 Contrail Networking 로드 밸런서 객체에 대해 설명합니다.
- Contrail Networking 각 서비스는 로드 밸런서 객체로 표시됩니다.
- 각 서비스 포트에 대해 동일한 서비스 로드 밸런서에 대해 리스너 객체가 생성됩니다.
- 각 리스너에 대해 풀 객체가 있습니다.
- 풀에는 멤버가 포함됩니다. 백엔드 포드의 수에 따라 하나의 풀에 여러 구성원이 있을 수 있습니다.
- 풀의 각 멤버 객체는 백엔드 포드 중 하나로 매핑됩니다.
contrail-kube-manager
Kubernetes 서비스를 들어kube-apiserver
보십시오. 서비스가 생성되면 유형native
이 있는 로드 밸런서 객체loadbalancer_provider
가 생성됩니다.- 로드 밸런서에는 서비스 IP 주소와 동일한 가상 IP 주소(VIP)가 있습니다.
- 서비스 IP/VIP 주소는 각 백엔드 포드의 인터페이스에 연결됩니다. 이는 ECMP 로드 밸런서 드라이버로 수행됩니다.
- 서비스 IP 주소에서 여러 백엔드 포드의 인터페이스로의 연결은 Contrail Networking ECMP 다음 홉을 생성합니다. 트래픽은 소스 포드에서 백엔드 포드 중 하나로 직접 로드 밸런서가 됩니다.
- 모든
contrail-kube-manager
변경 사항에 대한 수신을 계속합니다kube-apiserver
. 엔드포인트contrail-kube-manager
의 pod 목록을 기반으로 가장 현재 백엔드 포드를 알고 풀에서 멤버를 업데이트합니다.
NodePort Service in Contrail Networking
컨트롤러 서비스는 에서 kube-manager
구현됩니다. 은 kube-manager
(는) 서비스와 같은 Kubernetes 코어 리소스와 및 와 같은 확장된 Contrail 리소스 VirtualNetwork
RoutingInstance
간의 인터페이스입니다. 이 컨트롤러 서비스는 리소스 엔드포인트를 통과하는 이벤트를 모니터링합니다. 엔드포인트는 서비스와 관련된 모든 변경에 대한 이벤트를 수신합니다. 또한 엔드포인트는 서비스 선택기와 일치하는 포드 생성 및 삭제에 대한 이벤트를 수신합니다. 컨트롤러 서비스는 필요한 Contrail 리소스 생성을 처리합니다. 그림 2를 참조하십시오.
InstanceIP
관련 리소스ServiceNetwork
FloatingIP
리소스 및 관련VirtualMachineInterfaces
사용자가 서비스를 생성하면 Kubernetes에서 관련 엔드포인트가 자동으로 생성되어 컨트롤러 서비스가 새로운 요청을 수신할 수 있습니다.
NodePort 서비스 생성 워크플로우
그림 3 과 다음 단계는 NodePort 서비스가 생성되면 워크플로우를 자세히 설명합니다.
- NodePort 서비스가 생성
InstanceIP
되면(IIP) 생성됩니다. 리소스는InstanceIP
고정 IP 주소와 참조된 가상 네트워크의 서브넷에 속하는 특성을 지정합니다. - 엔드포인트가 NodePort 서비스에 연결되면 은(는)
FloatingIP
생성됩니다.kube-manager
서비스에 연결된 엔드포인트를 생성하는 것을 감시합니다. - 새 엔드포인트가 생성
kube-manager
되면 서브넷에 을(를InstanceIP
ServiceVirtualNetwork
) 생성합니다. 그런 다음 은kube-manager
(는) 을(를FloatingIP
InstanceIP
) 부모로 사용하여 을(를) 생성합니다. - 리소스는
FloatingIP
특정VirtualMachineInterface
(VMI)에 속하지 않는 특별한 종류의 IP 주소를 지정합니다. 은FloatingIP
(는) 별도의VirtualNetwork
서브넷에서 할당되며 여러 VMI와 연결할 수 있습니다. 여러 VMI와 연결되면 로 향하는FloatingIP
트래픽은 모든 VMI에서 ECMP를 사용하여 분산됩니다.
VMI에 대한 참고 사항:
- VMI는 pod와 레이블이 추가 및 삭제됨에 따라 동적으로 업데이트됩니다.
- VMI는 가상 네트워크에 대한 인터페이스(포트)를 나타내며, 해당 가상 머신이 있을 수도 있고 없을 수도 있습니다.
- VMI에는 최소한 MAC 주소 및 IP 주소가 있습니다.
VM에 대한 참고 사항:
- VM 리소스는 컴퓨팅 컨테이너를 나타냅니다. 예를 들어 VM, 베어메탈, 포드 또는 컨테이너와 같은 것입니다.
- 각 VM은 정책 제한에 따라 동일한 테넌트 네트워크에서 다른 VM과 통신할 수 있습니다.
- 테넌트 네트워크가 분리되어 있으므로, 한 테넌트에서 VM은 정책에 의해 특별히 허용되지 않는 한 다른 테넌트에서 VM과 통신할 수 없습니다.
Kubernetes 프로브 및 Kubernetes NodePort 서비스
각 노드에서 실행되는 에이전트인 은 kubelet
(는) 활기와 준비 프로브를 위해 포드에 대한 도달 가능성이 필요합니다. Contrail 네트워크 정책은 노드와 포드 간의 연결성을 제공하기 위해 IP 패브릭 네트워크와 포드 네트워크 사이에 생성됩니다. 포드 네트워크가 생성되면, 네트워크 정책은 노드와 포드 간의 연결성을 제공하기 위해 포드 네트워크에 연결됩니다. 결과적으로 노드의 모든 프로세스는 포드에 도달할 수 있습니다.
Kubernetes NodePort 서비스는 포드에 대한 노드 연결성을 기반으로 합니다. Contrail Networking Contrail 네트워크 정책을 통해 노드와 포드 간의 연결을 제공하기 때문에 NodePort는 지원됩니다.
NodePort 서비스는 다음 두 가지 유형의 트래픽을 지원합니다.
- 동서(East-West)
- 패브릭에서 포드로
NodePort 서비스 포트 매핑
Kubernetes NodePort 서비스에 대한 포트 매핑은 YAML 파일의 FloatingIp
리소스에 있습니다. 에서 FloatingIp
포트는 에 "floatingIpPortMappings"
추가됩니다.
targetPort
서비스에 이(가) 언급되지 않은 경우, port
이 값은 기본값으로 지정됩니다.
포트 세부 정보가 포함된 NodePort 서비스에 대한 YAML 파일 예 spec
:
spec: clusterIP: 10.100.13.106 clusterIPs: - 10.100.13.106 ports: - port: 80 protocol: TCP targetPort: 80 selector: run: my-nginx sessionAffinity: None
위의 예 spec
인 YAML "floatingIpPortMappings"
은 리소스에서 FloatingIp
생성됩니다.
YAML 예 "floatingIpPortMappings"
:
"floatingIpPortMappings": { "portMappings": [ { "srcPort": 80, "dstPort": 80, "protocol": "TCP" } ] }
예: NodePort 서비스 요청 여정
서비스 요청이 백엔드 포드에 도달할 때까지 요청이 노드 포트에 도달할 때부터 NodePort 서비스 요청의 여정을 따르도록 합시다.
Nodeport 서비스는 에 kubeproxy
의존합니다. Kubernetes 네트워크 프록시(kube-proxy
)는 각 노드에서 실행되는 데몬입니다. 클러스터에 정의된 서비스를 반영하고 규칙을 관리하여 서비스의 백엔드 포드에 대한 요청을 로드 밸런시합니다.
다음 예시에서 NodePort 서비스가 apple-service
생성되고 엔드포인트가 연결됩니다.
user@domain ~ % kubectl describe svc apple-service Name: apple-service Namespace: default Labels: <none> Annotations: <none> Selector: app=apple Type: NodePort IP Families: <none> IP: 10.105.135.144 IPs: 10.105.135.144 Port: <unset> 5678/TCP TargetPort: 5678/TCP NodePort: <unset> 31050/TCP Endpoints: 10.244.0.4:5678 Session Affinity: None External Traffic Policy: Cluster Events: <none> user@domain ~ % kubectl get endpoints apple-service NAME ENDPOINTS AGE apple-service 10.244.0.4:5678 2d18h
서비스가 생성되거나 삭제되거나 엔드포인트가 수정 kube-proxy
될 때마다 클러스터의 각 노드에 대한 규칙을 업데이트합니다 iptables
. 요청의 여정을 iptables
이해하고 따르기 위해 체인을 봅니다.
첫째, KUBE-NODEPORTS 체인은 유형 NodePort
으로 서비스되는 패킷을 고려합니다.
$ sudo iptables -L KUBE-NODEPORTS -t nat
Chain KUBE-NODEPORTS (1 references)
target prot opt source destination
KUBE-MARK-MASQ tcp -- anywhere anywhere /* default/apple-service */ tcp dpt:31050
KUBE-SVC-Y4TE457BRBWMNDKG tcp -- anywhere anywhere /* default/apple-service */ tcp dpt:31050
포트 31050
로 들어오는 각 패킷은 먼저 KUBE-MARK-MASQ에 의해 처리되며, 이는 패킷에 값을 태그합니다 0x4000
.
다음으로 패킷은 KUBE-SVC-Y4TE457BRBWMNDKG 체인에서 처리됩니다(위의 KUBE-NODEPORTS 체인에서 참조). 이 체인을 자세히 살펴보면 추가적인 iptables 체인을 확인할 수 있습니다.
$ sudo iptables -L KUBE-SVC-Y4TE457BRBWMNDKG -t nat
Chain KUBE-SVC-Y4TE457BRBWMNDKG (2 references)
target prot opt source destination
KUBE-SEP-LCGKUEHRD52LOEFX all -- anywhere anywhere /* default/apple-service */
KUBE-SEP-LCGKUEHRD52LOEFX 체인을 검사하여 애플리케이션을 실행하는 apple-service
백엔드 포드 중 하나에 대한 라우팅을 정의하는지 확인합니다.
$ sudo iptables -L KUBE-SEP-LCGKUEHRD52LOEFX -t nat Chain KUBE-SEP-LCGKUEHRD52LOEFX (1 references) target prot opt source destination KUBE-MARK-MASQ all -- 10.244.0.4 anywhere /* default/apple-service */ DNAT tcp -- anywhere anywhere /* default/apple-service */ tcp to:10.244.0.4:5678
이것은 서비스 요청이 백엔드 포드에 도달할 때까지 요청이 노드 포트에 도달할 때부터 NodePort 서비스 요청의 여정을 완료합니다.
외부 트래픽 정책의 로컬 옵션 제한
설정된 NodePort Local
서비스는 externalTrafficPolicy
Contrail Networking 릴리스 22.1에서 지원되지 않습니다.
이 externalTrafficPolicy
서비스는 외부 트래픽을 node-local 또는 cluster-wide 엔드포인트로 라우팅하기를 원하는 경우 를 표시합니다.
Local
클라이언트 소스 IP 주소를 보존하고 NodePort 유형 서비스에 대한 두 번째 홉을 방지합니다.Cluster
클라이언트 소스 IP 주소를 가리고 다른 노드에 두 번째 홉을 일으킬 수 있습니다.
Cluster
은(는) 의 기본값입니다 externalTrafficPolicy
.
서비스 업데이트 또는 삭제, 또는 서비스에서 포드 제거
- 서비스 업데이트 - 변경 가능한 모든 필드는 및
Namespace
을(를) 제외하고Name
변경할 수 있습니다. 예를 들어, 서비스 YAML 정의의Type
필드를 변경하여 Nodeport 서비스를 로 변경할ClusterIp
수 있습니다. - 서비스 삭제 — 명령과 관계없이
Type
서비스를 삭제할 수 있습니다.kubectl delete -n <name_space> <service_name>
- 서비스에서 포드 제거 - 서비스 또는 포드에서 및
Selector
을(를Labels
) 변경하여 달성할 수 있습니다.