클라우드 + DevOps/Kubernetes (k8s)

Kubernetes 실습 :: 포드(pod) 관리 - declarative syntax 포드 선언형

gamjadori 2024. 4. 18. 16:55
728x90

<Kubernetes 실습 :: 포드(pod) 관리 - declarative syntax 포드 선언형>

<Pod 관련 명령어 정리>

kubectl {create | apply} -f {mynode.yaml | URL/mynode.yaml}
kubectl apply -f resources/    (YAML    (directory) kubectl get pod [ -o {wide | yaml | json} ]
kubectl describe pod pod-name kubectl delete pod -f mynode.yaml
kubectl delete pod -f mynode.yaml -f mynode-svc.yaml kubectl delete {pod pod-name | pod/pod-name} kubectl edit pod pod-name
kubectl replace -f mynode.yaml kubectl patch -f mynode.yaml

 

<포드 생성 방법>

  1. imperative syntax (명령형 문법): kubectl {create | run} 을 통해 CLI로 Object 생성
  2. declarative syntax (선언형 문법): YAML코드를 작성하여 kubectl apply 하여 생성

 

<declarative syntax 포드 선언형 실습 1>

1. multi-pod1.yaml 제작

  • 두 개의 컨테이너가 단일 Pod 내에서 실행

<multi-pod1.yaml 파일 내용>

  • 두 개의 컨테이너를 가지고 있는 Pod (8080, 8000 포트 개방)
apiVersion: v1
kind: Pod
metadata:
  name: multi-container-pod
spec:
  containers:
  - name: c1
    image: mrsono0/k8s-lab:p8000
    ports:
    - containerPort: 8000
  - name: c2
    image: mrsono0/k8s-lab:p8000
    ports:
    - containerPort: 8080

 

2. yaml 파일 적용

PS C:\Users\admin\Desktop\k8s-pods> kubectl apply -f multi.pod1.yaml
pod/multi-container-pod created

3. multi-container-pod 제작 확인

A. kubectl get po -o wide 명령어로 제작 확인

B. ssh으로 마스터 서버 접속 후 로컬 호스트 요청

  • ssh 접속: ssh ubuntu@192.168.56.100
ubuntu@k8s-master: kubectl exec -it multi-container-pod -c c1 -- curl localhost:8000
contaienrPort: 8080
ubuntu@k8s-master: kubectl exec -it multi-container-pod -c c2 -- curl localhost:8080
contaienrPort: 8000

 

<명령어 실행 시 과정 조사 명령어>

  • strace: 리눅스에서 실행되는 프로세스의 시스템 호출을 추적하고 분석하는 유틸리티로, 명령어가 어디까지 실행됐는지 알 수 있는 서비스
  • 디버깅 할 시에 유용함
ubuntu@k8s-master:~$ sudo apt -y install strace
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
strace is already the newest version (5.16-0ubuntu3).
0 upgraded, 0 newly installed, 0 to remove and 71 not upgraded.
  • kubectl get pod을 실행하는 동안 발생하는 시스템 호출 추적
ubuntu@k8s-master:~$ strace kubectl get pod

<출력 화면>

 

<declarative syntax 포드 선언형 실습 2>

  • myweb이라는 폴더를 만들어 파드 선언 및 서비스 선언 실습 실시

1. 파드 생성

<myweb1-pod.yaml>

  • nginx-container라는 이름의 컨테이너가 포함되어 있는 pod로, 포트 8000을 개방
apiVersion: v1
kind: Pod
metadata:
  name: myweb1
  labels:
    app: myweb1
spec:
  containers:
  - name: nginx-container
    image: nginx:1.25.3-alpine
    ports:
    - containerPort: 8000

>> 제작한 yaml 파일 실행

PS C:\Users\admin\Desktop\k8s-pods> kubectl apply -f myweb1-pod.yaml
pod/myweb1 created

 

2. 서비스 선언

<myweb1-svc.yaml>

  • myweb1 라벨을 가진 Pod를 선택해 포트 8001을 통해 외부에서 서비스에 접근
  • 해당 트래픽은 선택된 Pod의 포트 80으로 전달
  • 또한 외부 IP 주소 192.168.56.101을 통해 서비스에 접근
apiVersion: v1
kind: Service
metadata:
  name: myweb-svc
spec:
  selector:
    app: myweb1
  ports:
  - port: 8001
    targetPort: 80
  externalIPs:
  - 192.168.56.103 (생성된 노드에 따라 IP 다르게 부여)

** externalIPs 확인 방법: pod를 확인해 생성된 노드 확인 (k8s-node3 = 192.168.56.103)

 

3. 서비스 적용

PS C:\Users\admin\Desktop\k8s-pods> kubectl apply -f myweb1-svc.yaml
pod/myweb-svc created

 

<생성 확인>

A. kubectl get po,svc -o wide | grep myweb1: 실행 중인 포드와 서비스 출력

B. curl 실행

  • 서비스를 통해 노출된 포트에 curl을 실행하면 해당 서비스의 백엔드 Pod로 전달되어 정상적인 응답을 받아야 함