Exercise 11.2: Ingress Controller

  1. CP 노드에 연결된 터미널로 이동

  2. Artifact Hub에 있는 Charts 중에 키워드가 ingress 인 Chart 검색

    helm search hub ingress
  3. Helm Repository 추가 - ingess-nginx

    {
        helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
        helm repo update
    }
  4. 위에서 추가한 Helm Chart에 명시된 변수 확인 - https://artifacthub.io/packages/helm/ingress-nginx/ingress-nginx

  5. Helm Chart 설치

    helm install ingress-nginx ingress-nginx/ingress-nginx \
    --set controller.kind=DaemonSet
  6. 클러스터에 생성된 Ingress가 있는지 확인

    kubectl get ing -A
  7. NGINX Ingress Controller가 설치 됐는지 확인

    kubectl get svc,pod
  8. 데모 애플리케이션 배포

    cat <<EOF | kubectl create -f -
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: web-one
      labels:
        app: web-one
    spec:
      selector:
        matchLabels:
          app: web-one
      replicas: 1
      template:
        metadata:
          labels:
            app: web-one
        spec:
          containers:
          - image: nginx
            name: nginx
            ports:
            - containerPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: web-one
    spec:
      type: ClusterIP
      selector:
        app: web-one
      ports:
        - port: 80
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: web-two
      labels:
        app: web-two
    spec:
      selector:
        matchLabels:
          app: web-two
      replicas: 1
      template:
        metadata:
          labels:
            app: web-two
        spec:
          containers:
          - image: httpd
            name: httpd
            ports:
            - containerPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: web-two
    spec:
      type: ClusterIP
      selector:
        app: web-two
      ports:
        - port: 80
    EOF
  9. Ingress 생성

    cat <<EOF | kubectl apply -f -
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: ingress-test
    spec:
      ingressClassName: nginx
      rules:
      - host: www.external.com
        http:
          paths:
          - backend:
              service:
                name: web-one
                port:
                  number: 80
            path: /
            pathType: ImplementationSpecific
    EOF
  10. 생성된 Ingress 확인

    kubectl get ingress ingress-test
  11. 생성된 Ingress Controller Pod의 IP 주소 확인

    kubectl get pod -l app.kubernetes.io/name=ingress-nginx -o wide
  12. CURL 명령어로 Ingress Controller Pod의 IP 주소 호출

    curl INGRESS_CONTROLLER_POD_IP 

    OR

    curl $(kubectl get pod -l app.kubernetes.io/name=ingress-nginx -o=jsonpath='{.items[0].status.podIP}')
  13. 생성된 Ingress Controller Service의 IP 주소 확인

    kubectl get svc ingress-nginx-controller
  14. CURL 명령어로 Ingress Controller Service의 IP 주소 호출

    curl INGRESS_CONTROLLER_SERVICE_IP 

    OR

    curl $(kubectl get svc ingress-nginx-controller -o=jsonpath='{.spec.clusterIP}')
  15. Ingress에 명시한 Host 값을 포함해서 CURL 명령어로 Ingress Controller Service의 IP 주소 호출

    curl -H "Host: www.external.com" INGRESS_CONTROLLER_SERVICE_IP 

    OR

    curl -H "Host: www.external.com" \
    $(kubectl get svc ingress-nginx-controller -o=jsonpath='{.spec.clusterIP}')
  16. NGINX Ingress Controller에 Linkered 구성

    kubectl get ds ingress-nginx-controller -o yaml \
    | linkerd inject --ingress - | kubectl apply -f -
  17. Linkerd 대시보드에 NGINX Ingress Controller DaemonSet의 Mesh가 활성 되었는지 확인

  18. Linkerd 대시보드 왼쪽 패널에서 Top에 들어가서 daemonset/ingress-nginx-controller로 들어오는 트래픽 모니터링

  19. 위에서 생성한 Ingress에 새로운 규칙 추가

    cat <<EOF | kubectl apply -f -
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: ingress-test
    spec:
      ingressClassName: nginx
      rules:
      - host: www.external.com
        http:
          paths:
          - backend:
              service:
                name: web-one
                port:
                  number: 80
            path: /
            pathType: ImplementationSpecific
      - host: internal.org
        http: 
          paths:
          - backend:
              service:
                name: web-two
                port:
                  number: 80
            path: /
            pathType: ImplementationSpecific
    EOF
  20. Ingress에 추가한 Host 값을 포함해서 CURL 명령어로 Ingress Controller Service의 IP 주소 호출

    curl -H "Host: internal.org" \
    $(kubectl get svc ingress-nginx-controller -o=jsonpath='{.spec.clusterIP}')
  21. Linkerd 대시보드에 위에서 호출한 HTTP 요청 기록 확인

  22. NGINX Ingress Controller 삭제

    helm uninstall ingress-nginx
  23. 리소스 삭제

    {
        kubectl delete deployment web-one web-two
        kubectl delete svc web-one web-two
        kubectl delete ing ingress-test
        linkerd viz uninstall | kubectl delete -f -
        linkerd uninstall | kubectl delete -f -
        pkill linkerd
        cd
    }

Last updated