sungsu9022 / study-kubernetes-in-action

study-kubernetes
12 stars 8 forks source link

3. 파드 : 쿠버네티스에서 컨테이너 실행 #3

Open sungsu9022 opened 4 years ago

sungsu9022 commented 4 years ago

3. 파드 : 쿠버네티스에서 컨테이너 실행

3.1 파드 소개

스크린샷 2020-08-04 오전 1 40 29

3.1.1 파드가 필요한 이유

3.1.2 파드 이해하기

같은 파드에서 컨테이너 간 부분 격리

컨테이너가 동일한 IP와 포트 공간을 공유하는 방법

파드간 플랫 네트워크 소개

스크린샷 2020-08-04 오전 1 39 48

3.1.3 파드에서 컨테이너의 적절한 구성

다계층 애플리케이션을 여러 파드로 분할

개별 확장이 가능하도록 여러 파드로 분할

파드에서 여러 컨테이너를 사용하는 경우

스크린샷 2020-08-04 오전 1 38 03

파드에서 여러 컨테이너를 사용하는 경우 결정

3.2 YAML 또는 JSON 디스크립터로 파드 생성

3.2.1 기존 파드의 YAML 디스크립터 살펴보기

# 메타 데이터
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: "2020-08-03T14:21:44Z"
  generateName: kubia-
  labels:
    run: kubia
  name: kubia-5wsx8
  namespace: default
  ownerReferences:
  - apiVersion: v1
    blockOwnerDeletion: true
    controller: true
    kind: ReplicationController
    name: kubia
    uid: cb311984-2974-4434-8979-b7a11f07388d
  resourceVersion: "4551"
  selfLink: /api/v1/namespaces/default/pods/kubia-5wsx8
  uid: ed4f042e-f547-4003-9a89-8005bca02f60
# 스펙
spec:
  containers:
  - image: sungsu9022/kubia
    imagePullPolicy: Always
    name: kubia
    ports:
    - containerPort: 8080
      protocol: TCP
    resources: {}
    terminationMessagePath: /dev/termination-log
    terminationMessagePolicy: File
    volumeMounts:
    - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
      name: default-token-zszt7
      readOnly: true
  dnsPolicy: ClusterFirst
  enableServiceLinks: true
  nodeName: docker-desktop
  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
  - effect: NoExecute
    key: node.kubernetes.io/unreachable
    operator: Exists
    tolerationSeconds: 300
  volumes:
  - name: default-token-zszt7
    secret:
      defaultMode: 420
      secretName: default-token-zszt7
status:
  conditions:
  - lastProbeTime: null
    lastTransitionTime: "2020-08-03T14:21:44Z"
    status: "True"
    type: Initialized
  - lastProbeTime: null
    lastTransitionTime: "2020-08-03T14:21:49Z"
    status: "True"
    type: Ready
  - lastProbeTime: null
    lastTransitionTime: "2020-08-03T14:21:49Z"
    status: "True"
    type: ContainersReady
  - lastProbeTime: null
    lastTransitionTime: "2020-08-03T14:21:44Z"
    status: "True"
    type: PodScheduled
# Status
  containerStatuses:
  - containerID: docker://796528475e929b9f1ec28fc5ae3ca722f1279b8f852b262dfef549bbdebdcd7a
    image: sungsu9022/kubia:latest
    imageID: docker-pullable://sungsu9022/kubia@sha256:3811562a9c1c45f2e03352bf99cacf4e024f9c3a874a3d862f0208367eace763
    lastState: {}
    name: kubia
    ready: true
    restartCount: 0
    started: true
    state:
      running:
        startedAt: "2020-08-03T14:21:48Z"
  hostIP: 192.168.65.3
  phase: Running
  podIP: 10.1.0.13
  podIPs:
  - ip: 10.1.0.13
  qosClass: BestEffort
  startTime: "2020-08-03T14:21:44Z"

파드를 정의하는 주요 부분 소개

3.2.2 파드를 정의하는 간단한 YAML 정의

apiVersion: v1
kind: Pod
metadata:
  name: kubia-manual  # 파드 이름
spec:
  containers:
  - image: luksa/kubia # 컨테이너 이미
    name: kubia # 컨테이너 이름
    ports:
    - containerPort: 8080 # 애플리케이션 수신 포트
      protocol: TCP

컨테이너 포트 지정

오브젝트 필드들에 대한 설명 확인(도움말같은)

kubectl explain pods
kubectl explain pod.spec

3.2.3 kubectl create 명령으로 파드 만들기

kubectl create -f kubia-manual.yaml

실행중인 파드의 전체 정의 가져오기

kubectl get po kubia-manual -o yaml
kubectl get po kubia-manual -o json

3.2.4 애플리케이션 로그 보기

docker log <container id>

컨테이너 이름을 지정해 다중 컨테이너 파드에서 로그 가져오기

kubectl logs kubia-manual -c kubia

3.2.5 파드에 요청 보내기

로컬 네트워크 포트를 파드의 포트로 포워딩

kubectl port-forward kubia-manual 8888:8080 
스크린샷 2020-08-04 오전 1 41 51

3.3 레이블을 이용한 파드 구성

스크린샷 2020-08-04 오전 1 38 37

3.3.1 레이블 소개

스크린샷 2020-08-04 오전 1 41 19

