일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- elasticsearch
- 옵셔널 체이닝
- AWS
- api gateway
- Endpoints
- docker swarm
- optional chaining
- Service
- Await
- VPC
- Custom Resource
- docker
- vgw
- 자바스크립트
- Kubernetes
- On-Premise
- JavaScript
- CloudFormation
- transit gateway
- Proxy Resource
- 구조분해 할당
- cognito
- 온프레미스
- grafana
- 비구조화 할당
- null 병합 연산자
- DynamoDB
- prometheus
- Site-to-Site VPN
- 단축 평가
- Today
- Total
만자의 개발일지
[Kubernetes] 서비스(Service) 구성 및 생성하기 본문
이번 포스팅에서는 YAML 파일로 Service를 구성하고 생성하는 법에 대해 포스팅하도록 하겠습니다.
서비스와 서비스의 유형에 대해서는 아래 글을 참고하시길 바랍니다.
https://yoo11052.tistory.com/189
https://yoo11052.tistory.com/191
서비스(Service) 구성하기
서비스를 구성하기 위해서는 port와 targetPort에 대한 이해가 필요합니다.
- port
- 서비스 쪽에서 열려있는 포트를 의미합니다.
- targetPort
- Pod 쪽에서 열려있는 Port를 의미합니다.
- 서비스로 들어온 트래픽은 해당 파드의 <Cluster 내부 IP>:<targetPort>로 넘어가게 됩니다.
Service(ClusterIP)
다음과 같이 Service(ClusterIP)를 구성하였습니다.
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: ClusterIP
selector:
app: myapp
ports:
- name: http
port: 80 # 서비스의 80번 포트로 들어오면
targetPort: 80 # Pod의 80번 포트로 전달
protocol: TCP
- name: https
port: 443 # 서비스의 443번 포트로 들어오면
targetPort: 80 # Pod의 80번 포트로 전달
protocol: TCP
ClusterIP의 경우 type이 생략 가능합니다.
spec.selector 섹션을 통해 동일한 라벨을 가지고 있는 Pod들을 해당 서비스로 묶을 수 있습니다. 위 구성을 예시로 들면, app: myapp이라는 라벨을 가지고있는 모든 Pod들은 my-service라는 ClusterIP유형의 서비스의 80, 443 포트로 접근할 수 있게 되는 것입니다.
만약 서비스에 묶인 Pod가 하나가 아니라 여러개라면 서비스는 랜덤으로 Pod에 트래픽을 분산하게 됩니다.
Service(NodePort)
다음과 같이 Service(NodePort)를 구성하였습니다.
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: NodePort
selector:
app: myapp
ports:
- name: http
nodePort: 30001 # 노드의 30001번 포트로 들어오면
port: 80 # 서비스의 80번 포트로 전달하고
targetPort: 80 # Pod의 80번 포트로 전달 30001(Node) -> 80(Service) -> 80(Pod)
protocol: TCP
NodePort의 경우는 type을 생략할 수 없으며 ClusterIP와 달리 nodePort를 지정할 수 있습니다.
nodePort를 지정하면 사용자는 <node IP>:<nodePort>로 Pod에 접근할 수 있습니다. 마찬가지로 Pod가 여러개인 경우 랜덤으로 트래픽을 분산하고, nodePort의 포트범위는 30000~32767사이이며, 별도로 지정해주지 않을 경우 시스템이 알아서 지정하게됩니다.
Service(LoadBalancer)
다음과 같이 Service(LoadBalancer)를 구성하였습니다.
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: LoadBalancer
selector:
app: myapp
ports:
- name: http
port: 80 # 로드밸런서로 트래픽이 들어오면 서비스의 80번 포트로 전달하고
targetPort: 80 # Pod의 80번 포트로 전달
protocol: TCP
status: # 프로비저닝된 로드 밸런서 정보
loadBalancer:
ingress:
- ip: 192.0.2.127
LoadBalancer의 경우 기본적인 구조는 NodePort와 유사하지만 NodePort와 ClusterIP가 자동으로 생성되고,
status.loadBalancer 섹션을 통해 로드밸런서를 프로비저닝할 수 있습니다.
Service(ExternalName)
다음과 같이 Service(ExternalName)를 구성하였습니다.
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: ExternalName
externalName: my.service.example.com
ExternalName은 서비스로 들어오는 트래픽을 Pod가아닌 외부 서비스로 전달하기 때문에 spec.selector와 spec.ports를 지정해줄 필요가 없습니다.
spec.externalName에 외부 서비스의 DNS로 지정해주면 서비스로 들어오는 트래픽을 해당 외부 서비스로 포워딩해줍니다.
서비스(Service) 생성하기
서비스를 YAML파일로 구성한 뒤 다음 명령어로 서비스를 생성할 수 있습니다.
$ kubectl apply -f service.yaml
service/my-service created
예시로 nginx 컨테이너가 실행되고있는 Pod와 NodePort 서비스를 생성하였습니다.
Pod생성은 아래글을 참고하시길 바랍니다.
https://yoo11052.tistory.com/190?category=1033876
다음 명령어로 서비스가 생성되었는지 확인합니다.
$ kubectl get svc my-service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
my-service NodePort 10.104.76.218 <none> 80:30001/TCP 94s
노드에 30001번 포트가 할당된것을 보실 수 있습니다.
서비스로 접근시 Pod로 트래픽이 잘 전달되는것을 보실 수 있습니다.
생성된 서비스는 다음 명령어를 통해 삭제할 수 있습니다.
$ kubectl delete svc my-service
서비스(Service) 생성 흐름
서비스를 구성하고 생성하는 방법에대해 알아봤으니 이제 서비스를 생성하면 클러스터 내부에서 어떤 동작이 일어나는지 알아보도록 합시다.
- Endpoints Controller가 Service와 Pod를 감시하면서 조건(Selector)에 맞는 Pod의 IP를 수집합니다.
- Endpoints Controller가 수집한 IP를 가지고 Endpoints를 생성합니다.
- Kube-Proxy는 Endpoints의 변화를 감지하고 노드의 iptables을 설정하여 노드가 해당 서비스 주소로 접근할 수 있도록 만듭니다.
- CoreDNS는 Service를 감시하고 서비스 이름과 IP를 CoreDNS에 추가합니다.
CoreDNS란?
CordeDNS는 쿠버네티스 클러스터의 DNS서버 역할을 합니다. Pod, Service의 도메인을 관리하고 외부 도메인 서버와 연결이 필요한 경우 통로역할을 수행합니다.
참고
'Kubernetes' 카테고리의 다른 글
[Kubernetes] Deployment란 (1) | 2022.12.18 |
---|---|
[Kubernetes] Endpoints란 (1) | 2022.07.20 |
[Kubernetes] 서비스(Service)의 유형 (0) | 2022.07.19 |
[Kubernetes] Pod 구성 및 생성하기 (0) | 2022.07.19 |
[Kubernetes] Kubernetes Object란 (1) | 2022.07.14 |