본문 바로가기

Data Engineering

[Kubernetes] Deployment

쿠버네티스 명령들이 잘 실행되지 않아 다음과 같이 minikube를 삭제하고 다시 시작하였다.

[rocky@localhost kube1]$ minikube delete
🔥  docker 의 "minikube" 를 삭제하는 중 ...
🔥  Deleting container "minikube" ...
🔥  /home/rocky/.minikube/machines/minikube 제거 중 ...
💀  "minikube" 클러스터 관련 정보가 모두 삭제되었습니다
[rocky@localhost kube1]$ minikube start --driver=docker

deloyment001.yml

apiVersion: apps/v1 # 버전, 앱관련
kind: Deployment    # 리소스의 종류
metadata:
 name: echo-deploy  # 이름
spec:               # 사양
 replicas: 4        # 생성할 파드의 수
 selector:          # 파드를 선택하는 기준
  matchLabels:      # 라벨을 기준으로 파드를 생성
   app: echo        # app=echo 라벨을 가진 파드를 선택
   tier: app        # tier=app 라벨을 가진 파드를 선택
 template:         # 파드 템플릿
  metadata:        # 파드의 메타데이터
   labels:         # 파드라벨
    app: echo
    tier: app 
  spec:            # 파드사양
   containers:     # 파드에 적재될 컨테이너
    - name: echo
      image: ghcr.io/subicura/echo:v1

[rocky@localhost kube1]$ kubectl apply -f deployment001.yml
deployment.apps/echo-deploy created
# 히스토리 확인
kubectl rollout history deploy/echo-deploy

# revision 1 히스토리 상세 확인
kubectl rollout history deploy/echo-deploy --revision=1

# 바로 전으로 롤백
kubectl rollout undo deploy/echo-deploy

# 특정 버전으로 롤백
kubectl rollout undo deploy/echo-deploy --to-revision=2

deployment002.yml

apiVersion: apps/v1 	# 버전, 앱관련이므로
kind: Deployment		# 리소스의 종류
metadata:		
  name: echo-deploy-st	# 이름
spec:				# 사양
  replicas: 4		# 생성할 파드의 수
  selector:			# 파드를 선택하는 기준
    matchLabels:		# 라벨을 기준으로 파드를 생성
      app: echo		# app=echo 라벨을 가진 파드를 선택
      tier: app		# tier=app 라벨을 가진 파드를 선택
  minReadySeconds: 5	# 새로운 파드는 최소 5초동안  실행하고 준비상태
  strategy:
    type: RollingUpdate
    rollingUpdate:		# 파드가 생성되고 준비되면 오래된 파드는 삭제
      maxSurge: 3		# 업데이트중에 원하는 최대 파드수
      maxUnavailable: 3	# 업데이트중에 최대 3개 의 사용불능파드
  template:		# 파드 템플릿
    metadata:		# 파드의 메타데이터
      labels:		# 파드라벨
        app: echo
        tier: app
    spec:			# 파드사양
      containers:	# 파드에 적재될 컨테이너
        - name: echo
          image: ghcr.io/subicura/echo:v1
          livenessProbe:	# 파드의 생존여부 확인
            httpGet:
              path: /
              port: 3000
[rocky@localhost kube1]$ kubectl apply -f deployment002.yml
deployment.apps/echo-deploy-st created

image 변경

[rocky@localhost kube1]$ kubectl set image deploy/echo-deploy-st echo=ghcr.io/subicura/echo:v2
deployment.apps/echo-deploy-st image updated

이벤트 확인

[rocky@localhost kube1]$ kubectl describe deploy/echo-deploy-st

multi-pod-service.yml

apiVersion: apps/v1
kind: Deployment
metadata:
 name: redis
spec:
 selector:
  matchLabels:
   app: counter
   tier: db
 template:
  metadata:
   labels:
    app: counter
    tier: db
  spec:
   containers:
    - name: redis
      image: redis
      ports:
         - containerPort: 6379
           protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
 name: redis
spec:
 ports:
  - port: 6379
    protocol: TCP
 selector:
  app: counter
  tier: db
[rocky@localhost kube1]$ kubectl apply -f multi-pod-service.yml
deployment.apps/redis created
service/redis created

실행중인 것들 확인하기

[rocky@localhost kube1]$ kubectl get all

삭제하기

