해당 페이지는 https://kubernetes.io/docs/concepts/workloads/pods/ 를 기준으로 작성 하였습니다
Pod란?
- Kubernetes 에서 만들고 관리 할 수 있는 가장 작은 단위
- 공유 스토리지, 네트워크 리소스와 컨테이너 실행하는 사양을 포함하는 하나 이상의 컨테이너 그룹
- Pod의 컨텐츠는 항상 같은 위치에 위치하고, 일정이 잡혀 있으며 공유하는 컨텍스트에서 실행
- Pod는 애플리케이션 별 논리적 호스트를 모델링함
- 애플리케이션 컨테이너와 마찬가지로 Pod에는 Pod 시작 중 실행돠는 초기화 컨테이너 포함
- 디버깅을 위해 임시 컨테이너를 삽입할 수 있음
- Pod의 공유 context는 리눅스 네임스페이스, cgroup 및 잠재적으로 다른 격리 측면의 집합
#kubectl apply -f https://k8s.io/examples/pods/simple-pod.yaml
# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 11s
#cat simple-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
- kubectl apply 명령어를 통해 pod를 생성 한
- nginx 이름을 가진 pod는 dockerhub에서 nginx 1.14.2 이미지를 사용
- pod는 80번 포트를 사용
Pod 동작 방식
Pod OS
- Pod를 실행할 OS를 나타 내려면 .spec.os.name 필드를 windows or linux 설정
- Kubernetes 버전은 Pod 스케줄링에 영향을 주지 않음
- .spec.os.name 을 설정하면 Pod는 OS를 확실하게 식별
- kubelet의 경우 노드와 OS가 다를 시, 실행 되지 않음
Pod와 Controller
- Kubernetes workload resource를 이용하여 여러 pod를 생성하고 관리함
- resource controller는 pod 오류 발생 시, 복제, roll out, 자동 복구 처리 수행
- scheduler는 대체 Pod를 정상 노드에 배치
Pod templates
- resource controller는 Pod Templates에서 Pod를 생성하고 사용자를 대신해 해당 Pod 관리
- Pod Templates는 Pod 생성을 위한 사양이며, Jobs, Deployments, Daemonset 포함
- 각 controller는 workload 내부 개체에 실제 Pod 생성
※ PodTemplate 예제
apiVersion: batch/v1
kind: Job
metadata:
name: hello
spec:
template:
# This is the pod template
spec:
containers:
- name: hello
image: busybox:1.28
command: ['sh', '-c', 'echo "Hello, Kubernetes!" && sleep 3600']
restartPolicy: OnFailure
# The pod template ends here
- Pod Templates를 수정하거나 새 Pod Templates로 전환해도 존재하는 Pod에는 영향 없음
- Pod Templates를 변경하는 경우 Pod를 재생성해야 업데이트 내용이 반영
- 각 workload resource는 Pod Templates에 변경 사항 처리를 위한 자체 규칙 존재
- kubelet은 Pod Templates 및 Update에 대한 세부 정보를 직접관찰하거나 관리하지 않음
Pod update and replacement
- Kubernetes 는 Pod를 사용자가 직접 관리하는 것을 막지 않음
- 일부 필드의 경우 실행중인 Pod를 직접 업데이트 가능
- 하지만 patch, replace 작업에 제한 사항 존재
- Pod의 대부분의 metadata 변경 불가
- 필드의 현재 값 증가 업데이트만 수락
- metadata.deletionTimestamp 가 설정된 경우, metadata.finalizers 추가 불가
- spec.containers[*].image, spec.initContainers[*].image, spec.activeDeadlineSeconds or spec.tolerations 외 업데이트 불가
- spec.tolerations 의 경우 새 항목 추가만 가능
- spec.activeDeadlineSeconds의 경우 2가지 유형만 변경 가능
- ( 할당되지 않은 필드를 양수로 설정하는 단계, 필드를 양수에서 음수가 아닌 더 작은 숫자로 업데이트 하는 경우)
Resource 공유와 커뮤니케이션
Pod의 스토리지
- Pod는 공유 스토리지 볼륨 지정 가능
- Pod는 모든 콘테이너 간 공유 볼륨 엑세스 가능
- 볼륨 사용 시, Pod 영구 데이터 보관 가능
Pod 네트워크
- 각 Pod는 주소 패밀리에 고유 IP 할당
- Pod의 모든 컨테이너는 IP 주소 및 포트를 네트워크 네임스페이스와 공유
- Pod 내 속한 컨테이너는 localhost를 통해 통신 가능
- Pod의 컨테이너가 Pod 외부의 엔터티와 통신하고 공유 네트워크 리소스를 사용하는 방법을 조절함
- Pod 내 컨테이너는 IP 주소를 포트 공간으로 공유하고, localhost를 통해 서로 찾을수 있음
- Pod 의 컨테이너는 SystemV 세마포머 또는 POSIX 공유 메모리와 같은 표준 프로세스 간 통신 사용
- 다른 Pod에 있는 컨테이너는 별도의 설정 없이 OS 수준 IPC 통신 불가
컨테이너 권한 설정
- 리눅스 내 플래그를 사용하여 권한 모드 활성화 가능
- 네트워크 스택 조작 또는 하드웨어 엑세스 하는 컨테이너에 유용
정적 Pod
- 정적 Pod는 API 서버가 직접 관찰하지 않고 특정 노드의 kublet에서 관리됨
- 정적 Pod는 항상 특정 노드의 하나의 kubelet에 바인딩 됨
- kubelet을 이용하여 개별 control plane 컴포넌트를 관리
- kubelet은 정적 Pod에 대해 Kubernetes API 서버에 미러 Pod를 자동으로 생성 하려고 시도
- 노드에서 실행되는 Pod는 API 서버에서 볼 수 있지만 controller에서는 볼 수 없음
컨테이너 Probe
- Probe는 컨테이너에서 kubelet이 주기적으로 수행하는 진단
- ExecAction(컨테이너 런타임의 도움으로 수행됨)
- TCPSocketAction(kubelet에서 직접 확인)
- HTTPGetAction(kubelet에서 직접 확인)
'kubernetes' 카테고리의 다른 글
[kubernetes] static pod란 (0) | 2022.10.31 |
---|---|
[kubernetes] namespace 란? (0) | 2022.10.21 |
[kubernetes] etcd 및 백업 복구 방법 (0) | 2022.10.21 |
[kubernetes] kubernertes Component (0) | 2022.10.21 |