ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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돌릴 때나 특정 작업을 할때만 사용하여야 할 것 같습니다.

     

     

     

    모든 소스는 제 깃헙에 있습니다.

     

    GitHub - hyunseokjoo/k8s_sample_code

    Contribute to hyunseokjoo/k8s_sample_code development by creating an account on GitHub.

    github.com

     

     

     

    참고문헌

    https://kubernetes.io/ko/docs/concepts/workloads/pods/

    반응형

    댓글

Designed by Tistory.