Kind 로 Ingress Controller 구성하기
Setting Up An Ingress Controller의 내용을 설명한 글입니다.
이 글에서는 Kind 클러스터에서 Ingress 를 구성하여 호스트 시스템에 서비스를 노출(Expose)하는 방법을 소개합니다.
다음은 우리가 구성할 Workload 구성도입니다:
목표
- Kind 클러스터를 사용하여 로컬 호스트에 쿠버네티스 클러스터 구성하기
- Helm Chart 를 사용하여 Nginx 배포하기
- Ingress 를 사용하여 내부 서비스로 접근하기
준비하기
- WSL(윈도우즈일 경우)
- Docker
- Helm
- Kind
위 구성이 준비되지 않았다면,
Containerization Part.0 - Containerization 준비 과정을 따라하세요. 😉
시작하기
Kind 클러스터 구성하기
클러스터를 생성할 때 호스트에서 노드에서 실행 중인 Ingress Controller 로 포트를 포워딩하기 위해 Kind의 extraPortMapping
구성 옵션을 활용할 수 있습니다.
Ingress Controller nodeSelector 가 사용할 수 있도록 kubeadm InitConfiguration의 노드 레이블을 사용하여 사용자 정의 노드 레이블을 설정할 수도 있습니다.
extraPortMappings
와 node-labels
를 사용하여 Kind 클러스터를 생성합니다.
extraPortMappings
를 사용하면 로컬 호스트가 포트 80/443 을 통해 Ingress Controller 에 요청을 전달할 수 있습니다.node-labels
는 Ingress Controller 가 Label Selector(레이블 선택기) 와 일치하는 특정 노드에서만 실행되도록 허용합니다.
다음 명령을 실행하여 Kind 클러스터를 생성합니다:
cat <<EOF | kind create cluster --config=-
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
kubeadmConfigPatches:
- |
kind: InitConfiguration
nodeRegistration:
kubeletExtraArgs:
node-labels: "ingress-ready=true"
extraPortMappings:
- containerPort: 80
hostPort: 80
protocol: TCP
- containerPort: 443
hostPort: 443
protocol: TCP
EOF
Ingress-NGINX 의 Ingress Controller 구성하기
다음 명령을 실행하여 Ingress NGINX 를 구성합니다:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml
위 매니페스트에는 hostPorts 를 Ingress Controller 로 전달하고 Taint Tolerations 을 설정하고 이를 커스텀 레이블이 지정된 노드로 예약하기 위한 Kind 패치가 포함되어 있습니다.
Taint Tolerations 는 오염 허용이라는 의미입니다.
Node affinity(노드 선호도) 는 Pod 를 Node 집합으로 끌어들이는 Pod의 속성입니다. Taint 는 반대로 Node 가 Pod 세트를 거절(repel)하는 속성입니다.
Tolerations 은 Pod 에 적용되고, 스케줄러는 일치하는 Taint 로 Pod 를 예약합니다.
이제 Ingress가 모두 설정되었습니다.
다음 명령으로 실행 중인 요청을 처리할 준비가 될 때까지 기다립니다:
kubectl wait --namespace ingress-nginx \
--for=condition=ready pod \
--selector=app.kubernetes.io/component=controller \
--timeout=90s
NGINX Chart 배포하기
이 글에서는 bitnami 에서 작성한 Helm Chart 를 사용하겠습니다.
만약, 로컬 호스트에 bitnami Chart 저장소가 없다면 새로 추가합니다:
이미 있다면 다음 명령은 실행하지 않아도 됩니다
helm repo add bitnami https://charts.bitnami.com/bitnami
다음 명령을 사용하여 my-ngin 라는 이름으로 bitnami Nginx Chart 를 배포합니다:
helm install my-nginx bitnami/nginx
Labels 확인하기
다음 명령을 호스트에서 실행하여 Nginx 에 접근하는 지 확인합니다:
curl localhost
아쉽게도 아직 호스트에서 Nginx 기본 페이지를 확인할 수 없습니다. 🤔
bitnami Helm Charts 에서 공통으로 사용하는 로직들은 Bitnami Common Library Chart에 정의되어 있습니다.
deploy.spec.selector.matchLabels
나 svc.spec.selector
는 common.labels.matchLabels
파라미터로 정의되어 있습니다.
다음 그림은 배포된 Workload 의 Label 입니다:
kubectl describe
명령으로 각 Workload 의 세부 구성을 확인할 수 있습니다.
자세한 내용은 다음 포스트에서 소개하겠습니다.
Label 이 제대로 구성되지 않으면, 트래픽이 전달되지 않기 때문에 쿠버네티스 매니페스트를 구성할 때 Label 설정을 잘 확인해야 합니다.
그리고 지금은 Lable 설정에 문제가 없어도 호스트에서 서비스에 접근할 수 없습니다.
이 문제를 해결하기 위해서는 Routing Rule 을 정의하는 Ingress 객체를 정의해야 합니다.
Ingress 배포하기
다음 명령을 실행하여 Routing Rule 을 정의한 Ingress 를 배포합니다:
kubectl apply -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
rules:
- http:
paths:
- pathType: Prefix
path: /
backend:
service:
name: my-nginx
port:
number: 80
EOF
구성된 Workload 는 다음 그림과 같습니다:
다음 명령을 호스트에서 실행하여 Nginx 에 접근하는 지 확인합니다:
curl localhost
Nginx 페이지를 확인할 수 있습니다 😆:
$ curl localhost
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
Kind 클러스터 삭제하기
다음 명령을 실행하여 Kind 클러스터를 삭제합니다:
kind delete clusters kind
결론
이 글에서는 Kind 클러스터를 사용하여 로컬 호스트에 쿠버네티스 클러스터를 구성하고, Helm Chart 를 사용하여 Nginx 를 배포한 후, Ingress 를 사용하여 내부 서비스로 접근하는 구성을 소개했습니다.
쿠버네티스 Workload 에 대한 자세한 설명은 다음 포스트에서 소개하겠습니다. 😎
댓글남기기