1. Pods - gomamon/k8s_study GitHub Wiki

Pods

podsλ‹¨μœ„λ‘œ μ»¨ν…Œμ΄λ„ˆλ“€μ„ λ¬Άμ–΄μ„œ 관리

μ»¨ν…Œμ΄λ„ˆλ§ˆλ‹€ μ—­ν•  λΆ€μ—¬ κ°€λŠ₯

νŒŒλ“œ λ‚΄ μ»¨ν…Œμ΄λ„ˆλ“€μ΄ 같은 λͺ©μ μœΌλ‘œ μžμ›κ³΅μœ 

νŒŒλ“œμ•ˆμ˜ μ»¨ν…Œμ΄λ„ˆλŠ” λͺ¨λ‘ ν•˜λ‚˜μ˜ λ…Έλ“œμ—μ„œ μ‹€ν–‰

νŒŒλ“œμ•ˆμ— μžˆλŠ” μ»¨ν…Œμ΄λ„ˆλ“€μ΄ ipν•˜λ‚˜λ₯Ό 곡유

νŒŒλ“œμ•ˆ μ»¨ν…Œμ΄λ„ˆμ™€ μ†Œν†΅ν• λ•ŒλŠ” μ»¨ν…Œμ΄λ„ˆλ§ˆλ‹€ λ‹€λ₯΄κ²Œ μ„€μ •ν•œ 포트 μ‚¬μš©

sample pod λ§Œλ“€κΈ° pod-sample.yaml

apiVersion: v1
kind: Pod
metadata:
  name: kubernetes-simple-pod
  labels:
    app: kubernetes-simple-pod
spec:
  containers:
    - name: kubernetes-simple-pod
      image: arisu1000/simple-container-app:latest
      ports:
      - containerPort: 8080
kubectl apply -f pod-sample.yaml
kubectl get pods

pod life cycle

  • pending
    • νŒŒλ“œ μ•ˆμ˜ 전체 μ»¨ν…Œμ΄λ„ˆκ°€ 싀행될 λ•ŒκΉŒμ§€ μ‹œκ°„μΌ κ±Έλ¦°λ‹€
  • running
    • νŒŒλ“œ μ•ˆμ— λͺ¨λ“  μ»¨ν…Œμ΄λ„ˆκ°€ 싀행쀑!
  • succeeded
    • νŒŒλ“œμ•ˆμ˜ 무돈 μ»¨ν…Œμ΄λ„ˆκ°€ 정상 μ‹€ν–‰μ’…λ£Œλœ μƒνƒœλ‘œ μž¬μ‹œμž‘ γ„΄γ„΄
  • failed
    • νŒŒλ“œ μ•ˆ μ»¨ν…Œμ΄λ„ˆ 쀑 μ •μƒμ μœΌλ‘œ μ‹€ν–‰ μ’…λ£Œ μ•ˆλœμ–˜κ°€ μžˆλ‹€λ‘œ
  • unknown
    • μƒνƒœν™•μΈ λΆˆκ°€.. ( νŒŒλ“œκ°€ μžˆλŠ” λ…Έλ“œμ™€ 톡신 λΆˆκ°€λŠ₯ν•œ μƒνƒœ)

νŒŒλ“œ statusν™•μΈν•˜κΈ°

kubectl describe pods νŒŒλ“œμ΄λ¦„

kubelet μ»¨ν…Œμ΄λ„ˆ 진단

kubelet이 μ»¨ν…Œμ΄λ„ˆλ₯Ό 주기적으둜 확인

  • livenessProbe: μ»¨ν…Œμ΄λ„ˆκ°€ μ‹€ν–‰λλŠ”μ§€ 확인, 진단에 μ‹€νŒ¨μ‹œ μ’…λ£Œμ‹œν‚€κ³  μž¬μ‹œμž‘!
  • readinessProbe: μ‹€μ œλ‘œ μ„œλΉ„μŠ€ μš”μ²­μ— 응닡할 수 μžˆλŠ”μ§€ 진단. 진단 μ‹€νŒ¨μ‹œ ν•΄λ‹Ή νŒŒλ“œμ— μ—°κ²°λ˜μ–΄μžˆλŠ” λͺ¨λ“  μ„œλΉ„μŠ€μ— μžˆλŠ” μ—”λ“œν¬μΈνŠΈ 제거

