Kubernetes Service 를 이용한 Pod 연결

KubernetesBeginner
지금 연습하기

소개

Kubernetes 에서 Pod 는 일시적이며 언제든지 종료 및 다시 생성될 수 있습니다. 이는 네트워킹과 관련하여 어려움을 야기하는데, Pod 에 직접 연결하기가 어렵기 때문입니다. 이 문제를 해결하기 위해 Kubernetes 는 Service 라는 상위 수준의 추상화를 제공합니다. Service 는 Pod 집합에 대해 안정적인 IP 주소와 DNS 이름을 제공하여 다른 구성 요소가 쉽게 연결할 수 있도록 합니다. 이 랩에서는 Kubernetes 에서 Service 를 사용하여 Pod 를 네트워킹하는 방법을 배우게 됩니다.

Minikube 클러스터 시작

리소스를 생성하기 전에 실행 중인 Kubernetes 클러스터가 필요합니다. Minikube 는 로컬 머신에서 실행되는 가벼운 Kubernetes 환경입니다.

  1. 작업 디렉토리로 이동:

    터미널을 열고 기본 프로젝트 폴더로 이동합니다.

    cd /home/labex/project
    
  2. Minikube 시작:

    Kubernetes 클러스터를 초기화하기 위해 Minikube 를 시작합니다.

    minikube start
    
    • 이 명령은 로컬 머신에 단일 노드 Kubernetes 클러스터를 설정합니다.
    • Minikube 는 시스템 성능에 따라 시작하는 데 몇 분 정도 걸릴 수 있습니다.
  3. Minikube 가 실행 중인지 확인:

    Minikube 클러스터의 상태를 확인합니다.

    minikube status
    
    • kubeletapiserver와 같은 구성 요소가 Running으로 나열되어 있는지 확인합니다.
    • 클러스터가 실행 중이지 않으면 minikube start를 다시 실행합니다.

Minikube 를 시작하는 데 문제가 발생하면 필요에 따라 minikube delete를 사용하여 환경을 재설정하십시오.

Pod 생성

첫 번째 단계는 간단한 Pod 를 생성하는 것입니다. /home/labex/project/myapp-pod.yaml이라는 파일을 다음 내용으로 생성합니다.

apiVersion: v1
kind: Pod
metadata:
  name: my-pod-1
  labels:
    app: nginx
spec:
  containers:
    - name: my-container
      image: nginx

파일을 저장하고 다음 명령을 실행하여 Pod 를 생성합니다.

kubectl apply -f /home/labex/project/myapp-pod.yaml

이렇게 하면 Nginx 이미지를 실행하는 단일 컨테이너가 있는 my-pod-1이라는 Pod 가 생성됩니다.

Service 생성

두 번째 단계는 이전 단계에서 생성한 Pod 를 대상으로 하는 Service 를 생성하는 것입니다. /home/labex/project/service.yaml이라는 파일을 다음 내용으로 생성합니다.

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: nginx
  ports:
    - name: http
      port: 80
      targetPort: 80

파일을 저장하고 다음 명령을 실행하여 Service 를 생성합니다.

kubectl apply -f /home/labex/project/service.yaml

이렇게 하면 app=nginx 레이블이 있는 Pod 를 대상으로 하고 포트 80 을 노출하는 my-service라는 Service 가 생성됩니다.

Service 테스트

세 번째 단계는 다른 Pod 에서 Service 에 접근하여 Service 를 테스트하는 것입니다. /home/labex/project/test-pod-1.yaml이라는 파일을 다음 내용으로 생성합니다.

apiVersion: v1
kind: Pod
metadata:
  name: test-pod-1
spec:
  containers:
    - name: my-container
      image: nginx
      command:
        - sleep
        - "3600"

파일을 저장하고 다음 명령을 실행하여 테스트 Pod 를 생성합니다.

kubectl apply -f /home/labex/project/test-pod-1.yaml

이렇게 하면 Busybox 이미지를 실행하는 단일 컨테이너가 있는 test-pod-1이라는 Pod 가 생성됩니다.

다음으로, 컨테이너에 exec 하여 curl을 사용하여 Service 에 접근합니다. 컨테이너에 exec 하려면 다음 명령을 실행합니다.

kubectl exec -it test-pod-1 -- sh

이렇게 하면 컨테이너 내부에 쉘이 열립니다. 쉘에서 다음 명령을 실행하여 Service 에 접근합니다.

curl http://my-service

이렇게 하면 기본 Nginx 페이지가 반환되어 Service 가 올바르게 작동하고 있음을 나타냅니다.

Service 업데이트

네 번째 단계는 다른 Pod 집합을 대상으로 Service 를 업데이트하는 것입니다. /home/labex/project/service.yaml 파일의 selector 필드를 다음과 같이 업데이트합니다.

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: busybox
  ports:
    - name: http
      port: 80
      targetPort: 8

파일을 저장하고 다음 명령을 실행하여 Service 를 업데이트합니다.

kubectl apply -f service.yaml

이렇게 하면 app=busybox 레이블이 있는 Pod 를 대상으로 Service 가 업데이트됩니다.

업데이트된 Service 테스트

다섯 번째 단계는 다른 Pod 에서 접근하여 업데이트된 Service 를 테스트하는 것입니다. 다음 명령을 사용하여 새로운 테스트 Pod 를 생성합니다.

kubectl run my-pod-2 --image=busybox --restart=Never -- sleep 3600

이 명령은 Busybox 이미지를 실행하는 단일 컨테이너를 가진 my-pod-2라는 새로운 Pod 를 생성합니다.

컨테이너에 exec 하여 Step 3 에서 했던 것처럼 curl을 사용하여 Service 에 접근합니다. 컨테이너에 exec 하기 위해 다음 명령을 실행합니다.

kubectl exec -it my-pod-2 -- sh

이번에는 연결이 거부되었다는 오류가 발생해야 합니다.

이는 Service 가 이제 테스트 Pod 가 실행 중인 Pod 와 다른 Pod 집합을 타겟팅하기 때문입니다. 이를 해결하려면 Pod 의 레이블을 Service 의 새로운 selector 와 일치하도록 업데이트할 수 있습니다.

테스트 Pod 의 레이블을 업데이트하려면 다음 명령을 실행합니다.

kubectl label pod my-pod-2 app=busybox

이 명령은 테스트 Pod 에 app=busybox 레이블을 추가합니다.

이제 curl 명령을 다시 실행하면 기본 Nginx 페이지가 표시되어 Service 가 올바르게 작동하고 있음을 나타냅니다.

요약

이 랩에서는 Kubernetes 에서 Service 를 사용하여 Pod 를 네트워킹하는 방법을 배웠습니다. Nginx 이미지를 실행하는 간단한 Pod 를 생성하고, 해당 Pod 를 대상으로 하는 Service 를 생성했으며, 다른 Pod 에서 접근하여 Service 를 테스트했습니다. 또한 다른 Pod 집합을 대상으로 Service 를 업데이트하는 방법과 Service 의 새로운 selector 와 일치하도록 Pod 의 레이블을 업데이트하는 방법을 배웠습니다. Service 는 Kubernetes 네트워킹의 필수 구성 요소이며, 안정적이고 확장 가능한 방식으로 Pod 에 연결할 수 있도록 해줍니다.