쿠버네티스 사용법

쿠버네티스 사용법 관련한 내용을 소개합니다.

파드를 생성하는 방법 – 쿠버네티스 사용법

#파드 생성
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를 만들고 파드에 연결하기
Back to top