# 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
[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/
# 바뀌는 상태 정보 과정을 한 줄씩 출력
[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 |