Service
: 동일한 목적으로 동작되고 있는 Pod들을 하나로 묶어주고 로드밸런싱(L4
). Cluster IP를 할당.
Pod Network
: CNI에서 관리하는 포드 간 통신에 사용되는 클러스터 전체 네트워크
+ CNI
: 컨테이너 사이에 통신할 수 있도록 해주는 인터페이스. Pod에 대한 IP를 할당해주는 역할
Service Network
: Service discovery를 위해 kube-proxy가 관리하는 Cluster-wide 범위의 Virtual IP
Kubernetes Network Proxy
: 각각의 Node에서 실행되고, Kubernetes Service API에 정의된 서비스를 각 노드에서 반영
kube-proxy
의 역할: iptables rule
을 설정하고 외부 네트워크와 Pod를 연결
+ service가 로드밸런싱하는 것처럼 보이는 것은 사실 워커 노드마다 iptables rule
이 만들어지고 이것을 통해서 라우팅되고 있는 것입니다.
ClusterIP
(default): Pod 그룹(동일한 서비스를 지원하는 Pod 모음)의 단일 진입점(Virtual IP: LB) 생성(NodePort 설정 전까진 외부에서 접근 불가능)NodePort
: ClusterIP가 생성된 후 모든 Worker Node에 외부에서 접속 가능한 포트를 예약해서 포트포워딩.LoadBalancer
: 클라우드 인프라스트럭처(AWS, Azure, GCP)에 적용. LoadBalancer를 자동으로 프로비저닝하는 기능 지원Replicas: 3
인 deployment
를 생성합니다.
% vim nginx-deployment.yaml
# 아래와 같이 편집
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
% kubectl apply -f nginx-deployment.yaml
deployment.apps/nginx-deployment created
% kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
eshop-cart-app 1/1 Running 4 (114d ago) 117d 10.244.1.18 k8s-worker1 <none> <none>
front-end-8dc556958-fvlpx 1/1 Running 3 (114d ago) 137d 10.244.2.41 k8s-worker2 <none> <none>
front-end-8dc556958-vcr4s 1/1 Running 4 (114d ago) 137d 10.244.2.48 k8s-worker2 <none> <none>
nginx-79488c9578-qwnfk 1/1 Running 2 (114d ago) 115d 10.244.1.19 k8s-worker1 <none> <none>
nginx-79488c9578-xpsvp 1/1 Running 2 (114d ago) 115d 10.244.2.45 k8s-worker2 <none> <none>
nginx-deployment-877f48f6d-qfdfq 1/1 Running 0 5m35s 10.244.2.50 k8s-worker2 <none> <none>
nginx-deployment-877f48f6d-ws2sn 1/1 Running 0 5m35s 10.244.1.21 k8s-worker1 <none> <none>
nginx-deployment-877f48f6d-xg7fx 1/1 Running 0 5m35s 10.244.1.20 k8s-worker1 <none> <none>
10.96.100.100
주소를 가진 service
를 생성합니다.
(ClusterIP
를 적지 않으면 무작위로 할당됩니다)
% vim my-service.yaml
# 아래와 같이 편집
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
clusterIP: 10.96.100.100
selector:
app: nginx
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
% kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 175d
my-service ClusterIP 10.96.100.100 <none> 80/TCP 5s
% ssh k8s-worker1
% curl 10.96.100.100
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
selector
의 label
이 동일한 Pod
들을 그룹으로 묶어 단일 진입점 (Virtual_IP
)을 생성합니다.클러스터 내부
에서만 사용 가능합니다.service type
생략 시 default로 설정됩니다.10.96.0.0/12
범위에서 할당됩니다.LAB
: 동일한 서비스를 제공하는 Pod 그룹에 ClusterIP 생성하기
% kubectl create deployment web --image=nginx --port=80 --replicas=2
% kubectl get deployments.apps web
% kubectl get pod -o wide
% kubectl expose deployment web --type=ClusterIP --port=80 --target-port=80
% kubectl get svc web
devops
네임스페이스에서 운영되고 있는 eshop-order
deployment의 service를 만드세요.
devops
네임스페이스에 현재 생성되어있는 deployment를 확인하고 selector
를 확인합니다.
% kubectl get deployments.apps -n devops -o wide
% kubectl expose deployment eshop-order -n devops --type=ClusterIP --port=80 --target-port=80 --name=eshop-order-svc
% kubectl get svc
미리 배포한 'front-end'에 기존의 nginx 컨테이너의 포트 80/tcp
를 expose
하는 http
라는 이름을 추가합니다.
컨테이너 포트 http를 expose하는 'front-end-svc'라는 새 service를 만듭니다.
또한 준비된 node의 'NodePort'를 통해 개별 Pods를 expose되도록 Service를 구성합니다.
# front-end deployment 동작 확인
% kubectl get deployments.apps front-end -o yaml > front-end.yaml
% vim front-end.yaml
# 아래 내용으로 편집