DevOps/Kubernetes

[Kubernetes] 2. Pod, Deployment, YAML

ddonghyeo 2023. 9. 23. 22:49

1. Pod

κ°„λ‹¨ν•œ νŒŒλ“œ μ‹€ν–‰(YAML없이)은 μ•„λž˜ λͺ…λ Ήμ–΄λ‘œ κ°€λŠ₯ν•˜λ‹€.

# νŒŒλ“œ μ‹€ν–‰ (μ»¨ν…Œμ΄λ„ˆ ν•˜λ‚˜)
$ kubectl run {νŒŒλ“œμ΄λ¦„} --image={μ»¨ν…Œμ΄λ„ˆμ΄λ―Έμ§€}

# λͺ¨λ“  νŒŒλ“œ 확인
$ kubectl get pods

# νŒŒλ“œ 정보 확인
$ kubectl get pod {νŒŒλ“œμ΄λ¦„}

# νŒŒλ“œ 상세 정보 확인
$ kubectl describe pod {νŒŒλ“œμ΄λ¦„}

# νŒŒλ“œ μ‚­μ œ
$ kubectl delete pod {νŒŒλ“œμ΄λ¦„}

# λͺ¨λ“  νŒŒλ“œ μ‚­μ œ
$ kubectl delete pods --all

μœ„ λͺ…λ μ–΄λ‘œ νŒŒλ“œλ₯Ό μ‹€ν–‰ν•˜κ³ , 정보λ₯Ό 확인할 수 μžˆλ‹€.

각 νŒŒλ“œλ“€μ€ ν•œ λ…Έλ“œμ— λ°°μ •λœλ‹€.

νŒŒλ“œ 두 개λ₯Ό μƒμ„±ν•˜κ³ , μ•„λž˜ λͺ…λ Ήμ–΄λ₯Ό 싀행해보면 λ…Έλ“œ 내에 νŒŒλ“œκ°€ μƒμ„±λœ 것을 λ³Ό 수 μžˆλ‹€.

$ kubectl describe node {λ…Έλ“œ 이름}

$ kubectl describe node docker-desktop

 

 

μΏ λ²„λ„€ν‹°μŠ€ λ‚΄μ—λŠ” νŒŒλ“œ 내에 μ»¨ν…Œμ΄λ„ˆ 개수λ₯Ό ν•œ 개 이상 μœ μ§€ν•œλ‹€.

κ·Έλ ‡λ‹€λ©΄, μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‚­μ œν•˜κ²Œ 되면 μ–΄λ–»κ²Œ 될까?

 

싀행쀑인 μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‚­μ œν•˜κ³  λ‹€μ‹œ μ‘°νšŒν•΄λ³΄λ‹ˆ, μ‹λ³„μžκ°€ λ‹€λ₯Έ μ»¨ν…Œμ΄λ„ˆκ°€ λ‹€μ‹œ μ‹€ν–‰λœ 것을 λ³Ό 수 μžˆλ‹€.

 

μΏ λ²„λ„€ν‹°μŠ€κ°€ μƒˆλ‘œμš΄ μ»¨ν…Œμ΄λ„ˆλ‘œ νŒŒλ“œλ₯Ό λ³΅μ›ν•œ 것이닀.

 

μ•žμ„  ν¬μŠ€νŒ…μ—μ„œ μ„€λͺ…ν–ˆλ˜ μžκΈ°μˆ˜λ³΅μ„±(self-healing)의 성격이 λ“œλŸ¬λ‚œλ‹€.

 

 

 

2. Port-Forwarding

 

μ•žμ„œ μ‹€ν–‰ν–ˆλ˜ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ ν¬νŠΈν¬μ›Œλ”©ν•˜μ—¬ 접속해 보겠닀.

 

$ kubectl port-forward pod/{νŒŒλ“œ 이름} {λ“€μ–΄μ˜€λŠ” 포트}:{νŒŒλ“œμ˜ 포트}

$ kubectl port-forward pod/hello-kiamol 8080:80

 

νŒŒλ“œμ˜ ν¬νŠΈν¬μ›Œλ”©μ΄ 된 것을 확인할 수 μžˆλ‹€.

 

 

 

3. Deployment

 