3.3.2 파드를 생성할 때 레이블 지정

apiVersion: v1
kind: Pod
metadata:
  name: kubia-manual-v2
  labels: # 레이블 2개 지정
    creation_method: manual
    env: prod
spec:
  containers:
  - image: luksa/kubia
    name: kubia
    ports:
    - containerPort: 8080
      protocol: TCP
kubectl create -f kubia-manual-with-labels.yaml

kubectl get po --show-labels

# 특정 레이블에만 관심 있는 경우 -L 스위치를 지정해 각 레이블을 자체 열에 표시할 수 있음.
kubectl get po -L creation_method,env

3.3.3 기존 파드 레이블 수정

# 기존 pods 레이블 추가
kubectl label po kubia-manual creation_method=manual

# pods 레이블 수정
kubectl label po kubia-manual-v2 env=debug --overwrite

# 레이블 조회
kubectl get po -L creation_method,env

3.4 레이블 셀렉터를 이용한 파드 부분 집합 나열

  1. 특정한 키를 포함하거나 포함하지 않는 레이블
  2. 특정한 키와 값을 가진 레이블
  3. 특정한 키를 갖고 있지만, 다른 값을 가진 레이블

3.4.1 레이블 셀렉터를 사용해 파드 나열

# creation_method 레이블 manual을 가지고 있는 파드 나열
kubectl get po -l creation_method=manual

# env를 가지고 있는 파드 나열
kubectl get po -l env

# env를 가지고 있지 않은 파드 나열
kubectl get po -l '!env'

# creation_method 레이블을 가진 것중에 값이 manual이 아닌것
kubectl get po -l 'creation_method!=manual'

kubectl get po -l 'env in (prod,devel)'

kubectl get po -l 'env notin (prod,devel)'

3.4.2 레이블 셀렉터에서 여러 조건 사용

kubectl get po -l creation_method=manual,env=debug

3.5 레이블과 셀렉터를 이용해 파드 스케줄링 제한

3.5.1 워커 노드 분류에 레이블 사용

# 이런식으로 노드에 label을 붙인다.(로컬에서 docker-desktop밖에 없어서 직접해보지는 ㅇ낳음)
kubectl label node gke-kubia-85f6-node-0rrx gpu=true

kubectl get nodes -l gpu=true

3.5.2 특정 노드에 파드 스케줄링

apiVersion: v1
kind: Pod
metadata:
  name: kubia-gpu
spec:
  nodeSelector:
    gpu: "true" # gpu=true 레이블을 포함한 노드에 이 파드라 배포하도록 지시
  containers:
  - image: luksa/kubia
    name: kubia

3.5.3 하나의 특정 노드 스케줄링

3.6 파드에 어노테이션 달기

3.6.1 오브젝트의 어노테이션 조회

# kubectl describe {리소스} {name}
kubectl get po kubia-xxxxx -o yarml  # 1.9부터 이 정보는 yaml안에서 확인할수 없도록 변경됨

3.6.2 어노테이션 추가 및 수정

kubectl annotate pod kubia-manual naver.com/someannotation="naver foo bar"

kubectl describe pod kubia-manual

3.7 네임스페이스를 사용한 리소스 그룹화

3.7.1 네임스페이스의 필요성

3.7.2 다른 네임스페이스와 파드 살펴보기

kubectl get po -n kube-system

 - 쿠베 시스템에 대한 네임스페이스가 분리되어 있어서 뭔가 유저가 만든 리소스들과 깔끔하게 분리하여 관리할수 있음.
 - 매우 큰 규모에서 쿠버네티스를 사용한다면 네임스페이스를 사용해서 서로 관계없는 리소스를 겹치지 않는 그룹으로 분리할 수 있다.
 - 네임스페이스 기준으로 리소스 이름에 관한 접근범위를 제공하므로 리소스 이름 충돌에 대한 걱정도 할 필요 없음.
 - 이 외에도 특정 사용자에 대한 리솟 ㅡ접근 권한을 관리할수도 있고, 개별 사용자가 사용할 수 있는 컴퓨팅 리소스를 제한하는 데에도 사용된다.

### 3.7.3 네임스페이스 생성

``` yaml
apiVersion: v1
kind: Namespace
metadata:
  name: custom-namespace
# yaml 파일을 이용한 네임스페이스 생성
kubectl create -f custom-namespace.yaml

# 커맨드라인 명령어로 생성
kubectl create namespace custom-namespace

3.7.4 다른 네임스페이스의 오브젝트 관리

3.7.5 네임스페이스가 제공하는 격리이해

3.8 파드 중지와 제거

3.8.1 이름으로 파드 제거

# 이름으로 삭제
kubectl delete po kubia-gpu

# 공백을 구분자로 여러개를 한번에 지울수 있음.
kubectl delete po kubia-gpu kubia-gpu2

3.8.2 레이블 셀렉터를 이용한 파드 삭제

# 레이블 셀렉터를 이요한 삭제
kubectl delete po -l creation_method=manual
kubectl delete po -l rel=canary

3.8.3 네임스페이스를 삭제한 파드 제거

kubectl delete ns custom-namespace

3.8.4 네임스페이슬 유지하면서 네임스페이스 안에 모든 파드 삭제

3.8.5 네임스페이스에서 (거의) 모든 리소스 삭제

3.9 요약