- 책 또는 웹사이트의 내용을 복제하여 다른 곳에 게시하는 것을 금지합니다.
- 책 또는 웹사이트의 내용을 발췌, 요약하여 강의 자료, 발표 자료, 블로그 포스팅 등으로 만드는 것을 금지합니다.
로컬에서 Kubernetes 클러스터 구축하기
NodePort로 서비스 생성하기
지금까지 Minikube의 한계로 인해 서비스를 생성할 때 type
을 ClusterIP
로 만들고 kubectl port-forward
로만 실습을 해보았습니다. 이번에는 Vagrant와 VirtualBox로 구축한 정식 쿠버네티스 클러스터에서 서비스 type
을 NodePort
로 만들어서 실습을 해보겠습니다.
다음 내용을 deployment.yaml
파일로 저장합니다. 이 디플로이먼트는 Nginx 파드를 3개 생성하는데, 모든 워커 노드(worker1, 2, 3)에 1개씩 고르게 생성합니다. affinity
부분이 상당히 복잡해보이지만, 자세히 보면 크게 어려울 것이 없습니다. podAntiAffinity
는 이름 그대로 관련성 없음(anti-affinity)이라는 의미로 requiredDuringSchedulingIgnoredDuringExecution
(스케쥴링하는 동안 꼭 필요한 조건)과 조합하여 해당 호스트(topologyKey: 'kubernetes.io/hostname'
)에 파드가 생성되어 있지 않으면 파드를 생성한다는 의미입니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-nginx
spec:
replicas: 3
selector:
matchLabels:
app: hello-nginx
template:
metadata:
labels:
app: hello-nginx
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- hello-nginx
topologyKey: 'kubernetes.io/hostname'
containers:
- name: hello-nginx
image: nginx:latest
ports:
- containerPort: 80
다음 명령을 실행하여 deployment.yaml
파일로 디플로이먼트를 생성합니다.
$ kubectl create -f deployment.yaml
deployment.apps/hello-nginx created
정말 파드가 각 노드에 고르게 생성되었는지 확인해보겠습니다. kubectl get pod
명령은 파드만 출력하는 명령입니다.
$ kubectl get pod -l app=hello-nginx -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
hello-nginx-648486ccd-4shxl 1/1 Running 0 157m 10.244.1.5 worker1 <none> <none>
hello-nginx-648486ccd-7jb46 1/1 Running 0 153m 10.244.3.5 worker3 <none> <none>
hello-nginx-648486ccd-qjvkx 1/1 Running 0 153m 10.244.2.5 worker2 <none> <none>
-l
옵션은 특정 레이블을 가져오겠다는 뜻이고, -o
옵션은 출력 방식을 결정하는데, wide
를 설정하여 상세 정보를 출력하도록 했습니다. NODE 부분을 보면 worker1, 2, 3에 고르게 파드가 생성된 것을 볼 수 있습니다.
Nginx 서비스
이번에는 서비스를 생성해보겠습니다. 다음 내용을 service.yaml
파일로 저장합니다.
apiVersion: v1
kind: Service
metadata:
name: hello-nginx
spec:
selector:
app: hello-nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: NodePort
이 서비스는 type
이 NodePort
로 설정되어 있습니다. 즉, 각 노드의 포트로 서비스를 노출하겠다는 뜻입니다.
다음 명령을 실행하여 service.yaml
파일로 서비스를 생성합니다.
$ kubectl create -f service.yaml
service/hello-nginx created
이제 서비스의 포트 번호를 조회해보겠습니다. kubectl get service
명령은 서비스만 출력하는 명령입니다.
$ kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hello-nginx NodePort 10.108.89.52 <none> 80:31490/TCP 163m
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 10h
hello-nginx
서비스의 PORT(S) 부분을 보면 80:31490/TCP라고 나오는데, 80:뒤에 있는 포트가 노드에 열린 포트 번호입니다. 주의할 점은 이 포트 번호가 서비스를 생성할 때 마다, 클러스터 마다 각자 다르게 나온다는 점입니다. 따라서 이 문서와 일치하지 않을 수 있습니다.
웹 브라우저를 열고 다음 URL에 각각 접속하면 Welcome to nginx!가 표시될 것입니다.
- worker1: http://192.168.56.11:<노드 포트>
- worker2: http://192.168.56.12:<노드 포트>
- worker3: http://192.168.56.13:<노드 포트>
저작권 안내
이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.- 블로그, 게시판 등에 퍼가는 것을 금지합니다.
- 비공개 포스트에 퍼가는 것을 금지합니다.
- 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
- 링크 및 SNS 공유는 허용합니다.