KEMBAR78
쿠버네티스 오픈 소스와 클라우드 매니지드 서비스 접점 소개 | PDF
쿠버네티스 오픈 소스와 클라우드 매니지드
서비스 접점 소개
최영락
한국마이크로소프트
2022년 5월
클라우드 매니지드 쿠버네티스 서비스
(Managed Kubernetes Services)
• 오픈 소스인 Kubernetes에 대한 서비스를 호스팅 형태로 제공
• “Cluster as a Service”
• 사용자 (고객) 구독에서 워크로드가 실행 & 호스트되는 노드 (nodes, worker nodes)들을 관리
• 해당 노드들을 관리하기 위한 클러스터 기능 및 사용자 (고객)이 사용하는 Customer Control Plane
(CCP)에 있는 컴포넌트들을 관리
• 자동화된 프로비저닝, 업그레이드 (Base OS 이미지, Kubernetes 버전), 동적 스케일링, 모니터링 지원
• 주요 접점에 대한 연동 컴포넌트
• Load balancers
• Persistent volumes
• DNS (e.g., Azure DNS)
• vNETs
• Kubenet
• Container Network Interfaces (e.g., Azure CNI), etc.
참고: 쿠버네티스 Control Plane 및 Node 핵심 컴포넌트
Control Plane
• Kube-apiserver
• Etcd
• Kube-scheduler
• Kube-controller-manager
• Kube-addon-manager
• TunnelEnd: (CCP tunnel side)
Nodes
• Kubelet
• Kube-proxy
• Container Runtime
• CoreDNS
• TunnelFront
한 눈에 보기: K8s vs AKS
Node 1
Network
Container Engine
Control Plane(1…N)
AKS Service Underlay VNET
Customer 1 Control Plane
Add-on Manager
Controller Manager TunnelEnd
Customer 2 Control Plane
Add-on Manager
Controller Manager TunnelEnd
Customer 3 Control Plane
Add-on Manager
Controller Manager TunnelEnd
Node N
Container Engine
Nodepool 1
CoreDNS
TunnelFront
Node 1
CoreDNS
TunnelFront
Node 2
Nodepool 1 (Linux) Nodepool 2 (Windows) Nodepool 1
Nodepool 2
Nodepool 3
Nodepool N
VNET
VirtualSubnet
VirtualSubnet
Node 1 Node 2
Node 3 Node 4
Node 5 Node 6
Node 7 Node 8
Node 9 Node 10
Node 11 Node 12
Node 13 Node 14
Node 15 Node N
VirtualSubnet
VirtualSubnet
Load Balancer Load Balancer Load Balancer
©Microsoft Corporation Azure
1. Load Balancer 이전에, Managed Cloud Network for K8s
: AKS Kubenet (basic CNI) & Azure CNI
• AKS Kubenet
• 디폴트 CNI
• 노드 IP 주소를 Azure 서브넷에서 가져옴
• Pod: 노드 내 논리 주소 영역에서 IP 주소를 가져옴
• Azure 가상 네트워크에 접근하기 위해 NAT가 구성됨
• Source IP 가 노드 주 IP 주소로 변환이 이루어짐
• 노드 서브넷: UDR (User-defined Routes, 사용자 정의 경로) 필수
• Azure CNI
• 노드 & Pod: 서브넷에서 IP 주소를 가져옴
• 각 노드는 1 + MaxPod 개수 만큼 IP 주소를 할당받아 가짐
• 다른 네트워크로 향하는 Pod 트래픽이 노드 IP를 통해 NAT를 얻음
• UDR을 필요로 하지 않음
AKS Kubenet
vs. Azure CNI
©Microsoft Corporation Azure
1. Load Balancer: MetalLB for K8s
https://metallb.universe.tf/installation/clouds/
©Microsoft Corporation Azure
1. Load Balancer: Managed K8s (e.g., AKS with LB)
$ cat azure-lb.yaml
apiVersion: v1
kind: Service
metadata:
name: azure-lb-websrv
spec:
type: LoadBalancer
ports:
- port: 80
targetPort: 8080
selector:
app: deploy-websrv
$ cat vote-lb.yaml
apiVersion: v1
kind: Service
metadata:
name: azure-vote-front
spec:
type: LoadBalancer
ports:
- port: 80
selector:
app: azure-vote-front
$ az aks create --resource-group dkos-with-aks --name aks-
with-basic-lb --node-count 1 --enable-addons monitoring --
generate-ssh-keys --load-balancer-sku basic
©Microsoft Corporation Azure
1. Load Balancer: Managed K8s (e.g., AKS with LB)
Azure:~$ az aks get-credentials --resource-group dkos-with-aks --name aks-with-basic-lb
Merged "aks-with-basic-lb" as current context in /home/ian/.kube/config
Azure:~$ kubectl apply -f echo-pod.yaml
deployment.apps/deploy-echo created
Azure:~$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
deploy-echo-56f947c867-nt6wp 0/1 ContainerCreating 0 8s <none> aks-nodepool1-43778350-vmss000000 <none> <none>
deploy-echo-56f947c867-sxrzm 0/1 ContainerCreating 0 8s <none> aks-nodepool1-43778350-vmss000000 <none> <none>
deploy-echo-56f947c867-w77sd 0/1 ContainerCreating 0 8s <none> aks-nodepool1-43778350-vmss000000 <none> <none>
Azure:~$ kubectl apply -f azure-lb.yaml
service/azure-lb-websrv created
Azure:~$ kubectl get svc -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
azure-lb-websrv LoadBalancer 10.0.84.162 <pending> 80:30071/TCP 12s app=deploy-websrv
kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 6m29s <none>
Azure:~$ kubectl get svc -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
azure-lb-websrv LoadBalancer 10.0.84.162 52.231.197.251 80:30071/TCP 22s app=deploy-websrv
kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 6m39s <none>
Azure:~$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
deploy-echo-56f947c867-nt6wp 1/1 Running 0 63s 10.244.0.9 aks-nodepool1-43778350-vmss000000 <none> <none>
deploy-echo-56f947c867-sxrzm 1/1 Running 0 63s 10.244.0.10 aks-nodepool1-43778350-vmss000000 <none> <none>
deploy-echo-56f947c867-w77sd 1/1 Running 0 63s 10.244.0.8 aks-nodepool1-43778350-vmss000000 <none> <none>
Azure:~$ kubectl apply -f vote-lb.yaml
service/azure-vote-front created
Azure:~$ kubectl apply -f public-svc.yaml
service/public-svc created
©Microsoft Corporation Azure
1. Load Balancer: Managed K8s (e.g., AKS with LB)
©Microsoft Corporation Azure
2. Persistent Volumes 이전에, 잠시 Volume 개요
[Volume]
• Pod 삭제시에도 스토리지를 통해
데이터를 계속 저장
• hostPath: 워커 노드의 로컬 디렉터리를
공유해 볼륨으로 사용 (링크)
• emptyDir: Pod 수명이 끝나기 전까지는
Pod가 재시작되어도 접근 가능한 볼륨
(링크)
• 별도 파일 시스템, 클라우드 스토리지와
연동하여 사용 가능 (Persistent Volume)
https://bit.ly/K8s-volume-basic
https://kubernetes.io/ko/docs/concepts/storage/volumes/
©Microsoft Corporation Azure
2. Persistent Volumes with Kubernetes
©Microsoft Corporation Azure
2. Persistent Volumes with Managed K8s – e.g., AKS
• azureDisk/azureFile 볼륨
플러그인 활용
• CSI (Container Storage Interface)
활용
https://kubernetes.io/ko/docs/concepts/storage/volumes
©Microsoft Corporation Azure
2. Persistent Volumes with Managed K8s – e.g., AKS
• 퍼시스턴스 볼륨 배포 확인 at Managed K8s – e.g., AKS
https://bit.ly/wordpress-with-managed-k8s
요약
• 쿠버네티스 오픈 소스로 실제 많이 사용되는 로드밸런서,
스토리지 등까지 배워보려면 MetalLB, Longhorn 등 직접 설치 필요
• 매니지드 쿠버네티스 서비스에서는 클라우드 프로바이더에서
제공하는 리소스와 연동
• 연동을 위한 대표적인 방식이 Interface를 통한 방식
• CNI (Container Network Interface): 네트워크 인터페이스
• CSI (Container Storage Interface): 스토리지 인터페이스
• 참고: CRI (Container Runtime Interface – with containerd, docker, cri-o, …)

