[따배쿠] 11. Service
( 참고 : 따배쿠 https://www.youtube.com/watch?v=6n5obRKsCRQ&list=PLApuRlvrZKohaBHvXAOhUD-RxD0uQ3z0c )
Contents
- Service 개념
- Service의 4가지 타입
- Headless Service
- kube-proxy
Service = 쿠버네티스 네트워크
1. Service 개념
- 동일한 서비스를 제공하는 “Pod 그룹의 단일 진입점”을 제공
step 1) deployment 생성요청
step 2) controller & scheduler의 도움으로, 3개의 웹서버 실행
- ( 같은 일을 하는 pod가 3개 있음. but IP는 다 다름 )
Q. 3개의 pod 중 누구에게 일을 시킬까?
A. 상황 봐서~ 균등하게 잘 분산시켜주자!
\(\rightarrow\) 그래서 Service가 필요함
Service는 같은 역할을 하는 pod를 하나의 IP로 묶어서 관리해줌 ( with virtual IP = Load Balancer IP = 단일 진입점 . 이 정보 또한 etcd에 저장된다 )
같은 label(key:value)를 가진 pod가 추가로 생성되면, 해당 pod의 ip또한 자동으로 virtual IP에 추가/할당된다.
Service YAML 파일
kubectl get svc
2. Service의 4가지 타입
(1) Cluster IP
Pod그룹의 “단일 진입점(Virtual IP)” 생성
- selector의 label이 동일한 pod를 묶는다
- cluster 내부에서만 사용 가능
- type 생략 시, default 값으로 10.96.0.0/12 범위에서 할당
YAML
- clusterIP : 단일 진입점 IP
( nginx 웹서버를 3개 실행하는 Deployment가 작동 중인 상황 )
1) kubectl create -f clusterip-nginx.yaml
- YAML파일을 사용하여, clusterIP 서비스를 하나 생성
2) kubectl get svc
- 모든 service 확인
- 방금 생성한 service의 cluster IP가 10.100.100.200임을 확인 가능
3) curl 10.100.100.100
-
clusterIP로 접속하면, 3개 중 아무런 거 하나에 배정받아서 접속된다
( 유저는 당연히 자각 X )
4) kubectl describe svc clusterip-service
- clusterIP와, 이에 포함되는 pod의 IP들도 확인 가능
5) kubectl scale deployment webui --replicas=5
- pod의 개수를 3개에서 5개로 늘리면, 새로 생성되는 2개의 pod는 자동으로 clusterIP에 속하게 된다
5) kubectl delete svc clusterip-service
- 삭제하기
(2) Node Port
ClusterIP가 생성된 후, 모든 worker node에 “외부에서 접속 가능한 포트”가 예약
-
안에 cluster IP가 들어있음
( NodePort 생성 시, 자동으로 Cluster IP는 생성됨 )
-
즉, Node Port = Cluster IP +외부 접속가능한 포트
-
(외부에서 들어올 수 있는) default NodePort의 범위 : 30000-32767
YAML
1) kubectl create -f nodeport-nginx.yaml
2) kubectl get svc
3) curl 10.100.100.200
( 1) ~ 3)은 ClusterIP와 동일 )
4) curl node1.example.com:30200
- 3개의 pod 중 하나로 배정 받게 될 것
5) kubectl describe svc nodeport-service
6) kubectl delete svc nodeport-service
( 5) ~ 6)은 ClusterIP와 동일 )
(3) LoadBalancer
Cloud 인프라 ( ex. AWS, GCP, Azure ) 에서 적용
- public cloud에서 운영 가능
- LoadBalancer를 자동으로 구성 요청
- NodePort를 예약 후, 해당 nodeport로 외부 접근 허용
(4) ExternalName
Cluster “안”에서, 외부에 접속 시 사용할 도메인을 등록해서 사용
( 클러스터 도메인이 실제 외부 도메인으로 치환되어 동작 )
- naming 서비스 지원 ( like DNS )
- ex) External Name을 “goooogle.com”으로 등록
YAML
1) kubectl create -f externalname.yaml
2) kubectl get svc
3) kubectl run testpod -it --image=centos:7
: pod 내부로 접속
curl externalname-svc.default.svc.cluster.local
( = google로 접속 )exit
4) kubectl delete svc externalname-svc
3. headless Service
-
cluster IP가 없는 서비스로, 단일 진입점이 필요 X 때!
-
Service와 연결된 pod의 endpoint로 dns 레코드가 생성됨
( DNS resolving Service )
-
pod의 DNS 주소 :
pod-ip-addr.namespace.pod.cluster.local
YAML
- clusterIP를 None으로 설정하면, 자동으로 headless!
1) kubectl create -f headless-nginx.yaml
- headless 서비스 생성
2) kubectl get svc
- Cluster IP가 none임을 확인 가능
3) kubectl describe svc headless-service
- 묶여 있는 3개의 pod를 확인 가능 ( 3개의 endpoint )
4) pod endpoint DNS 서비스 조회
kubectl run testpod -it --image=centos:7 --command /bin/bash
cat /etc/resolv.conf
: core DNS 서버 확인 가능 ( 10.96.0.10 )curl ip-addr.default.pod.cluster.local
- exx) ` curl 10-36-0-1.default.pod.cluster.local`
exit
5. kube-proxy
- k8s Service의 backend 구현
- endpoint 연결을 위한 iptables (규칙) 구성
- nodePort로의 접근과 pod 연결을 구현 (iptables 구성)
kubectl get pods --all-namespaces
-
총 4개의 kube-proxy가 kube-system 네임스페이스에서 작동 중
( 각각 master, node 1,2,3에서 동작 중 )
iptables -t nat -S | grep 80
- 어디로 접속하면 xxxxxxx:80으로 연결되는지 알 수 있음
3가지 방식으로 운영됨