3 분 소요


Setting Up An Ingress Controller의 내용을 설명한 글입니다.


이 글에서는 Kind 클러스터에서 Ingress 를 구성하여 호스트 시스템에 서비스를 노출(Expose)하는 방법을 소개합니다.

다음은 우리가 구성할 Workload 구성도입니다:

그림. Kind 에 배포할 Workload 구성


목표

  • Kind 클러스터를 사용하여 로컬 호스트에 쿠버네티스 클러스터 구성하기
  • Helm Chart 를 사용하여 Nginx 배포하기
  • Ingress 를 사용하여 내부 서비스로 접근하기




준비하기

  • WSL(윈도우즈일 경우)
  • Docker
  • Helm
  • Kind

위 구성이 준비되지 않았다면,
Containerization Part.0 - Containerization 준비 과정을 따라하세요. 😉




시작하기

Kind 클러스터 구성하기

클러스터를 생성할 때 호스트에서 노드에서 실행 중인 Ingress Controller 로 포트를 포워딩하기 위해 Kind의 extraPortMapping 구성 옵션을 활용할 수 있습니다.

Ingress Controller nodeSelector 가 사용할 수 있도록 kubeadm InitConfiguration의 노드 레이블을 사용하여 사용자 정의 노드 레이블을 설정할 수도 있습니다.

extraPortMappingsnode-labels 를 사용하여 Kind 클러스터를 생성합니다.

  • extraPortMappings 를 사용하면 로컬 호스트가 포트 80/443 을 통해 Ingress Controller 에 요청을 전달할 수 있습니다.
  • node-labelsIngress 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(노드 선호도)PodNode 집합으로 끌어들이는 Pod의 속성입니다. Taint 는 반대로 NodePod 세트를 거절(repel)하는 속성입니다.
TolerationsPod 에 적용되고, 스케줄러는 일치하는 TaintPod 를 예약합니다.

이제 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.matchLabelssvc.spec.selectorcommon.labels.matchLabels 파라미터로 정의되어 있습니다.

다음 그림은 배포된 WorkloadLabel 입니다:

그림. Kind 에 배포된 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 는 다음 그림과 같습니다:

그림. Kind 에 Ingress를 배포한 Worload 구성


다음 명령을 호스트에서 실행하여 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 에 대한 자세한 설명은 다음 포스트에서 소개하겠습니다. 😎




참고자료

댓글남기기