GKE에서 HTTP(S) LB를 활용하여 Ingress 구성 하기

멀티클라우드와 관련하여 여러가지를 해보고 있습니다. 이번에는 GKE(Google Kubernetes Engine)에서 단순하게 LB를 구성하는 것이 아니라, HTTP(S) LB를 사용하는 Ingress를 구성을 해보고자 합니다. 이번 구성에는 CDN을 함께 구성하지 않는 방식을 사용합니다.

FrontendConfig 구성

FrontendConfig를 구성하는 것은 HTTP to HTTPS redirect를 설정하기 위함입니다. responseCodeNmae에 어떤 항목을 기재하는냐에 따라 WebBrowser에서 받아들이는 http code값이 달라집니다.

RESPONSE_CODEDESC.기타
MOVED_PERMANENTLY_DEFAULT301default value
FOUND302
SEE_OTHER303
TEMPORARY_REDIRECT307
PERMANENT_REDIRECT308

위의 표를 참고하여 아래 yaml을 수정하고 적용합니다. 또한, SSL 통신시 사용할 TLS 버전 등에 있어서는 GCP Console에서 SSL 정책을 생성하고, sslPolicy에 해당 이름을 입력함으로써 적용할수 있습니다.

apiVersion: networking.gke.io/v1beta1
kind: FrontendConfig
metadata:
  name: ysyukr-frontendconfig
spec:
  sslPolicy: ysyukr-ssl-policy
  redirectToHttps:
    enabled: true
    responseCodeName: MOVED_PERMANENTLY_DEFAULT

BackendConfig 구성

BackendConfig를 구성하는 것은, Ingress에서 사용할 hearth probe를 구성한다고 보면 됩니다. 여기에는 크게 어렵지 않습니다.

apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
  name: ysyukr-backendconfig
spec:
  healthCheck:
    checkIntervalSec: 5 # probe의 interval
    timeoutSec: 5 # probe의 timeout
    healthyThreshold: 2 # 상태확인시 몇회 이상 정상이 되어야 하는지
    unhealthyThreshold: 5 # 상태확인시 몇회 이상 비정상이 되어야 하는지
    type: HTTP # HTTP, HTTPS, HTTP/2 중에서 선택
    requestPath: /status # url path 미설정시 / 이 기본값
    port: 8001 # 커스텀 포트일경우 설정, 미설정시 80 포트가 기본값

Service 구성

POD에 연결할 Service를 구성합니다. Ingress 구성에는 NodePort 또는 ClusterIP로 구성된 Service만 사용할수 있습니다.

apiVersion: v1
kind: Service
metadata:
  annotations:
    cloud.google.com/backend-config: '{"default": "ysyukr-backendconfig"}'
  name: external-svc
  namespace: default
spec:
  type: NodePort # 또는 ClusterIP
  ports:
  - name: proxy
    port: 80
    protocol: TCP
    targetPort: 8000
  - name: ssl
    port: 443
    protocol: TCP
    targetPort: 8443
  selector:
    app: external-proxy

Google ACME 구성

L7사용시 도메인에 대한 SSL 인증서를 구성할수 있습니다. 구성에 있어서는 도메인 자동인증으로 되는 것을 사용합니다.

apiVersion: networking.gke.io/v1
kind: ManagedCertificate
metadata:
  name: gcp-managed-acme-cert
spec:
  domains:
    - gcp.ysyu.kr

Ingress 구성

앞선 4개의 설정파일 구성 및 배포가 완료되었다면 아래의 구성을 참고하여 수정 및 배포합니다.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.allow-http: "false" # http port 노출할 것인지 결정합니다. 미설정시 true가 기본값입니다.
    kubernetes.io/ingress.class: gce
    kubernetes.io/ingress.global-static-ip-name: ysyukr-external-pip # 고정 IP 사용시 리전 귀속 IP가 아닌, 전역 IP만 연결이 가능합니다.
    networking.gke.io/managed-certificates: gcp-managed-acme-cert
    networking.gke.io/v1beta1.FrontendConfig: ysyukr-frontendconfig
  name: external-svc-l7
  namespace: default
spec:
   defaultBackend:
     service:
       name: external-svc
       port:
         number: 80

구성확인

구성 확인은 본인에게 편안한 도구를 사용하여 테스트합니다. 다만, ACME 인증에 있어서는 LB에 연결한 IP에 도메인을 연결하고, 이것이 GCP 내부에서 확인이되어야 합니다. 확인 이후에 ACME 인증서가 발행되고, 적용되는데 약 1시간여 소요되기 때문에 이를 참고하여 구성 후 테스트를 진행합니다.