320x100
320x100

실행중인 특정 파드의 개수 추가

# 특정 파드의 개수를 count개로 지정
# 이미 만들어진 pod에 대해서만 실행 가능
kubectl scale deployment [pod-name] --replicas=[count]

# 특정 파드 삭제
# scale로 증분한 파드들도 함께 삭제됨
kubectl delete deployment [pod-name]

 

 

 

 

yaml 파일로 Spec을 지정해 오브젝트 생성하기

- 쿠버네티스에서 사용가능한 API 버전 확인 (yaml 파일 작성전 반드시 확인)

# 모든 api의 버전 확인
kubectl api-versions

# 특정 오브젝트로 생성 시에 사용해야하는 apiVersion 확인
kubectl explane [object-name]

 

- 쿠버네티스 yaml 파일의 기본 속성

apiVersion: [오브젝트를 포함한 API의 버전]
kind: [오브젝트의 종류]

: apiVersion은 사용할 오브젝트에 따라 다름

 

- Deployment 오브젝트를 사용한 예시

apiVersion: apps/v1
kind: Deployment
metadata:
	name: [service-name]
    labels: [description]
spec:
	replicas: [number of pods]
    containers:
    - name: [container-name]
      image: [container-image repo name of docker hub]

 

 

 

 

 

실행중인 파드에 대해 yaml 파일의 변경사항 적용

kubectl apply -f [image-file]

: apply로 생성한 오브젝트가 아닌 경우 경고 발생

: 처음부터 apply 명령으로 오브젝트를 생성하는 것을 권장

 

 

 

 

 

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

# i = stdin
# t = tty
# 호스트의 터미널에서 결과를 바로 확인하려면 /bin/bash 대신 다른 명령어 입력
kubectl exec -it [pod-name] -- /bin/bash

 

 

 

 

 

파드 상태 값 확인하기

# 열 이름:내용 값
kubectl get pods \
-o=custom-columns=NAME:.metadata.name,IP:.status.pod,STATUS:.status.phase,NODE:.spec.nodeName


# 배포된 파드의 내용을 yaml 파일로 저장
kubectl get pods [pod-name] -o yaml > pod-content.yaml

 

- 저장된 파일 내용

apiVersion: v1
kind: Pod
metadata:
  annotations:
    cni.projectcalico.org/podIP: 172.16.103.132/32
  creationTimestamp: "2023-06-04T10:05:07Z"
  generateName: echo-hname-7894b67f-
  labels:
    app: nginx
    pod-template-hash: 7894b67f
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:metadata:
        f:generateName: {}
        f:labels:
          .: {}
          f:app: {}
          f:pod-template-hash: {}
        f:ownerReferences:
          .: {}
          k:{"uid":"fcc70446-cef8-4c13-acab-988ba5140ce9"}:
            .: {}
            f:apiVersion: {}
            f:blockOwnerDeletion: {}
            f:controller: {}
            f:kind: {}
            f:name: {}
            f:uid: {}
      f:spec:
        f:containers:
          k:{"name":"echo-hname"}:
            .: {}
            f:image: {}
            f:imagePullPolicy: {}
            f:name: {}
            f:resources: {}
            f:terminationMessagePath: {}
            f:terminationMessagePolicy: {}
        f:dnsPolicy: {}
        f:enableServiceLinks: {}
        f:restartPolicy: {}
        f:schedulerName: {}
        f:securityContext: {}
        f:terminationGracePeriodSeconds: {}
    manager: kube-controller-manager
    operation: Update
    time: "2023-06-04T10:05:07Z"
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:metadata:
        f:annotations:
          .: {}
          f:cni.projectcalico.org/podIP: {}
    manager: calico
    operation: Update
    time: "2023-06-04T10:05:08Z"
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:status:
        f:conditions:
          k:{"type":"ContainersReady"}:
            .: {}
            f:lastProbeTime: {}
            f:lastTransitionTime: {}
            f:status: {}
            f:type: {}
          k:{"type":"Initialized"}:
            .: {}
            f:lastProbeTime: {}
            f:lastTransitionTime: {}
            f:status: {}
            f:type: {}
          k:{"type":"Ready"}:
            .: {}
            f:lastProbeTime: {}
            f:lastTransitionTime: {}
            f:status: {}
            f:type: {}
        f:containerStatuses: {}
        f:hostIP: {}
        f:phase: {}
        f:podIP: {}
        f:podIPs:
          .: {}
          k:{"ip":"172.16.103.132"}:
            .: {}
            f:ip: {}
        f:startTime: {}
    manager: kubelet
    operation: Update
    time: "2023-06-04T10:05:50Z"
  name: echo-hname-7894b67f-48p8m
  namespace: default
  ownerReferences:
  - apiVersion: apps/v1
    blockOwnerDeletion: true
    controller: true
    kind: ReplicaSet
    name: echo-hname-7894b67f
    uid: fcc70446-cef8-4c13-acab-988ba5140ce9
  resourceVersion: "41834"
  selfLink: /api/v1/namespaces/default/pods/echo-hname-7894b67f-48p8m
  uid: b500fc3b-5341-49de-88dc-ddaf7d167f3a