# λ””ν”Œλ‘œμ΄λ¨ΌνŠΈ 생성
$ kubectl create deployment {λ””ν”Œλ‘œμ΄λ¨ΌνŠΈμ΄λ¦„} --image={이미지이름}

# λ””ν”Œλ‘œμ΄λ¨ΌνŠΈ 좜λ ₯
$ kubectl get deploy

# λ””ν”Œλ‘œμ΄λ¨ΌνŠΈ μ‚­μ œ
$ kubectl delete deploy {λ””ν”Œλ‘œμ΄λ¨ΌνŠΈμ΄λ¦„}

# λ””ν”Œλ‘œμ΄λ¨ΌνŠΈ λͺ¨λ‘ μ‚­μ œ
$ kubectl delete deploy --all

μœ„ λͺ…λ Ήμ–΄λ‘œ deploymentλ₯Ό 생성할 수 μžˆλ‹€.

 

λ””ν”Œλ‘œμ΄λ¨ΌνŠΈλ₯Ό μƒμ„±ν•˜λ©΄, μžλ™μœΌλ‘œ λ””ν”Œλ‘œμ΄λ¨ΌνŠΈ 이름 뒀에 λ¬΄μž‘μœ„ λ¬Έμžμ—΄μ΄ 뢙은 νŒŒλ“œκ°€ μƒμ„±λœλ‹€.

 

μ—¬κΈ°μ„œ μ€‘μš”ν•œ 점은, λ””ν”Œλ‘œμ΄λ¨ΌνŠΈκ°€ νŒŒλ“œμ˜ '이름'을 ν†΅ν•΄μ„œ κ΄€λ¦¬ν•œλ‹€.

 

λ”°λΌμ„œ 이름을 λ³€κ²½ν•˜κ²Œ 되면, λ””ν”Œλ‘œμ΄λ¨ΌνŠΈμ˜ κ΄€λ¦¬μ—μ„œ λ²—μ–΄λ‚˜κ²Œ λœλ‹€.

 

 

λ””ν”Œλ‘œμ΄λ¨ΌνŠΈμ˜ ν¬νŠΈν¬μ›Œλ”©μ€ μ•„λž˜μ™€ κ°™λ‹€.

$ kubectl port-forward deploy/{λ””ν”Œλ‘œμ΄λ¨ΌνŠΈμ΄λ¦„} 8080:80

뒀에 생긴 λ¬΄μž‘μœ„ λ¬Έμžμ—΄μ„ μž…λ ₯ν•  ν•„μš”λŠ” μ—†κ³ , λ””ν”Œλ‘œμ΄λ¨ΌνŠΈκ°€ 가진 νŒŒλ“œ 쀑 ν•˜λ‚˜λ₯Ό λŒ€μƒμœΌλ‘œ μ§€μ •ν•˜κ²Œ λœλ‹€.

 

 

 

 

 

4. Application Menifest

 

μœ„μ—μ„œ μ‚΄νŽ΄λ³Έ νŒŒλ“œμ™€ λ””ν”Œλ‘œμ΄λ¨ΌνŠΈλŠ” κ°„λ‹¨ν•œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ°°ν¬μ—μ„œ μ‚¬μš©ν•  수 μžˆκ² λ‹€.

 

쑰금 더 λ³΅μž‘ν•œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 배포λ₯Ό μœ„ν•΄, μΏ λ²„λ„€ν‹°μŠ€ YAMLνŒŒμΌμ„ μ΄μš©ν•΄μ•Ό ν•œλ‹€.

 

- pod.yml

# μΏ λ²„λ„€ν‹°μŠ€ API 버전 & λ¦¬μ†ŒμŠ€ μœ ν˜•
apiVersion: v1
kind: Pod

#λ¦¬μ†ŒμŠ€μ˜ 이름(ν•„μˆ˜) & λ ˆμ΄λΈ”(ν•„μˆ˜X)
metadata:
  name: hello-kiamol-3

#λ¦¬μ†Œμ‹€ μ •μ˜ λ‚΄μš©
#μ‹€ν–‰ν•  μ»¨ν…Œμ΄λ„ˆ : 이름, 이미지
spec:
  containers:
    - name: web
      image: kiamol/ch02-hello-kiamol

 

