클라우드/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