Kubernetes Nginx pod, service YAML작성 및 파드간 통신, 안녕하세요! 이번 포스팅에서는 Kubernetes YAML 파일을 사용하여 Nginx 웹 서버를 배포하고 외부에 노출하는 방법에 대해 알아보겠습니다.
deployment YAML 파일
먼저, Nginx 웹 서버를 배포하기 위한 Deployment YAML 파일입니다. 이 파일은 하나의 Replication Controller를 정의하며, 노드 선택자(nodeSelector)를 사용하여 특정 노드에 파드를 스케줄링할 수 있습니다.
사전에 key=storage라는 라벨을 노드에 붙혀 놓았습니다.
# example)
# nodeSelector:
# key: storage
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-web
spec:
replicas: 1
selector:
matchLabels:
app: nginx-web
template:
metadata:
name: nginx-web
labels:
app: nginx-web
spec:
containers:
- image: nginx
name: nginx-web
ports:
- containerPort: 80
nodeSelector:
key: storage
Service YAML
다음으로, 배포한 Nginx 웹 서버를 외부로 노출하기 위한 Service YAML 파일입니다. 이 파일은 LoadBalancer 유형의 서비스로 설정되어 있어 외부에서 접근 가능하며, 특정 IP 주소로 노출되도록 설정되어 있습니다.
apiVersion: v1
kind: Service
metadata:
name: nginx-web
labels:
name: nginx-web
spec:
type: LoadBalancer
loadBalancerIP: 10.2.3.116
ports:
- port: 80
targetPort: 80
name: http
selector:
app: nginx-web
(service flow )
client -> http://10.2.3.116:80 ->
[service:pod]
selector({(app:nginx-web):(app:nginx-web)}
pod:container
클라이언트가 로드밸런스의 external IP의 특정 포트로 데이터를 요청하면 그에 해당하는 service에 매핑된 selector, app:nginx-web이라는 파드를 찾아서 데이터를 보낸다. 그리고 해당 파드는 80포트로 들어온 요청을 컨테이너 80포트로 전달하여 최종 컨테이너 안에 있는 nginx.index가 나타난다.
그리고 서비스 간(파드끼리)의 통신을 할 때
이때, 같은 namespace 내의 서비스는 http://<Service name>:<Service Port>
로, 다른 namespace 내의 서비스는 http://<Service name>.<namespace>.svc.cluster.local:<Service Port>
로 접근할 수 있습니다.
이렇게 작성된 YAML 파일과 설명을 통해 Nginx 웹 서버를 Kubernetes 클러스터에 배포하고 외부로 노출하는 과정을 자세히 알아보았습니다. 블로그를 통해 더 많은 Kubernetes 관련 정보를 확인해보세요!