Kubernetes Service 를 이용한 Pod 연결

KubernetesBeginner
지금 연습하기

소개

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

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 초급 레벨의 실험이며 완료율은 97%입니다.학습자들로부터 100%의 긍정적인 리뷰율을 받았습니다.

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 에 연결할 수 있도록 해줍니다.