쿠버네티스 오픈 소스와 클라우드 매니지드 서비스 접점 소개

  • 1.
    쿠버네티스 오픈 소스와클라우드 매니지드 서비스 접점 소개 최영락 한국마이크로소프트 2022년 5월
  • 2.
    클라우드 매니지드 쿠버네티스서비스 (Managed Kubernetes Services) • 오픈 소스인 Kubernetes에 대한 서비스를 호스팅 형태로 제공 • “Cluster as a Service” • 사용자 (고객) 구독에서 워크로드가 실행 & 호스트되는 노드 (nodes, worker nodes)들을 관리 • 해당 노드들을 관리하기 위한 클러스터 기능 및 사용자 (고객)이 사용하는 Customer Control Plane (CCP)에 있는 컴포넌트들을 관리 • 자동화된 프로비저닝, 업그레이드 (Base OS 이미지, Kubernetes 버전), 동적 스케일링, 모니터링 지원 • 주요 접점에 대한 연동 컴포넌트 • Load balancers • Persistent volumes • DNS (e.g., Azure DNS) • vNETs • Kubenet • Container Network Interfaces (e.g., Azure CNI), etc.
  • 3.
    참고: 쿠버네티스 ControlPlane 및 Node 핵심 컴포넌트 Control Plane • Kube-apiserver • Etcd • Kube-scheduler • Kube-controller-manager • Kube-addon-manager • TunnelEnd: (CCP tunnel side) Nodes • Kubelet • Kube-proxy • Container Runtime • CoreDNS • TunnelFront
  • 4.
    한 눈에 보기:K8s vs AKS Node 1 Network Container Engine Control Plane(1…N) AKS Service Underlay VNET Customer 1 Control Plane Add-on Manager Controller Manager TunnelEnd Customer 2 Control Plane Add-on Manager Controller Manager TunnelEnd Customer 3 Control Plane Add-on Manager Controller Manager TunnelEnd Node N Container Engine Nodepool 1 CoreDNS TunnelFront Node 1 CoreDNS TunnelFront Node 2 Nodepool 1 (Linux) Nodepool 2 (Windows) Nodepool 1 Nodepool 2 Nodepool 3 Nodepool N VNET VirtualSubnet VirtualSubnet Node 1 Node 2 Node 3 Node 4 Node 5 Node 6 Node 7 Node 8 Node 9 Node 10 Node 11 Node 12 Node 13 Node 14 Node 15 Node N VirtualSubnet VirtualSubnet Load Balancer Load Balancer Load Balancer
  • 5.
    ©Microsoft Corporation Azure 1.Load Balancer 이전에, Managed Cloud Network for K8s : AKS Kubenet (basic CNI) & Azure CNI • AKS Kubenet • 디폴트 CNI • 노드 IP 주소를 Azure 서브넷에서 가져옴 • Pod: 노드 내 논리 주소 영역에서 IP 주소를 가져옴 • Azure 가상 네트워크에 접근하기 위해 NAT가 구성됨 • Source IP 가 노드 주 IP 주소로 변환이 이루어짐 • 노드 서브넷: UDR (User-defined Routes, 사용자 정의 경로) 필수 • Azure CNI • 노드 & Pod: 서브넷에서 IP 주소를 가져옴 • 각 노드는 1 + MaxPod 개수 만큼 IP 주소를 할당받아 가짐 • 다른 네트워크로 향하는 Pod 트래픽이 노드 IP를 통해 NAT를 얻음 • UDR을 필요로 하지 않음 AKS Kubenet vs. Azure CNI
  • 6.
    ©Microsoft Corporation Azure 1.Load Balancer: MetalLB for K8s https://metallb.universe.tf/installation/clouds/
  • 7.
    ©Microsoft Corporation Azure 1.Load Balancer: Managed K8s (e.g., AKS with LB) $ cat azure-lb.yaml apiVersion: v1 kind: Service metadata: name: azure-lb-websrv spec: type: LoadBalancer ports: - port: 80 targetPort: 8080 selector: app: deploy-websrv $ cat vote-lb.yaml apiVersion: v1 kind: Service metadata: name: azure-vote-front spec: type: LoadBalancer ports: - port: 80 selector: app: azure-vote-front $ az aks create --resource-group dkos-with-aks --name aks- with-basic-lb --node-count 1 --enable-addons monitoring -- generate-ssh-keys --load-balancer-sku basic
  • 8.
    ©Microsoft Corporation Azure 1.Load Balancer: Managed K8s (e.g., AKS with LB) Azure:~$ az aks get-credentials --resource-group dkos-with-aks --name aks-with-basic-lb Merged "aks-with-basic-lb" as current context in /home/ian/.kube/config Azure:~$ kubectl apply -f echo-pod.yaml deployment.apps/deploy-echo created Azure:~$ kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES deploy-echo-56f947c867-nt6wp 0/1 ContainerCreating 0 8s <none> aks-nodepool1-43778350-vmss000000 <none> <none> deploy-echo-56f947c867-sxrzm 0/1 ContainerCreating 0 8s <none> aks-nodepool1-43778350-vmss000000 <none> <none> deploy-echo-56f947c867-w77sd 0/1 ContainerCreating 0 8s <none> aks-nodepool1-43778350-vmss000000 <none> <none> Azure:~$ kubectl apply -f azure-lb.yaml service/azure-lb-websrv created Azure:~$ kubectl get svc -o wide NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR azure-lb-websrv LoadBalancer 10.0.84.162 <pending> 80:30071/TCP 12s app=deploy-websrv kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 6m29s <none> Azure:~$ kubectl get svc -o wide NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR azure-lb-websrv LoadBalancer 10.0.84.162 52.231.197.251 80:30071/TCP 22s app=deploy-websrv kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 6m39s <none> Azure:~$ kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES deploy-echo-56f947c867-nt6wp 1/1 Running 0 63s 10.244.0.9 aks-nodepool1-43778350-vmss000000 <none> <none> deploy-echo-56f947c867-sxrzm 1/1 Running 0 63s 10.244.0.10 aks-nodepool1-43778350-vmss000000 <none> <none> deploy-echo-56f947c867-w77sd 1/1 Running 0 63s 10.244.0.8 aks-nodepool1-43778350-vmss000000 <none> <none> Azure:~$ kubectl apply -f vote-lb.yaml service/azure-vote-front created Azure:~$ kubectl apply -f public-svc.yaml service/public-svc created
  • 9.
    ©Microsoft Corporation Azure 1.Load Balancer: Managed K8s (e.g., AKS with LB)
  • 10.
    ©Microsoft Corporation Azure 2.Persistent Volumes 이전에, 잠시 Volume 개요 [Volume] • Pod 삭제시에도 스토리지를 통해 데이터를 계속 저장 • hostPath: 워커 노드의 로컬 디렉터리를 공유해 볼륨으로 사용 (링크) • emptyDir: Pod 수명이 끝나기 전까지는 Pod가 재시작되어도 접근 가능한 볼륨 (링크) • 별도 파일 시스템, 클라우드 스토리지와 연동하여 사용 가능 (Persistent Volume) https://bit.ly/K8s-volume-basic https://kubernetes.io/ko/docs/concepts/storage/volumes/
  • 11.
    ©Microsoft Corporation Azure 2.Persistent Volumes with Kubernetes
  • 12.
    ©Microsoft Corporation Azure 2.Persistent Volumes with Managed K8s – e.g., AKS • azureDisk/azureFile 볼륨 플러그인 활용 • CSI (Container Storage Interface) 활용 https://kubernetes.io/ko/docs/concepts/storage/volumes
  • 13.
    ©Microsoft Corporation Azure 2.Persistent Volumes with Managed K8s – e.g., AKS • 퍼시스턴스 볼륨 배포 확인 at Managed K8s – e.g., AKS https://bit.ly/wordpress-with-managed-k8s
  • 14.
    요약 • 쿠버네티스 오픈소스로 실제 많이 사용되는 로드밸런서, 스토리지 등까지 배워보려면 MetalLB, Longhorn 등 직접 설치 필요 • 매니지드 쿠버네티스 서비스에서는 클라우드 프로바이더에서 제공하는 리소스와 연동 • 연동을 위한 대표적인 방식이 Interface를 통한 방식 • CNI (Container Network Interface): 네트워크 인터페이스 • CSI (Container Storage Interface): 스토리지 인터페이스 • 참고: CRI (Container Runtime Interface – with containerd, docker, cri-o, …)