본문 바로가기

Container/Kubernetes

[K8S] YAML 템플릿 및 Pod

# YAML 템플릿

  • 사람이 쉽게 읽을 수 있는 데이터 직렬화 양식
  • 기본 문법
    • 구조화된 데이터 포맷
    • Python처럼 들여쓰기로 데이터 계층 표기
    • 들여쓰기 할 때에는 Tab이 아닌 Space Bar 사용! (두 칸: 형제, 네 칸: Child)
    • Scalar 문법: ':'를 기준으로 key:value 설정
    • 배열 문법 : '-' 문자로 여러 개 값 지정
    • 주석은 #로 시작하고, 여러 줄 주석은 지원하지 않는다.
    • `---`는 성격이 다른 YAML 형식의 문서 여러 개가 있을 때 구분자로 사용한다. 
      • YAML 의 시작을 알리는 용도로도 사용한다. 
템플릿의 기본 형식
---
apiVersion: v1 #  사용하려는 API 버전
kind: Pod         # 어떤 종류의 오브젝트 혹은 컨트롤러 작업 등 리소스 유형(Pod, Deployment, Service 등..)
metadata:        # 오브젝트의 이름, 레이블 설정, 네임 스페이스 등 메타데이터 정보 포함
  tier: 라벨로 정의되어 특정 리소스의 역할, 계층(frontend, backend, database), 용도 정의하는데 사용됨
spec:               # 파드가 어떤 컨테이너를 갖고 실행하며, 실행할 때 어떻게 동작해야 하는지 명시

API version

alpha  👉🏻 beta 👉🏻 stable
kubernetes Object 정의 시 apiVersion이 필요
kubernetes가 update하는 API가 있으면 새로운 API가 생성됨
# 현재 클러스터에서 사용 가능한 API 버전 확인
root@master:~# kubectl api-versions
admissionregistration.k8s.io/v1
apiextensions.k8s.io/v1
apiregistration.k8s.io/v1
apps/v1
authentication.k8s.io/v1
authorization.k8s.io/v1
autoscaling/v1
autoscaling/v2
batch/v1
certificates.k8s.io/v1
coordination.k8s.io/v1
discovery.k8s.io/v1
events.k8s.io/v1
flowcontrol.apiserver.k8s.io/v1
flowcontrol.apiserver.k8s.io/v1beta3
networking.k8s.io/v1
node.k8s.io/v1
policy/v1
rbac.authorization.k8s.io/v1
scheduling.k8s.io/v1
storage.k8s.io/v1
v1

root@master:~# kubectl explain pod
KIND:       Pod
VERSION:    v1

 

API Object의 종류 및 버전

  • Deployment : apps/v1
  • Pod : v1
  • ReplicaSet:  apps/v1
  • ReplicationController:  v1
  • Service: v1
  • PersistentVolume: v1
# kubectl explane [obejct]
# 리소스의 정보 출력
# kubectl explan 이용해서 api version 찾기

[master ~]$ kubectl explain pod 
KIND:       Pod
VERSION:    v1

DESCRIPTION:
    Pod is a collection of containers that can run on a host. This resource is
    created by clients and scheduled onto hosts.
...

 

# Pod

Pod란?
컨테이너를 표현하는 K8S API의 최소 단위
Pod에는 하나 또는 여러 개의 컨테이너가 포함될 수 있다.
(컨테이너간의 유기적인 연동으로 동작하는 형태 : multiple container pod)


 

 

 

Pod 생성하기

  • kubectl run 명령(CLI)으로 생성
    • $ kubectl run <pod name> --image=nginx:1.14
    • 모르겠으면 $ kubectl run --help 이용하기
  • Pod yaml을 이용해 생성
    • $ kubectl create -f pod-nginx.yaml

pod-nginx.yaml

[master ~]$ kubectl get nodes
NAME    STATUS     ROLES           AGE   VERSION
master   NotReady   control-plane   21m   v1.27.2
node1   Ready      <none>          18m   v1.27.2
node2   Ready      <none>          32s   v1.27.2
node3   Ready      <none>          28s   v1.27.2

# CLI로 생성
[master ~]$ kubectl run web1 --image=nginx:1.14 --port=80
pod/web1 created

# yaml로 생성
[master ~]$ cat > pod-nginx.yaml 
apiVersion: v1 # string
kind: Pod      # string
metadata:      # dictionary
  name: nginx-pod
spec:
  containers:
  - name: nginx-container
    image: nginx:1.14
    ports:
    - containerPort: 80
      protocol: TCP
      
[master ~]$ kubectl create -f pod-nginx.yaml 
pod/nginx-pod created

