쿠버네티스 사용법 관련한 내용을 소개합니다.
목차
Toggle파드를 생성하는 방법 – 쿠버네티스 사용법
#파드 생성
kubectl run ngix-pod --image=nginx
#확인
kubectl get pod
#파드 생성
kubectl create deployment dpy-nginx --image-nginx
#확인
kubectl get pods
#파드 확인
kube get pods -o wide
#웹페이지 정보 받아오기
curl 172.16.221.129
- run 명령 : 단일 파드 1개만 생성, 관리됨(예> 초코파이 1개)
- create deployment : 디플로이먼트라는 관리 그룹 내에서 파드가 생성(예> 초코파이 상자 안의 초코파이 1개)
오브젝트
오브젝트 : Spect과 Status 등의 값을 가지고 있는 파드와 디플로이먼트를 개별 속성을 포함해 부르는 단위
기본 오브젝트
- Pod : 쿠버네티스에서 실행되는 최소 단위, 웹서비스 구동에 필요한 최소 단위. 독립적인 공간과 사용 가능한 IP로 구성
- Namespace : 쿠버네티스 클러스터에서 리소스들을 구분해 관리하는 그룹
- Volumn : Pod가 사용할 수 있는 디렉토리.
- Service : Pod 접속을 안정적으로 유지하도록 서비스를 통해 내/외부로 연결, 즉 쿠버네티스 외부에서 부커네티스 내부로 접속할 때 내부가 어떤 구조로 돼 있는지, 파드가 살았는지 죽었는지 신경 쓰지 않아도 이를 논리적으로 연결하는 것
- Deployment : 파드에 기반을 두고 레플리카셋 오브젝트를 합쳐 놓은 형태.
kubectl create deployment dpy-hname --image=sysnet4admin/echo-hname
kubectl get pods
kubectl delete deployment dpy-hname
레플라카셋으로 파드 수 관리하기
- 다수의 파드를 만드는 레플리카셋 오브젝트를 제공.
kubectl scale deployment dpy-nginx --replicas=3
스펙을 지정해 오브젝트 생성하기
- 오브젝트 스펙 : yaml 파일
- echo-hname.yaml – ep.111
#쿠버네티스 API 버전 확인
kubectl api-versions
# 생성
kubectl create -f ~/xxx/echo-hname.yaml
kubectl get pods
sed -i 's/replicas:3/replicas: 6/' ~/xxxx/echo-hname.yaml
#-i : --in-place 변경한 내용을 현재 파일에 바로 적용
#s/ : 주어진 패턴을 원하는 패턴으로 변경
# 변경 내용 확인
cat ~/xxxx/echo-hname.yaml | grep replicas
# 변경 파일 적용
kubectl create -f ~/xxxx/echo-hname.yaml
#Error 발생
apply 오브젝트 생성하고 관리하기
kubectl apply -f ~/xxx/echo-hname.yaml
# warning : 처음부터 apply로 생성하지 않았기 때문, 이제 apply로 사용하자.
파드의 컨테이너 자동 복구 방법
- Self-Healing : 자동 복구 기술, 제대로 작동하지 않는 컨테이너를 다시 시작하거나 교페해 파드가 정상적으로 작돋하게 함.
# pod ip 확인
kubectl get pods -o wide
# 파드 컨테이너의 Shell에 접속
kubectl exec -it nginx-pod -- /bin/bash
#i : stdin(standard input), 표준입력
#t : tty(teletypewriter)
#it : 표준 입력을 명령줄 인터페이스로 작성할 것임.
# nginx-pod에 /bin/bash를 실행해 nginx-pod의 컨테이너에서 bash shell에 접속
# -- : exec 대한 인자값을 나누고 싶을 때 사용 : kubectl exec -it nginx-pod -- ls -l /run
파드의 동작 보증 기능
- 파드 자체에 문제가 발생하면 자동 복구해서 정상동작하게 함.
#파드 삭제
kubectl delete pods echo-hname-xxxxxxx
#해당 파드가 삭제되고 다시 생성됨.
#echo-hname은 디플로이트에 속한 파드임.
#replicas를 6으로 선언했으므로 디플로이먼트는 파드수를 유지함.
#전체 파드 지우기
kubectl delete deployment echo-hname
노드 자원 보호하기
- 노드 : 쿠버네티스 스케줄러에서 파드를 할당받고 처리하는 역할 담당.
# 생성
kubectl apply -f ~/xxx/echo-hname.yaml
# 확장 9
kubectl scale deployment echo-hname --replicas=9
# 내용 저장
kubectl get pod echo-hname-xxx -o yaml > pod.yaml
# 감소 3
kubectl scal deployment echo-hname --replicas=3
#노드에서 문제가 자주 발생해 현재 상태 보존
kubectl cordon w3-k8s
#w3-k8s 노드들 중 하나
#확인
kubectl get nodes
# 재확장 9
kubectl scale deployment echo-hname --replicas=9
#w3-k8s 노드에는 파드 생성이 안됨
#해제
kubectl uncordon w3-k8s
#확인
kubectl get nodes
노드 유지보수하기 – 쿠버네티스 사용법
- 정기 또는 비정기적인 유지보수를 위해 노드를 꺼야 하는 상황이 발생
- kubectl drain : 유지보수할 노드를 파드가 없는 상태로 만듬.
kubectl drain w3-k8s --ignore-daemonsets
kubectl uncordon w3-k8s
# 디플로이먼트 삭제
kubectl delete -f ~/xxx/echo-hname.yaml
파드 업데이트하고 복구하기
- 파드 업데이트하기
# image: nginx:1.15.12 업데이트
#--record : 배포한 정보의 히스토리 기록
kubectl apply -f ~/xxx/rollout-nginx.yaml --record
#히스토리 확인
kubectl rollout history deployment rollout-nginx
#nginx 컨테이너 버젼 확인
curl -I --silent 172.16.103.143 | grep Server
# nginx 컨테이너 버전 1.16.0 업데이트
kubectl set image deployment rollout-nginx nginx=nginx:1.16.0 --record
#Deployment 상태 확인
kubectl rollout status deployment rollout-nginx
#rollout-nginx 적용된 명령들 확인
kubectl rollout history deployment rollout-nginx
- 업데이트 실패 시 파드 복구하기
#버전 잘못 입력
kubectl set image deployment rollout-nginx nginx=nginx:1.17.3 --record
#오류 상세 확인
kubectl describe deployment rollout-nginx
#사용했던 명령들 확인
kubectl rollout history deployment rollout-nginx
# 마지막단계(revision 3) -> 전단계(revision 2)로 되돌림
kubectl rollout undo deployment rollout-nginx
- 특정 시점으로 파드 복구하기
# 특정 시점 revision 1로 돌아감
kubectl rollout undo deployment rollout-nginx --to-revision=1
#새로 생성된 파드들의 IP 확인
kubectl get pods \\\\
-o=custom-columns=NAME:.metadata.name,IP:.status.podIP,STATUS:.status.phase,NODE:.spec.nodeName
# 버젼 확인
curl -I --silent 172.16.103.150 | grep Server
# 다음 단계를 위해 디플로이먼트 삭제
kubectl delete -f ~/xxx/rollout-nginx.yaml
# 확인
kubectl get pods
쿠버네티스 연결을 담당하는 서비스
- NodePort 서비스 : 외부에서 쿠버네티스 클러스터의 내부에 접속하는 방법
- 노드포트 서비스로 외부에서 접속하기
# 파드 생성
kubectl create deployment np-pods --image=sysnet4admin/echo-hname
# Pod Check
kubectl get pods
# NodePort Service Creation
kubectl create -f ~/xxx/nodeport.yaml
# Service Check
kubectl get services
# Worker Node IP Check
kubectl get nodes -o wide
- 부하 분산 테스트하기
# Pod scale up 3
kubectl scale deployment np-pods --replicas=3
# Pod Check
kubectl get pods
- expose로 노드포트 서비스 생성하기
# NodePore Creation
kubectl expose deployment np-pods --type=NodePort --name=np-svc-v2 --port=80
# Service Check
kubectl get services
# Delete
kubectl delete deployment np-pods
kubectl delete services np-svc
kubectl delete services np-svc-v2
사용 목적별로 연결하는 인그레스
- 노드포트 서비스 : 1개의 노드포트에 1개의 디폴로이먼트만 매칭
- Ingress : 고유한 주소를 제공해 사용 목적에 따라 다른 응답을 제공, 트래픽에 대한 L4/L7 로드밸런서오 보안 인증서를 처리하는 기능을 제공
# Deployment 2 unit(in-hname-pod, in-ip-pod) Deploy
kubectl create deployment in-hname-pod --image=sysnet4admin/echo-hname
kubectl create deployment in-ip-pod --image=sysnet4admin/echo-ip
# Pod Check
kubectl get pods
# NGINX Ingress Controller Installation
kubectl apply -f ~/xxx/ingress-nginx.yaml
# NGINX IC Check
kubectl get pods -n ingress-nginx
# 사용자 요구 사항에 맞게 설정하기 위한 경로와 작동 정의
kubectl apply -f ~/xxx/ingress-config.yaml
# Ingress Check
kubectl get ingress
# Ingress Check on yaml
kubectl get ingress -o yaml
# 외부에 NGINX 인그레스 컨트롤러에 접속할 수 있게 노드포트 서비스로 NGINX 인그레스 컨트롤러를 외부에 노출
kubectl apply -f ~/xxx/ingress.yaml
kubectl get services -n ingrss-nginx
# 외부 노출
kubectl expose deployment in-hname-pod --name=hname-svc-default --port=80,443
kubectl expose deployment in-ip-pod --name=ip-svc --port=80,443
# Serice Check
kubectl get services
# Delete
kubectl delete deployment in-hname-pod
kubectl delete deployment in-ip-pod
kubectl delete services hname-svc-default
kubectl delete services ip-svc
kubectl delete -f ~/xxx/ingress-nginx.yaml
클라우드에서 쉽게 구성 가능한 로드밸런서
- NodePort 는 비효율적임
- LoadBalancer
#클라우드에서 로드밸런서 사용
kubectl expose deployment ex-lb --type==LoadBalancer --name=ex-svc
kubectl get services ex-svc
온프레미스에서 로드밸런서를 제공하는 MetalLB
- MetalLB : 온프레미스에서 로드밸런서를 사용하게 하는 구성.
kubectl create deployment lb-hname-pods --images=sysnet4admin/echo-hname
kubectl scale deplyment lb-hname-pods --replicas=3
kubectl get pods
#MetalLB 적용
kubectl apply -f ~/xxx/metallb.yaml
#확인
kubectl get pods -n metallb-system -o wide
# MetallLb Config apply
kubectl apply -f ~/xxx/metallb-l2config.yaml
# Config map 생성 여부 확인
kubectl get configmap -n matallb-system
# Config Check
kubectl get configmap -n metallb-system -o yaml
# expose loadbalancer
kubectl expose deployment lb-hname-pods --type=LoadBalancer --name=lb-hname-svc --port=80
kubectl expose deployment lb-ip-pods --type==LoadBalancer --name=lb-ip-svc --port=80
# Delete
kubectl delete deployment in-hname-pods
kubectl delete deployment in-ip-pods
kubectl delete services lb-hname-svc
kubectl delete services ip-ip-svc
부하에 자동으로 파드 수를 조절하는 HPA
- HPA(Horizontal Pod Autoscaler) : 부하량에 따라 디폴이먼트의 파드 수를 유동적으로 관리하는 기능
#디폴이먼트 1개 생성
kubectl create deployment hpa-hname-pods --image=sysnet4admin/echo-hname
#로드밸런서 서비스 바로 설정
kubectl expose deployment hpa-hname-pods --type=LoadBalancer --name=hpa-hname-svc --port=80
# LoadBalancer Service , IP Check
kubectl get services
# Budden Check
kubectl top pods
- Metrics-Server : 계측값을 수집하고 전달해주는 서버
- 메트릭 서버의 원본 소스
https://github.com/kubernetes-sigs/metrics-server
kubectl -f ~/xxx/metrics-server.yaml
kubectl top pods
kubectl edit deployment hpa-hname-pods
- 10m : 파드의 CPU 0.01 사용을 기준으로 파드를 증성하게 설정
# CPU 50% over -> autoscale
kubectl audoscale deployment hpa-hname-pods --min=1 --max=30 --cpu-percent=50
- 예> CPU : 10m, CPU : 50% 설정했다고 가정
- 29m 이면 29m/5 = 6, 증가하는 파드수는 6개임.
#hpa Info
kubectl get hpa
# Delete
kubectl delete deployment hpa-hname-pods
kubectl delete hpa hpa-hname-pods
kubectl delete service hap-hname-svc
kubectl delete -f ~/xxx/metrics-server.yaml
쿠버네티스 오브젝트
데몬셋
kubectl get pods -n metallb-system -o wide
#Worker node add
vagrant up w4-k8s
kubectl get pods -n metallb-system -o wide -w
# Check DaemonSet
kubectl get pods speaker-vnc2k -o yaml -n metallb-system
컨피그맵
- 설정을 목적으로 하는 오브젝트
kubectl create deployment cfgmap --image=sysnet4admin/echo-hname
kubectl expose deployment cfgmap --type=LoadBalancer --name=cfgmap-svc --port=80
kubectl get services
cat ~/xxxx/metallb-l2config.yaml | grep 192.
sed -i 's/11/21/;s/13/23/' ~/xxx/metallb-l2config.yaml
cat ~/xxx/metallb-l2config.yaml | grep 192.
kubectl apply -f ~/xxx/metallb-12config.yaml
kubectl delete pods --all -n metallb-system
kubectl get pods -n metallb-system
kubectl delete service cfgmap-svc
kubectl expose deployment cfgmap --type=LoadBalancer --name=cfgmap-svc --port=80
kubectl get services
kubectl delete deployment cfgmap
kubectl delete service cfgmap-svc
PV와 PVC
- PV : PersistentVolume(지속적으로 사용 가능한 볼륨)
- PVC : PersistentVolumeClaim(지속적으로 사용 가능한 볼륨 요청)
- 임시 : emptyDir
- 로컬 : host Path, local
- 원격 : persistentVolumeClaim, …
- 특수 목적 : downwardAPI, configMap
- 클라우드 : awsElasticBlockStore, azureDisk, gcePersistentDisk
- NFS 볼륨에 PV/PVC를 만들고 파드에 연결하기