Kubernetes

[ Kans 3 Study - 6w ] 4. HTTPS 처리(TLS 종료)

su''@ 2024. 10. 13. 00:09
CloudNetaStudy - Kubernets Networtk 3기 실습 스터디 게시글입니다.

 

HTTPS 처리 (TLS 종료) -링크
  • svc-pod.yaml
    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-https
      labels:
        app: https
    spec:
      containers:
      - name: container
        image: k8s.gcr.io/echoserver:1.6
      terminationGracePeriodSeconds: 0
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: svc-https
    spec:
      selector:
        app: https
      ports:
      - port: 8080
  • ssl-termination-ingress.yaml
    출처 : https://kschoi728.tistory.com/266
    cat <<EOT> ssl-termination-ingress.yaml
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: https
    spec:
      ingressClassName: nginx
      tls:
      - hosts:
        - kans.com
        secretName: secret-https
      rules:
      - host: kans.com
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: svc-https
                port:
                  number: 8080
    EOT
  • 생성 확인 및 secret 생성 후 접속 확인
    # 서비스와 파드 생성
    curl -s -O https://raw.githubusercontent.com/gasida/NDKS/main/7/svc-pod.yaml
    kubectl apply -f svc-pod.yaml
    
    # 도메인 변경
    MYDOMAIN1=<각자 자신의 닉네임의 도메인> 예시) gasida.com
    MYDOMAIN1=kans.com
    echo $MYDOMAIN1
    sed -i "s/kans.com/$MYDOMAIN1/g" ssl-termination-ingress.yaml
    
    # 인그레스 생성
    kubectl apply -f ssl-termination-ingress.yaml
    
    # 인증서 생성
    # openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=dkos.com/O=dkos.com"mkdir key && cd key
    MYDOMAIN1=kans.com
    openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=$MYDOMAIN1/O=$MYDOMAIN1"
    tree
    
    # Secret 생성
    kubectl create secret tls secret-https --key tls.key --cert tls.crt
    
    # Secret 확인 
    kubectl get secrets secret-https
    kubectl get secrets secret-https -o yaml
    
    -------------------
    # 자신의 PC 에서 접속 확인 : PC 웹브라우저
    # 접속 확인 : -k 는 https 접속 시 : 접속 포트 정보 확인
    curl -Lk https://$MYDOMAIN1:30443
    
    ## (옵션) /etc/hosts 파일 변경 없이 접속 방안
    curl -Lk -H "host: $MYDOMAIN1" https://$MYDOMAIN1:30443
  • Nginx SSL Termination 패킷 확인 : 중간 172.16.29.11 이 nginx controller
    # 패킷 캡처 명령어 참고
    export IngHttp=$(kubectl get service -n ingress-nginx ingress-nginx-controller -o jsonpath='{.spec.ports[0].nodePort}')
    export IngHttps=$(kubectl get service -n ingress-nginx ingress-nginx-controller -o jsonpath='{.spec.ports[1].nodePort}')
    tcpdump -i <nginx 파드 veth> -nnq tcp port 80 or tcp port 443 or tcp port 8080 or tcp port $IngHttp or tcp port $IngHttps
    tcpdump -i <nginx 파드 veth> -nn  tcp port 80 or tcp port 443 or tcp port 8080 or tcp port $IngHttp or tcp port $IngHttps -w /tmp/ingress.pcap
  • 오브젝트 삭제 kubectl delete pod,svc,ingress --all
  • Nginx 인그레스 컨트롤러 삭제 helm uninstall -n ingress ingress-nginx

 

(옵션) HTTP → HTTPS Redirect 설정 - 링크
  • 설정 및 확인
    # nginx 서비스 편집 : 아래 내용 추가
    kubectl edit svc -n ingress-nginx ingress-nginx-controller
    ---
      annotaion
        nginx.ingress.kubernetes.io/ssl-redirect: 'true'
    ---