k8s pod

김승윤·2021년 11월 3일
0

pod 란?

  • 컨테이너를 표현하는 k8s API의 최소 단위

  • 하나 또는 여러 개의 컨테이너의 그룹

    • 스토리지 및 네트워크를 공유
    • 해당 컨테이너를 구동하는 방식에 대한 명세를 가진다.

Pod 생성하기

  • 포드에서 특정 이미지를 생성하고 실행
$ kubectl run NAME --image=iamge [--env="key=value"] [--port=port] [--dry-run=server|client] [--overrides=inline-json] [--command] [args....]
  • 동작 중인 pod 확인
$ kubectl get pods
$ kubectl get pods -o wide

Pod Template으로 Pod 실행

  • 파드 템플릿은 파드를 생성하기 위한 명세이다.

  • 파드 템플릿은 yaml 형식이나 json 형식을 가진다.

  • 파드 템플릿을 사용하여 실제 파드가 동작된다.

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - image: nginx:1.14
    name: nginx
    ports:
    - containerPort: 80

dry-run : 실제 pod를 실행하지 않고 실행 여부를 화면에 출력

-o yaml : 실제 pod를 실행하지 않고 실행 여부를 확인하고 pod API를 yaml 파일 포맷으로 출력

$ kubectl run nginx --image=nginx:1.14 --port=80 --dry-run=client -o yaml > pod-nginx.yaml

Pod 관리 Commands

  • 동작중인 pod 정보 보기
$ kubectl get pods
$ kubectl describe pod nginx
  • 동작중인 pod 수정
$ kubectl edit pod nginx
  • 동작중인 pod 삭제
$ kubectl delete pod nginx
  • pod 내 컨테이너 log 보기
$ kubectl logs nginx
  • 동작중인 pod로 연결
$ kubectl exec -it nginx -- /bin/bash

Pod expose

  • Deployment로 여러 개의 웹서버 실행
    • 동일한 애플리케이션을 여러 개 실행 가능
$ kubectl create deployment webserver --image=nginx:1.14 --replicas=2 --port=80
  • 동작 중인 pod 확인
$ kubectl get deployments.apps
$ kubectl get pods
$ kubectl get pods -o wide
  • 단일 진입점 만들기 : expose
$ kubectl expose deployment webserver --port=80
$ kubectl get service

multiple-container Pod

  • 하나의 pod에는 여러개의 컨테이너가 포함될 수 있다.

  • 하나의 Pod에 여러 개의 컨테이너를 포함하는 경우 모든 컨테이너가 항상 단일 Node에서 실행된다.

  • 보통 multiple-container pod에 포함된 컨테이너들은 밀접하게 관련된 프로세스를 함께 실행하거나 동일한 IP 및 Port를 사용한다.

apiVersion: v1
kind: Pod
metadata:
  name: multiple-pod
spec:
  containers:
  - name: nginx-container
    image: ningx:1.14
    ports:
    - containerPort: 80
  - name: centos-container
    image: centos:7
    command:
    - sleep
    - "10000"

Label

  • Label은 Pod와 같은 오브젝트에 첨부된 Key와 Value의 쌍이다.

  • Label은 오브젝트의 특성을 식별하는데 사용되어 사용자에게 중요하지만, 코어 시스템에 직접적인 의미는 없다.

  • Label로 오브젝트의 하위 집합을 선택하고, 구성하는데 사용할 수 있다.

  • Label은 오브젝트를 생성할 떄에 붙이거나 생성 이후에 붙이거나 언제든지 수정이 가능하다.

  • 오브젝트마다 key와 value로 Label을 정의할 수 있다. 오브젝트의 key는 고유한 값이어야 한다.

Label Selector

  • name과 UID와 다르게 label은 고유하지 않다.

  • Label Selector를 통해 클라이언트와 사용자는 오브젝트를 식별할 수 있다.

  • 집합성 기준 레이블 요건에 따라 값 집합을 키로 필터링할 수 있다.
    (in, notin, exists)

- Label

matadat:
  label:
    rel: stable
    name: mainui

- Selector

selector:
  matchLabels:
    key: value
  matchExpressions:
  - {key: name, operator: In, values: [mainui]}
  - {key: rel, operator: NotIn, values: ["beta", "canary"]}

Label Template

  • pod label definition
apiVersion: v1  
kind: Pod 
metatdata:
  name: appjs-pod
  labels:
    apps: web
    release: stable
spec:
  containers:
    name: appjs-container
    image: smlinux/appjs
    ports:
      containerPort: 80

label 관리

  • label 보기
$ kubectl get pods --show-labels
$ kubectl get pods -L <label_name>
  • label 관리 : kubectl label --help
    • label 생성, 변경, 확인, 제거
$ kubectl label pod <name> key=value
$ kubectl label pod <name> key=value --overwrite
$ kubectl label pod <name> --show-labes
$ kubectl label pod <name> key-

annotation

  • Label과 동일하게 key-value를 통해 리소스의 특성을 기록

  • Kubernetes에게 특정 정보 전달할 용도로 사용

  • 관리를 위해 필요할 정보를 기록할 용도로 사용

  • 릴리즈, 로깅, 모니터링에 필요한 정보들을 기록

  • Label과 달리 오브젝트를 식별하여 select하지 않음

apiVersion: v1
kind: Pod
metadata:
  name: anon-pod
  annotation:
    imageregistry: "http://hub.docker.com/"
spec:
  containers:
    name: nginx
    image: nginx:1.14

Node Label

  • Worker node에 할당된 label을 이용해 node를 선택

  • Node Label 설정

$ kubectl label nodes <node 이름> <label key>=<label value>
$ kubectl label nodes node1.example.com gpu=true
$ kubectl get nodes -L gpu

node label 관리 명령

  • worker node를 구분할 용도로 label 할당
$ kubectl label nodes <node 이름> key=value
  • node에 할당된 label 보기
$ kubectl get nodes --show-labels
$ kubectl get nodes -L <label name>
  • node label 생성, 변경, 제거
$ kubectl label nodes <name> key=value
$ kubectl label nodes <name> key=value --overwrite
$ kubectl label nodes <name> key-
  • node Selector : label이 할당된 node는 nodeSelector를 통해 선택된다.
apiVersion: v1
kind: Pod
metadata:
  name: testpod
spec:
  containers:
    name: nginx
    image: ngnix:1.14
  nodeSlector:
    type: ssh

Pod Resource 제한 및 관리

  • Pod Resource 요청 및 제한

  • Resource Requests

    • pod를 실행하기 위한 최소 리소스 양을 지정
  • Resource Limits

    • Pod가 사용할 수 있는 최대 리소스 양을 지정
  • Pod Resources 단위

    • 1000m(milicores) = 1 core = 1 CPU = 1 AWS vCPU = 1 GCP Core
apiVersion: v1
kind: Pod
metadata:
  name: pod
spec:
  containers:
    name: nginx-container
    image: nginx:1.14
    resources:
      requests:
        cpu: 100m
        memory: 250Mi
      limits:
        cpu: 500m
        memory: 500Mi

0개의 댓글