[rocky@localhost kube1]$ kubectl delete --all deployment
deployment.apps "echo-deploy" deleted
deployment.apps "echo-deploy-st" deleted
deployment.apps "redis" deleted
[rocky@localhost kube1]$ kubectl delete --all service
service "kubernetes" deleted
service "redis" deleted

재실행

[rocky@localhost kube1]$ kubectl apply -f multi-pod-service.yml
deployment.apps/redis created
service/redis created
[rocky@localhost kube1]$ kubectl get all
NAME                         READY   STATUS    RESTARTS   AGE
pod/redis-694bccc6cd-g9sn6   1/1     Running   0          9s

NAME                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
service/kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP    87s
service/redis        ClusterIP   10.110.87.81   <none>        6379/TCP   9s

NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/redis   1/1     1            1           9s

NAME                               DESIRED   CURRENT   READY   AGE
replicaset.apps/redis-694bccc6cd   1         1         1       9s
[rocky@localhost kube1]$

counter-app.yml

apiVersion: apps/v1
kind: Deployment
metadata:
 name: counter
spec:
 selector:
  matchLabels:
   app: counter
   tier: app
 template:
  metadata:
   labels:
    app: counter
    tier: app
  spec:
   containers:
    - name: counter
      image: ghcr.io/subicura/counter:latest
      env:
       - name: REDIS_HOST
         value: "redis"
       - name: REDIS_PORT
         value: "6379"
[rocky@localhost kube1]$ kubectl apply -f counter-app.yml
deployment.apps/counter created
[rocky@localhost kube1]$ kubectl get all
NAME                         READY   STATUS              RESTARTS   AGE
pod/counter-75b6b4b5-nts2b   0/1     ContainerCreating   0          4s
pod/redis-694bccc6cd-g9sn6   1/1     Running             0          5m59s

NAME                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
service/kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP    7m17s
service/redis        ClusterIP   10.110.87.81   <none>        6379/TCP   5m59s

NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/counter   0/1     1            0           4s
deployment.apps/redis     1/1     1            1           5m59s

NAME                               DESIRED   CURRENT   READY   AGE
replicaset.apps/counter-75b6b4b5   1         1         0       4s
replicaset.apps/redis-694bccc6cd   1         1         1       5m59s
[rocky@localhost kube1]$

실행중인 컨테이너에 접근하기

[rocky@localhost kube1]$ kubectl get po
NAME                     READY   STATUS    RESTARTS   AGE
counter-75b6b4b5-nts2b   1/1     Running   0          67s
redis-694bccc6cd-g9sn6   1/1     Running   0          7m2s
[rocky@localhost kube1]$ kubectl exec -it ^C
[rocky@localhost kube1]$ kubectl exec -it counter-75b6b4b5-nts2b -- sh
/app # curl localhost:3000
1
/app # telnet redis 6379
Connected to redis
^C
Console escape. Commands are:

 l	go to line mode
 c	go to character mode
 z	suspend telnet
 e	exit telnet
/app # 
/app #

kubectl 명령어 alias 설정

[rocky@localhost kube1]$ alias k="kubectl"

counter-nodeport.yml

apiVersion: v1
kind: Service
metadata:
 name: counter-np
spec:
 type: NodePort
 ports:
  - port: 3000
    protocol: TCP
    nodePort: 31000
 selector:
  app: counter
  tier: app
[rocky@localhost kube1]$ k apply -f counter-nodeport.yml
service/counter-np created
[rocky@localhost kube1]$ k get svc
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
counter-np   NodePort    10.111.7.96    <none>        3000:31000/TCP   40s
kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP          41m
redis        ClusterIP   10.110.87.81   <none>        6379/TCP         40m
[rocky@localhost kube1]$

counter-lb.yml

apiVersion: v1
kind: Service
metadata:
 name: counter-lb
spec:
 type: LoadBalancer
 ports:
  - port: 30000
    targetPort: 3000
    protocol: TCP
 selector:
  app: counter
  tier: app
[rocky@localhost kube1]$ gedit counter-lb.yml
[rocky@localhost kube1]$ k apply -f counter-lb.yml
service/counter-lb created
[rocky@localhost kube1]$ k get svc
NAME         TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)           AGE
counter-lb   LoadBalancer   10.98.6.125    <pending>     30000:30107/TCP   47s
counter-np   NodePort       10.111.7.96    <none>        3000:31000/TCP    3h22m
kubernetes   ClusterIP      10.96.0.1      <none>        443/TCP           4h2m
redis        ClusterIP      10.110.87.81   <none>        6379/TCP          4h1m
[rocky@localhost kube1]$