여러 시스템으로nginx-ingress/kube-lego 구축

7424 단어 kube-legokubernetes


슬프게도 이 기사를 쓸 때(2018/02/08) 쿠베레고는 이미 DEPRECATED 상태에 있었다.

kube-lego is in maintenance mode only. There is no plan to support any new features. The latest Kubernetes release that kube-lego officially supports is 1.8. The officially endorsed successor is cert-manager .
Kubernetes1.8만 공식적으로 지원하며cert-manager에 의해 계승됩니다.
1.9 발표, 마침 오늘 GKE도 모든 영역 1.9 지원 완료
그래서 자신이 이 구조에서 운용하지 않고 끝냈지만 완성한 필기였다.
기본적으로 Helm을 사용합니다.

하고 싶은 일


사용NGINX Ingress Controller
각 입구에서 이 컨트롤러의 서비스(type:LoadBalancer)를 공유하고 GKE에서 TCP LoadBalancer를 공유하면 IP도 같다.
(이로 인한 나쁜 점이 얼마나 큰지 모르겠다)
이러한 상황을 방지하기 위해 여러 개의 NGINX Ingress Controller를 배포하는 방법
그때 고전했던 쿠베레고 측의 설정 노트.

환경

  • Host: GKE
  • Master version/Node version: 1.8.5-gke.0
  • Helm: v2.8.0
  • chart: stable/nginx-ingress:0.9.1
  • chart: stable/kube-lego:0.4.0
  • image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.10.2
  • image:jetstack/kube-lego:master-3418(후술)
  • 프로비저닝


  • NGINX Ingress Controller
  • namespace: ingress-nginx

  • kube-lego
  • namespace: kube-lego

  • 일반 시스템
  • nginx-ingress/kube-lego

  • 기타 시스템 (회사 내부용 시스템 이미지)
  • nginx-ingress-inhouse/kube-lego-inhouse
  • 단계


    (helm의 설정 절차를 생략)

    namespace 만들기

    # ingress-nginx
    curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/namespace.yaml \
      | kubectl apply -f -
    
    # kube-lego
    curl https://raw.githubusercontent.com/jetstack/kube-lego/master/examples/nginx/lego/00-namespace.yaml \
      | kubectl apply -f -
    
    꼭 필요한 것은 아니지만 공식 명칭을 기준으로 한다.

    nginx-ingress 설정

    helm install stable/nginx-ingress \
      --name nginx-ingress \
      --namespace ingress-nginx \
      --set controller.replicaCount=2
    
    replicaCount는 임의의 것이다.

    nginx-ingress-inhouse 설정

    helm install stable/nginx-ingress \
      --name nginx-ingress-inhouse \
      --namespace ingress-nginx \
      --set controller.ingressClass=nginx-inhouse \
      --set controller.replicaCount=2
    
    ingressClass를 기본 nginx 별칭으로 지정합니다.

    kube-lego 설정

    helm install stable/kube-lego \
      --name kube-lego \
      --namespace kube-lego \
      --set image.tag=master-3418 \
      --set config.LEGO_LOG_LEVEL=debug \
      --set [email protected] \
      --set config.LEGO_URL=https://acme-v01.api.letsencrypt.org/directory
    
    LEGO_LOG_LEVEL는 임의의 것이다.LEGO_EMAIL 자신의 것으로 변경해야 한다.LEGO_URL 우선 지정하지 않은 상황에서 설정(staging용api가 됨)을 검증한 다음에 생산용api에서 구축한다.image.tag=master-3418 후술.

    kube-legoin house 설정

    helm install stable/kube-lego \
      --name kube-lego-inhouse \
      --namespace kube-lego \
      --set nameOverride=kube-lego-inhouse \
      --set image.tag=master-3418 \
      --set config.LEGO_LOG_LEVEL=debug \
      --set [email protected] \
      --set config.LEGO_URL=https://acme-v01.api.letsencrypt.org/directory \
      --set config.LEGO_SUPPORTED_INGRESS_CLASS=nginx-inhouse \
      --set config.LEGO_DEFAULT_INGRESS_CLASS=nginx-inhouse \
      --set config.LEGO_DEFAULT_INGRESS_PROVIDER=nginx \
      --set config.LEGO_SECRET_NAME=kube-lego-inhouse-account \
      --set config.LEGO_SERVICE_NAME_NGINX=kube-lego-inhouse-nginx \
      --set config.LEGO_INGRESS_NAME_NGINX=kube-lego-inhouse-nginx
      --set config.LEGO_SERVICE_SELECTOR=kube-lego-inhouse \
    
    LEGO_SUPPORTED_INGRESS_CLASS에서 nginx-inhouseingressclass를 대상으로 변경합니다.LEGO_DEFAULT_INGRESS_CLASS,LEGO_DEFAULT_INGRESS_PROVIDERkube-lego가 ACME에 도전하는 경로로 생성된ingress의kubernetes.io/ingress.class,kubernetes.io/ingress.providerannotation의 값입니다.LEGO_SECRET_NAME,LEGO_SERVICE_NAME_NGINX,LEGO_INGRESS_NAME_NGINX는kube-lego가 생성한 자원의 이름이 주 시스템과 중복되지 않도록 설정한 것이다.LEGO_SERVICE_SELECTOR도 주 시스템과 분리하여 설정한다.
    고전에 빠진 것은 이 중 LEGO_DEFAULT_INGRESS_PROVIDER 등 항목은helm 기본 참조인jetstack/kube-lego:0.1.5 이미지에서 대응하지 못했다는 것이다.
    최신 버전의 이미지를 사용하려면 참조https://hub.docker.com/r/jetstack/kube-lego/tags/를 사용하여 최신 image.tag=master-3418(2018/02/08 시점)을 지정합니다.

    nginx-ingress 시스템에 ingress 추가


    예제
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: web-nginx
      namespace: default
      annotations:
        kubernetes.io/ingress.class: nginx
        kubernetes.io/tls-acme: "true"
    spec:
      rules:
      - host: example.com
        http:
          paths:
          - path: /
            backend:
              serviceName: web
              servicePort: 80
      tls:
      - hosts:
        - example.com
        secretName: web-tls
    
    name, namespace, serviceName, servicePort, secretName, example.com 등 적당한 이름을 지었다.kubernetes.io/ingress.class 변경이 필요합니다.nginxnginx-ingress이므로 주 시스템kube-lego, kubernetes.io/ingress.class이 포착되고 처리됩니다.

    nginx-ingress-inhouse 시스템에 ingress 추가


    예제
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: admin-nginx-inhouse
      namespace: default
      annotations:
        kubernetes.io/ingress.class: nginx-inhouse
        kubernetes.io/ingress.provider: nginx
        kubernetes.io/tls-acme: "true"
    spec:
      rules:
      - host: admin.example.com
        http:
          paths:
          - path: /
            backend:
              serviceName: admin-service
              servicePort: 80
      tls:
      - hosts:
        - admin.example.com
        secretName: admin-tls
    
    nginx-inhousenginx-ingress-inhouse,kube-lego-inhouse에 잡혔다.
    삽입된 것을 지정하지 않으면 kubernetes.io/ingress.provider: nginx ingress입니다.class도provider 이름으로 응용되었고, 결과는kube-lego의nginxprovider 처리의 영향을 받지 않습니다
    disable provider no TLS hosts found
    
    쿠베레고는 동작이 없습니다.
    (소스 코드의 경우 이 일대 입니다.provider 이름의 지점에 들어가지 않음)

    끝내다

    annotation.kubernetes.io/ingress.provider열쇠입니다.
    그리고 이것은 latest 이미지가 지원하지 않는 함정입니다.
    그리고 어쨌든 DEPRECATED의 슬픔입니다.
    다음은cert-manager를 조사합니다.

    좋은 웹페이지 즐겨찾기