관리 메뉴

진취적 삶

05 Pod 본문

개발 도서/핵심만 콕 쿠버네티스

05 Pod

hp0724 2023. 11. 17. 10:56

5.1 pod 소개

pod는 쿠버네티스의 최소 실행단위

p8s 는 pod를 통해 기본 가상환경을 제공한다.

가상머신의 instance 도커의 컨테이너와 같이 p8s 에서 지원하는 가상환경 실행 단위

5.1.1 Pod 특징

  • pod는 1개 이상의 컨테이너를 가질수 있다.
  • 동일 노드에 할당 동일한 생명주기
  • 고유의 Pod IP
  • IP 공유
  • volume 공유

NAT : 여러개의 내부 IP를 1개의 외부 IP 와 연결하는 기술

apiVersion: v1
kind: Pod
metadata:
  labels:
    run:mynginx
  name: mynginx
spec:
  containers:
  - name: mynginx
    image: nginx
  restartPolicy: Never
  • apiVersion : 리소스 이름이 동일할 경우 , 이름 충돌을 피하기 위한 목적으로 리소스의 scope을 정의한것 . 패키지 이름과 비슷
  • kind: 리소스의 타입을 정의. 클래스와 비슷
  • metadata: 리소스의 메타정보를 나타낸다.
    • labels: 리소스의 라벨정보를 표기
    • name:리소스의 이름을 표기
    • spec : 리소스의 스펙을 정의
      • containers: 1 개 이상의 컨테이너를 정의
        • name: 컨테이너 이름
        • image:컨테이너의 이미지 주소 지정

pod 생성 순서

  1. 사용자가 kubectl 명령을 통해 pod 정의를 k8s 마스터에 전달
  2. k8s 마스터는 YAML 정의의 유효성 체크후 특정 노드에 사용자의 요청에 따라 컨테이너 실행
  3. 명령 전달받은 노드는 요청 사항에 맞게 실제 컨테이너를 노드에 실행

5.2 라벨링 시스템

특정 리소스를 참조하기위해서 라벨링 시스템을 이용하기도 하고 Pod에 트래픽을 전달할때도 라벨링 시스템을 활용

Pod에 라벨을 부여한다는 의미는 key,value 형태의 문자열을 Pod의 metadata property 에 추가한다는것을 의미

5.2.1 라벨 정보 부여

  1. label 명령을 이용하는 방법
    sudo kubectl label pod mynginx hello=world
    
  2. kubectl label pod <NAME> <KEY>=<VALUE>
  3. yaml 에 직접 라벨 추가 가능
kubectl run hello -- image nginx 

로 실행하는 경우 자동으로 run:hello 가 라벨에 추가됨

5.2.2 라벨 정보 확인

sudo kubectl get pod mynginx  --show-labels

5.2.4 nodeSelector를 이용한 노드 선택

라벨링 시스템을 이용하여 Pod 가 특정 노드에 할당 되도록 스케줄링 할수 있다.

쿠버네티스는 클러스터링 시스템, 사용자가 매번 노드를 선택할 필요 없이 쿠버네티스가 Pod 스케줄링 관리

sudo kubectl label node suhworker disktype=hdd
sudo kubectl label node suhworker1 disktype=ssd
sudo kubectl get node --show-labels | grep disktype

node-selector.yaml

GNU nano 6.2                                                           
apiVersion: v1
kind: Pod
metadata:
  name: node-selector
spec:
  containers:
  - name: nginx
    image: nginx
  
  nodeSelector:
    disktype: ssd
sudo kubectl apply -f node-selector.yaml

노드 그룹

2 개 이상의 노드에 동일한 라벨이 부여되어 있는 경우 ,쿠버네티스가 노드의 상태를 확인하여 그 가운데 최적의 노드 하나를 선택

에러발생

pending 지속

sudo kubectl describe pod node-selector 

disktype =hdd가 없어서 발생

5.3 실행 명령 및 파라미터 지정

apiVersion: v1 
kind: Pod 
metadata:
  name: cmd 
spec:
  restartPolicy: OnFailure
  containers:
  - name: nginx 
    image: nginx 
    command: ["/bin/echo"] 
    args: ["hello"]
  • command: 컨테이너의 시작 실행 명령을 지정 . 도커의 ENTRYPOINT 에 대응되는 property
  • args: 실행 명령에 넘겨줄 파라미터를 지정한다
  • restartPolicy : Pod의 재시작 정책을 설정
    • Always: Pod 종료시 항상 재시작
    • Never : 재시작을 시도하지 않는다.
    • OnFailure: 실패 시에만 재시작 시도

5.4 환경변수 설정

