DevOps/Kubernetes

[Kubernetes Study - 03] 기본 실습 (1) - yaml 파일 작성 및 Pod 내 컨테이너 접속

돌돌김 2021. 1. 21. 03:26

 

쿠버네티스의 가장 기본이 되는 yaml 파일 작성 및 Pod 안에 있는 컨테이너에 접속하는 방법을 알아보자

현재 Azure의 AKS를 활용하여 클러스터를 구축한 상황이다.

 

하나 짚고 넘어갈 것은, AKS를 사용하여 구축한 클러스터에서 Master Node는 Azure가 되고, AKS를 생성할 때 만든 노드들이 전부 Worker Node가 된다.

 

호스팅되는 Kubernetes 서비스인 Azure는 상태 모니터링 및 유지 관리 같은 중요 작업을 처리합니다. Kubernetes 마스터는 Azure에서 관리됩니다. 에이전트 노드만 관리하고 유지하면 됩니다. 관리되는 Kubernetes 서비스, AKS가 무료이므로 마스터가 아니라 클러스터 내의 에이전트 노드에 대해서만 지불합니다.

 

 

Azure Kubernetes Service 소개 - Azure Kubernetes Service

Azure에서 컨테이너 기반 애플리케이션을 배포 및 관리하는 Azure Kubernetes Service의 기능 및 이점을 알아봅니다.

docs.microsoft.com

 

yaml 파일 작성

 

아래 파일은 다음과 같은 내용을 담고 있다

  • 종류 : Pod
  • Pod에 들어가는 컨테이너 : 2개
    • container1, port : 8000
    • container2, port: 8080
  • 사용하는 이미지는 docker.hub에서 가져온다
apiVersion: v1
kind: Pod
metadata:
  name: pod-1
spec:
  containers:
  - name: container1
    image: kubetm/p8000
    ports:
    - containerPort: 8000
  - name: container2
    image: kubetm/p8080
    ports:
    - containerPort: 8080

 

yaml 파일 적용 및 삭제

 

kubectl apply 를 통해 위에서 만든 yaml 파일에 정의된 리소스(오브젝트)를 생성해보자. 

$ kubectl apply -f test.yaml

 

만약, 해당 리소스를 지우고 싶으면 delete 명령어를 사용한다. 

$ kubectl delete -f test.yaml

 

 

pod 확인 및 컨테이너 접속

 

먼저 현재 올라와있는 파드를 확인한다 

$ kubectl get pods
NAME    READY   STATUS    RESTARTS   AGE
pod-1   2/2     Running   0          8h

 

현재 2/2라는 것은 1개의 파드에 2개의 컨테이너가 2개 모두 정상적으로 돌아간다는 의미이다. 이 컨테이너들은 쿠버네티스 클러스터 내에서 접속할 수 있는 ip를 가지고 있다.

 

동일한 Pod 내에 배포된 Container들은 같은 IP를 공유하며 내부적으로 포트를 통해 통신이 가능하다. 물론 포트가 중복되서는 안된다.

 

describe 명령어를 통해 pods내에 배포된 container의 정보를 알 수 있다. 

$ kubectl describe pods
Name:         pod-1
Namespace:    default
Priority:     0
Node:         aks-agentpool-19228959-vmss000001/10.240.0.5
Start Time:   Wed, 20 Jan 2021 09:44:42 +0000
Labels:       <none>
Annotations:  <none>
Status:       Running
IP:           10.244.1.19
IPs:
  IP:  10.244.1.19
Containers:
  container1:
    Container ID:   docker://076a8ed1324c1260121948cb27f800ed76d32136b144353f3561cb9ccf7e21e5
    Image:          kubetm/p8000
    Image ID:       docker-pullable://kubetm/p8000@sha256:3fc0e2cea5a67646f2f7a8dbef8cc59697ee010a0a9e66fcdca045999b419cc2
    Port:           8000/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Wed, 20 Jan 2021 09:44:56 +0000
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-lhwbk (ro)
  container2:
    Container ID:   docker://64f965e16b945687c03a72d41452b31d2bd55af1bae35e055779799e01974f28
    Image:          kubetm/p8080
    Image ID:       docker-pullable://kubetm/p8080@sha256:527ddab085f34dac27c7b45197efe9ee478582b0e02e84bbd9f6defdbc7697b5
    Port:           8080/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Wed, 20 Jan 2021 09:44:59 +0000
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-lhwbk (ro)

 

 

 

컨테이너에 접속하기 위해서는 docker 컨테이너 접속과 마찬가지로 exec -it 명령어를 사용한다.

컨테이너가 2개가 떠있으므로 어떤 컨테이너에 접속할 것인지를 같이 써준다. 만약 써주지 않으면 default 컨테이너로 접속한다 (이 경우에는 container1로 접속되었다)

# 접속할 컨테이너를 따로 명시하지 않은 경우
$ kubectl exec -it pod-1 -- /bin/sh
Defaulting container name to container1.
Use 'kubectl describe pod/pod-1 -n default' to see all of the containers in this pod.


# 접속할 컨테이너를 명시 : -c 옵션 사용
$ kubectl exec -it pod-1 pod-1 -c container2 -- /bin/sh