ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Ingress traefik을 이용한 nginx http 배포
    K8S 2022. 10. 25. 21:00

    틀린 내용이 있을 수도 있습니다! 

    틀린 내용이 있다면 댓글로 달아주시면 감사하겠습니다!

     

    개요  

    • ingress를 사용하기 위해 nginx-controller 대신 traefik을 사용한다.
    • nginx를 traefik ingress를 통해서 배포한다.
    • ingress는 http로 배포한다. 다음 포스팅에서 https로 배포할 것이다. 

     

    구성

    1. loadbalancer를 사용할 수 없는 환경인 경우, traefik service를 nodeport로 배포해서 ingress를 사용한다. 

    2. lb를 사용할 수 있다면, traefik service를 loadbalancer로 사용한다.

     

    이외에도 여기서는 다루지 않지만, traefik pod를 hostnetwork로 사용해서 배포할 수 있을 것이다.  

     

    1. NodePort를 사용하는 경우

    1) helm을 이용해서 traefik chart를 설치한다. 

    helm repo add traefik https://helm.traefik.io/traefik
    helm repo update
    helm pull traefik/traefik --untar

     

    2) traefik helm chart의 values.yaml을 변경한다.

    # values.yaml
    ingressClass.enabled: true
    ingressClass.isDefaultClass: true
    service.type: NodePort 
    ports.web.nodePort: 32080
    ports.websecure.nodePort: 32443

     

    3) traefik을 설치하자. 

    kubectl create ns traefik
    helm install traefik ./traefik -n traefik

     

    4) nginx deployment와 service 생성한다. 

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      creationTimestamp: null
      labels:
        app: nginx
      name: nginx
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
      strategy: {}
      template:
        metadata:
          creationTimestamp: null
          labels:
            app: nginx
        spec:
          containers:
          - image: nginx
            name: nginx
            ports:
            - containerPort: 80
            resources: {}
    status: {}
    
    ---
    apiVersion: v1
    kind: Service
    metadata:
      creationTimestamp: null
      labels:
        app: nginx
      name: nginx
      namespace: default
    spec:
      ports:
      - name: http
        port: 8080
        protocol: TCP
        targetPort: 80
      selector:
        app: nginx
    status:
      loadBalancer: {}

     

    5) 마지막으로 제일 중요한 ingress를 생성한다. 

     

    나의 경우는 domain을 따로 만들지 않았기 때문에 nip.io를 사용했다.

    그래서 클러스터에 있는 아무 노드 하나를 고른 후, 노드 ip + nip.io로 사용했다. 

    service의 정책(externalTraffikPolicy등이라던지)을 변경하지 않았기 때문에 어떤 노드를 골라도 무관하다.   

    그리고 nginx라는 subdomain을 nip.io 도메인에 추가하여 ingress를 생성했다. 

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: nginx-ingress
      annotations:
        nginx.ingress.kubernetes.io/rewrite-target: /
    spec:
      rules:
      - host: "nginx.192.168.9.37.nip.io" # 원하는 subdomain.[nodeip].nip.io로 설정
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: nginx
                port:
                  name: http
                  # number: 8080

     

    이제 nodeport로 접속해보자. 

    http://nginx.192.168.9.37.nip.io:32080

     

     

    2. Loadbalancer를 사용하는 경우

    내가 사용중인 환경은 metallb를 사용하기 때문에 loadbalancer를 사용할 수 있었다. 

    위에서 배포한 traefik helm chart에 이어서 작업한다. 

     

    1) 위에서 이어 traefik helm chart values를 수정한다. 

    # values.yaml
    service.type: LoadBalancer
    providers.kubernetesIngress.publishedService.enabled: true # 이 부분 사실 설정 안해도 상관없을듯하다.

     

    2) 기존 chart를 upgrade한다. 

    helm upgrade traefik [chart 경로] -n traefik

     

    3) loadbalancer ip를 확인한다.

    kubectl get svc traefik -n traefik -o jsonpath={.status.loadBalancer.ingress[0].ip}

     

    4) 기존에 배포된 ingress를 지운 후, 새로운 ingress를 배포한다.

     

    바뀐 부분이 있다면 이전의 ingress에는 node의 ip를 적었다면,

    현재 배포할 ingress에는 loadbalancer의 ip를 적었다. 

    이외의 다른 부분은 동일하다.  

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: nginx-ingress
      annotations:
        nginx.ingress.kubernetes.io/rewrite-target: /
    spec:
      rules:
      - host: "nginx.192.168.109.20.nip.io" # 원하는 subdomain.[loadbalancer ip].nip.io로 설정
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: nginx
                port:
                  name: http
                  # number: 8080

     

    잘 배포 되었다면 http://nginx.192.168.109.20.nip.io 로 접속해서 배포된 nginx를 확인해보자. 

    반응형

    댓글

Designed by Tistory.