클라우드/kubernetes
[k8s] 인그레스(Ingress) 컨트롤러
moving
2021. 3. 30. 19:21
728x90
master 192.168.122.11
node1 192.168.122.21
node2 192.168.122.22
node3 192.168.122.23
쿠버네티스 외부에 노출 시켜야할 서비스가 많을 경우, 하나의 인그레스 컨트롤러를 이용해서 HTTP 요청의 주소부분을 구분해 각 서비스에 연결할 수 있다.
인그레스 컨트롤러는 OSI Layer 7(HTTP/HTTPS)에서 작동한다.
$ kubectl get all -n ingress-nginx
NAME READY STATUS RESTARTS AGE
pod/ingress-nginx-controller-gfzm6 1/1 Running 1 253d
pod/ingress-nginx-controller-ncgqh 1/1 Running 1 253d
pod/ingress-nginx-controller-w74wk 1/1 Running 1 253d
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
daemonset.apps/ingress-nginx-controller 3 3 3 3 3 beta.kubernetes.io/os=linux 253d
1. 인그레스 생성
mynapp-ing.yml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: mynapp-ing
spec:
rules:
- host: mynapp.example.com
http:
paths:
- path: /
backend:
serviceName: mynapp-svc-ext-np
servicePort: 80
외부에서 mynapp.example.com FQDN 주소를 통해 인그러스 컨트롤러에 접속하면, 인그러스 컨트롤러는 백엔드 서비스인 mynapp-svc-ext-np 서비스에 리다이렉션하며, mynapp-svc-ext-np 서비스는 레이블 셀렉터에 매핑된 파드로 연결해준다.
# 레플리카셋 컨트롤러와 NodePort 서비스를 생성한다.
$ kubectl create -f mynapp-rs.yml -f mynapp-svc-ext-nodeport.yml
# 인그레스 컨트롤러 생성
$ kubectl create -f mynapp-ing.yml
2. 인그레스 컨트롤러 확인
$ kubectl get ingresses.networking.k8s.io
NAME HOSTS ADDRESS PORTS AGE
mynapp-ing mynapp.example.com 80 33s
*!인그레스 컨트롤러에 주소가 할당되야 하는데, 기다려도 할당되지 않음. 이유를 모르겠다.
$ kubectl get all
NAME READY STATUS RESTARTS AGE
pod/mynapp-rs-4vmp4 1/1 Running 0 7m49s
pod/mynapp-rs-bnmnr 1/1 Running 0 7m49s
pod/mynapp-rs-qxhch 1/1 Running 0 7m49s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.233.0.1 <none> 443/TCP 253d
service/mynapp-svc-ext-np NodePort 10.233.0.88 <none> 80:31111/TCP 7m49s
NAME DESIRED CURRENT READY AGE
replicaset.apps/mynapp-rs 3 3 3 7m49s
3. 인그레스 컨트롤러에 요청할 때에는 mynapp.example.com 주소로 접근해야 해당 mynapp-svc-ext-np 서비스로 리다이렉션 하게 된다.
curl 명령의 --resolve 옵션을 사용하면 해당 FQDN의 주소를 IP로 변환시킨다.
$ curl mynapp.example.com:80:192.168.122.22 http://mynapp.example.com
curl: (6) Could not resolve host: mynapp.example.com:80:192.168.122.22; Unknown error
curl: (6) Could not resolve host: mynapp.example.com; Unknown error
$ curl --resolve mynapp.example.com:80:192.168.122.22 http://mynapp.example.com
Message: Hello World!
Hostname: mynapp-rs-qxhch
Platform: linux
Uptime: 10594
IP: 10.233.92.12
DNS: 169.254.25.10
mynapp-rs.yml | 레플리카셋 컨트롤러
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: mynapp-rs
spec:
replicas: 3
selector:
matchLabels:
app: mynapp-rs
template:
metadata:
labels:
app: mynapp-rs
spec:
containers:
- name: mynapp
image: c1t1d0s7/myweb
ports:
- containerPort: 8080
mynapp-svc-ext-nodeport.yml | NodePort 서비스
apiVersion: v1
kind: Service
metadata:
name: mynapp-svc-ext-np
spec:
type: NodePort
ports:
- port: 80
targetPort: 8080
nodePort: 31111
selector:
app: mynapp-rs