Pod는 Kubernetes에서 애플리케이션의 기본 실행 단위로, 가장 작은 배포 단위입니다.
POD는 하나 이상의 ‘동작중인’ 컨테이너를 포함하고 있는 Object이고 하나의 POD에는 하나의 컨테이너를 배치하는 게 기본입니다.
또한, 이 컨테이너들은 네트워크와 저장소를 공유합니다.
클러스터 내에서 POD는 주로 두 가지 방법으로 사용되죠.
1개 컨테이너
- 단일 POD 모델“one-container-per-Pod”은 쿠버네티스에서 가장 널리 쓰이는 케이스 입니다.
한개의 pod가 1개의 container을 감싸고 있으며, 쿠버네티스에서 해당 pod을 관리합니다.
2개 이상 컨테이너
- 다중 POD 모델2개 이상의 container가 리소스를 밀접하게 공유해야하는 상황에 쓰입니다.
하나의 컨테이너가 file을 제공해주면 “sidecar” 역할을 하는 컨테이너가 해당 file에 접근하는 개념입니다.
즉 쉽게 말해 서로 의존성이 있는 다중 컨테이너가 동작 중인 POD. 리소스 공유가 필요한 결합 서비스 단위인 경우입니다.
기본적으로 하나의 컨테이너에는 최소한의 필요한 기능 즉 하나의 컨테이너는 하나의 기능만 하는 것이 기본입니다.
그런데 VM에 익숙해지면 착각하는 것이 하나의 컨테이너에 여러 개의 어플리케이션을 돌리면 효율적이지 않겠냐는 의문 들기 시작합니다.
하지만 Dockerfile의 메커니즘 자체가 그렇듯 하나의 컨테이너는 하나의 어플리케이션만 띄울 수 있도록 설계되어 있습니다.
쉘 스크립트나 docker-compose를 이용해서 동시에 여러 동작을 유발할 수는 있지만 원칙은 그렇습니다.
다만, 컨테이너는 유연하게 확장/축소가 가능하다는 것이 장점입니다.
만약 하나의 컨테이너에 웹, DB, APP를 실행시키는 것은 가장 기본적인 목적인 'APP 격리'
에 위배됩니다.
POD가 사용되는 방식 중 하나인 '다중 컨테이너의 동작'
은 '멀티 컨테이너'
이지 여러 개를 실행하는 것과는 다르다는 것 입니다.
또한 POD의 컨테이너는 같은 노드에서만 동작하고, 하나의 POD에 있는 다중 컨테이너는 저장소, 네트워크 IP 등을 공유합니다.
요약하자면 아래와 같은 특성들을 가지고 있는 것이죠.
POD는 애초에 결합성이 있는 서비스를 위해 다중 컨테이너를 지원하도록 디자인 되었습니다.
Volume 내부의 웹 역할을 하는 컨테이너와 원격 소스로부터 그 파일들을 업데이트하는 분리된 “사이드카” 컨테이너가 있는 경우 아래와 같습니다.
'사이드 카'
패턴이라고 합니다.네트워킹
과 저장소
인 경우 입니다.
- 사용자의 삭제 명령(default 유예기간: 30초)
- 유예기간이 지난 POD 정보가 갱신
- 이 POD는 조회시 Terminating이라는 문구 출력
- Terminating으로 표시되는 것을 확인하면 kubelet은 종료 작업 시작
- 종료한 POD는 엔드포인트 리스트에서 제거되며, 레플리케이션 컨트롤러의 관리 대상에서 제외
- 만약 도중에 유예 기간이 만료되면 POD에서 실행중이던 모든 프로세스에 SIGKILL이 떨어짐
- kubelet은 유예기간을 0으로 세팅해서 API 서버로부터 POD를 즉시 삭제할 수 있음. 이제 POD는 더이상 보이지 않음.
--grace-period=<second>
와 함께 --force
를 같이 사용해야 합니다.kubectl explain
명령으로 POD 리소스의 필드를 확인 해보죠[root@nasa-master ~]# kubectl explain pod.spec.containers KIND: Pod VERSION: v1 RESOURCE: containers <[]Object> DESCRIPTION: List of containers belonging to the pod. Containers cannot currently be added or removed. There must be at least one container in a Pod. Cannot be updated. A single application container that you want to run within a pod. FIELDS: image <string> Docker image name. More info: https://kubernetes.io/dojs/concepts/containers/images This field is optional to allow higher level config management to default or override container images in workload controllers like Deployments and StatefulSets. ...
yaml
파일을 만들어보겠습니다.apiVersion: v1 kind: Pod metadata: name: nasa-nginx-pod spec: containers: - name: nasa-nginx-container image: nginx:latest ports: - containerPort: 80 protocol: TCP
apiVersion
: YAML 파일에서 정의한 오브젝트의 API 버전을 나타냅니다.kind
: 이 리소스의 종류를 나타냅니다. 위에선 pod로 생성하기 때문에 pod 다른 오브젝트의 종류는 kubectl api-resources 명령어를 통해 확인할 수 있습니다.metadata
: 라벨, 주석, 이름과 같은 리소스의 부가 정보들을 입력합니다. spec
: 리소스를 생성하기 위한 자세한 정보를 입력합니다. 생성되는 container의 이름, 이미지, 포트 등을 설정할 수 있습니다. pod.spec.containers : 컨테이너 정의 pod.spec.containers.image: 컨테이너에 사용할 이미지 pod.spec.containers.name: 컨테이너 이름 pod.spec.containers.ports: 노출할 포트 정의 pod.spec.containers.ports.containerPort: 노출할 컨테이너 포트번호 pod.spec.containers.ports.protocol: 노출할 컨테이너 포트의 기본 프로토콜
YAML
파일을 기반으로 POD를 생성해보겠습니다kubectl apply -f yaml 파일이름
[root@nasa-master nasa]# kubectl apply -f nasa.yml pod/nasa-nginx-pod created
[root@nasa-master nasa]# kubectl get po NAME READY STATUS RESTARTS AGE nasa-nginx-pod 1/1 Running 0 64s
-o
옵션에는 yaml과 json 중 하나를 선택할 수 있습니다.[root@nasa-master nasa]# kubectl get pods nasa-nginx-pod -o yaml apiVersion: v1 kind: Pod metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"name":"nasa-nginx-pod","nam espace":"default"},"spec":{"containers":[{"image":"nginx:latest","name":"nasa-nginx-container", "ports":[{"containerPort":80,"protocol":"TCP"}]}]}} creationTimestamp: "2020-09-16T07:26:45Z" name: nasa-nginx-pod namespace: default resourceVersion: "39554" selfLink: /api/v1/namespaces/default/pods/nasa-nginx-pod uid: 148bfb1a-73ad-4c44-805d-300cb5be8af8 spec: containers: - image: nginx:latest imagePullPolicy: Always name: nasa-nginx-container ports: - containerPort: 80 protocol: TCP resources: {} terminationMessagePath: /dev/termination-log terminationMessagePolicy: File volumeMounts: - mountPath: /var/run/secrets/kubernetes.io/serviceaccount name: default-token-556xc readOnly: true dnsPolicy: ClusterFirst enableServiceLinks: true nodeName: nasa-node3 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
[root@nasa-master nasa]# kubectl describe pods nasa-nginx-pod Name: nasa-nginx-pod Namespace: default Priority: 0 Node: nasa-node3/10.146.0.9 Start Time: Wed, 16 Sep 2020 07:26:45 +0000 Labels: <none> Annotations: kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"name":"nasa-nginx -pod","namespace":"default"},"spec":{"containers":[{"image"... Status: Running ...
kubectl exec
를 통해 명령어를 실행시킬 수 있습니다.kubectl exec -it nasa-nginx-pod bash
[root@nasa-master nasa]# kubectl exec -it nasa-nginx-pod bash root@nasa-nginx-pod:/# root@nasa-nginx-pod:/# ls bin dev docker-entrypoint.sh home lib64 mnt proc run srv tmp var boot docker-entrypoint.d etc lib media opt root sbin sys usr
kubectl logs
를 통해 포드의 로그를 확인할 수 있습니다.kubectl logs nasa-nginx-pod
[root@nasa-master nasa]# kubectl logs nasa-nginx-pod /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuratio n /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/ /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh 10-listen-on-ipv6-by-default.sh: Getting the checksum of /etc/nginx/conf.d/default.conf 10-listen-on-ipv6-by-default.sh: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh /docker-entrypoint.sh: Configuration complete; ready for start up
kubectl delete -f
명령어로 삭제할 수 있습니다.[root@nasa-master nasa]# kubectl delete -f nasa.yml pod "nasa-nginx-pod" deleted [root@nasa-master nasa]# [root@nasa-master nasa]# kubectl get po No resources found.
apiVersion: v1 kind: Pod metadata: name: nasa-nginx-pod spec: containers: - name: nasa-nginx-container image: nginx:latest ports: - containerPort: 80 protocol: TCP - name: sidecar image: ubuntu:14.04 command: ["echo", "hello"] args: ["ubuntu"]
[root@nasa-master nasa]# kubectl get po NAME READY STATUS RESTARTS AGE nasa-nginx-pod 1/2 CrashLoopBackOff 1 32s
-c
옵션을 사용해 어떤 컨테이너에 접속 할지 확인 가능합니다kubectl exec -it nasa-nginx-pod -c sidecar bash
[root@nasa-master nasa]# kubectl exec -it nasa-nginx-pod -c nasa-nginx-container bash root@nasa-nginx-pod:/# ls bin dev docker-entrypoint.sh home lib64 mnt proc run srv tmp var boot docker-entrypoint.d etc lib media opt root sbin sys usr