-
[kubernetes] Ingress-nginx --enable-ssl-passthrough 옵션 적용해보기 (with argocd)kubernetes 2023. 12. 21. 17:40반응형
kubernetes 에서 운영을 하다보면 가끔 필요한 기능이 있다. ssl 을 직접 구현하고 있는 백엔드 서비스에 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/
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/
여기서
--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 는 임시 값이다.
이제 접근해 본다. 브라우저로 접근이 잘 된다.
잘 된다.
참고 사항
한편 문서에 따르면 ssl-passthrough 옵션 적용시 다른 어노테이션 옵션을 무시한다고 하며, 성능상 단점이 있다고 하니 유의한다.
반응형'kubernetes' 카테고리의 다른 글
kubeadm 으로 local kubernetes 환경 구축 (0) 2021.09.08