Pod

도움말

$ kubectl explain pods
$ kubectl explain pods.metadata
$ kubectl explain pods.metadata.annotations
$ kubectl explain pods --recursive

조회

# 일반 출력
$ kubectl get pods

# 자세히 출력
$ kubectl get pods -o wide

# json, yaml 형식 출력
$ kubectl get pods -o json
$ kubectl get pods -o yaml

# 출력 주시
$ kubectl get pods -w
$ watch -x kubectl get pods

# 모든 네임스페이스 pod 조회
$ kubectl get pods --all-namespaces
# 특정 네임스페이스 pod 조회
$ kubectl get pods -n [namespace name]
$ kubectl get pods -n kube-system

라벨

# 라벨 지정
$ kubectl label pod [pod name] [key]=[value]

# 라벨 포함 조회
$ kubectl get pod --show-labels

# 특정 라벨을 column으로 조회, 출력
$ kubectl get pod -L [key1],[key2]...

# 라벨 필터링 검색
$ kubectl get pod --show-labels -l '[key]'
$ kubectl get pod --show-labels -l '![key]'
$ kubectl get pod --show-labels -l '[key1]=[value],[key2]=[value]'
$ kubectl get pod --show-labels -l '![key1]=[value],[key2]=[value]'

# 라벨 수정
$ kubectl label pod [pod name] [key]=[value] --overwrite

# 라벨 삭제
$ kubectl label pod [pod name] [key]-

정보

# 조회
$ kubectl describe pod [name]

# 수정
$ kubectl edit pod [name]

로그

$ kubectl logs [pod name]

단일 컨테이너 pod 실행

$ kubectl run [name] --image=[image] --port=[port]
$ kubectl run nginx --image=nginx --port=80

# echoserver pod 생성, 서비스 생성
$ kubectl run echoserver --image="k8s.gcr.io/echoserver:1.10" --port=8080
$ kubectl expose pod echoserver --type=NodePort
$ kubectl get pods

컨테이너 접속

$ kubectl exec -it [pod name] sh
$ kubectl exec -it [pod name] /bin/bash

# 접속해서 서비스 포트에 curl, -s 는 불필요한 정보 삭제해서 출력
$ kubectl exec [pod name] -- curl [svc cluster ip]:port -s

삭제

$ kubectl delete pod [name]

기본 탬플릿

# 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

yaml 적용

$ kubectl apply -f pod-sample.yaml

기본 탬플릿 생성

$ kubectl run nginx --image=nginx --port=80 --dry-run=client -o yaml > abc.yaml

컨테이너가 실행 된 후에 kubelet가 컨테이너를 주기적으로 진단, 이때 probe를 제공하면 다음과 같은 효과를 볼 수 있음

livenessProbe : 컨테이너가 실행됐는지 확인 / 실패 시 종료 후 재시작
readinessProbe : 실제로 서비스 요청에 응답할 수 있는지 진단 / 실패 시, 연결 끊음


초기화 컨테이너 앱 컨테이너 실행 전에 별도의 작업을 지시하기 위해 사용하는 컨테이너 초기화 컨테이너는 readinessprobe를 지원안함

---
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']

pause 컨테이너

모든 파드마다 기본으로 실행되는 컨테이너로 pause 컨테이너가 제공하는 네트워크를 공유함. 따라서 pause 컨테이너가 재시작되면 파드 안의 모든 컨테이너도 같이 재시작된다. –pod-infra-container-image 옵션으로 다른 컨테이너를 pause컨테이너로 지정 가능


static 파드

kube-apiserver를 통하지 않고 kubelet이 직접 실행하는 pods kubelet 설정의 –pod-manifest-path라는 옵션에 지정한 경로의 파드들을 kubelet이 감지해서 스태틱 파드로 실행한다. 이상이 생길 시에 자동으로 재시작하고 실행 중인 노드에서만 실행되고 다른 노드에는 실행되지 않는다. kube-apiserver로 조회만 가능하다. 보통 kube-apiserver, etcd와 같은 시스템 pod들을 실행하는 용도로 사용됨.

static pod의 경로 : /etc/kubernetes/manifests

$ kubectl describe pods kube-apiserver-$(hostname) -n kube-system

cpu, 메모리 할당

---
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

환경 변수 설정

---
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