YAMLνŒŒμΌμ„ μž‘μ„±ν–ˆμœΌλ©΄, μ•„λž˜ λͺ…λ Ήμ–΄λ‘œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ 배포할 수 μžˆλ‹€.

 

$ kubectl apply -f {yaml경둜}
pod/hello-kiamol-3 created


$ kubectl apply -f pod.yaml
NAME                              READY   STATUS    RESTARTS   AGE
hello-kiamol                      1/1     Running   2          3h35m
hello-kiamol-2-5dbf59b864-wjllt   1/1     Running   0          18m
hello-kiamol-3                    1/1     Running   0          9s

μƒˆλ‘œμš΄ νŒŒλ“œ hello-kiamol-3κ°€ μƒμ„±λœ 것을 λ³Ό 수 μžˆλ‹€.

 

선언적 슀크립트λ₯Ό 톡해 μ—¬λŸ¬ ν™˜κ²½μ—μ„œλ„ μ‹€ν–‰ν•  수 μžˆλŠ” ν™˜κ²½μ„ ꡬ좕할 수 μžˆλ‹€.

 

λ§Œμ•½ yaml이 외뢀에 μžˆμ–΄λ„ μ‹€ν–‰ν•  수 μžˆλ‹€.

 

$ kubectl apply -f https://raw.githubusercontent.com/sixeyed/kiamol/master/ch02/pod.yaml

 

yamlνŒŒμΌμ— λŒ€ν•œ μ •λ³΄λŠ” 곡식 λ¬Έμ„œμ—μ„œ μΆ”κ°€λ‘œ ν™•μΈν•΄λ³΄μž.

https://kubernetes.io/ko/docs/tasks/manage-kubernetes-objects/declarative-config/

 

ꡬ성 νŒŒμΌμ„ μ΄μš©ν•œ μΏ λ²„λ„€ν‹°μŠ€ 였브젝트의 μ„ μ–Έν˜• 관리

μΏ λ²„λ„€ν‹°μŠ€ μ˜€λΈŒμ νŠΈλŠ” μ—¬λŸ¬ 개의 였브젝트 ꡬ성 νŒŒμΌμ„ 디렉터리에 μ €μž₯ν•˜κ³  ν•„μš”μ— 따라 kubectl applyλ₯Ό μ‚¬μš©ν•˜μ—¬ μž¬κ·€μ μœΌλ‘œ 였브젝트λ₯Ό μƒμ„±ν•˜κ³  μ—…λ°μ΄νŠΈν•¨μœΌλ‘œμ¨ 생성, μ—…λ°μ΄νŠΈ 및 μ‚­μ œν• 

kubernetes.io

 

 

 

 

5. μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 관리

 

싀행쀑인 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— μ ‘κ·Όν•˜λŠ” 방법을 μ•Œμ•„λ³΄μž.

 

# μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λŒ€ν™”ν˜• μ…Έ 생성
$ kubectl exec -it {νŒŒλ“œμ΄λ¦„} sh

μœ„ λͺ…λ Ήμ–΄λ₯Ό 톡해 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 내에 접속할 수 μžˆλ‹€.

 

 

μ…Έ μ•ˆμ—μ„  λ‹€μŒ λͺ…λ Ήμ–΄λ‘œ ν…ŒμŠ€νŠΈν•΄λ³Ό 수 μžˆλ‹€.

 

#IP 확인
$ hostname -i

# μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ™μž‘ 확인
$ wget -O - http://localhost | head -n 4

# μ’…λ£Œ
$ exit

 

 

μ•„λž˜ λͺ…λ Ήμ–΄λŠ” μΏ λ²„λ„€ν‹°μŠ€ μ»¨ν…Œμ΄λ„ˆμ˜ 둜그λ₯Ό 좜λ ₯ν•  수 μžˆλ‹€.

 

# 전체 둜그 좜λ ₯
$ kubectl logs {νŒŒλ“œμ΄λ¦„}

# λ§ˆμ§€λ§‰ 두 쀄 둜그 좜λ ₯
$ kubectl logs --tail=2 {νŒŒλ“œμ΄λ¦„}

 

 

 

μ°Έκ³ 
Learn Kubernetes in a Month of Lunches: Stoneman, Elton
https://kubernetes.io/docs/reference/kubectl/