- 책 또는 웹사이트의 내용을 복제하여 다른 곳에 게시하는 것을 금지합니다.
- 책 또는 웹사이트의 내용을 발췌, 요약하여 강의 자료, 발표 자료, 블로그 포스팅 등으로 만드는 것을 금지합니다.
Nginx YAML 설정 파일 작성하기
Nginx 디플로이먼트와 서비스의 구조 살펴보기
디플로이먼트와 서비스를 YAML 파일로 작성하여 Nginx 웹 서버를 실행해보았습니다. 이번에는 디플로이먼트와 서비스의 구조를 알아보겠습니다.
쿠버네티스는 매니페스트 파일(설정파일)이 다소 복잡하여 익숙해지는데 시간이 조금 걸립니다. 하지만, 핵심만 이해하면 크게 어렵지 않습니다.
먼저 쿠버네티스 매니페스트 파일의 필수 구성요소는 apiVersion
, kind
, metadata
, spec
입니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-nginx
spec:
replicas: 1
selector:
matchLabels:
app: hello-nginx
template:
metadata:
labels:
app: hello-nginx
spec:
containers:
- name: hello-nginx
image: nginx:latest
ports:
- containerPort: 80
.apiVersion
: 현재 리소스의 API 버전입니다. 이 버전은 시간이 지남에 따라 계속 바뀝니다(예: v1, v1beta1 등). 여기서는apps/v1
를 지정합니다..kind
: 현재 리소스의 종류를 지정합니다. 여기서는 디플로이먼트를 작성하므로Deployment
를 지정합니다..metadata
: 현재 오브젝트의 이름과 각종 설정 정보가 들어갑니다. 나중에metadata
는 리소스에 따라 중요하게 사용되기도 하므로 눈여겨 보는게 좋습니다..spec
: 현재 오브젝트의 원하는 상태를 정의하는 부분입니다. 여기서는 디플로이먼트의 각종 설정값들이 들어갑니다.
디플로이먼트의 metadata
에서는 name
에 디플로이먼트의 이름을 지정합니다. 여기서 지정한 이름은 kubectl get all
명령을 실행했을 때 pod 부분에 나오게 됩니다(pod는 name
뒤에 랜덤값이 붙습니다).
metadata:
name: hello-nginx
spec
에는 오브젝트의 원하는 상태를 정의한다고 했습니다. 즉, 쿠버네티스는 spec
에 정의된 대로 디플로이먼트를 유지합니다. 예를 들어 replicas
가 1이면 pod
을 1개만 유지하고, 10이면 10개를 유지합니다. 만약 pod 10개 중 2개가 중단(terminate)되었다면, 10개를 맞추기 위해 다시 2개를 생성합니다.
아래 설정은 실제로는 레플리카셋(replicaset)과 파드(pod)의 설정을 모두 담고 있습니다.
spec:
replicas: 1
selector:
matchLabels:
app: hello-nginx
template:
metadata:
labels:
app: hello-nginx
spec:
containers:
- name: hello-nginx
image: nginx:latest
ports:
- containerPort: 80
.spec.replicas
: 레플리카셋에서 파드를 몇 개 유지할지 설정합니다. 여기서는 1로 설정해서 1개만 유지합니다..spec.selector
: 디플로이먼트가 관리할 파드를 찾는 방법을 정의합니다. 여기서는matchLabels
에app: hello-nginx
로 설정했으므로 키가app
, 값이hello-nginx
로 정확히 일치하는 파드를 찾습니다..spec.template
: 여기서부터 파드 설정입니다.metadata
:labels
에 키-값을 설정하여 디플로이먼트가 찾을 수 있도록 합니다. 여기서는app: hello-nginx
를 설정했습니다.spec
: 파드의spec
입니다. 파드에는 컨테이너가 여러 개 들어갈 수 있어서containers
로 되어있고, 그 아래에는-
를 사용하여 배열(Array)로 값을 설정합니다.containers
:name
에는 컨테이너의 이름을 설정합니다. 여기서는hello-nginx
로 설정했지만 셀렉터와는 상관이 없습니다.image
에는 컨테이너를 실행할 Docker 이미지를 설정합니다.<이미지>:<태그>
형식이며 여기서는nginx:latest
를 설정했습니다. 마지막으로ports
아래에 배열 형태로containerPort
를 설정합니다.containerPort
는 컨테이너에서 개방할 포트 번호를 뜻합니다. 여기서는 Nginx 웹 서버의 HTTP 포트인 80을 설정했습니다.
이제 서비스를 살펴볼 차례입니다. 서비스는 파드를 쿠버네티스 네트워크나 외부에 노출할 때 사용한다고 했는데, 여기서는 ClusterIP
를 사용하여 쿠버네티스 네트워크에만 노출하도록 하겠습니다. 외부에 노출하는 방법은 뒤에서 설명하겠습니다.
apiVersion: v1
kind: Service
metadata:
name: hello-nginx
spec:
selector:
app: hello-nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP
.apiVersion
: 현재 리소스의 API 버전입니다. 이 버전은 시간이 지남에 따라 계속 바뀝니다(예: v1, v1beta1 등). 여기서는v1
를 지정합니다..kind
: 현재 리소스의 종류를 지정합니다. 여기서는 서비스를 작성하므로Service
를 지정합니다..metadata
: 현재 오브젝트의 이름과 각종 설정 정보가 들어갑니다..spec
: 현재 오브젝트의 원하는 상태를 정의하는 부분입니다. 여기서는 서비스의 각종 설정값들이 들어갑니다.
서비스의 metadata
에서는 name
에 서비스의 이름을 지정합니다. 여기서 지정한 이름은 kubectl get all
명령을 실행했을 때 service 부분에 나오게 됩니다.
metadata:
name: hello-nginx
서비스의 spec
부분입니다. 여기서는 selector
와 ports
부분이 중요합니다.
spec:
selector:
app: hello-nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP
.spec.selector
: 서비스가 트래픽을 전달할 파드를 선택합니다. 여기서는app: hello-nginx
을 설정했으므로 키가app
, 값이hello-nginx
인 파드를 찾습니다..spec.ports
: 서비스의 포트 설정이며-
를 사용하여 배열(Array)로 값을 설정합니다.protocol
은 서비스가 처리할 프로토콜이며 여기서는 HTTP만 처리하므로 TCP로 설정합니다.port
는 서비스가 개방할 포트입니다. 여기서는 80을 설정했습니다.targetPort
는 파드에 열려 있는 포트를 의미합니다. 따라서 80을 설정합니다..spec.type
: 서비스의type
은 여러 가지가 있지만 여기서는ClusterIP
를 설정하여 쿠버네티스 네트워크 안에서만 포트를 노출하도록 합니다.
저작권 안내
이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.- 블로그, 게시판 등에 퍼가는 것을 금지합니다.
- 비공개 포스트에 퍼가는 것을 금지합니다.
- 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
- 링크 및 SNS 공유는 허용합니다.