-
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를 확인해보자.
반응형'K8S' 카테고리의 다른 글
ArgoCD와 Keycloak OIDC 연동하기 (0) 2022.11.25 Cert-manager와 Traefik IngressRoute을 이용한 nginx https 배포 (0) 2022.10.25 Keycloak을 이용한 K8S 사용자 분리 (0) 2022.09.04 local 볼륨 동적 프로비저닝을 위한 PV, PVC 예제 (0) 2022.08.26 PV, PVC, SC 사용시 Tip! (0) 2022.08.17