ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [kubernetes] Ingress-nginx --enable-ssl-passthrough 옵션 적용해보기 (with argocd)
    kubernetes 2023. 12. 21. 17:40
    반응형

    kubernetes 에서 운영을 하다보면 가끔 필요한 기능이 있다. ssl 을 직접 구현하고 있는 백엔드 서비스에 ingress-nginx 로 https 요청을 바이패스만 해 주고 싶은 기능이 그것이다.

    예를 들어 아래와 같은 상황에서 필요한 기능이다.

    ingress-nginx 은 https 요청에 바이패스만 수행

    Ingress 는 https 요청이 들어왔을 때, ssl 처리를 하지 않고 요청을 그대로 백엔드 서비스로 바이패스하는 상황이다.

    성능을 일부 희생해도 된다면 ingress-nginx 옵션만 추가하면 바로 구현할 수 있다.

    nginx.ingress.kubernetes.io/ssl-passthrough: "true"

    다만, 이 옵션은 default 값으로 비활성화 되어 있기 때문에 ingress 옵션을 수정해야 한다.

     

    이 글에선, ssl 을 직접 구현하는 argocd 서비스를 대상으로 Ingress-nginx 의 ssl-passthrough 옵션을 적용해 본다.


    환경

    • nhncloud 환경
    • kubernetes: v1.27.3
    • ingress-nginx: v1.8.2
    • argocd: v2.9.3

    Ingress-nginx 설치 및 옵션 적용

    Ingress-nginx 로 Ingress controller 로 사용하려고 한다. 설치 관련 링크: https://kubernetes.github.io/ingress-nginx/deploy/

     

    Installation Guide - Ingress-Nginx Controller

    Installation Guide There are multiple ways to install the Ingress-Nginx Controller: with Helm, using the project repository chart; with kubectl apply, using YAML manifests; with specific addons (e.g. for minikube or MicroK8s). On most Kubernetes clusters,

    kubernetes.github.io

    kubectl 로 설치를 한다. 가이드에 따라 아래와 같이 수행한다.

    $ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.2/deploy/static/provider/cloud/deploy.yaml
    namespace/ingress-nginx created
    serviceaccount/ingress-nginx created
    serviceaccount/ingress-nginx-admission created
    role.rbac.authorization.k8s.io/ingress-nginx created
    role.rbac.authorization.k8s.io/ingress-nginx-admission created
       (...)

     

    설치되었다.


    Ingress-nginx 설정

    다만 현재 시점에서는

    nginx.ingress.kubernetes.io/ssl-passthrough: "true"

    옵션을 바로 적용할 수 없다.

     

    이 때는, ingress-controller 의 옵션을 변경하면 된다. 옵션 목록: https://kubernetes.github.io/ingress-nginx/user-guide/cli-arguments/

     

    Command line arguments - Ingress-Nginx Controller

    Command line arguments The following command line arguments are accepted by the Ingress controller executable. They are set in the container spec of the ingress-nginx-controller Deployment manifest Argument Description --annotations-prefix Prefix of the In

    kubernetes.github.io

    여기서 

    --enable-ssl-passthrough=true

    를 적용하면 된다. 관련 설명: 링크

     

    현재 옵션을 확인해 본다. spec.template.spec.containers 를 확인해 본다.

    $ kubectl get deployment/ingress-nginx-controller -n ingress-nginx -o yaml
       (...)
    spec:
       (...)
      template:
       (...)
        spec:
          containers:
          - args:
            - /nginx-ingress-controller
            - --publish-service=$(POD_NAMESPACE)/ingress-nginx-controller
            - --election-id=ingress-nginx-leader
            - --controller-class=k8s.io/ingress-nginx
            - --ingress-class=nginx
            - --configmap=$(POD_NAMESPACE)/ingress-nginx-controller
            - --validating-webhook=:8443
            - --validating-webhook-certificate=/usr/local/certificates/cert
            - --validating-webhook-key=/usr/local/certificates/key
       (...)

     

    여기에 edit 명령어를 통해 옵션을 적용한다.

    $ kubectl edit deployment/ingress-nginx-controller -n ingress-nginx

     

    spec.template.spec.containers 의 args 에 옵션을 추가한다.

    확인해본다.

    $ kubectl get deployment/ingress-nginx-controller -n ingress-nginx -o yaml
       (...)
    spec:
       (...)
      template:
       (...)
        spec:
          containers:
          - args:
            - /nginx-ingress-controller
            - --publish-service=$(POD_NAMESPACE)/ingress-nginx-controller
            - --election-id=ingress-nginx-leader
            - --controller-class=k8s.io/ingress-nginx
            - --ingress-class=nginx
            - --configmap=$(POD_NAMESPACE)/ingress-nginx-controller
            - --validating-webhook=:8443
            - --validating-webhook-certificate=/usr/local/certificates/cert
            - --validating-webhook-key=/usr/local/certificates/key
            - --enable-ssl-passthrough=true
       (...)

     

    enable-ssl-passthrough 옵션이 추가되었다.


    argocd 설치

    argocd 는 gitOps 를 구현하기 위해 사용되는 툴이다. 다만 이 글은 argocd 에 대한 것이 아니라 자세한 설명은 생략한다.

    argocd 를 설치하면 기본적으로 자체 ssl 인증서를 통해 ssl 을 지원한다. 그래서 테스트로 좋을 것 같아서 선택하였다.

     

    argocd 및 설치 방법에 대한 것은 공식홈페이지에 자세히 나와있다: https://argo-cd.readthedocs.io/en/stable/getting_started/

     

    공식홈페이지에서 소개하는 방법으로 설치하겠다.

     

    먼저 argocd 를 위한 네임스페이스를 만든다.

    $ kubectl create namespace argocd

     

    그리고 최신 stable 버전(현시점 v2.9.3)으로 설치를 한다.

    $ kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
    customresourcedefinition.apiextensions.k8s.io/applications.argoproj.io created
    customresourcedefinition.apiextensions.k8s.io/applicationsets.argoproj.io created
    customresourcedefinition.apiextensions.k8s.io/appprojects.argoproj.io created
    serviceaccount/argocd-application-controller created
    serviceaccount/argocd-applicationset-controller created
       (...)

     

    설치가 되었다.

    이 글에서는 다른 것은 중요하지 않고 서버에 접근하는 것만 확인하려고 하니 연결된 서비스를 확인해 본다.

    $ kubectl get service/argocd-server -n argocd -o wide
    NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE   SELECTOR
    argocd-server   ClusterIP   10.254.56.106   <none>        80/TCP,443/TCP   33m   app.kubernetes.io/name=argocd-server

     

    해당 서비스를 통해 argocd 서버에 접근 할 수 있다. 설치 시 ClusterIp 타입으로 설정되어 있다. 이를 LoadBalancer 나 NodePort 로 변환하면 외부에서 접근이 가능한데, 이 글에서는 Ingress 로 접근할 것이기 때문에 여기서는 그냥 ClusterIp 타입으로 둔다.


    Ingress 설정

    argocd-server 서비스로 연결할 Ingress 를 만들어 본다. 이 때, ssl-passthrough 옵션을 준다.

    # argocd-ingress.yaml
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: argocd-server-ingress
      namespace: argocd
      annotations:
        nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
        nginx.ingress.kubernetes.io/ssl-passthrough: "true"
    spec:
      ingressClassName: nginx
      rules:
        - host: argocd.crudewebtools.com
          http:
            paths:
              - path: /
                pathType: Prefix
                backend:
                  service:
                    name: argocd-server
                    port:
                      name: https

     

    • namespace: argocd-server 가 argocd 네임스페이스에 존재하기 때문에 통일하였다.
    • nginx.ingress.kubernetes.io/force-ssl-redirect: http 요청이 온다면 https 로 리다이렉트 하라는 응답을 전달한다. (308 Permanent Redirect)
    • nginx.ingress.kubernetes.io/ssl-passthrough: 위에서 설명했듯이, https 요청을 그대로 백엔드 서비스에 전달한다.
    • host 는 필자가 테스트를 위해 임시로 설정한 값이다.

    Ingress 적용

    $ kubectl apply -f argocd-ingress.yaml

     

    확인

    $ kubectl get ingress
    NAME                    CLASS   HOSTS                      ADDRESS          PORTS   AGE
    argocd-server-ingress   nginx   argocd.crudewebtools.com   10.10.10.10      80      38m

     

    ADDRESS 는 임시 값이다.

    이제 접근해 본다. 브라우저로 접근이 잘 된다.

    브라우저 접근. 리다이렉트 되었음.
    curl 로 접근

    잘 된다.

     

    참고 사항

    한편 문서에 따르면 ssl-passthrough 옵션 적용시 다른 어노테이션 옵션을 무시한다고 하며, 성능상 단점이 있다고 하니 유의한다.

    https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#ssl-passthrough
    https://kubernetes.github.io/ingress-nginx/user-guide/tls/#ssl-passthrough

     

    반응형

    'kubernetes' 카테고리의 다른 글

    kubeadm 으로 local kubernetes 환경 구축  (0) 2021.09.08

    댓글

Designed by Tistory.