ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Kubernetes Nginx Ingress 알아보기
    Kubernetes 2023. 12. 16. 00:39
    728x90
    반응형

     

    - 목차

     

    소개.

    Ingress 는 Kubernetes 환경을 외부 네트워크와 연결하는 창구역할을 합니다. 
    Kubernetes 내부의 Pod 들은 서로의 IP 를 기반으로 통신을 수행하는데요. 
    Kubernetes 외부에서 특정 Pod 와의 연결은 불가능합니다. 
    Ingress 는 이러한 소통을 가능하게 하는 Kubernetes 리소스이며, 
    이번 글에서 Nginx 을 기반으로하는 Nginx Ingress 에 대해서 설명하려고 합니다. 

     

    Ingress 란 ?

    Ingress 는 Kubernetes 외부에서 Kubernetes 내부로의 통신을 가능하게 도와주는 Kubernetes Resource 입니다. 
    네트워크 관점에서 Ingress 와 Egress 라는 개념이 존재합니다. 
    Ingress 는 Inbound Network Traffic 을 수용하는 개념이고, egress 는 그 반대입니다. 
    Kubernetes 의 Pod 들은 Egress Network 는 가능합니다. 
    반면 Ingress Network 는 단절되어있어 불가능하죠. 
    그래서 Ingress 라는 Kubernetes Resource 는 이름 그대로 Ingress Network Traffic 을 관리하는 Kubernetes Resource 입니다. 

    Ingress 는 여러가지 종류가 존재합니다. 
    흔히 사용되는 Nginx 기반의 Ingress 가 존재하고, 그외에 Traefik, HAProxy Ingress, Contour 등이 있습니다. 
    Kubernetes 의 Resource 들은 반드시 Controller 가 필요한데요. 
    이 Controller 의 Reconcile Loop 을 통해서 Self-Healing 또는 Auto-Scaling 등을 가능하게 합니다. 
    그래서 Deployment, ReplicaSet 등은 Kubernetes Built-in Controller 가 존재합니다. 
    반면, Ingress 는 Built-in Controller 가 존재하지 않습니다. 
    왜냐하면 사용가능한 종류가 많습니다. ( Nginx, Traefik, HAProxy Ingress, Contour )
    그래서 사용자의 선택에 맡겨집니다. 

    Ingress Controller 가 생성된다면 본격적으로 Ingress 라는 Kubernetes Resource 를 사용할 수 있게 됩니다. 

     

    Kubernetes Version Compatibility.

    아래는 쿠버네티스와 Ingress Controller 의 버전 호환테이블입니다. 
    Ingress 를 적용하기 위해서는 Ingress Controller 와 Custon Resource Definition 의 설치가 선행되어야합니다. 

     

    https://docs.nginx.com/nginx-ingress-controller/technical-specifications/

     

    Technical Specifications | NGINX Ingress Controller

    Technical Specifications NGINX Ingress Controller Technical Specifications. Supported NGINX Ingress Controller Versions We recommend upgrading to the latest release of the NGINX Ingress Controller. We provide software updates for the most recent release. W

    docs.nginx.com

    https://github.com/kubernetes/ingress-nginx

     

    GitHub - kubernetes/ingress-nginx: Ingress-NGINX Controller for Kubernetes

    Ingress-NGINX Controller for Kubernetes. Contribute to kubernetes/ingress-nginx development by creating an account on GitHub.

    github.com

     

     

    그리고 Kubernetes 와 호환되는 버전의 nginx-controller 를 선택하시면 됩니다.  
    저는 Kubernetes 1.24 환경과 호환되는 1.8.4 버전의 nginx-controller 를 사용할 예정입니다.
    https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.4/docs/examples/static-ip/nginx-ingress-controller.yaml

     

     

    Nginx Ingress 적용하기.

    아래의 내용은 Local Kubernetes 에서 Ingress 를 생성하는 내용입니다.

    참고한 KinD-Ingress 문서 또한 함께 공유드립니다.

     

    https://kind.sigs.k8s.io/docs/user/ingress/#ingress-nginx

     

    kind – Ingress

    Ingress This guide covers setting up ingress on a kind cluster. Setting Up An Ingress Controller 🔗︎ We can leverage KIND’s extraPortMapping config option when creating a cluster to forward ports from the host to an ingress controller running on a no

    kind.sigs.k8s.io

     

    KinD Kubernetes 클러스터 생성.

    cat <<EOF> /tmp/k8s-cluster.yaml
    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
    - role: worker
    - role: worker
    - role: worker
    EOF

     

    kind create cluster \
    --name test-cluster \
    --image kindest/node:v1.24.0 \
    --config /tmp/k8s-cluster.yaml

     

    Nginx Ingress Controller 생성.

    먼저 nginx-ingress Namespace 를 생성합니다.

    그리고 nginx-ingress-controller 를 생성합니다.

    nginx-ingress-controller 는 Deployment 로 관리됩니다.

    kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml
    kubectl wait --namespace ingress-nginx \
      --for=condition=ready pod \
      --selector=app.kubernetes.io/component=controller \
      --timeout=90s

     

     

    Pod, Service, Nginx 생성하기.

     

    cat <<EOF> /tmp/node.yaml
    kind: Pod
    apiVersion: v1
    metadata:
      name: node
      labels:
        app: node
    spec:
      containers:
      - command:
        - /agnhost
        - netexec
        - --http-port
        - "8080"
        image: registry.k8s.io/e2e-test-images/agnhost:2.39
        name: node
    ---
    kind: Service
    apiVersion: v1
    metadata:
      name: node-service
    spec:
      selector:
        app: node
      ports:
      - port: 8080
    ---
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: node-ingress
      annotations:
        nginx.ingress.kubernetes.io/rewrite-target: /$2
    spec:
      rules:
      - http:
          paths:
          - pathType: Prefix
            path: /
            backend:
              service:
                name: node-service
                port:
                  number: 8080
    ---
    EOF
    kubectl apply -f /tmp/node.yaml

     

    아래와 같이 확인이 가능합니다.

    반응형
Designed by Tistory.