[master ~]$ kubectl get pods
NAME        READY   STATUS    RESTARTS   AGE
nginx-pod   1/1     Running   0          62s
web1        1/1     Running   0          6m3s


[master ~]$ kubectl get pods -o wide
NAME        READY   STATUS    RESTARTS   AGE     IP         NODE    NOMINATED NODE   READINESS GATES
nginx-pod   1/1     Running   0          92s     10.5.2.2   node3   <none>           <none>
web1        1/1     Running   0          6m33s   10.5.3.2   node4   <none>           <none>

# 현재 실행중인 상태를 yaml 파일로 확인하기
[node1 ~]$ kubectl get pods web1 -o yaml
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: "2024-02-13T13:49:06Z"
  labels:
    run: web1
  name: web1
  namespace: default
  resourceVersion: "2548"
  uid: d6a4db5a-ff29-4fca-bf75-0db7c1f8c310
spec:
  containers:
  - image: nginx:1.14
    imagePullPolicy: IfNotPresent
    name: web1
    ...

 

# watch [명령어]
# watch 뒤의 명령어를 2초마다 한 번씩 실행
[master ~]$ watch kubectl get pods -o wide
NAME        READY   STATUS    RESTARTS   AGE     IP         NODE    NOMINATED NODE   READINESS GATES
nginx-pod   1/1     Running   0          7m41s   10.5.2.2   node3   <none>           <none>
web1        1/1     Running   0          12m     10.5.3.2   node4   <none>           <none>

# Pod에 접속해서 결과보기
[master ~]$ curl 10.5.2.2
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
....

