클라우드/GCP 자원 테라폼으로 관리해보기

(17) GCP GKE Ingress에 SSL 인증서 적용

Fanic 2024. 7. 5. 02:38
반응형

 

(16)에서 생성한 SSL 인증서를 이용하여 GKE Ingress에 SSL 적용 방법에 대해 설명하려고 한다.

 

먼저 SSL 인증서를 GKE Secret으로 만들어야 인그레스 컨트롤러에서 사용이 가능하다.

 

추후에 설명할 ELK 사설 인증서 적용과정에서도 동일한 인증서 시크릿을 사용하게 된다.

 

먼저 ssl 인증서를 참조할 ssl 폴더 생성 후 인증서 파일을 넣어준 후 시크릿 파일에서 사용할 수 있도록 인증서 타입을 편집을 통해 변경해주었다.

 

#인증서 타입 변경
cert.pem -> tls-cert.crt
chain.pem -> ca.crt
privkey.pem -> newkey.key

 

SSL 인증서 쿠버네티스 시크릿 등록을 kubectl 명령어로 하게된다면 아래 형식으로 할 수 있다.
kubectl create secret generic elastic-certificates -n default --from-file=tls.key=newkey.key --from-file=tls.crt=tls-cert.crt --from-file=ca.crt=ca.crt

 

나는 시크릿 생성도 테라폼을 통해 secret-kube.tf 파일 생성 후 네임스페이스 별로 하나씩 시크릿을 생성해주었다.

resource "kubernetes_secret" "default_elastic_certificates" {
  metadata {
    name = "elastic-certificates"
    namespace = "default"
  }

  data = {
    "tls.key" = file("../ssl/newkey.key")
    "tls.crt" = file("../ssl/tls-cert.crt")
    "ca.crt"  = file("../ssl/ca.crt")
  }

  type = "Opaque"
}

resource "kubernetes_secret" "ingress_elastic_certificates" {
  metadata {
    name = "elastic-certificates"
    namespace = "ingress-nginx"
  }

  data = {
    "tls.key" = file("../ssl/newkey.key")
    "tls.crt" = file("../ssl/tls-cert.crt")
    "ca.crt"  = file("../ssl/ca.crt")
  }

  type = "Opaque"
}

 

생성된 시크릿 정보

 

 

이제 이 인증서를 인그레스 생성 테라폼 코드에 추가해주는 작업을 통해 인증서 적용을 할 수 있다.

 

resource "kubernetes_ingress_v1" "jenkins_ingress-ssl" {
  metadata {
    name = "jenkins-ingress"
    annotations = {
      "kubernetes.io/ingress.class" = "nginx"
      "nginx.ingress.kubernetes.io/rewrite-target" = "/"
    }
  }

  spec {
    tls {
      hosts      = ["jenkins.hrc0303.store", "sonarqube.hrc0303.store"]
      secret_name = "elastic-certificates"
    }
    rule {
      host = "jenkins.hrc0303.store"
      http {
        path {
          backend {
            service {
              name = "jenkins"
              port {
                number = 8080
              }
            }
          }
          path_type = "Prefix"
          path = "/"
        }
      }

    }
  }
}


resource "kubernetes_ingress_v1" "sonarqube_ingress-ssl" {
  metadata {
    name = "sonarqube-ingress"
    annotations = {
      "kubernetes.io/ingress.class" = "nginx"
      "nginx.ingress.kubernetes.io/rewrite-target" = "/"
    }
  }

  spec {
    tls {
      hosts      = ["sonarqube.hrc0303.store"]
      secret_name = "elastic-certificates"
    }
    rule {
      host = "sonarqube.hrc0303.store"
      http {
        path {
          backend {
            service {
              name = "sonarqube"
              port {
                number = 80
              }
            }
          }
          path_type = "Prefix"
          path = "/"
        }
      }

    }
  }
}

 

기존에 Jenkins, Sonarqube 서비스를 Pod로 기동하는 작업을 했었는데 그때 사용한 서비스들로 도메인에 대한 인그레스 생성 후 spec의 tls 부분에 생성한 시크릿 네임을 넣어주면 해당 도메인에 대한 인증서 적용이 되게 된다.

 

적용 된 화면

 

1. Sonarqube

 

2. Jenkins 

반응형