Kubernetes Ingress를 이용한 클러스터 외부 공개

Ingress란? Pod를 클러스터 내외에 공개하는 L7(http에 근거해 배분 가능)의 로드 밸런서를 말한다. 클러스터 외부에서 URL의 호스트 경로로 서비스를 배분할 수 있다. 외부 액세스는 공용 DNS를 사용하여 수행된다.

Ingress 애드온을 활성화

그럼 사용하는 방법을 살펴 보겠다. 다음 명령을 사용하여 minikube에 Ingress 애드온을 활성화한다.

minikube addons enable ingress

실행 결과:

% minikube addons enable ingress
💡  ingress is an addon maintained by Kubernetes. For any concerns contact minikube on GitHub.
You can view the list of minikube maintainers at: https://github.com/kubernetes/minikube/blob/master/OWNERS
💡  After the addon is enabled, please run "minikube tunnel" and your ingress resources would be available at "127.0.0.1"
    ▪ Using image k8s.gcr.io/ingress-nginx/controller:v1.2.1
    ▪ Using image k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1
    ▪ Using image k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1
🔎  Verifying ingress addon...
🌟  'ingress' 애드온이 활성화되었습니다

그런 다음 아래 명령을 실행하여 minikube의 추가 기능 목록을 표시하고, ingress가 활성화되었는지 확인한다.

minikube addons list

실행 결과:

% minikube addons list
|-----------------------------|----------|--------------|--------------------------------|
|         ADDON NAME          | PROFILE  |    STATUS    |           MAINTAINER           |
|-----------------------------|----------|--------------|--------------------------------|
| ambassador                  | minikube | disabled     | 3rd party (Ambassador)         |

... 중간 생략 ...

| inaccel                     | minikube | disabled     | 3rd party (InAccel             |
|                             |          |              | [info@inaccel.com])            |
| ingress                     | minikube | enabled ✅   | Kubernetes                     | <<< 활성화
| ingress-dns                 | minikube | disabled     | Google                         |

... 중간 생략 ...

| volumesnapshots             | minikube | disabled     | Kubernetes                     |
|-----------------------------|----------|--------------|--------------------------------|

그런 다음 아래 명령을 실행하여, Ingress controller pod가 작성되었는지 확인한다.

kubectl get pods -n ingress-nginx
% kubectl get pods -n ingress-nginx
NAME                                        READY   STATUS      RESTARTS   AGE
ingress-nginx-admission-create-sqvcp        0/1     Completed   0          8m9s
ingress-nginx-admission-patch-t6cj5         0/1     Completed   1          8m9s
ingress-nginx-controller-755dfbfc65-cf8ww   1/1     Running     0          8m9

minikube의 경우 이러한 방식으로 애드온을 활성화하여 Ingress 컨트롤러를 만들 수 있지만, 클라우드 환경에서는 Ingress 컨트롤러를 설치해야 한다.

yaml 파일을 이용한 Ingress 실행

그런 다음 접속을 허용할 경로를 yaml로 정의해야 한다. 이번은 hello-world Pod를 모든 패스 /로 공개하도록 실행한다. 그러기 위해 다음과 같은 yaml 파일을 작성한다.

ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: helloworld
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
    - http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: helloworld-nodeport
                port:
                  number: 8080

이 yaml 파일에는 Ingress의 이름을 helloworld로 하고, http 아래에 경로에 관한 규칙을 기재하고 있는 구조로 되어 있다. 또 path로서 /에 오면, 어느 Service에 접속시킬지를 backend의 장소를 기입하고 있다. 여기서는 helloworld-nodeport에 포트 8080으로 접속되도록 정의하고 있다.

이 파일을 사용하여 매니페스트를 만든다. 매니페스트에 대해서는 나중에 설명을 하겠지만, 여기에서는 설정을 반영시키는 정도의 인식하기로 하자. 다음 명령을 사용하여 이 작업을 수행한다.

kubectl apply -f ingress.yaml

실행 결과:

% kubectl apply -f ingress.yaml
ingress.networking.k8s.io/helloworld created

Ingress를 목록을 표시하고, 위에서 생성한 helloworld의 ingress가 생성되었는지 확인하려면, 다음 명령을 실행한다.

kubectl get ingress

실행 결과:

% kubectl get ingress
NAME         CLASS   HOSTS   ADDRESS        PORTS   AGE
helloworld   nginx   *       192.168.49.2   80      69s

또한 ingress resource에 대한 자세한 내용을 보려면 다음 명령을 실행한다.

kubectl describe ingress [Ingress명]

helloworld인 경우은 앨와 같이 실행한다.

% kubectl describe ingress helloworld
Name:             helloworld
Labels:           <none>
Namespace:        default
Address:          192.168.49.2
Ingress Class:    nginx
Default backend:  <default>
Rules:
  Host        Path  Backends
  ----        ----  --------
  *
              /   helloworld-nodeport:8080 (172.17.0.3:8080)
Annotations:  nginx.ingress.kubernetes.io/rewrite-target: /$1
Events:
  Type    Reason  Age                From                      Message
  ----    ------  ----               ----                      -------
  Normal  Sync    40s (x2 over 80s)  nginx-ingress-controller  Scheduled for sync

또한 다음 명령을 실행하여 Ingress 컨트롤러의 IP를 얻을 수 있으며, 이를 사용하여 Ingress를 통해 helloworld-nodeport Service에 액세스한다.

% kubectl get ingress | awk '{ print $4 }'|tail -1
192.168.49.2

Ingress를 경유하여 접근해 본다.

% kubectl run --image curlimages/curl:7.68.0 -it --restart Never --rm curl sh
If you don't see a command prompt, try pressing enter.
/ $ curl 192.168.49.2
Hello, world!
Version: 1.0.0
Hostname: helloworld
/ $

이것으로 Ingress를 경유해서 안전하게 helloworld-nodeport의 Service에 접근하고 helloworld Pod에 접속한 것을 확인할 수 있다.