[master ~]$ kubectl get pods web1 -o json | grep -i podip
        "podIP": "10.5.3.2",
        "podIPs": [

 

 

# multi pod

- multiple container pod 생성하기

# describe        Show details of a specific resource or group of resources
# kubectl describe [object] : 특정, 또는 그룹의 오브젝트를 더욱 자세하게 보여주는 명령어

# web1 pod안에 어떤 container가 있는 지 확인
[master ~]$ kubectl describe pod web1
Name:             web1
Namespace:        default
Priority:         0
Service Account:  default
Node:             node4/192.168.0.15
Start Time:       Tue, 13 Feb 2024 22:56:16 +0000
Labels:           run=web1
Annotations:      <none>
Status:           Running
IP:               10.5.3.2
IPs:
  IP:  10.5.3.2
Containers:
  web1:
    Container ID:   containerd://9070a35e0c00f81696504b7778d57aa17ab652d32e615801883ffaa1ea41d15d
    Image:          nginx:1.14
    Image ID:       docker.io/library/nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d
    Port:           80/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Tue, 13 Feb 2024 22:56:21 +0000
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-bvmsp (ro)
      
      
[master ~]$ cat pod-multi.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: multipod
spec:
  containers:
  - name: nginx-container
    image: nginx:1.14
    ports:
    - containerPort: 80
  - name: centos-container
    image: centos:7
    command:
    - sleep
    - "10000"
    
[master ~]$ kubectl get pods -o wide
NAME        READY   STATUS    RESTARTS   AGE   IP         NODE    NOMINATED NODE   READINESS GATES
multipod    2/2     Running   0          17s   10.5.2.2   node3   <none>           <none>
nginx-pod   1/1     Running   0          18m   10.5.3.3   node4   <none>           <none>
web1        1/1     Running   0          20m   10.5.3.2   node4   <none>           <none>
# ip는 하나인 것 확인 가능

[master ~]$ kubectl exec multipod -c nginx-container -it -- /bin/bash
root@multipod:/# cd /usr/share/nginx/html/
root@multipod:/usr/share/nginx/html# ls
50x.html  index.html

root@multipod:/usr/share/nginx/html# echo "Test web" > index.html 
root@multipod:/usr/share/nginx/html# exit
exit

[master ~]$ curl 10.5.2.2
Test web

# centos-container에는 webserver 동작중이지 않는 중이다.
[master ~]$ kubectl exec multipod -c centos-container -it -- /bin/bash
[root@multipod /]# ps -ef 
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 23:16 ?        00:00:00 sleep 10000
root         7     0  0 23:50 pts/0    00:00:00 /bin/bash
root        21     7  0 23:50 pts/0    00:00:00 ps -ef

# 하지만 동일한 IP를 가지고 웹서버가 이미 Test web을 송출하고 있다.
## 즉, multi-container pod에서 container들의 pod명과 ip는 동일하다.
[root@multipod /]# curl localhost:80
Test web
# kubectl logs [pod명] -c [container명]
 [pod명] 안의 [container명] 의 로그 출력
multi container 안에서는 -c 옵션을 꼭 붙여줘야 하지만 single container에서는 안붙여도 된다.

 

# nginx가 가지고 있는 log 출력
[master ~]$ kubectl logs multipod -c nginx-container
192.168.0.18 - - [13/Feb/2024:23:46:13 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
192.168.0.18 - - [13/Feb/2024:23:49:57 +0000] "GET / HTTP/1.1" 200 9 "-" "curl/7.29.0" "-"
127.0.0.1 - - [13/Feb/2024:23:52:37 +0000] "GET / HTTP/1.1" 200 9 "-" "curl/7.29.0" "-"

# single container connection log 확인
[master ~]$ kubectl logs web1
192.168.0.18 - - [13/Feb/2024:23:58:52 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
192.168.0.18 - - [13/Feb/2024:23:59:07 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"

 

# Pod 동작 flow

Pod lifecycle : https://kubernetes.io/ko/docs/concepts/workloads/pods/pod-lifecycle/

 

파드 라이프사이클

이 페이지에서는 파드의 라이프사이클을 설명한다. 파드는 정의된 라이프사이클을 따른다. Pending 단계에서 시작해서, 기본 컨테이너 중 적어도 하나 이상이 OK로 시작하면 Running 단계를 통과하

kubernetes.io

 

# 바뀌는 상태 정보 과정을 한 줄씩 출력
[master ~]$ kubectl get pods -o wide --watch
NAME        READY   STATUS    RESTARTS   AGE     IP         NODE    NOMINATED NODE   READINESS GATES
nginx-pod   1/1     Running   0          6m38s   10.5.2.3   node3   <none>           <none>

 

 

# 따배쿠 Quiz

1. 현재 namespace에서 동작중인 pod는 몇개인가?

$ kubectl get pods

2. 현재 시스템에서 동작중인 Pod 수는?

$ kubectl get pods --all-namespaces

3. 컨테이너 nginx를 실행하는 nginx-pod라는 이름의 Pod 생성하시오

$ kubectl run nginx-pod --image=nginx:1.14

4. 앞에서 생성한 Pod의 image 정보를 확인하는 명령?

$ kubectl describe pod nginx-pod

5. 컨테이너 image 'redis123'을 실행하는 pod 'redis'를 redis.yaml를 이용해 생성하시오

[master ~]$ kubectl run redis --image=redis123 --dry-run -o yaml > redis.yaml
apiVersion: v1
kind: Pod
metadata:
  name: redis
spec:
  containers:
  - image: redis123
    name: redis

[master ~]$ kubectl create -f redis.yaml 
pod/redis created

[master ~]$ kubectl get pods
NAME    READY   STATUS         RESTARTS   AGE
redis   0/1     ErrImagePull   0          6s

6. 앞서 만든 redis pod의 image를 redis로 수정하여 동작시키기

# 왜 제대로 동작하지 않는가?
# 세부 정보 확인
[master ~]$ kubectl describe pod redis
Name:             redis
Namespace:        default
Priority:         0
Service Account:  default
Node:             node4/192.168.0.15
Start Time:       Wed, 14 Feb 2024 00:26:45 +0000
Labels:           <none>
Annotations:      <none>
Status:           Pending
IP:               10.5.3.4
...
Events:
  Type     Reason     Age                  From               Message
  ----     ------     ----                 ----               -------
  Normal   Scheduled  2m24s                default-scheduler  Successfully assigned default/redis to node4
  Normal   Pulling    51s (x4 over 2m24s)  kubelet            Pulling image "redis123"
  Warning  Failed     51s (x4 over 2m23s)  kubelet            Failed to pull image "redis123": rpc error: code = Unknown desc = failed to pull and unpack image "docker.io/library/redis123:latest": failed to resolve reference "docker.io/library/redis123:latest": pull access denied, repository does not exist or may require authorization: server message: insufficient_scope: authorization failed
  Warning  Failed     51s (x4 over 2m23s)  kubelet            Error: ErrImagePull
  Warning  Failed     36s (x6 over 2m22s)  kubelet            Error: ImagePullBackOff
  Normal   BackOff    23s (x7 over 2m22s)  kubelet            Back-off pulling image "redis123"
  
[master ~]$ kubectl edit pod redis
pod/redis edited
반응형

'Container > Kubernetes' 카테고리의 다른 글

[K8S] init container  (0) 2024.02.18
[K8S] Liveness Probe (Self-healing) Pod  (1) 2024.02.16
[K8S] namespace란  (0) 2024.02.13
[K8S] 쿠버네티스 개념 및 Architecture  (0) 2024.02.09
[K8S] kubectl command  (0) 2024.02.06