0%

kubernetes service, ingress

서비스

서비스는 쿠버네티스 클러스터 안에서 파드의 집합(주로 레플리카세트) 에 대한 경로나 서비스 디스커버리를 제공하는 리소스입니다.

서비스 대상이 되는 파드는 서비스에서 정의하는 레이블 셀렉터로 정해집니다.

일단 1개의 yml 파일에 2개의 레플리카세트를 정의해보자.

simple-echo-replicaset-with-label.yaml

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: simple-echo-spring
labels:
app: simple-echo
release: spring
spec:
replicas: 1
selector:
matchLabels:
app: simple-echo
release: spring
template: # template 아래는 파드 리소스 정의와 같음
metadata:
labels:
app: simple-echo
release: spring
spec:
containers:
- name: goecho
image: lejewk/goecho:latest
ports:
- containerPort: 80

---

apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: simple-echo-summer
labels:
app: simple-echo
release: summer
spec:
replicas: 2
selector:
matchLabels:
app: simple-echo
release: summer
template: # template 아래는 파드 리소스 정의와 같음
metadata:
labels:
app: simple-echo
release: summer
spec:
containers:
- name: goecho
image: lejewk/goecho:latest
ports:
- containerPort: 80

NodePort 를 사용하여 relaese = summer 인 파드만 접근하도록 서비스를 생성한다면

NodePort 는 클러스터 외부에서 서비스에 접근이 가능하도록 하는 설정입니다.

1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: v1
kind: Service
metadata:
name: simple-echo
spec:
type: NodePort
selector:
app: simple-echo
release: summer
ports:
- name: http
port: 80

이제 각각을 적용해보면

1
2
3
4
5
6
$ kubectl apply -f simple-echo-replicaset-with-label.yaml 
replicaset.apps/simple-echo-spring created
replicaset.apps/simple-echo-summer created

$ kubectl apply -f simple-echo-service.yaml
service/simple-echo created

이후 NodePort 를 확인해봅니다.

1
2
3
4
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 12h
simple-echo NodePort 10.105.219.48 <none> 80:31399/TCP 3m18s

31399 포트로 열려있어 이를 통해 접근해보겠습니다.
http://localhost:31399/

1
[simple-echo-summer-nfvln] Hello~

응답 바디에 호스트를 작성했는데요,

리플리카셋을 2로 설정했지만 어째서인지 계속 동일한 파드로만 진입이 되는것같습니다.
서비스의 로드벨런싱 기능이 존재하는지 아니면 없는건지는 이후 학습하면서 보면 될것같습니다.

인그레스

클러스터 외부로 서비스를 공개하려면 서비스를 NodePort 로 노출시킵니다.
그러나 이 방법은 L4 레벨까지만 다룰 수 있어서 HTTP/HTTPS 처럼 경로를 기반으로 전환하는 L7 레벨의 제어는 불가능합니다.

이를 해결하가 위한 리소스가 인그레스 입니다.

튜토리얼에서는 nginx ingress controller 를 사용하겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 메니패스트의 내용중 Deployment 의 apiVersion 이 extensions/v1beta1 을 지원하지 않는다면 
# 해당 파일을 내려받아 yaml 로 만든 후
# extensions/v1beta1 -> apps/v1 으로 변경하여 적용합니다.
https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.16.2/deploy/mandatory.yaml

$ kubectl apply -f simple-echo-ingress-nginx-controller.yaml
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.16.2/deploy/provider/cloud-generic.yaml

# 적용 확인
$ kubectl -n ingress-nginx get service,pod
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/default-http-backend ClusterIP 10.102.121.230 <none> 80/TCP 5m15s
service/ingress-nginx LoadBalancer 10.110.155.253 localhost 80:30942/TCP,443:31597/TCP 4s

NAME READY STATUS RESTARTS AGE
pod/default-http-backend-75b5c88cd6-pvhdk 1/1 Running 0 5m15s
pod/nginx-ingress-controller-86d68989c8-772pv 1/1 Running 0 5m15s

서비스의 NodePort 를 제거후 다시 반영합니다.

1
2
3
4
5
6
7
8
9
10
apiVersion: v1
kind: Service
metadata:
name: simple-echo
spec:
selector:
app: simple-echo
ports:
- name: http
port: 80
1
2
3
4
$ kubectl apply -f simple-echo-service.yaml --force
service/simple-echo configured

# --force 를 붙여 강제로 적용시킵니다. type 미정의에 따른 경고를 무시한다고 보면됩니다.

이제 간단한 인그레스를 정의하고 반영해봅니다.
simple-echo-ingress.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: simple-echo
spec:
rules:
- host: wook.ingress.local
http:
paths:
- path: /
backend:
serviceName: simple-echo
servicePort: 80
1
2
3
4
5
6
$ kubectl apply -f simple-echo-ingress.yaml 
ingress.extensions/simple-echo created

kubectl get ingress
NAME HOSTS ADDRESS PORTS AGE
simple-echo wook.ingress.local localhost 80 19m

이제 지정한 호스트로 /etc/hosts 파일을 127.0.0.1 아이피와 매핑후 통신을하면

1
2
3
4
5
6
7
$ curl http://wook.ingress.local/
# 또는
$ curl http://localhost -H 'Host: wook.ingress.local'
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 33 100 33 0 0 3000 0 --:--:-- --:--:-- --:--:-- 3300
[simple-echo-summer-lszln] Hello~

와 같이 응답하는것을 볼 수 있습니다.
로드벨런스까지 적용되어 새로고침시 다른 호스트의 응답을 볼수 있습니다.