본문 바로가기
CICD

[Kubernetes] Pod(기본 오브젝트)

by 장중앙 2022. 1. 3.

Pod란

컨테이너를 하나 이상 모아놓은 것, 쿠버네티스 애플리케이션의 최소 단위

같은 포드에 속한 컨테이너끼리는 동일한 컴퓨팅 리소스를 공유

 

k8s의 크기 단위

Cluster > Node > Pod > Container

 

 

Pod의 3가지 특징

  1. Container 
    • pod안에는 하나의 독립적인 서비스를 제공할 수 있는 컨테이너들이 존재
    • 컨테이너들은 서비스가 연결될 수 있도록 Port를 가지고 있음
      • 한 Pod안에서 컨테이너들끼리의 Port는 중복될 수 없음
    • pod가 생성될 떄 고유의 IP 주소가 할당됨
      • 쿠버네티스 외부에서는 접근 불가
  2. Label
    • pod 뿐만 아니라 모든 Object에 달 수 있음(pod에서 가장 많이 사용)
    • 사용목적에 따라 label 등록, 목적에 따라 오브젝트 분류/연결
    • Key, Value로 구성
  3. Node Schedule
    • 하나의 Pod는 결국 여러 Node중 하나에 올라가야함
    • 두가지의 방법 존재
      1. 직접 Node를 선택하는 방법
        • Node에 label을 달고 Pod를 만들 때 Node를 지정
      2. Kubernetes가 자동으로 연결해주는 방법
        • Kubernetes의 스케줄러가 판단하여 지정
        • Node에는 전체 사용가능한 자원량이 존재
          • Pod 생성시 요구 메모리를 지정하면 적합한 Node에 배치 연결
            • request : 요구되는 메모리, limits: 최대 허용 메모리로 설정가능
            • limits의 경우 Cpu, Memory로 나눠서 설정가능
              • Memory : 초과시 Pod 종료
              • Cpu : 초과시 request로 낮춤, 종료 X

Pod 실습


Kubernets 워크로드 접속

http://<master-node IP>/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/#/workloads?namespace=default로 접속 가능

 

Master Node 재기동 시, Dashboard에 접속하기위해서는 아래 명령어로 Proxy를 오픈해야함 

 

[root@k8s-master ~]# nohup kubectl proxy --port=8001 --address=192.168.56.30 --accept-hosts='^*$' >/dev/null 2>&1 &

 



여러 컨테이너가 포함된 Pod 생성

신규 리소스 생성 클릭 후, Yaml 파일 작성

Pod 생성시, 한 파드에 같은 port번호를 가진 컨테이너로 구성할 시 pod 생성 실패

apiVersion: v1
kind: Pod
metadata:
  name: pod-1
spec:
  containers:
  - name: container1
    image: kubetm/p8000
    ports:
    - containerPort: 8000
  - name: container2
    image: kubetm/p8080
    ports:
    - containerPort: 8080

 

생성된 pod 확인

pod 실행창에서 container1 -> containter2, container1 -> container1 모두의 접속이 가능함


ReplicationController 생성

ReplicationController는 Pod를 관리, Pod를 생성해주고 Pod가 죽어있다면 재생성의 관리를 해줌

apiVersion: v1
kind: ReplicationController
metadata:
  name: replication-1
spec:
  replicas: 1
  selector:
    app: rc
  template:
    metadata:
      name: pod-1
      labels:
        app: rc
    spec:
      containers:
      - name: container
        image: kubetm/init

 

replicationController와 이로 인해 생성된 Pod 확인

생성된 pod 삭제 시, 삭제와 동시에 새로운 Pod 생성

 

재생성된 Pod를 확인해면 20.109.131.2에서 20.109.131.3으로 IP가 변경된 것을 확인 가능 

재생성된 Pod


Label을 적용한 Pod

web, db, server의 dev용, Production용 Pod를 생성(총 6개의 파드)

apiVersion: v1
kind: Pod
metadata:
  name: pod-1
  labels:
    type: web
    lo: dev
spec:
  containers:
  - name: container
    image: kubetm/init
apiVersion: v1
kind: Pod
metadata:
  name: pod-2
  labels:
    type: db
    lo: dev
spec:
  containers:
  - name: container
    image: kubetm/init
apiVersion: v1
kind: Pod
metadata:
  name: pod-3
  labels:
    type: server
    lo: dev
spec:
  containers:
  - name: container
    image: kubetm/init
apiVersion: v1
kind: Pod
metadata:
  name: pod-4
  labels:
    type: web
    lo: production
spec:
  containers:
  - name: container
    image: kubetm/init
apiVersion: v1
kind: Pod
metadata:
  name: pod-5
  labels:
    type: db
    lo: production
spec:
  containers:
  - name: container
    image: kubetm/init
apiVersion: v1
kind: Pod
metadata:
  name: pod-6
  labels:
    type: server
    lo: production
spec:
  containers:
  - name: container
    image: kubetm/init

 

생성된 6개의 Pod 확인

 

service를 이용해 원하는 Pod 선택(service에 대한 정리는 다음 글에)

 

label - type이 web인 pod를 연결

apiVersion: v1
kind: Service
metadata:
  name: svc-for-web
spec:
  selector:
    type: web
  ports:
  - port: 8080

생성된 service를 확인하면 type이 web인 pod-1, pod-4으로 구성되어 있음

 

label -lo가 production인 pod를 연결

apiVersion: v1
kind: Service
metadata:
  name: svc-for-production
spec:
  selector:
    lo: production
  ports:
  - port: 8080

생성된 service를 확인하면 lo가 production인 pod-4, pod-5, pod-6으로 구성되어 있음


Node Schedule 실습

 

사용자 지정 Node Schedule

사용자가 Node를 직접 지정하여 Pod를 생성

apiVersion: v1
kind: Pod
metadata:
  name: pod-3
spec:
  nodeSelector:
    kubernetes.io/hostname: k8s-node1
  containers:
  - name: container
    image: kubetm/init

 

생성된 pod를 확인하면 지정한 Node인 k8s-node1에 Pod가 생성된것을 확인 할 수 있다.

 

Kubernets 임의의 Node Schedlule

Pod 생성시, 요구되는 사양을 지정

apiVersion: v1
kind: Pod
metadata:
  name: pod-8
spec:
  containers:
  - name: container
    image: kubetm/init
    resources:
      requests:
        memory: 2Gi
      limits:
        memory: 3Gi

정상 생성됨


 

첫 실습을 진행하면서

 Virtual Box로 VM을 생성하여 Xshell로 SSH접소을 통해 실습을 진행하는 동안 

  1. 생성한 Pod가 Pendding상태 유지
  2. XShell에서의 Master Node가 먹통

과 같은 현상이 계속 발생, 아래와 같은 메시지가 확인됨 

centOS의 CPU 현재 시간이 Watchdog 임계값보다 커서 소프트 잠금이 발생

위의 메시지에서는 커널의 watchdog이 170초 동안 업데이트되지 않았다는 의미인데

현재 VM의 리소스보다 과도하게 사용되어 발생한 것으로 생각

댓글