ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 클라우드: 쿠버네티스 포드(Pod) 오브젝트 사용하기
    K8S 2021. 2. 1. 19:56

     

    쿠버네티스는 대부분의 리소스를 오브젝트 형태로 관리한다.

     

    쿠버네티스의 컨테이너의 집합(pods), 컨테이너의 집합을 관리하는 컨트롤러(replica set)

     

    사용자(service account), 노드(node)등이 하나의 오브젝트들이다. 

     

     

     

    오브젝트 종류 확인하기 

     

    kubectl api-resources

     

     

     

    오브젝트 설명보기 

     

    kubectl explain pod

     

     

     

    쿠버네티스는 대부분의 작업을 명령어로 수행할 수 있다.

     

    하지만 쿠버네티스의 가장 큰 특징은 yaml파일을 이용한 클러스터 관리이기 때문에

     

    쿠버네티스를 잘 사용하는 사람은 yaml파일을 잘 작성하는 사람이라 해도 과언이 아니다.

     

     

     

     

    1. 마스터노드와 워커노드

     

    쿠버네티스에서 노드의 역할은 크게 두가지로 마스터워커이다.

     

    마스터노드의 경우, 클러스터를 관리하며 워커노드에는 애플리케이션 컨테이너가 생성된다.

     

    마스터 노드에는 api서버, 컨트롤러 매니저, 스케줄러, dns서버등의 컴포넌트들이 실행되며

     

    모든 노드에는 오버레이 네트워크 구성을 위해 프락시와 네트워크 플러그인이 있다. 

     

    아울러 쿠버네티스의 구성을 위해 모든 노드에서 kubenet이라는 에이전트가 실행된다. 

     

    여기서 kublet은 컨테이너의 생성, 삭제, 마스터노드와 워커노드간의 통신역할을 담당한다.

     

     

     

     

    2. 포드(Pod)

     

    쿠버네티스에서는 컨테이너 애플리케이션의 기본단위를 포드라고 부르며 이는 1개 이상의 컨테이너로 구성된 컨테이너 집합이다. 

     

    예시로 nginx 컨테이너로 구성된 포드를 직접 생성한다.

     

     

     

    <nginx-pod.yaml>

    apiVersion: v1
    kind: Pod
    metadata:
        name: my-nginx-pod
    spec:
        containers:
        - name: my-nginx-container
          image: nginx:latest
          ports:
          - containerPort: 80
            protocol: TCP
    

     

     

     

    yaml을 만든 후 이를 이용해 새로운 포드를 생성한다.

     

    kubectl apply -f nginx-pod.yaml

     

     

     

    포드가 잘 생성되었는지 확인한다. 

     

    kubectl get pods

     

     

     

    생성된 포드의 자세한 정보 보기 

     

    kubectl describe pods my-nginx-pod

     

     

     

    my-nginx-pod의 Ip주소가 10.244.152.65 일때 다른 노드에서 접근할 수 있는지 확인한다. 

     

    curl 10.244.152.65

     

    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>
        body {
            width: 35em;
            margin: 0 auto;
            font-family: Tahoma, Verdana, Arial, sans-serif;
        }
    </style>
    </head>
    <body>
    <h1>Welcome to nginx!</h1>
    <p>If you see this page, the nginx web server is successfully installed and
    working. Further configuration is required.</p>
    
    <p>For online documentation and support please refer to
    <a href="http://nginx.org/">nginx.org</a>.<br/>
    Commercial support is available at
    <a href="http://nginx.com/">nginx.com</a>.</p>
    
    <p><em>Thank you for using nginx.</em></p>
    </body>
    </html>
    

    (단, 이 ip는 외부에서 접근할 수 없기 때문에 클러스터 내부에서만 접근할 수 있다)

     

     

     

    마스터노드에서 포드 컨테이너 내부로 직접 들어가기 

     

    kubectl exec -it my-nginx-pod bash

     

    포드 내부에서 bash 쉘을 실행하고, -it로 쉘을 유지한다.

     

     

     

    마스터 노드에서 포드의 로그를 확인하기 

     

    kubectl logs my-nginx-pod

     

     

     

    쿠버네티스의 오브젝트 삭제하기 

     

    kubectl delete -f nginx-pod.yaml

     

     

     

    또는 포드이름을 이용해서 삭제할 수도 있다. 

     

    kubectl delete pod my-nginx-pod

     

     

     

    포드는 컨테이너들의 집합으로 이번에는 포드에 컨테이너를 추가해본다.

     

    < nginx-with-ubuntu.yaml >

    apiVersion: v1
    kind: Pod
    metadata:
        name: my-nginx-pod
    spec:
        containers:
        - name: my-nginx-container
          image: nginx:latest
          ports:
          - containerPort: 80
            protocol: TCP
        - name: ubuntu-sidecar-container
          image: alicek106/rr-test:curl
          command: ["tail"]
          args: ["-f", "/dev/null"]
    

    (여기서 이미지는 curl이 설치된 우분투 이미지)

     

    yaml에서 대시(-)는 여러개의 항목을 정의할 수 있음을 의미한다. 

     

    포드의 yaml파일에서 사용되는 command와 args는 컨테이너 내부에서 가장 먼저 실행될 프로세스를 지정한다.

     

     

     

    kubectl get pods를 통해 포드안에 두개의 컨테이너가 실행중인것을 알 수 있다.

     

     

     

     

    이번에는 my-nginx-pod안에 방금생성한 ubuntu-sidecar-container로 들어가본다.

     

    kubectl exec -it my-nginx-pod -c ubuntu-sidecar-container bash

     

    (-c 옵션은 container를 의미)

     

    my-nginx-pod 포드안에 있는 ubuntu-sidecar-container를 실행시키겠다는 의미

     

     

     

    포드 내부의 우분투 컨테이너로 들어왔음을 알 수 있다. 

     

     

     

     

    이제 우분투 컨테이너 내부에서 local host로 http요청을 보내보면

     

    curl localhost

     

    다음과 같이 nginx서버의 응답이 도착하는 것을 볼 수 있다. 

    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>
        body {
            width: 35em;
            margin: 0 auto;
            font-family: Tahoma, Verdana, Arial, sans-serif;
        }
    </style>
    </head>
    <body>
    <h1>Welcome to nginx!</h1>
    <p>If you see this page, the nginx web server is successfully installed and
    working. Further configuration is required.</p>
    
    <p>For online documentation and support please refer to
    <a href="http://nginx.org/">nginx.org</a>.<br/>
    Commercial support is available at
    <a href="http://nginx.com/">nginx.com</a>.</p>
    
    <p><em>Thank you for using nginx.</em></p>
    </body>
    </html>
    

     

     

     

     우분투 컨테이너에  nginx서버를 실행하고 있지 않음에도 불구하고, nginx서버로 접근이 가능한 것은 

     

    포드 내의 컨테이너들이 네트워크 네임스페이스 등과 같은 리눅스 네임스페이스를 공유해서 사용하기 때문이다. 

     

    컨테이너 네트워크 타입은 네트워크 네임스페이스를 컨테이너간에 공유해 사용할 수 있도록 설정하기 때문에

     

    여러 개의 컨테이너는 동일한 네트워크 환경을 가지게 된다. 

     

    왜 하나의 포드에는 여러개의 컨테이너가 들어갈까?

     

    이전에 만든 nginx 포드는 하나의 어플리케이션으로 2개의 nignx 컨테이너가 하나의 포드안에 

    존재하는 것은 바람직하지 않다. 

     

    하지만 만약 기존에 만든 nginx 컨테이너에 부가적인 기능이 필요하다면 어떻게 할까?

     

    이럴때 하나의 컨테이너를 더 추가하여  포드의 메인 컨테이너는 nginx의 기능을 수행하고

    추가한 컨테이너는 nignx의 기능확장을 위한 컨테이너로써 사용한다. 

     

    이런식으로 포드에 추가된 컨테이너를 사이드카(sidecar) 컨텐이너라고 부르며, 정의된 네임스페이스에 의해

    포드내 다른 컨테이너들과 네트워크 환경을 공유하게 된다. 

     

    위와 같은 방식으로 포드 내에 정의된 여러개의 컨테이너는 하나의 어플리케이션으로 동작하게 된다. 

     

     

     

    용찬호 개발자님의 "시작하세요! 도커/쿠버네티스"를 인용해서 작성했습니다.

    반응형

    댓글

Designed by Tistory.