-
[Kubernetes] Kubernetes Pod란? pod관련 명령어 실습해보기CI-CD/Kubernetes 2023. 1. 21. 16:36반응형
Pod란?
Kubernetes는 Container 오케스트레이션 툴인데, Pod는 kubernetes의 Node안에 올라가는 컨테이너 묶음의 단위이다. 위 그림은 Kubernetes 하나의 노드를 나타내는데 여기서 10.10.10.1~4 까지가 각각 Pod이며, 그 안에 컨테이너가 하나 이상 존재 하고, Volume을 이용하여 Storage도 받을 수 있다.
Pod 특징
- 여러개의 컨테이너 묶음 단위이며, 노드에 컨테이너를 실행하는 가장 기본 단위이다.
- Pod가 생성 되면 유일한 IP주소를 가진다. 이 ip주소는 외부 노출용 주소가 아닌 Cluster에서 사용하며, 동일한 Pod object라도 다시 생성되면 유일한 IP주소는 바뀌고 다시 할당 된다.
- Pod안에 컨테이너 간 통신은 localhost로 통신하며 다른 Pod로 통신은 할당된 ip통신을 한다.
- Pod안에 Volume은 공유하나 다른 Pod는 공유하지 않는다.
- 외부에서 Pod에 접근할려고하면 Pod의 Ip를 알수 없기 때문에 외부에서 접근 할려고하면 Service나 Ingress 오브젝트를 사용하여 연결 해주는 부분이 필요하다.
- Pod는 자가 치유 능력(selft-Healing)이 없어, Pod가 종료되면 모든 정보는 삭제된다. HA나 자가치유 능력을 원한다면 ReplicaSet을 이용하여 한다.
Pod Yaml Template
Kubernetes cluster에 pod를 생성하기 위해서는 kubectl apply명령어를 사용하여 제공해야 합니다. 그 때 같이 제공해야하는 것이 있는데 바로 yaml파일 template입니다. template은 기본적으로 아래와 같이 작성합니다.
apiVersion: v1 # apiVersion kind: Pod # object 종류 Pod로 명시 metadata: # object를 식별하는 정보 name: nginx # object 이름 labels: app: nginx-demo # object Labeling project: hsjoo namespace: default # namespace 기입 안적으면 default로 됨 spec: containers: # container를 정의 - name: nginx # container 이름 image: nginx:1.14.2 # conatiner가 바라볼(다운받아 실행 할) image ports: - containerPort: 80 # container가 바라보는 port protocol: tcp # container가 바라보는
Pod안에 환경 변수 선언법
환경 변수는 Container아래에 env를 작성하여 정의 할 수 있습니다. name을 이용하여 변수 이름을 정의하고 value로 값을 정의합니다. valuefrom은 object의 value를 가져오겠다는 뜻입니다.
... spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80 env: - name: STUDENT_NAME # container안에서 사용할 환경 변수 정의 value: hsjoo # 첫 번째 env name은 STUDENT_NAME - name: STATE # STUDENT_NAME = hsjoo value: "학생 이름은 $(STUDENT_NAME)입니다." # 두 번째 env name은 STATE - name: NODE_NAME # 정의된 환경 변수를 $()로 불러와서 사용 가능 valueFrom: # 쿠버네티스 오브젝트로부터 환경 변수 값을 얻음 fieldRef: # spec, status의 field를 환경변수 값으로 참조 fieldPath: spec.nodeName # 참조할 field의 경로 선택 - name: NODE_IP valueFrom: fieldRef: fieldPath: status.hostIP
완성 Pod Template
아래의 내용으로 kubernetes에 pod를 생성해 보겠습니다. yaml 파일 이름은 pod.yaml로 하겠습니다.
apiVersion: v1 kind: Pod metadata: name: nginx labels: app: nginx-demo project: hsjoo namespace: default spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80 env: - name: STUDENT_NAME value: hsjoo - name: STATE value: "학생 이름은 $(STUDENT_NAME)입니다." - name: NODE_NAME valueFrom: fieldRef: fieldPath: spec.nodeName - name: NODE_IP valueFrom: fieldRef: fieldPath: status.hostIP
Pod 관련 kubectl 명령어 정리
# pod 생성 kubectl apply -f <yaml파일 경로> kubectl apply -f pod.yaml # 모든 pod 확인 kubectl get pods # pod 실행 및 ip 확인 kubectl get pod -o wide # pod 종료 kubectl delete pod --all kubectl delete pod <pod-name> # 컨테이너 IP확인 kubectl exec <pod-name> [-c <container-name>] -- env # 컨테이너 환경 변수 확인 kubectl exec <pod-name> --env # 포트 포워딩 kubectl port-forward <pod-name> <host-port>:<container-port>
명령어 실습 해보기
클러스터에 Pod 생성
kubectl apply -f pod.yaml > pod/nginx created
Pod 확인
kubectl get pods > NAME READY STATUS RESTARTS AGE > nginx 1/1 Running 0 103s
pod 자세히 보기(feat. ip)
kubectl get pod -o wide > NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES > nginx 1/1 Running 0 2m37s 10.76.1.8 my-cluster <none> <none>
pod 안에 있는 특정 컨테이너에 명령어 날리기
명령어를 날릴 때는 꼭 “--”와 “ “(공백) 을 넣은 다음 관련 명령어를 입력하여야 한다.
kubectl exec nginx -c nginx -- echo 1 > 1
pod 안에 환경 변수 확인하기
kubectl exec nginx -c nginx -- env > PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin > HOSTNAME=nginx > NGINX_VERSION=1.14.2-1~stretch > NJS_VERSION=1.14.2.0.2.6-1~stretch > STUDENT_NAME=hsjoo > STATE=학생 이름은 hsjoo입니다. > NODE_NAME=gke-my-cluster-default-pool-c66689e3-0p40 > NODE_IP=10.128.0.7 > KUBERNETES_SERVICE_PORT=443 > KUBERNETES_SERVICE_PORT_HTTPS=443 > KUBERNETES_PORT=tcp://10.80.0.1:443 > KUBERNETES_PORT_443_TCP=tcp://10.80.0.1:443 > KUBERNETES_PORT_443_TCP_PROTO=tcp > KUBERNETES_PORT_443_TCP_PORT=443 > KUBERNETES_PORT_443_TCP_ADDR=10.80.0.1 > KUBERNETES_SERVICE_HOST=10.80.0.1 > HOME=/root
Pod port-forwarding
kubectl port-forward nginx 8080:80
Pod 삭제하기
# kubectl delete pod --all # 모든 pod 삭제 # 이 포스팅에서 만든 pod는 nginx이기 때문에 nginx삭제 # kubectl delete pod <pod-name> kubectl delete pod nginx > pod "nginx" deleted
마치며…
이번에는 k8s의 pod에 대해 알아보았는데, pod는 삭제 되면 기록이 사라지므로, replicaset을 이요하거나 deployment를 사용하여 자가 치유속성을 해야한다고 알게 되었습니다. pod는 job돌릴 때나 특정 작업을 할때만 사용하여야 할 것 같습니다.
모든 소스는 제 깃헙에 있습니다.
참고문헌
반응형'CI-CD > Kubernetes' 카테고리의 다른 글