kubernetes pod, deployment and service

kubernetes pod, deployment and service

kubernetes 의 pod, deployment 그리고 service에대해 알아보려한다.
일단 pod는 쉽게말해서 container 와 같고 deployment는 docker swarm 의 service와 상응하는 기능으로 보인다.
햇갈릴수있는 부분이, docker swarm 에서 지칭하는 service 와 kubernetes에서 지칭하는 service의 혼동이다.
docker swarm 에서의 service는 n개의 replicas container의 집합과 관리를 담당 ( rollback , update 등 ) 하는반면
kubernetes의 service는 deployment 들을 expose( 노출 ) 하던지 load balancing을 위한 용도로 지칭하는듯 하다.
또 다른 특이점으론 docker swarm 에서 master node는 –availability active mode로 동작하는 반면 kubernetes master node는 기본적으로 –availability drain mode로 동작한다. ( 사용자가 생성한 pod, deployment등 container들을 master node에서 생성하지않는다. )
nginx를 이용하여 간단히 테스트를 진행한다.

deployment

deployment( pods ) 생성한다.

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
$ vi nginx-deployment.yaml
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2 # tells deployment to run 2 pods matching the template
template: # create pods using pod definition in this template
metadata:
# unlike pod-nginx.yaml, the name is not included in the meta data as a unique name is
# generated from the deployment name
labels:
app: nginx
spec:
containers:
- name: nginx
# image: nginx
image: setyourmindpark/debian-nginx
ports:
- containerPort: 80
$ kubectl create -f nginx-deployment.yaml

1
2
3
4
$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
nginx-deployment-5599c844c4-7qxkm 1/1 Running 0 12m 10.244.1.18 node1
nginx-deployment-5599c844c4-lzmxj 1/1 Running 0 12m 10.244.1.19 node1
1
2
3
$ kubectl get deployments
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx-deployment 2 2 2 2 12m

service

앞에서 언급한 바와같이 deployment로 생성된 pods 들은 기본적으로 cluster 내부에서만 접근가능하므로 외부에 expose( 노출 ) 을 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ vi nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
ports:
- name: nginx-service
port: 80
targetPort: 80
type: NodePort
selector:
app: nginx
$ kubectl create -f nginx-service.yaml

1
2
3
4
$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 6h
nginx-service NodePort 10.100.189.254 <none> 80:32035/TCP 15m

확인

expose 확인

필자의 pods들은 10.10.80.12 node에 생성되었다.
브라우저에서 10.10.80.12:32035 접속시 정상적으로 nginx default page가 로드된다.
cluster 외부에서는 node-ip:32035
cluster 내부에서는 10.100.189.254:80

load balancing 확인

생성된 2개의 pod에 접속하여 access log를 확인한다.
기본적으로 access log는 주석처리되어있으므로 설정변경과 nginx를 reload 한다 .
master node에서 kubectl exec … 로 pods( container ) 접근하여 수정하거나 해당 node에서 docker exec …로 생성된 pods로 직접접속한다.

1
2
3
4
5
6
7
8
$ kubectl exec -it nginx-deployment-5599c844c4-7qxkm /bin/bash
$ kubectl exec -it nginx-deployment-5599c844c4-lzmxj /bin/bash
$ vi /etc/nginx/conf.d/default.conf
...
access_log /var/log/nginx/host.access.log main; # 다음과같이 주석해제
...
$ nginx -s reload
$ tail -f /var/log/nginx/host.access.log # watching access log

node1에서 service ip로( 10.100.189.254:80 ) curl 을 날린다.

1
2
3
4
5
6
7
8
$ curl 10.100.189.254 # default port 80
$ curl 10.100.189.254
$ curl 10.100.189.254
$ curl 10.100.189.254
$ curl 10.100.189.254
$ curl 10.100.189.254
$ curl 10.100.189.254
$ curl 10.100.189.254

2대의 pods( container )에서 access log를 확인한다.

nginx-deployment-5599c844c4-7qxkm

1
2
3
4
5
10.244.1.1 - - [24/Mar/2018:18:21:58 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
10.244.1.1 - - [24/Mar/2018:18:21:59 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
10.244.1.1 - - [24/Mar/2018:18:22:00 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
10.244.1.1 - - [24/Mar/2018:18:22:01 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
10.244.1.1 - - [24/Mar/2018:18:22:02 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"

nginx-deployment-5599c844c4-lzmxj

1
2
3
10.244.1.1 - - [24/Mar/2018:18:21:59 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
10.244.1.1 - - [24/Mar/2018:18:22:00 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
10.244.1.1 - - [24/Mar/2018:18:22:06 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"

load balancing도 잘 수행된다.

견해

간단히 kubernetes를 살펴본 느낌으로는 docker swarm 보다 기능이 디테일하게 세분화되어있는 느낌을 받았다.
예를들어 docker swarm에서 default로 생성되는 overlay network 라든지 외부접근 관련된 service expose 라던지..
좀더 살펴봐야하겠지만. docker swarm 과 비슷하면서도 난해한부분이 없지않아 있는듯하다. 특히 ingress 관련 …

참고

http://lng1982.tistory.com/m/270
http://bryan.wiki/288