μ»¨ν…Œμ΄λ„ˆκ°€ κ΅¬ν˜„ν•œ handler을 kubelete이 ν˜ΈμΆœν•΄ μ»¨ν…Œμ΄λ„ˆλ₯Ό μ§„λ‹¨ν•œλ‹€.

  • container handler
    • ExecAction : μ§€μ •λœ λͺ…λ Ή μ‹€ν–‰, μ’…λ£Œμ½”λ“œ 0 β‡’ success
    • TCPSocketAction: μ»¨ν…Œμ΄λ„ˆ μ•ˆμ— μ—°κ²°λœ IP와 포트둜 TCPμƒνƒœ 확인, 포트 open β‡’ Success
    • HTTPGetAction: μ»¨ν…Œμ΄λ„ˆ μ•ˆ IP, port, path둜 http get requestλ₯Ό 보냄. HTTP response status 200~400 β‡’ Success

Init Container

app continerκ°€ μ‹€ν–‰λ˜κΈ°μ „ podsλ₯Ό μ΄ˆκΈ°ν™”

app continer이미지와 같이 두면 μ•ˆλ˜λŠ” μ•±μ˜ μ†ŒμŠ€μ½”λ“œ 관리 μ‹œμ— μƒμš”λœλ‹€μš”

  • νŒŒλ“œ ν…œν”Œλ¦Ώμ— λͺ…μ‹œν•œ μˆœμ„œλŒ€λ‘œ init continer 싀행됨
apiVersion: v1
kind: Pod
metadata:
  name: kubernetes-simple-pod
  labels:
    app: kubernetes-simple-pod
spec:
  initContainers:
  - name: init-myservice
    image: arisu1000/simple-container-app:latest
    command: ['sh', '-c', 'sleep 2; echo helloworld01;']
  - name: init-mydb
    image: arisu1000/simple-container-app:latest
    command: ['sh', '-c', 'sleep 2; echo helloworld02;']
  containers:
  - name: kubernetes-simple-pod
    image: arisu1000/simple-container-app:latest
    command: ['sh', '-c', 'echo The app is running! && sleep 3600']

메세지에 λŒ€μ‹  섀정같은거 μΆ”κ°€ν•΄μ„œ μ“°λ©΄ λ©λ‹ˆλ‹€!

μ μš©ν•˜κ³  둜그보기!

kubectl apply -f .\pod-init.yaml
kubectl get -f .\pod-init.yaml
kubectl describe -f .\pod-init.yaml
> kubectl logs kubernetes-simple-pod -c init-myservice
helloworld01
kubectl logs kubernetes-simple-pod -c init-mydb
>helloworld02

Static Pod

:kube-apiserver을 μ•ˆν†΅ν•˜κ³  kubelet이 직접 μ‹€ν–‰ν•˜λŠ” νŒŒλ“œ

  • kubeletμ„€μ •μ˜ β€”pod-manifest-path에 μ„€μ •ν•œ 디렉터리에 μŠ€ν…Œν‹± νŒŒλ“œλ“€μ„ 넣어두면 λœλ‹€!
  • kubelet이 직접관리, λ¬Έμ œκ°€ 생기면 restart
  • kube-apiserverλΌλ˜κ°€ etcd같은 μ‹œμŠ€ν…œ νŒŒλ“œλ₯Ό μ‹€ν–‰ν• λ•Œ μ“΄λ‹Ή!

CPU와 λ©”λͺ¨λ¦¬ μžμ› ν• λ‹Ήν•˜κΈ°

msaμ—μ„œλŠ” λ…Έλ“œν•˜λ‚˜μ— μ—¬λŸ¬κ°œμ˜ νŒŒλ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” 일이 많음, μ΄λ•Œ μ‚¬μš©λŸ‰μ΄ λ§Žμ€ νŒŒλ“œ ν•˜λ‚˜κ°€ 있으면 ν•΄λ‹Ή νŒŒλ“œ μ•ˆμ— λ…Έλ“œλ“€μ˜ μ„±λŠ₯ Down β‡’ 각 μ»¨ν…Œμ΄λ„ˆμ˜ CPUλ‚˜ λ©”λͺ¨λ¦¬ μ‚¬μš©μ„ μ œν•œν•œλ‹€!

pod-resource.yaml

apiVersion: v1
kind: Pod
metadata:
  name: kubernetes-simple-pod
  labels:
    app: kubernetes-simple-pod
