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에 접속한 것을 확인할 수 있다.