env property 를 활용하면 간단히 설정 가능

apiVersion: v1 
kind: Pod
metadata: 
  name: env 
spec:
  containers:
  - name: nginx
    image: nginx
    env:
    - name: hello
      value: "world!"

env: 환경변수를 설정하는 propertty를 선언

  • name : 환경변수의 key를 지정
  • value: 환경 변수의 value를 지정
sudo kubectl exec env -- printenv | grep hello

5.5 불륨 연결

Pod 내부 스토리지의 생명 주기는 Pod와 동일하게 Pod가 사라지면 저장된 데이터도 삭제된다.

Pod내에서 생성된 데이터를 Pod 생명주기와 상관없이 지속적으로 저장하고 싶다면 불륨을 따로 연결해야 한다.

                                                                  volume.yaml *                                                                             
apiVersion: v1 
kind: Pod
metadata:
  name: volume
spec:
  containers:
  - name: nginx
    image: nginx 
		
		#컨테이너 내부의 연결 위치 지정 
    volumeMounts:
    - mountPath: /container-volume
      name: my-volume 
	# host 서버의 연결 위치 지정 
  volumes:
  - name: my-volume
    hostPath:
      path: /home
  • volumeMounts: 컨테이너 내부에 사용될 불륨을 선언
    • mountPath: 컨테이너 내부에 불륨이 연결될 위치를 지정
    • name: volumeMounts와 volumes 을 연결하는 식별자로 사용
  • volumes: Pod에서 사용할 volume을 지정
    • name: volumeMounts 와 volumes을 연결하는 식별자로 사용
    • hostPath: 호스트 서버의 연결 위치를 지정

5.6 리소스 관리

k8s는 컨테이너 실행에 필요한 리소스를 제약할수 있는 매커니즘을 제공한다.

resources 라는 property를 활용하여 리소스를 관리한다.

resources 에는 2가지 리소스 관리 기능이 있다.

최소 리소스 사용량 보장 : requests

최대 리소스 사용량 제한: limits property

apiVersion: v1
kind: Pod
metadata:
  name: requests
spec:
  containers:
    - name: nginx
      image: nginx
      resources:
        requests:
          cpu: "250m"
          memory: "500Mi"

requests :

cpu 리소스 최소 사용량 정의 1000m → 1core

memory 리소스 최소 사용량 정의

5.6.2 limits

apiVersion: v1 
kind: Pod
metadata: 
  name: limits 
spec:
  restartPolicy: Never
  containers:
  - name: mynginx
    image: python:3.7
    command: ["python"]
    args: ["-c","arr = []\\nwhile True:arr.append(range(1000))" ]
    resources: 
      limits: 
        cpu: "500m"
        memory: "1Gi"

limits: 최대 리소스 사용량 제한

-cpu: CPU 리소스 최대 사용량 정의

-memory: 메모리 리소스 최대 사용량 정의

request limit 합치기

apiVersion: v1
kind: Pod
metadata:
  name: resources
spec:
  containers:
  - name: nginx
    image: nginx
    resources:
      requests:
        cpu: "250m"
        memory: "500Mi"
      limits:
        cpu:"500m"
        memory: "1Gi"

5.7 상태 확인

5.7.1 livenessProbe

컨테이너가 정상적으로 살아있는지 확인하기 위해 livenessProbe 이용

apiVersion: v1 
kind: Pod 
metadata:
  name: liveness
spec:  
  containers:
  - name: nginx
    image: nginx
    livenessProbe:
      httpGet:
        path: /live
        port: 80
  • livenessProbe : Pod가 정상적으로 동작하고 있는지 확인하는 property -httpGet : HTTP GET method 를 이용하여 상태 확인을 수행
    • path: HTTP PATH 를 지정
    • port: HTTP 포트를 지정

nginx 에는 /live가 없어서 404 에러가 발생한다.

에러를 확인하려면 log 확인

kubectl logs liveness 

/live 가 없으니깐 만들어주자

kubectl exec liveness -- touch /usr/share/nginx/html/live 

5.7.2 readinessProbe

livenessProbe 는 Pod가 살아있는지 확인하는거라면 readinessProbe는 Pod가 생성 직후, 트래픽을 받을 준비가 완료되었는지 확인하는 property

젠킨스 경우 구동 시간이 오래 걸리는 웹서비스라면 구동이 완료되고 트래픽 받는지 확인해야한다 .

apiVersion: v1
kind: Pod
metadata:
  name: readiness 
