nginx 웹 서버 컨테이너를 pod로 동작시키기
# 파드 생성
% kubectl run web --image=nginx:1.14 --port=80
# 파드 조회
% kubectl get pods
% kubectl get pods -o wide
# 파드 삭제
% kubectl delete pod web
파드 생성 결과를 yaml
파일로 추출합니다.
(--dry-run
옵션을 통해 실제로 파드를 생성하지는 않습니다)
# 파드를 yaml 파일로 추출
% kubectl run web --image=nginx:1.14 --port=80 --dry-run=client -o yaml > web.yaml
% ls
web.yaml
% cat web.yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: web
name: web
spec:
containers:
- image: nginx:1.14
name: web
ports:
- containerPort: 80
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
# 파드를 조회해보면 파드 생성 시에 --dry-run 옵션을 주었으므로 파드가 실제로 생성되진 않았습니다.
% kubectl get pod
NAME READY STATUS RESTARTS AGE
eshop-cart-app 1/1 Running 4 (110d ago) 113d
front-end-8dc556958-fvlpx 1/1 Running 2 (111d ago) 133d
front-end-8dc556958-vcr4s 1/1 Running 3 (111d ago) 133d
nginx-79488c9578-qwnfk 1/1 Running 2 (110d ago) 111d
nginx-79488c9578-xpsvp 1/1 Running 1 (111d ago) 111d
이제 yaml 파일을 수정한 후 yaml 파일
로 파드를 생성 및 삭제
해봅시다.
% vim web.yaml
apiVersion: v1
kind: Pod
metadata:
name: web
spec:
containers:
- image: nginx:1.14
name: web
ports:
- containerPort: 80
# 수정 후에 yaml 파일을 이용해 파드를 실행
% kubectl apply -f web.yaml
pod/web created
% kubectl get pods web
NAME READY STATUS RESTARTS AGE
web 1/1 Running 0 8s
% kubectl get pods web -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
web 1/1 Running 0 15s 10.244.1.29 k8s-worker1 <none> <none>
# yaml 파일을 이용해 파드 삭제
% kubectl delete -f web.yaml
pod "web" deleted
cka-exam
이라는 namespace를 만들고, cka-exam
namespace에 아래와 같은 Pod를 생성하세요.k8s
로 클러스터 이동% kubectl config use-context k8s
Switched to context "k8s".
% kubectl config current-context
k8s
cka-exam
이라는 이름의 네임스페이스 생성% kubectl create namespace cka-exam
namespace/cka-exam created
% kubectl run pod-01 --image=busybox --dry-run=client -o yaml > pod-01.yaml
환경변수 설정 방법은 쿠버네티스 공식 문서 - Pod Enviorment Variable를 참고하세요.
커맨드와 아규먼트 설정 방법은 쿠버네티스 공식 문서 - Pod Command를 참고하세요.
% vim pod-01.yaml
# 아래와 같이 수정합니다.
kind: Pod
metadata:
creationTimestamp: null
labels:
run: pod-01
name: pod-01
namespace: cka-exam
spec:
containers:
- image: busybox
name: pod-01
env:
- name: CERT
value: "CKA-cert"
command: ["/bin/sh"]
args: ["-c", "while true; do echo $(CERT); sleep 10; done"]
% kubectl apply -f pod-01.yaml
pod/pod-01 created
% kubectl get pod pod-01 --namespace=cka-exam -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-01 1/1 Running 0 73s 10.244.1.30 k8s-worker1 <none> <none>
custom-app
의 log를 모니터링하고 file not found
메세지를 포함하는 log 라인을 추출하세요./opt/REPORT/2022/custom-app-log
에 기록하세요.hk8s
로 클러스터 이동% kubectl config use-context hk8s
Switched to context "hk8s".
% kubectl config current-context
hk8s
# 실행 중인 파드를 조회해 custom-app이 있는지 확인
% kubectl get pod
NAME READY STATUS RESTARTS AGE
busybox-sleep 0/1 Error 2 135d
campus-01 1/1 Running 3 (110d ago) 135d
cka-webserver 0/1 Completed 2 135d
custom-app 0/1 Error 2 135d
fast-01 0/1 Error 2 135d
web 0/1 Completed 29 135d
# 로그 조회
% kubectl logs custom-app
find files
error: file not found
Today: Wed Mar 2 03:14:05 KST 2022
Hostname: console
find files
error: file not found
Today: Wed Mar 2 03:14:05 KST 2022
Hostname: console
# 'file not found'라는 메세지를 추출
% kubectl logs custom-app | grep "file not found"
error: file not found
error: file not found
# 지정 경로에 메세지 저장 후 확인
% kubectl logs custom-app | grep "file not found" > /opt/REPORT/2022/custom-app-log
% cat /opt/REPORT/2022/custom-app-log
error: file not found
error: file not found
API 서버 없이 특정 노드에 있는 kubelet에 의해 직접 관리되는 Pod입니다.
/etc/kubernetes/manifests
디렉토리에 pod에 대한 yaml 파일을 저장 시 static pod가 생성
됩니다.
staticPod의 경로 확인
kubelet의 config 파일은 /var/lib/kubelet/config.yaml
에 위치하고 이 안에 staticPodPath: /etc/kubernetes/manifests
가 정의되어 있습니다.
% cat /var/lib/kubelet/config.yaml
...
staticPodPath: /etc/kubernetes/manifests
% systemctl restart kubelet
hk8s-w1
에 접속% ssh hk8s-w1
root
유저로 전환% sudo -i
/var/lib/kubelet/config.yaml
에서 static pod
의 경로를 확인(기본값: /etc/kubernetes/manifests
)% cat /var/lib/kubelet/config.yaml | grep staticPodPath
staticPodPath: /etc/kubernetes/manifests
static pod
생성# static pod 경로로 이동
% cd /etc/kubernetes/manifests/
# yaml 파일을 생성해 static pod 생성
% kubectl run webserver --image=nginx:1.14 --port=80 --dry-run=client -o yaml > webserver.yaml
% ls
webserver.yaml
% cat webserver.yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: webserver
name: webserver
spec:
containers:
- image: nginx:1.14
name: webserver
ports:
- containerPort: 80
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
# static pod 생성 확인
% kubectl get pods
NAME READY STATUS RESTARTS AGE
busybox-sleep 1/1 Running 3 (110d ago) 135d
campus-01 1/1 Running 3 (110d ago) 135d
cka-webserver 1/1 Running 3 (110d ago) 135d
custom-app 1/1 Running 3 (110d ago) 135d
fast-01 1/1 Running 3 (110d ago) 135d
web 0/1 CrashLoopBackOff 44 (2m51s ago) 135d
webserver-hk8s-w1 1/1 Running 0 88s
# yaml 파일을 삭제함으로써 static pod 삭제
% rm webserver.yaml
rm: remove regular file ‘webserver.yaml’? y
# static pod 삭제 확인
% kubectl get pods
NAME READY STATUS RESTARTS AGE
busybox-sleep 1/1 Running 3 (110d ago) 135d
campus-01 1/1 Running 3 (110d ago) 135d
cka-webserver 1/1 Running 3 (110d ago) 135d
custom-app 1/1 Running 3 (110d ago) 135d
fast-01 1/1 Running 3 (110d ago) 135d
web 0/1 CrashLoopBackOff 44 (4m35s ago) 135d
hk8s-w1
노드에 nginx-static-pod.yaml
라는 이름의 Static Pod
를 생성하세요.nginx-static-pod
nginx
80
hk8s-w1
에 접속% ssh hk8s-w1
root
유저로 전환% sudo -i
/var/lib/kubelet/config.yaml
에서 static pod
의 경로를 확인(기본값: /etc/kubernetes/manifests
)% cat /var/lib/kubelet/config.yaml | grep staticPodPath
staticPodPath: /etc/kubernetes/manifests
static pod
생성% cd /etc/kubernetes/manifests/
% kubectl run nginx-static-pod --image=nginx --port=80 --dry-run=client -o yaml > nginx-static-pod.yaml
% kubectl get pod
NAME READY STATUS RESTARTS AGE
busybox-sleep 1/1 Running 3 (110d ago) 135d
campus-01 1/1 Running 3 (110d ago) 135d
cka-webserver 1/1 Running 3 (110d ago) 135d
custom-app 1/1 Running 3 (110d ago) 135d
fast-01 1/1 Running 3 (110d ago) 135d
nginx-static-pod-hk8s-w1 1/1 Running 0 10s
web 0/1 CrashLoopBackOff 47 (25s ago) 135d
의존성
이 있다면 같이 하나의 파드로 묶어서 실행eshop-frontend
파드를 생성하세요.% kubectl config use-context k8s
% kubectl run eshop-frontend --image=nginx --dry-run=client -o yaml > eshop-frontend.yaml
% vim eshop-frontend.yaml
# 아래와 같이 편집합니다.
$ cat eshop-frontend.yaml
apiVersion: v1
kind: Pod
metadata:
name: eshop-frontend
spec:
containers:
- image: nginx
name: eshop-frontend
- image: redis
name: redis-frontend
- image: memcached
name: memcached-frontend
- image: consul
name: consul-frontend
% kubectl apply -f eshop-frontend.yaml
pod/eshop-frontend created
% kubectl get pod eshop-frontend
NAME READY STATUS RESTARTS AGE
eshop-frontend 0/4 ContainerCreating 0 28s
기본 컨테이너 기능을 확장하기 위해 사용
합니다.기본 서비스에 충실
하고, 추가 기능을 별도의 컨테이너에 적용
합니다.main container -----> volume -----> sidecar container
nginx shared-logs busybox
yaml
파일을 통해 예시를 살펴봅시다.
apiVersion: v1
kind: Pod
metadata:
name: webserver
spec:
volumes:
- name: shared-logs
emptyDir: {}
containers:
- name: main
image: nginx
volumeMounts:
- name: shared-logs
mountPath: /var/log/nginx
- name: sidecar
image: busybox
command: ["sh","-c","while true; do cat /log/access.log /log/error.log; sleep 10; done"]
volumeMounts:
- name: shared-logs
mountPath: /log
main
컨테이너의 /var/log/nginx
에 들어있는 로그를 shared-logs
라는 볼륨에 마운트하고 sidecar
컨테이너에서 shared-logs
를 /log
에 마운트합니다. 이후 sidecar
컨테이너에서 command
에 access.log
와 error.log
파일을 보여주도록 명령어를 입력합니다.
busybox
이미지를 사용. price
라는 이름의 사이드카 컨테이너르르 기존 eshop-cart-app
에 추가price
컨테이너는 아래의 command
실행"/bin/sh", "-c", "tail -n+1 -f /var/log/cart-app.log"
/var/log
에 마운트된 볼륨을 사용하여 사이드카 컨테이너에서 로그 파일 cart-app.log
를 사용eshop-cart-app
파드와 cart-app
컨테이너를 수정하지 마세요.쿠버네티스 공식 문서 - 사이드카 컨테이너를 참고하세요.
% kubectl get pod eshop-cart-app -o yaml > eshop-cart-app.yaml
% vim eshop-cart-app.yaml
# 공식문서를 참고해서 아래와 같이 수정합니다.
apiVersion: v1
kind: Pod
metadata:
name: eshop-cart-app
spec:
containers:
- command:
- /bin/sh
- -c
- 'i=1;while :; do echo -e "$i: Price: $((RANDOM % 10000 + 1))" >> /var/log/cart-app.log;
i=$((i+1)); sleep 2; done'
image: busybox
imagePullPolicy: Always
name: cart-app
volumeMounts:
- mountPath: /var/log
name: varlog
- name: price
image: busybox
args: [/bin/sh, -c, 'tail -n+1 -f /var/log/cart-app.log']
volumeMounts:
- name: varlog
mountPath: /var/log
volumes:
- emptyDir: {}
name: varlog
# 기존의 eshop-cart-app 파드를 삭제합니다.
% kubectl delete pod eshop-cart-app
pod "eshop-cart-app" deleted
# 파드를 yaml 파일로 다시 생성합니다.
% kubectl apply -f eshop-cart-app.yaml
pod/eshop-cart-app created
# 정상 동작 확인
% kubectl get pod eshop-cart-app
NAME READY STATUS RESTARTS AGE
eshop-cart-app 2/2 Running 0 13s
% kubectl logs eshop-cart-app -c price
...
192: Price: 5915
193: Price: 8018
194: Price: 5189
195: Price: 2873