실습
Single-container Pod
Pod 생성
cat <<EOF | kubectl apply -f - apiVersion: v1 kind: Pod metadata: name: nginx spec: containers: - image: nginx name: nginx volumeMounts: - mountPath: /var/log/nginx name: log-volume volumes: - name: log-volume emptyDir: {} EOF
배포된 웹서버 호출
kubectl exec nginx -- curl -s localhost
웹서버 로그 확인
kubectl exec nginx -- cat /var/log/nginx/access.log
Pod 삭제
kubectl delete pod nginx
Multi-container Pod
Pod 생성
cat <<EOF | kubectl apply -f - apiVersion: v1 kind: Pod metadata: name: nginx spec: containers: - image: nginx name: nginx volumeMounts: - mountPath: /var/log/nginx name: log-volume - image: curlimages/curl name: curl volumeMounts: - mountPath: /data/log name: log-volume volumes: - name: log-volume emptyDir: {} EOF
Pod 상태 확인
kubectl get pod nginx --watch
위의 명령어를 실행하면 아래와 같은 결과를 확인할수 있습니다.
NAME READY STATUS RESTARTS AGE nginx 0/2 ContainerCreating 0 6s nginx 1/2 Error 0 9s nginx 1/2 Error 1 (3s ago) 12s nginx 1/2 CrashLoopBackOff 1 (1s ago) 13s nginx 1/2 Error 2 30s nginx 1/2 CrashLoopBackOff 2 (12s ago) 41s ... ...
Pod가 정상적으로 실행되지 않는 이유 확인
kubectl describe pod nginx
사용한 컨테이너 이미지에 대한 상세 내용 확인 - https://hub.docker.com/r/curlimages/curl
Pod 재생성
cat <<EOF | kubectl replace --force -f - apiVersion: v1 kind: Pod metadata: name: nginx spec: containers: - image: nginx name: nginx volumeMounts: - mountPath: /var/log/nginx name: log-volume - image: curlimages/curl name: curl command: ["sleep", "3600"] volumeMounts: - mountPath: /data/log name: log-volume volumes: - name: log-volume emptyDir: {} EOF
생성한 Pod의 명시한 모든 컨테이너가 정상 동작하는지 확인
kubectl get pod nginx
curl 컨테이너에서 nginx 컨테이너에서 실행중인 웹서버 호출
kubectl exec nginx -c curl -- curl -s localhost
nginx 컨테이너에서 웹서버 로그 확인
kubectl exec nginx -c nginx -- cat /var/log/nginx/access.log
curl 컨테이너에서 마운트한 볼륨에 생성된 파일 확인
kubectl exec nginx -c curl -- ls /data/log
curl 컨테이너에서 nginx 컨테이너 실행중인 웹서버가 생성한 로그파일 확인
kubectl exec nginx -c curl -- cat /data/log/access.log
Pod 삭제
kubectl delete pod nginx
Commands and Arguments
Pod 생성
cat <<EOF | kubectl apply -f - apiVersion: v1 kind: Pod metadata: name: echo spec: containers: - name: echo image: youngwjung/echo restartPolicy: Never EOF
Pod에 명시한 이미지는 아래와 같은 Dockerfile을 통해서 생성 되었습니다.
FROM alpine ENTRYPOINT ["echo"] CMD ["hello world"]
생성된 Pod 확인
kubectl get pod echo
Pod 상태 확인
kubectl get pod echo -o=jsonpath='{.status.phase}{"\n"}'
아래의 명령어를 통해서 Pod 상태가 무엇을 의미하는지 확인
kubectl explain pod.status.phase
Pod 로그 확인
kubectl logs echo
Pod 재생성
cat <<EOF | kubectl replace --force -f - apiVersion: v1 kind: Pod metadata: name: echo spec: containers: - name: echo image: youngwjung/echo args: ["welcome to kubernetes"] restartPolicy: Never EOF
Pod 로그 확인
kubectl logs echo
터미널에서 아래의 같은 명령어를 실행해서 나오는 결과 확인
date hello world
Pod 재생성
cat <<EOF | kubectl replace --force -f - apiVersion: v1 kind: Pod metadata: name: echo spec: containers: - name: echo image: youngwjung/echo command: ["date"] restartPolicy: Never EOF
Pod 로그 확인
kubectl logs echo
Pod 삭제
kubectl delete pod echo
Pod Networking
Pod 생성
cat <<EOF | kubectl apply -f - apiVersion: v1 kind: Pod metadata: name: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 8080 --- apiVersion: v1 kind: Pod metadata: name: curl spec: containers: - name: curl image: curlimages/curl command: ["sleep", "3600"] EOF
nginx Pod의 IP 주소 확인
kubectl get pod nginx -o yaml | grep -i ip
nginx Pod의 IP 주소 확인
kubectl get pod nginx -o jsonpath='{.status.podIP}{"\n"}'
curl Pod에서 nginx Pod 호출 시도
kubectl exec curl -- \ curl -s $(kubectl get pod nginx -o jsonpath='{.status.podIP}'):$(kubectl get pod nginx -o jsonpath='{.spec.containers[0].ports[0].containerPort}')
curl Pod에서 nginx Pod 호출 재시도
kubectl exec curl -- \ curl -s $(kubectl get pod nginx -o jsonpath='{.status.podIP}')
Session Manager 플러그인 설치
{ curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/linux_64bit/session-manager-plugin.rpm" -o "session-manager-plugin.rpm" sudo yum install -y session-manager-plugin.rpm rm session-manager-plugin.rpm }
Node들의 인스턴스 아이디 확인
kubectl get node \ -o jsonpath='{.items[*].spec.providerID}{"\n"}' | grep -E "i-[a-z0-9]+"
nginx Pod의 IP 주소 확인
kubectl get pod nginx -o jsonpath='{.status.podIP}{"\n"}'
한개의 Node로 Session Manager 연결
aws ssm start-session --target \ $(kubectl get node -o jsonpath='{.items[0].spec.providerID}{"\n"}' | grep -oE "i-[a-z0-9]+")
curl 명령어를 통해서 nginx Pod의 IP 호출
curl NGINX_POD_IP
Session Manager 종료
exit
Pod 삭제
kubectl delete pod curl nginx
Init Containers
Pod 생성
kubectl run nginx --image=nginx
Pod에 설정된 환경변수 확인
kubectl exec nginx -- printenv
웹서버 인덱스 페이지 확인
kubectl exec nginx -- curl -s localhost
EC2 Metadata를 통해서 Pod가 배포된 Node의 가용영역 확인
kubectl exec nginx -- \ curl -s -w "\n" http://169.254.169.254/latest/meta-data/placement/availability-zone
웹서버 인덱스 페이지 업데이트
kubectl exec nginx -- \ bash -c 'echo "welcome to $HOSTNAME in $(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone)" > /usr/share/nginx/html/index.html'
웹서버 인덱스 페이지가 업데이트 됐는지 확인
kubectl exec nginx -- curl -s localhost
Pod 생성
cat <<'EOF' | kubectl apply -f - apiVersion: v1 kind: Pod metadata: name: nginx-init spec: containers: - name: nginx image: nginx ports: - containerPort: 80 volumeMounts: - name: html mountPath: /usr/share/nginx/html initContainers: - name: index image: curlimages/curl command: - 'sh' - '-c' - 'echo "welcome to $HOSTNAME in $(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone)" > /data/index.html' volumeMounts: - name: html mountPath: /data volumes: - name: html emptyDir: {} EOF
Pod가 생성되었는지 확인
kubectl get pod nginx-init
Cloud9 인스턴스의 8080 포트를 nginx-int Pod의 80 포트로 포워딩
kubectl port-forward nginx-init 8080:80
Preview -> Preview Running Application 을 클릭해서 NGINX 웹서버로 접근
미리보기 창 및 kubectl port-forward 프로세스 종료
Pod 삭제
kubectl delete pod nginx nginx-init
Logs
Pod 생성
kubectl run nginx --image=nginx
Pod 로그 확인
kubectl logs nginx
웹서버 호출
kubectl exec nginx -- \ bash -c "for i in {1..10}; do curl -s localhost; done"
Pod 로그 확인
kubectl logs nginx
마지막 5줄의 로그를 확인하고 새로운 라인을 표시
kubectl logs nginx --tail 5 --follow
새로운 터미널을 열고 웹서버 호출
kubectl exec nginx -- \ bash -c "for i in {1..10}; do curl -s localhost/notexist; done"
기존 터미널로 돌아와서 새로운 로그가 보이는지 확인
Ctrl+C를 입력해서 5번에서 실행한 프로세스 종료
Pod가 배포된 Node 확인
kubectl get pod nginx -o wide
Pod가 배포된 노드의 인스턴스 아이디 확인
kubectl get node $(kubectl get pod nginx -o=jsonpath='{.spec.nodeName}') \ -o jsonpath='{.spec.providerID}{"\n"}' | grep -E "i-[a-z0-9]+"
다른 터미널로 이동해서 Pod가 배포된 Node로 Session Manager 연결
aws ssm start-session --target \ $(kubectl get node $(kubectl get pod nginx -o=jsonpath='{.spec.nodeName}') -o jsonpath='{.spec.providerID}{"\n"}' | grep -oE "i-[a-z0-9]+")
실행중인 컨테이너 확인
sudo nerdctl ps
Pause 컨테이너란??
다른 터미널로 이동해서 컨테이너에 ps 바이너리 설치
kubectl exec nginx -- bash -c "apt update && apt install -y procps"
컨테이너에서 실행중인 프로세스 확인
kubectl exec nginx -- ps aux
Pod 상태 확인
kubectl get pod nginx
Init 프로세스 (PID 1) 종료
kubectl exec nginx -- kill 1
Pod 상태 확인
kubectl get pod nginx
Pod 로그 확인
kubectl logs nginx
이전에 종료된 컨테이너 로그 확인
kubectl logs nginx -p
생성된 Pod의 재시작 정책 확인
kubectl get pod nginx -o yaml | grep -i restartPolicy
아래의 명령어를 통해서 Pod 재시작 정책이 무엇을 의미하는지 확인
kubectl explain pod.spec.restartPolicy
다른 터미널로 이동해서 crictl 설치
{ VERSION="v1.30.0" # check latest version in /releases page wget https://github.com/kubernetes-sigs/cri-tools/releases/download/$VERSION/crictl-$VERSION-linux-amd64.tar.gz sudo tar zxvf crictl-$VERSION-linux-amd64.tar.gz -C /usr/local/bin rm -f crictl-$VERSION-linux-amd64.tar.gz }
실행중인 컨테이너 확인
sudo crictl ps
nginx 컨테이너의 ID 확인
{ sudo crictl ps --name nginx sudo crictl ps --name nginx -q }
nginx 컨테이너의 로그 경로 확인
sudo crictl inspect -o go-template --template '{{.status.logPath}}' \ $(sudo crictl ps --name nginx -q)
컨테이너 로그 확인
sudo cat $(sudo crictl inspect -o go-template --template '{{.status.logPath}}' \ $(sudo crictl ps --name nginx -q))
다른 터미널로 이동해서 Pod 로그 확인
kubectl logs nginx
24번 명령어로 확인한 로그와 25번 명령어로 확인한 로그 비교
Pod 삭제
kubectl delete pod nginx
23번 명령어로 확인한 로그 경로가 여전히 존재하는지 확인
Environment Variables
Pod 생성
kubectl run mysql --image=mysql
Pod 상태 확인
kubectl get pod mysql --watch
위의 명령어를 실행하면 아래와 같은 결과를 확인할수 있습니다.
NAME READY STATUS RESTARTS AGE mysql 0/1 ContainerCreating 0 6s mysql 1/1 Running 0 15s mysql 0/1 Error 0 16s mysql 0/1 Error 1 (4s ago) 19s mysql 0/1 CrashLoopBackOff 1 (1s ago) 20s mysql 0/1 Error 2 (17s ago) 36s mysql 0/1 CrashLoopBackOff 2 (13s ago) 49s
Pod 로그 확인
kubectl logs mysql
kubectl run 명령어의 도움말 확인
kubectl run --help
Pod 삭제
kubectl delete pod mysql
Pod 재생성
kubectl run mysql --image=mysql --env="MYSQL_ROOT_PASSWORD=asdf1234"
Pod 상태 확인
kubectl get pod mysql
Pod에 설정된 환경변수 확인
kubectl exec mysql -- printenv
아래의 명령어를 실행해서 mysql에 접속 시도
kubectl exec -it mysql -- mysql -p
Pod 삭제
kubectl delete pod mysql
Last updated