20210824 (화) kubectl 활용
9:40 review
Kubernetes : Google Borg project → CNCF Foundation
Kubernetes Architecture
Control Plane : Kubernetes를 제어하는 메인 서버
API Server : Kubernetes 구성요소들이 API 통신을 사용하여 API 서버와 통신
Kubernetes 구성요소를 관리 감독하는 역할을 수행함
Key-Value Storage (etcd)
Kubernetes 상태 정보를 저장하는 Key-Value Storage. API Server와 동일한 정보를 가지고 있음
Scheduler
새로 생성되는 파드(Pod)를 감지하고 적절한 노드에 할당
Controller Manager
API Server를 통해 지속적으로 Kubernetes Cluster를 감시하고 필요한 상태로 이행하는 역할 수행
- Node Controller : 노드 관리
- Replication Controller : Replication Controller를 사용하는 모든 Object를 관리
- Endpoint Controller : Service와 Pod를 연결함
- Service Account, Token Controller : Kubernetes의 Namespace, Account, Token 담당
Cloud Controller Manager
Cloud환경을 지원하기 위한 Controller
Node
Kubernetes Cluster에서 컨테이너의 실행 런타임 환경을 제공하고 동작중인 Pod를 유지하는 역할을 수행
Kubelet
각 노드에 위치하는 에이전트로 Control Plane으로부터 제공 받은 Pod의 구성정보를 바탕으로 컨테이너를 실행
Kube-proxy
Host레벨의 네트워크 규칙을 구성하고 외부 연결과 Pod를 연결하는 역할 수행
Container Runtime
컨테이너를 실행시키는 구성요소
- Docker
- containerd
- CRI-O 등...
Add-On : Kubernetes Cluster에 추가할 수 있는 확장기능 제공
Cluster DNS
Kubernetes Cluster 내의 여러 오브젝트에 대한 DNS 레코드 제공하여 DNS주소기반으로 탐색이 가능
(Object : Pod, Container, Service 등)
**컨테이너 환경에서 IP기반으로 찾으면 IP 할당이 변경되었을 시, 찾아갈 수가 없음 (비고정)
Kubernetes API 버전 종류
- Alpha Version API
실험적인 기능을 포함하는 API 버전
버전 이름에 alpha가 포함됨
지원이 별도의 공지없이 중단될 가능성이 있음
- Beta Version API
버전 이름에 beta가 포함됨
alpha보다 성숙된 API Version
다음 버전에서 호환성이 깨지는 형태로 변경될 수 있으나 마이그레이션을 지원
- Stable Version API
버전 이름이 vX 형태임 (X가 정수)
Kubernetes API 그룹
Kubernetes 에서 기능을 추가할 때 확장할 수 있도록 함
Core 그룹 :
YAML - apiVersion : API_VER
HTTP REST API - /api/API_VER
Core 이외의 그룹 :
YAML - apiVersion:Group/API_VER
HTTP REST API - /api/GROUP/API_VER
Kubernetes 오브젝트 관리
- 명령형 커맨드
kubectl 명령어에 인수나 옵션을 사용하여 애플리케이션을 관리함
일회성 작업
개발환경에서 사용하며 가장 단순한 작업
- 명령형 오브젝트 구성
오브젝트를 VAML 파일이나 JSON 파일에 저장
vagrant@kube-control1:~/.kube$ kubectl get nodes -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME kube-control1 Ready master 19h v1.19.11 192.168.200.11 <none> Ubuntu 20.04.3 LTS 5.4.0-81-generic docker://20.10.8 kube-node1 Ready <none> 19h v1.19.11 192.168.200.21 <none> Ubuntu 20.04.2 LTS 5.4.0-81-generic docker://20.10.8 kube-node2 Ready <none> 19h v1.19.11 192.168.200.22 <none> Ubuntu 20.04.2 LTS 5.4.0-81-generic docker://20.10.8 kube-node3 Ready <none> 18h v1.19.11 192.168.200.23 <none> Ubuntu 20.04.2 LTS 5.4.0-81-generic docker://20.10.8 vagrant@kube-control1:~/.kube$ kubectl get nodes NAME STATUS ROLES AGE VERSION kube-control1 Ready master 19h v1.19.11 kube-node1 Ready <none> 19h v1.19.11 kube-node2 Ready <none> 19h v1.19.11 kube-node3 Ready <none> 19h v1.19.11 vagrant@kube-control1:~/.kube$ kubectl get nodes -o json vagrant@kube-control1:~/.kube$ kubectl version vagrant@kube-control1:~/.kube$ kubectl cluster-info vagrant@kube-control1:~/.kube$ kubectl create -f nginx.yaml vagrant@kube-control1:~/.kube$ kubectl delete -f nignx.yaml vagrant@kube-control1:~/.kube$ kubectl delete -f apps/ |
##### 명령어로 컨테이너 애플리케이션 배포 ##### vagrant@kube-control1:~/.kube$ kubectl create deployment nginx --image nginx vagrant@kube-control1:~/.kube$ kubectl get deployments,replicasets,pods NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/nginx 1/1 1 1 3m6s NAME DESIRED CURRENT READY AGE replicaset.apps/nginx-6799fc88d8 1 1 1 3m6s NAME READY STATUS RESTARTS AGE pod/nginx 1/1 Running 0 51m pod/nginx-6799fc88d8-pjzrr 1/1 Running 0 3m6s vagrant@kube-control1:~/.kube$ kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx 1/1 Running 0 50m 192.168.233.193 kube-node2 <none> <none> nginx-6799fc88d8-pjzrr 1/1 Running 0 2m39s 192.168.9.66 kube-node1 <none> <none> vagrant@kube-control1:~/.kube$ curl http://192.168.9.66 ##### p50 컨테이너 애플리케이션 : 매니페스트 파일로 컨테이너 애플리케이션 배포 ##### vagrant@kube-control1:~$ cat test-deployment.yml apiVersion: apps/v1 kind: Deployment metadata: name: photoview-deployment spec: replicas: 5 → replica 5개 생성 selector: matchLabels: app: photo-view template: metadata: labels: app: photo-view env: stage spec: containers: - image: asashiho/photoview-image name: photoview-container ports: - containerPort: 80 vagrant@kube-control1:~$ kubectl create -f test-deployment.yml → manifest 파일 실행(생성) deployment.apps/photoview-deployment created ##### kubectl scale 명령 실습 ##### vagrant@kube-control1:~$ kubectl get pod -o wide → replica 5개 생성확인 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES my-nginx-pod 1/1 Running 0 80m 192.168.233.195 kube-node2 <none> <none> nginx-label 1/1 Running 0 20m 192.168.119.134 kube-node3 <none> <none> nginx-port 1/1 Running 0 38m 192.168.119.133 kube-node3 <none> <none> photoview-deployment-f75796b47-7jpzl 1/1 Running 0 2m21s 192.168.9.74 kube-node1 <none> <none> photoview-deployment-f75796b47-dn86b 1/1 Running 0 2m21s 192.168.9.73 kube-node1 <none> <none> photoview-deployment-f75796b47-dx2ch 1/1 Running 0 2m21s 192.168.233.199 kube-node2 <none> <none> photoview-deployment-f75796b47-tgkv6 1/1 Running 0 2m21s 192.168.119.137 kube-node3 <none> <none> photoview-deployment-f75796b47-z5mfk 1/1 Running 0 2m21s 192.168.233.198 kube-node2 <none> <none> vagrant@kube-control1:~$ kubectl scale deployment photoview-deployment --replicas=6 → replica 6개로 스케일업 deployment.apps/photoview-deployment scaled vagrant@kube-control1:~$ kubectl get pod -o wide → 추가 확인 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES my-nginx-pod 1/1 Running 0 85m 192.168.233.195 kube-node2 <none> <none> nginx-label 1/1 Running 0 25m 192.168.119.134 kube-node3 <none> <none> nginx-port 1/1 Running 0 43m 192.168.119.133 kube-node3 <none> <none> photoview-deployment-f75796b47-7jpzl 1/1 Running 0 7m47s 192.168.9.74 kube-node1 <none> <none> photoview-deployment-f75796b47-dn86b 1/1 Running 0 7m47s 192.168.9.73 kube-node1 <none> <none> photoview-deployment-f75796b47-dx2ch 1/1 Running 0 7m47s 192.168.233.199 kube-node2 <none> <none> photoview-deployment-f75796b47-jz7fv 1/1 Running 0 12s 192.168.119.138 kube-node3 <none> <none> photoview-deployment-f75796b47-tgkv6 1/1 Running 0 7m47s 192.168.119.137 kube-node3 <none> <none> photoview-deployment-f75796b47-z5mfk 1/1 Running 0 7m47s 192.168.233.198 kube-node2 <none> <none> ##### 로드밸런서 설정 및 서비스 동작 확인 ##### vagrant@kube-control1:~$ cat test-service.yml apiVersion: v1 kind: Service metadata: name: webserver spec: type: LoadBalancer ports: - port: 80 targetPort: 80 protocol: TCP selector: app: photo-view vagrant@kube-control1:~$ kubectl apply -f test-service.yml service/webserver created vagrant@kube-control1:~$ kubectl apply -f test-service.yml service/webserver created vagrant@kube-control1:~$ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 24h webserver LoadBalancer 10.102.202.200 192.168.200.200 80:32462/TCP 6s ▶ external-ip로 서비스 접속 가능 : 192.168.200.200 vagrant@kube-control1:~$ kubectl delete -f test-deployment.yml deployment.apps "photoview-deployment" deleted |
https://metallb.universe.tf/
퍼블릭 클라우드의 경우 벤더사의 로드밸런서가 설정되겠지만
on-premise 환경에서는 로드밸런서가 따로 준비되지 않으므로 metallb를 통해 로드밸런서 설정을 할 수 있다.
##### manifestfile을 이용한 metallb namespace 생성 ##### vagrant@kube-control1:~$ kubectl create -f https://raw.githubusercontent.com/metallb/metallb/v0.10.2/manifests/namespace .yaml namespace/metallb-system created vagrant@kube-control1:~$ kubectl get namespaces NAME STATUS AGE default Active 22h kube-node-lease Active 22h kube-public Active 22h kube-system Active 22h metallb-system Active 11s vagrant@kube-control1:~$ kubectl create -f https://raw.githubusercontent.com/metallb/metallb/v0.10.2/manifests/metallb.yaml (wget을 통해 다운로드 후 실행해도 됨) ##### manifestfile을 이용한 metallb 설정 ##### vagrant@kube-control1:~$ mkdir -p work/metallb vagrant@kube-control1:~$ cd work/metallb vagrant@kube-control1:~/work/metallb$ vim metallb-config.yaml vagrant@kube-control1:~/work/metallb$ cat metallb-config.yaml apiVersion: v1 kind: ConfigMap metadata: namespace: metallb-system name: config data: config: | address-pools: - name: default protocol: layer2 addresses: - 192.168.200.200-192.168.200.210 → worker노드들과 겹치지 않는 범위 지정필요 vagrant@kube-control1:~/work/metallb$ kubectl create -f metallb-config.yaml configmap/config created vagrant@kube-control1:~/work/metallb$ kubectl get namespaces NAME STATUS AGE default Active 22h kube-node-lease Active 22h kube-public Active 22h kube-system Active 22h metallb-system Active 7m5s vagrant@kube-control1:~/work/metallb$ kubectl get pods -n metallb-system NAME READY STATUS RESTARTS AGE controller-6b78bff7d9-9wsnz 1/1 Running 0 4m48s speaker-bvsnw 1/1 Running 0 4m48s speaker-ffbhd 1/1 Running 0 4m48s speaker-pcsgr 1/1 Running 0 4m48s speaker-xc4st 1/1 Running 0 4m48s |
application 배포단위 : pod
Kubernetes 에서 컨테이너를 실행하고 배포할 수 있는 가장 작은 단위
pod ≠ container
##### manifests 파일을 통한 pod 생성 ##### vagrant@kube-control1:~/work/20210824$ cat nginx-pod.yaml apiVersion: v1 → Kubernetes API Version 지정 kind: Pod → 생성할 Kubernetes Object 종류 metadata: → Object 정의 내용 (Object 이름) name: my-nginx-pod → Pod 이름 spec: → Object Spec 정의 containers: → Container 정의 - name: my-nginx-container → Container 이름 image: nginx:latest → Container 이미지 ports: → Port 정의 - containerPort: 80 → Container에서 여는 포트 지정 protocol: TCP → Protocol 지정 vagrant@kube-control1:~/work/20210824$ kubectl create -f nginx-pod.yaml vagrant@kube-control1:~/work/20210824$ kubectl get pods -o wide vagrant@kube-control1:~/work/20210824$ kubectl describe pod POD(my-nginx-pod) → 상세 정보 출력 vagrant@kube-control1:~/work/20210824$ kubectl logs POD(my-nginx-pod) → 파드 로그 확인 ##### port-foward ##### vagrant@kube-control1:~/work/20210824$ kubectl port-forward nginx-port 1234:80 Forwarding from 127.0.0.1:1234 -> 80 Forwarding from [::1]:1234 -> 80 → 쉘프롬프트가 없이 프로세스가 동작중일때만 포트포워딩이 실행됨. Ctrl+C로 중단되면 포트포워딩이 종료됨. https://kubernetes.io/ko/docs/tasks/access-application-cluster/port-forward-access-application-cluster/ ##### Label ##### vagrant@kube-control1:~/work/20210824$ cat label.yaml apiVersion: v1 kind: Pod metadata: name: nginx-label labels: env: test → env,apn 등은 customize 가능 apn: web-pub spec: containers: - name: my-nginx-label image: nginx:latest ports: - containerPort: 80 protocol: TCP vagrant@kube-control1:~/work/20210824$ kubectl create -f label.yaml pod/nginx-label created vagrant@kube-control1:~/work/20210824$ kubectl get pods --show-labels → get pod를 하면서 레이블 출력 옵션 NAME READY STATUS RESTARTS AGE LABELS my-nginx-pod 1/1 Running 0 62m <none> nginx-label 1/1 Running 0 106s apn=web-pub,env=test nginx-port 1/1 Running 0 19m run=nginx-port vagrant@kube-control1:~/work/20210824$ kubectl get pods -L apn,env → apn,env에 label에 속한 pod 정렬 NAME READY STATUS RESTARTS AGE APN ENV my-nginx-pod 1/1 Running 0 63m nginx-label 1/1 Running 0 3m24s web-pub test nginx-port 1/1 Running 0 21m vagrant@kube-control1:~/work/20210824$ kubectl label pods my-nginx-pod env=test → 기존 pod에 label 추가 pod/my-nginx-pod labeled vagrant@kube-control1:~/work/20210824$ kubectl get pods --show-labels NAME READY STATUS RESTARTS AGE LABELS my-nginx-pod 1/1 Running 0 67m env=test nginx-label 1/1 Running 0 7m9s apn=web-pub,env=test nginx-port 1/1 Running 0 25m run=nginx-port |