spec:
  containers:
  - name: kubernetes-simple-pod
    image: arisu1000/simple-container-app:latest
    resources:
      requests:
        cpu: 0.1
        memory: 200M
      limits:
        cpu: 0.5
        memory: 1G
  ports:
  - containerPort: 8080
  • memory
    • .spec.conteiners[].resource.requests.request : μ΅œμ†Œ, 이만큼 μ—¬μœ  resuorceκ°€ μ—†μœΌλ©΄ pending
    • .spec.conteiners[].resource.requests.limits μ΅œλŒ€
    • μΏ λ²„λ„€ν‹°μŠ€κ°€ νŒŒλ“œλ₯Ό μŠ€μΌ€μ₯΄λ§ν• λ•Œ μ–˜λ„€ μœ„μ— μ„ΈνŒ…μ•ˆν•˜κ΅¬ ".memory만 μ„€μ •ν•˜λ©΄ λ…Έλ“œμ•ˆμ— λ©”λͺ¨λ¦¬λ₯Ό μ „λΆ€ μ‚¬μš©ν•  수있음
  • CPU
    • .spec.conteiners[].resource.requests.cpu
    • μ—₯ μ™œ μ†Œμˆ˜? μ½”μ–΄μˆ˜ μ•„λ‹ˆμ•Ό? : νΌμ„Όν…Œμ΄μ§€μž…λ‹ˆλ ! ex) 0.5 μ½”μ–΄ ν•˜λ‚˜μ˜ 50ν”„λ‘œ!

νŒŒλ“œ ν™˜κ²½λ³€μˆ˜ μ„€μ •

apiVersion: v1
kind: Pod
metadata:
  name: kubernetes-simple-pod
  labels:
    app: kubernetes-simple-pod
spec:
  containers:
  - name: kubernetes-simple-pod
    image: arisu1000/simple-container-app:latest
    ports:
    - containerPort: 8080
    env:
    - name: TESTENV01
      value: "testvalue01"
    - name: HOSTNAME
      valueFrom:
        fieldRef:
          fieldPath: spec.nodeName
    - name: POD_NAME
      valueFrom:
        fieldRef:
          fieldPath: metadata.name
    - name: POD_IP
      valueFrom:
        fieldRef:
          fieldPath: status.podIP
    - name: CPU_REQUEST
      valueFrom:
        resourceFieldRef:
          containerName: kubernetes-simple-pod
          resource: requests.cpu
    - name: CPU_LIMIT
      valueFrom:
        resourceFieldRef:
          containerName: kubernetes-simple-pod
          resource: limits.cpu

μ μš©ν•΄λ³΄κΈ°

apiVersion: v1
kind: Pod
metadata:
  name: kubernetes-simple-pod
  labels:
    app: kubernetes-simple-pod
spec:
  initContainers:
  - name: init-myservice
    image: arisu1000/simple-container-app:latest
    command: ['sh', '-c', 'sleep 2; echo helloworld01;']
  - name: init-mydb
    image: arisu1000/simple-container-app:latest
    command: ['sh', '-c', 'sleep 2; echo helloworld02;']
  containers:
  - name: kubernetes-simple-pod
    image: arisu1000/simple-container-app:latest
    resources:
      requests:
        cpu: 0.1
        memory: 200M
      limits:
        cpu: 0.5
        memory: 1G
    ports:
    - containerPort: 8080
    command: ['sh', '-c', 'echo The app is running! && sleep 3600']
    env:
    - name: TESTENV01
      value: "testvalue01" # 첫 번째 ν™˜κ²½ λ³€μˆ˜
    - name: HOSTNAME
      valueFrom:
        fieldRef:
          fieldPath: spec.nodeName # 두 번째 ν™˜κ²½ λ³€μˆ˜
    - name: POD_NAME
      valueFrom:
        fieldRef:
          fieldPath: metadata.name  # μ„Έ 번째 ν™˜κ²½ λ³€μˆ˜
    - name: POD_IP
      valueFrom:
        fieldRef:
          fieldPath: status.podIP # λ„€ 번째 ν™˜κ²½ λ³€μˆ˜
    - name: CPU_REQUEST
      valueFrom:
        resourceFieldRef:
          containerName: kubernetes-simple-pod
          resource: requests.cpu # λ‹€μ„― 번째 ν™˜κ²½ λ³€μˆ˜
    - name: CPU_LIMIT
      valueFrom:
        resourceFieldRef:
          containerName: kubernetes-simple-pod
          resource: limits.cpu # μ—¬μ„― 번째 ν™˜κ²½ λ³€μˆ˜
> kubectl apply -f pod-all.yaml
pod/kubernetes-simple-pod created
>kubectl exec -it kubernetes-simple-pod sh
~ # env
POD_IP=10.1.0.22
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://10.96.0.1:443
CPU_REQUEST=1
HOSTNAME=docker-desktop
TESTENV01=testvalue01
SHLVL=1
HOME=/root
TERM=xterm
POD_NAME=kubernetes-simple-pod
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_PROTO=tcp
CPU_LIMIT=1
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_SERVICE_HOST=10.96.0.1
PWD=/root
~ # exit

Design patterns for container-based distributed system