본문 바로가기

kubernetes, helm, rancher

kubernetes pod, static pod, self-healing, container type

기본적인 kubernetes resource, option 등을 설명한 블로그입니다. 추가적인 기능을 보고싶으시면 docs를 참고바랍니다.

https://kubernetes.io/docs/home/

 

Kubernetes Documentation

Kubernetes is an open source container orchestration engine for automating deployment, scaling, and management of containerized applications. The open source project is hosted by the Cloud Native Computing Foundation.

kubernetes.io

  • kubectl edit pod [pod name] -> 동작 중 pod 수정.
  • kubectl get pods -o wide --watch -> pod동작 과정 한줄한줄로 보여준다.
  • kubectl delete pods <pod> --grace-period=0 --force -> 강제로 pod delete(default 30초지만 0초로 설정)
  • livenessProbe -> self-healing 용도 (응답안하면 kill하고 restart)

 

kind: Pod
...
spec:
    containers:
    - name: nginx-container
      image: nginx:1.14
      livenessProbe:
          httpGet:
               path: /
               port: 80
#         tcpSocket
#       	   port: 22 (SSH. 만약 다른 port를 쓰면 그 port를 적으면 됨)
#         exec:
#              command:
#              - ls
#              - /data/file (명령은 다를 수 있다. container 목적에 따라 다름.)
# httpGet으로 80번 포트를 이용해서 livenessProbe를 완성하겠다. (webserver)
# tcpSocket은 tcp로 연결시도
# exec 명령을 전달하고 종료코드가 0이 아니면
# 다시시작.
# describe를 통해 liveness를 볼 수 있고, delay, timeout 등등 default로 들어간다.
# kubectl get pods [pods name] -o yaml을 통해 delay, timeout등의 속성 key-value값을 알 수 있다.

 

...
livenessProbe:
  exec:
    command:
    - ls
    - /tmp/healthy
    initialDelaySeconds: 10
    failureThreshold: 2
    periodSeconds: 5
    successThreshold: 1
    timeoutSeconds: 1
# pod 실행 후 10초 후에 /tmp/healthy파일이 있는지 5초마다 실행 성공은 1번, 실패는 2번까지.
  • 그 밖에도 readinessProbe(container가 응답가능한 상태인지, 아니라면 service endpoint에서 제거), startupProbe(container 내의 application이 시작되었는지 확인, 이 옵션이 제공되면, 성공할때까지 다른 probe는 disable된다. 실패하면 kill하고 restart한다.)
  • 하나의 pod에는 여러 개의 container(docker image)가 들어갈 수 있음.
  • init container를 포함한 pod는 init container가 성공해야 다른 container가 실행된다.

 

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
spec:
  containers:
  - name: myapp-container
    image: busybox:1.28
    command: ['sh', '-c', 'echo The app is running! && sleep 3600']
  initContainers:
  - name: init-myservice
    image: busybox:1.28
    command: ['sh', '-c', "until nslookup myservice.$(cat /var/run/secrets/kubernetes.io\
    /serviceaccount/namespace).svc.cluster.local; do echo waiting for myservice; sleep 2; done"]
  - name: init-mydb
    image: busybox:1.28
    command: ['sh', '-c', "until nslookup mydb.$(cat /var/run/secrets/kubernetes.io/\
    serviceaccount/namespace).svc.cluster.local; do echo waiting for mydb; sleep 2; done"]

# myservice와 mydb가 실행될 때 까지 myapp-container는 실행되지 않는다.
# init 1개가 성공하면 status에 Init:1/2이런식으로 뜬다.

 

  • pause container(pod가 생성될 때 default로 생성, ip나 hostname 등의 network 관리)
  • 다른 container에서 만들어진 log를 이용하는 container 같은 경우는 Sidecar
  • Monitoring 정보를 app container로 전달하는 경우 adapter
  • app container에서 정보를 받아서 product를 분산해주는 경우 ambassador
  • static pod(control plane의 api에게 요청하지 않고, 각 노드의 kubelet이 /etc/kubernetes/manifests/[staticpod].yaml을 관리하고 실행시킴) -> master노드의 control plane에 관계 없이, 특정 노드에 pod 설치하려고 할 때.
  • /etc/kubernetes/manifests/[staticpod].yaml 수정시 systemctl restart kubelet
  • /var/lib/kubelet/config.yaml에 static pod directory정보 있음 -> config.yaml파일을 수정해서 static pod directory 위치를 바꿀 수 있음. -> systemctl restart kubelet.
  • 혹은 kubelet --pod-manifest-path=[directory] 옵션을 줘서 바꿀 수 있음.
  • kube-apiserver에서 worker node의 static pod를 안다.(read only) -> daemonset과 함께 kube-scheduler에 의해 무시되는 type.
  • static pod의 name은 마지막에 node 이름이 들어간다.