소개
Kubernetes 에서 Pod 는 일시적이며 언제든지 종료 및 다시 생성될 수 있습니다. 이는 네트워킹과 관련하여 어려움을 야기하는데, Pod 에 직접 연결하기가 어렵기 때문입니다. 이 문제를 해결하기 위해 Kubernetes 는 Service 라는 상위 수준의 추상화를 제공합니다. Service 는 Pod 집합에 대해 안정적인 IP 주소와 DNS 이름을 제공하여 다른 구성 요소가 쉽게 연결할 수 있도록 합니다. 이 랩에서는 Kubernetes 에서 Service 를 사용하여 Pod 를 네트워킹하는 방법을 배우게 됩니다.
Minikube 클러스터 시작
리소스를 생성하기 전에 실행 중인 Kubernetes 클러스터가 필요합니다. Minikube 는 로컬 머신에서 실행되는 가벼운 Kubernetes 환경입니다.
작업 디렉토리로 이동:
터미널을 열고 기본 프로젝트 폴더로 이동합니다.
cd /home/labex/projectMinikube 시작:
Kubernetes 클러스터를 초기화하기 위해 Minikube 를 시작합니다.
minikube start- 이 명령은 로컬 머신에 단일 노드 Kubernetes 클러스터를 설정합니다.
- Minikube 는 시스템 성능에 따라 시작하는 데 몇 분 정도 걸릴 수 있습니다.
Minikube 가 실행 중인지 확인:
Minikube 클러스터의 상태를 확인합니다.
minikube statuskubelet및apiserver와 같은 구성 요소가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 에 연결할 수 있도록 해줍니다.