spec:
  containers:
  - name: nginx
    image: nginx
    readinessProbe:
      httpGet:
        path: /ready
        port: 80
  • readinessProbe :Pod 의 준비 완료를 확인하는 property
    • httpGet: HTTP GET method를 이용한다.
      • path: HTTP PATH를 지정
      • port: HTTP 포트를 지정

ready 파일이 없어서 404 에러

sudo kubectl get pod 
READY 0/1 로 표시 

ready 생성

sudo kubectl exec readiness -- touch /usr/share/nginx/html/ready
sudo kubectl get pod 
READY 1/1 로 변

명령 실행을 통해 정상 여부 확인

apiVersion: v1
kind: Pod 
metadata:
  name: readiness-cmd
spec:
  containers:
  - name: nginx
    image: nginx
    readinessProbe: 
      exec:
        command:
        - cat
        - /tmp/ready

리턴값 0 이면 정상 0 이외의 다른값 반환되면 비정상

sudo kubectl exec readiness-cmd -- touch /tmp/ready

생성 함으로써 정상으로 만듬

5.8 2개 컨테이너 실행

apiVersion: v1 
kind: Pod 
metadata:
  name: second 
spec:
  containers:
  - name: nginx
    image: nginx
  - name: curl 
    image: curlimages/curl
    command: ["/bin/sh"]
    args:["-c","while true; do sleep 5; curl localhost; done"]

두개 이상의 컨테이너를 실행할경우 로그 실행을 위해서 1개만 선택

sudo kubectl logs second -c nginx

사이드카 패턴 :메인 컨테이너가 주어진 본연의 임무를 수행하고 사이드가 컨테이너에서 메인 컨테이너를 보조하는 역할

5.9 초기화 컨테이너

initContainers property 을 통해 먼저 초기화

먼저 git 저장소를 미리 받아야 하는 경우 초기화 컨테이너에서 미리 git pull 을 받아 컨테이너 끼리의 공유 공간이 emptyDirvolume 을 통해 git 리파지토리를 전달한다.

5.10 Config 설정

설정 값들을 따로 모아둘수 있는 통 을 k8s 에서는 ConfigMap 이라고 부른다

5.10.1 ConfigMap 리소스 생성

kubectl create confimap <key> <data-source>
sudo kubectl create configmap game-config --from-file=game.properties

상세확인

sudo kubectl get cm game-config -o yaml

ConfigMap 생성

GNU nano 6.2                                      monster-config.yaml                                                
apiVersion: v1
kind: ConfigMap
metadata:
  name: monster-config
  namespace: default
data:
  monsterType: fire
  monsterNum: "5"
  monsterLife: "3"

환경 변수 -envFrom

apiVersion: v1
kind: Pod
metadata:
  name: monster-env
spec:
  restartPolicy: OnFailure
  containers:
  - name: monster-env
    image: k8s.gcr.io/busybox
    command: ["printenv"]
    envFrom:
    - configMapRef:
        name: monster-config

5.11 민간 데이터 관리

Secret 리소스는 각 노드에서 사용될때 디스크에 저장되지 않고, tmpfs 라는 메모리 기반 파일시스템을 사용해서 보안에 더욱 강하다.

5.11. 1 Secret 리소스 생성

계정이름과 비밀번호로 사용할 값들을 base 64로 인코딩

echo -ne admin | base64
echo -ne password123 | base64
apiVersion: v1
kind: Secret
metadata:
  name: user-info
type: Opaque
data:
  username: YWRtaW4=
  password: cGFzc3dvcmQxMjM=

5.11.2 Secret 활용

불륨연결

apiVersion: v1
kind: Pod
metadata:
  name: secret-volume
spec:
  restartPolicy: OnFailure
  containers:
  - name: secret-volume
    image: k8s.gcr.io/busybox
    command: ["sh"]
    args:["-c","ls /secret; cat /secret/username"]
    volumeMounts:
    - name: secret 
      mountPath: "/secret" 
  volumes:
  - name: secret
    secret:
      secretName: user-info

환경변수 -envFrom

apiVersion: v1
kind: Pod
metadata:
  name: secret-envfrom
spec:
  restartPolicy: OnFailure
  containers:
  - name: secret-envfrom
    image: k8s.gcr.io/busybox
    command: ["printenv"]
    envFrom:
    - secretRef:
        name: user-info

'개발 도서 > 핵심만 콕 쿠버네티스' 카테고리의 다른 글

07 쿠버네티스 컨트롤러  (0) 2023.11.17
06 쿠버네티스 네트워킹  (0) 2023.11.17
04 쿠버네티스 첫 만남  (0) 2023.11.17
03 쿠버네티스 설치  (0) 2023.11.17
02 쿠버네티스 소개  (0) 2023.11.17