spec:
  containers:
  - image: sysnet4admin/echo-hname
    imagePullPolicy: Always
    name: echo-hname
    resources: {}
    terminationMessagePath: /dev/termination-log
    terminationMessagePolicy: File
    volumeMounts:
    - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
      name: default-token-95cpx
      readOnly: true
  dnsPolicy: ClusterFirst
  enableServiceLinks: true
  nodeName: w2-k8s
  priority: 0
  restartPolicy: Always
  schedulerName: default-scheduler
  securityContext: {}
  serviceAccount: default
  serviceAccountName: default
  terminationGracePeriodSeconds: 30
  tolerations:
  - effect: NoExecute
    key: node.kubernetes.io/not-ready
    operator: Exists
    tolerationSeconds: 300
  - effect: NoExecute
    key: node.kubernetes.io/unreachable
    operator: Exists
    tolerationSeconds: 300
  volumes:
  - name: default-token-95cpx
    secret:
      defaultMode: 420
      secretName: default-token-95cpx
status:
  conditions:
  - lastProbeTime: null
    lastTransitionTime: "2023-06-04T10:05:07Z"
    status: "True"
    type: Initialized
  - lastProbeTime: null
    lastTransitionTime: "2023-06-04T10:05:50Z"
    status: "True"
    type: Ready
  - lastProbeTime: null
    lastTransitionTime: "2023-06-04T10:05:50Z"
    status: "True"
    type: ContainersReady
  - lastProbeTime: null
    lastTransitionTime: "2023-06-04T10:05:07Z"
    status: "True"
    type: PodScheduled
  containerStatuses:
  - containerID: docker://ff2175ae47db87416129c2d1d5a0ca4a33a0e76f9038964bcb215f47da5c2871
    image: docker.io/sysnet4admin/echo-hname:latest
    imageID: docker-pullable://docker.io/sysnet4admin/echo-hname@sha256:a01efe0311050cbb42bd11ea8aa219460dc36cabbae0d17c3816dc9d1b2e1d40
    lastState: {}
    name: echo-hname
    ready: true
    restartCount: 0
    started: true
    state:
      running:
        startedAt: "2023-06-04T10:05:49Z"
  hostIP: 192.168.1.102
  phase: Running
  podIP: 172.16.103.132
  podIPs:
  - ip: 172.16.103.132
  qosClass: BestEffort
  startTime: "2023-06-04T10:05:07Z"

 

 

 

 

 

특정 노드에 파드가 생성되지 않도록 설정

# 지정한 노드에 파드 생성을 제한
kubectl cordon [node-name]

# cordon 명령어의 적용 여부 확인
# 실행 시 확인하면 SchedulingDisabled 상태가 됨
kubectl get nodes

# cordon 해제
kubectl uncordon [node-name]

: cordon 명령 이후 파드의 수를 늘려도 해당 노드에는 추가로 배포된 파드가 없음을 알 수 있다

: node의 상태는

 

 

 

 

 

 

노드에 있는 파드를 옮기기

# drain = 지정된 노드에 파드가 생성되지 않도록 설정
# --ignore-damonsets 옵션을 추가하여 DaemonSet 경고를 무시하도록 설정
kubectl drain [node-name] --ignore-damonsets

# drain 명령어의 적용 여부 확인
# 실행 시 확인하면 SchedulingDisabled 상태가 됨
kubectl get nodes

: 지정된 노드에 있던 파드를 삭제하고 다른 노드에서 파드를 생성함

 

 

 

 

 

오브젝트 업데이트 (pod 업데이트)

# --record = 파드 업데이트에 대한 배포 정보 히스토리를 기록
kubectl apply -f [image-file] --record

# 파드의 상태 확인
kubectl rollout status deployment [pod-name]

# --record 옵션으로 기록된 히스토리 확인
# 실행 명령어를 알 수 있음
kubectl rollout history deployment [pod-name]

# 배포된 파드에 속해있는 컨테이너의 헤더 정보 확인
curl -I --silent [container-ip] | grep Server

# 파드의 컨테이너 버전 업데이트
kubectl set image deployment [pod-name]

 

 



 

파드 복구

# 파드의 상태를 자세히 확인
# 어떤 과정으로 인해 파드에 문제가 있는지 확인할 수 있음
kubectl describe deployment [pod-name]

# 롤백 수행
# 바로 직전 Revision으로 파드를 복구
kubectl rollout undo depolyment [pod-name]

# 특정 시점으로 파드 복구
# revision n으로 복구
kubectl rollout undo deployment [pod-name] --to-revision=[n]

 

 

 

 

 

 

Reference

 

컨테이너 인프라 환경 구축을 위한 쿠버네티스/도커 - YES24

실무에 바로 적용할 수 있는 컨테이너 인프라 환경 기술!IT 자원을 효율적으로 빠르게 사용할 수 있는 방법으로 컨테이너 환경이 거론되었으나 그동안 관리가 어렵고 복잡해서 상용되기 어려웠

www.yes24.com

 

[k8s][따배쿠] 쿠버네티스 아키텍처 - yaml 템플릿과 API Version

https://www.youtube.com/watch?v=9kk_C4nUmWc&list=PLApuRlvrZKohaBHvXAOhUD-RxD0uQ3z0c&index=9 본 포스팅은 따배쿠(따라하면서 배우는 쿠버네티스) 4-2. 쿠버네티스 아키텍처 - yaml 템플릿과 API 편을 보고 정리한 내용입니

kimjingo.tistory.com

300x250
728x90