์ ๋ง ์ค๋๋ง์ ๋ธ๋ก๊ทธ ๊ธ์ ์์ฑํ๊ฒ ๋์๋ค.
์ฌํด๋ ํ์ฌ ์ผ์ด ์ ๋ง ๋ฐ๋นด๊ธฐ ๋๋ฌธ์ด์๋ค.. ์ฌ์ค ์ง๊ธ๋ ์ฌ์ ๋กญ์ง ์์๋ฐ ๊ทธ๋๋ ๋ญ๋ผ๋ ์์ฑํด์ผ๊ฒ ๋ค ์ถ์ด์ ๋ช์ ์ ์ด๋ณด๋ ค๊ณ ํ๋ค!
์ด๋ฒ์๋ GKE ์์ Ingress API ๊ธฐ๋ฐ์ผ๋ก ์์ฑํ L7 LB ์ Wildcard Google Managed Certification ์ ์ฌ์ฉํ ์ ์๋์ง์ ๋ํด ์์๋ณด๋ ค๊ณ ํ๋ค.
๋ฐ๋ก ๋ณธ๋ก ์ผ๋ก ๋ค์ด๊ฐ๋ณด์!
GKE Ingress API ๋ฌธ์๋ฅผ ์ดํด๋ณด๋ฉด HTTP(S) LB ์๋ Wildcard Google Manged SSL Cert ๋ ์ฌ์ฉํ ์ ์๋ค๊ณ ํ๋ค.
๊ทธ๋ฐ๋ฐ ๊ฒฐ๋ก ๋ถํฐ ๋งํ๋ฉด ๊ฐ๋ฅํ๋ค!

์ ๋ฌธ์ฅ์ด ๊ต์ฅํ ์ ๋งค๋ชจํธํ๋ค. ์๋ง ๋๋ถ๋ถ์ ์ฌ๋๋ค์ ์ ๋ฌธ์ฅ์ ๋ดค์๋ ๋จ์ํ L7 LB ์ ์์ผ๋์นด๋ ๋๋ฉ์ธ ์ธ์ฆ์๋ฅผ ์ฌ์ฉํ์ง ๋ชปํ ๊ฑฐ๋ผ๊ณ ์๊ฐํ ๊ฒ์ด๋ค.
"์ํ Ingress ๋ก ์์ฑํ๋ L7 LB ์๋ *.example.com ๊ฐ์ ๋๋ฉ์ธ์ ์ฌ์ฉํ ์ ์๋๋ณด๊ตฌ๋?"
์ ๋ง์ด ์์ ํ๋ฆฐ ๋ง์ ์๋๋ค. ์ง๊ธ๋ถํฐ ์ด๋ค ์ ์ด ํ๋ฆฌ๊ณ ์ด๋ค ์ ์ด ๋ง์๋์ง ํ๋ฒ ์ดํด๋ณด๋๋ก ํ์!
์ฐ์ GCP Certificate Manager ๋ถํฐ ์ดํด๋ณด์!
GCP Certificate Manager ์๋ ํฌ๊ฒ 3๊ฐ์ง ์ข ๋ฅ์ Certificate ๊ฐ ์๋๋ฐ, Certificates / Certificate Maps / Classic Certificates ์ด๋ค.

์ ์ AWS Certificate Manager ๋ฅผ ์ดํด๋ณด๋ฉด, ๊ทธ๋ฅ Certificate ํ๋๋ง ์กด์ฌํ๋ค. Certificate Maps, Classic Certificates ์ด๋ฐ๊ฒ ์๋ค. ๊ทธ๋์ ๊ทธ์ AWS L7 LB ์ ์ธ์ฆ์๋ง ๊ฐ์ ธ๋ค ๋ถ์ฌ๋ฒ๋ฆฌ๋ฉด ์์ผ๋์นด๋ ์ธ์ฆ์๋ ์์ฃผ ์ ๋์ํ๋ค.

AWS ๋ฅผ ์ฐ๋ค๊ฐ GCP ๋ฅผ ๋์ด๊ฐ๋ ์ ์ฅ์์ ์ด ๋ถ๋ถ์ด ์ฒซ๋ฒ์งธ ํผ๋ ํฌ์ธํธ์๋ค.
๊ทธ๋์ Certificates ์ Classic Certificates ๋ ๋ฌด์จ ์ฐจ์ด์ผ? ๋ต์ ์๋์ ๊ฐ๋ค.

๋จ์ํ ๋ถํ ๋ถ์ฐ๊ธฐ ์น์ธ์ด๋ DNS ์น์ธ์ด๋์ ์ฐจ์ด๋ค. ์์ธํ ์ฐจ์ด๋ ๋ฌธ์๋ฅผ ์ดํด๋ณด๊ธฐ ๋ฐ๋๋ค.
๊ทธ๋ฆฌ๊ณ AWS Certificate Manager ์ญ์ DNS ์น์ธ ๋ฐฉ์์ ์ฑํํ๊ณ ์๋ค.

์ฆ, Certificates ๋ DNS ์น์ธ ๋ฐฉ์์ผ๋ก ์์ฑํ ์ธ์ฆ์๊ฐ, Classic Certificates ๋ ๋ถํ ๋ถ์ฐ๊ธฐ ์น์ธ์ผ๋ก ์์ฑํ ์ธ์ฆ์๊ฐ ์กด์ฌํ๊ฒ ๋๋ค.
์ฐธ๊ณ ๋ก GCP ์์๋ Classic Ceritificates ๋ฐฉ์์ ๋ ์ด์ ๊ถ์ฅํ์ง ์๋๋ค.
ํํธ ๊ตฌ๊ธ ๋ฌธ์๋ฅผ ๋ณด๋ฉด Google Manged Cert ๋ฅผ ์ด์ฉํด์ Ingress ๊ธฐ๋ฐ GKE L7 LB ๋ฅผ ์์ฑํ๋ ค๋ฉด ManagedCertificate API ๋ฅผ ์์ฑํด์ค์ผ ํ๋ค.
apiVersion: networking.gke.io/v1
kind: ManagedCertificate
metadata:
name: example
spec:
domains:
- test.example.com
์์ฑํ๊ฒ ๋๋ฉด ์๋์ ๊ฐ์ด Classic certificates ์ "test.example.com" ๋๋ฉ์ธ์ ๋ํ ์ธ์ฆ์๊ฐ ์์ฑ๋๋ค.

๊ทธ๋ฆฌ๊ณ ์์ฑํ ManagedCertificate API ๋ฅผ Ingress Annotation ์ ๋ช ์ํ๊ฒ ๋๋ฉด ์์์ ์๋์ ๊ฐ์ด L7 LB ์ Certificate ๊ฐ ๋ฐ์ธ๋ฉ๋๋ค.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: managed-cert-ingress
annotations:
networking.gke.io/managed-certificates: "example" #-- ManagedCeritifacte API Name ๊ณผ ์ผ์น
kubernetes.io/ingress.class: "gce"
spec:
rules:
- host: "test.example.com"
http:
paths:
- pathType: ImplementationSpecific
backend:
service:
name: mc-service
port:
number: 8080
Certificate ์ ๋์์๋ "mcrt-714cb..." ๊ฐ ManagedCertificate API ๋ก ๋ง๋ ์ธ์ฆ์์ด๋ค.

curl ๋ช ๋ น์ด๋ฅผ ๋ ๋ ค๋ณด๋ฉด ์ค์ ๋ก ์ธ์ฆ์๊ฐ ์ ๋๋ก ๋์ํ๋ค.

์ฌ์ค ์ง๊ธ๊น์ง๋ง ๋ดค์๋ ์์ผ๋์นด๋๋ฅผ ์ฌ์ฉํ์ง ์์๊ธฐ ๋๋ฌธ์ ๊ตฌ๊ธ ๋ฌธ์์ ๋ง์ ์ ํ ํ๋ฆฐ ๊ฒ์ด ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ธ๋ค.
๊ทธ๋ผ ์ด์ ์์ผ๋์นด๋ ์ธ์ฆ์๋ฅผ ์์ฑํ ํ์ Ingress API ๊ธฐ๋ฐ์ผ๋ก ์์ฑํ L7 LB ์ ๋ถ์ฌ๋ณด๊ฒ ๋ค.
ManagedCertificate API ๋ฅผ ํตํด ์ธ์ฆ์๋ฅผ ์์ฑํ๊ณ Ingress Annotation ์ ๋ช ์ํด L7 LB ๋ฅผ ๋ถ์๋ ๋ฐฉ๋ฒ๊ณผ ๋ฌ๋ฆฌ ์ด๊ฑด ์ด์ง ์ผ๋งค? ๋ฐฉ๋ฒ์ด๋ค.
์ฐ์ ์ฟ ๋ฒ๋คํฐ์ค API ๋ฅผ ํตํด ๋ฐ์ธ๋ฉํ ์ ์๋ค. gcloud API ๋ก๋ง ๊ฐ๋ฅํ๋ค.
gcloud API ๋ก Classic Certificates ๊ฐ ์๋ ์ผ๋ฐ Certificates ์ Certificate Maps ๋ฅผ ์์ฑํด๋ณด์!
๋จผ์ certificates ์ ๋ํ ์์ ๊ถ์ ์ธ์ฆํด์ผ ํ๊ธฐ ๋๋ฌธ์ dns-authorization ๋ฅผ ์์ฑํด์ฃผ๊ณ , ๋ฐ๋ก certificate ๋ฅผ ์์ฑํด์ค๋ค.
gcloud certificate-manager dns-authorizations create example \
--domain="test.example.com"
gcloud certificate-manager certificates create example \
--domains="*.example.com,test.example.com" \
--dns-authorizations=example
์ดํ Certificate Maps ๋ฅผ ์์ฑํ๊ณ , ์ง์ ์ ๋ง๋ Certificate ๋ฅผ Certificate Maps ์ ๋ฐ์ธ๋ฉํด์ฃผ์!
gcloud certificate-manager maps create exmaple
gcloud certificate-manager maps entries create exmaple \
--location="global"
--map="exmaple" \
--certificates="exmaple" \
--hostname="*.example.com."
๊ทธ๋ผ ์ต์ข ์ ์ผ๋ก ์๋์ ๊ฐ์ด Certificate Maps ๊ฐ ์์ฑ๋๋ค.

์ดํ ์๋ gcloud ๋ช ๋ น์ ํตํด ์์ฑํ Certificate Map ์ LB Frontend ์ ๋ฐ์ธ๋ฉํด์ฃผ์!
gcloud compute target-https-proxies update k8s1-af2bed6e-default-mc-service-8080-078bc7b5 \
--certificate-map="example"
๊ทธ๋ผ ์๋์ ๊ฐ์ด Certificate ์๋ ์ทจ์์ ์ด ๊ทธ์ด์ ธ ์๊ณ , Certificate Map ์ด ๋ฐ์ธ๋ฉ ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค!

์ดํ curl ๋ช ๋ น์ด๋ก ํ์ธํด๋ณด๋ฉด ์ ์์ ์ผ๋ก SSL ๋ฅผ ์ฌ์ฉํ๋ค!
์ด์ฐ๋๋ Ingress API ๊ธฐ๋ฐ์ผ๋ก ์์ฑํ L7 LB ์๋ ์์ผ๋ ์นด๋ ์ธ์ฆ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ ์ฆ๋ช ํด๋ณด์๋ค!
๊ทธ๋ผ ๋ค์ ํ๋ฒ ๊ตฌ๊ธ ๋ฌธ์๋ฅผ ์ดํด๋ณด์!

"๊ด๋ฆฌํ ์ธ์ฆ์๋ ์์ผ๋ ์นด๋ ๋๋ฉ์ธ์ ์ง์ํ์ง ์์ต๋๋ค" ๋ผ๋ ๋ฌธ์ฅ์ ์๋์ ๊ฐ์ด ํด์ํ ์ ์์ ๊ฒ ๊ฐ๋ค.
"ManagedCertificate API ๋ฅผ ํตํด ์์ผ๋์นด๋ ๊ธฐ๋ฐ์ ๋๋ฉ์ธ์ ์ฌ์ฉํ ์ ์๋ค"
์ค์ ๋ก ์๋์ ๊ฐ์ด *.example.com ์ผ๋ก ์์ฑํ๋ ค๊ณ ํ๋ฉด 'spec.domains[0] in body should match '^(([a-z0-9]+|[a-z0-9][-a-z0-9]*[a-z0-9])\.)+[a-z][-a-z0-9]*[a-z0-9]$' ์ ๊ฐ์ ์๋ฌ๋ฅผ ๋ณผ ์ ์๋ค.
apiVersion: networking.gke.io/v1
kind: ManagedCertificate
metadata:
name: example
spec:
domains:
- *.example.com
๊ตฌ๊ธ ๋ฌธ์์์ "๊ด๋ฆฌํ ์ธ์ฆ์" ๋ผ๋ ํํ๋ณด๋ค๋ "ManagedCertificate API ๋ก ์์ฑํ ์ธ์ฆ์"๋ก ํํํ์ผ๋ฉด ๋ ํผ๋์ด ๋์ง ์์์๊น ์ถ๋ค. ์ฌ์ง์ด ์๋ฌธ์ผ๋ก ๋ด๋ ๋จ์ํ managed certificate ๋ผ๊ณ ๋ง ๋์์๋ค.
GCP ์ ์ต์์น ์์ ์ฌ๋์ด๋ผ๋ฉด ์ด๊ฑธ ๋ณดํต Google Managed Certificate ๋ผ๊ณ ์๊ฐํ์ง ์์๊น ์ถ๊ธฐ๋ ํ๋ค.
๊ทธ๋์ ์์ฐ์ค๋ "Google Managed Certificate ๋ ์์ผ๋์นด๋๋ฅผ ์ง์ํ์ง ์๋๋ณด๊ตฌ๋" ๋ผ๊ณ ์๊ฐํ๊ธฐ ์ฝ๋ค.
๋ ํท๊ฐ๋ฆด์ ์๋ ํฌ์ธํธ๊ฐ Classic Certificate ๋ฅผ ์์ฑํ ๋ ์๋์ ๊ฐ์ด ์์ผ๋์นด๋๋ฅผ ์ฌ์ฉํ๋ฉด "wildcard domains not supported" ๋ผ๊ณ ๋์จ๋ค.

๊ทผ๋ฐ ์ด๊ฒ ๋ ํ์ ๋ ๋ ์ ๋ฒ ์คํ ๊ธ๋ก๋ฒ ๋ธ๋ก๊ทธ ๊ธ์์๋ ์๋ชป๋ ์ ๋ณด๋ฅผ ์ ๊ณตํ๊ณ ์๋ค.

๊ทธ๋์ ๋ง์น GCP UI ์์ ์๋๊ณ gcloud API ๋ฅผ ์ด์ฉํ๋ฉด ์์ผ๋์นด๋๋ฅผ ์์ฑํ ์ ์๋ ๊ฒ์ฒ๋ผ ์๊ธฐํ๋ค.
์ด๊ฒ ์๋ชป๋ ๊ฒ์ด GCP UI ์์ ์์ฑํ๋ ค๊ณ ํ๋ ๊ฒ์ Classic Certificate ์ด๋ฉด์, ๋ง์ gcloud API ๋ก ์์ฑํ ๊ฒ์ ์ผ๋ฐ Certificates ์ด๋ค. Classic Certificate ์ ์ผ๋ฐ Certificate ์ ์์ฐํ ๋ค๋ฅธ๋ฐ ๋ง์ด๋ค.
์ด๋ฌ๋ GCP ์ ์ต์์น ์๋ ์ฌ๋๋ค์ ์ ๋ง ํท๊ฐ๋ฆด ์ ๋ฐ์ ์๋ค.
๊ทธ๋ผ ์ด์ ํ๋ฒ ์ ๋ฆฌํด๋ณด์!
"Ingress API ๊ธฐ๋ฐ์ผ๋ก ์์ฑํ ๋ ManagedCerficiate API ๋ฅผ ์ด์ฉํด์ ์ธ์ฆ์๋ฅผ ๋ฐ์ธ๋ฉํ ์ ์๋ค. ํ์ง๋ง ManagedCerficiate API ๋ ์์ผ๋์นด๋๋ฅผ ์ง์ํ์ง ์๊ธฐ ๋๋ฌธ์ ์์ผ๋์นด๋ ์ธ์ฆ์๋ฅผ Ingress API ์ ๋ฐ์ธ๋ฉํ๋ ค๋ฉด LB ๋ฅผ ์์ฑํ ํ์ gcloud API ๋ฅผ ์ด์ฉํด์ Certificate Maps ์ LB Frontend ์ ๋ฐ์ธ๋ฉํด์ฃผ์!"
๊ทธ๋ฐ๋ฐ ์ฌ์ค ์ด ๋ฐฉ๋ฒ์ ๊น๋ํ์ง ์๋ค. gcloud API ์ฌ์ฉ์ด ์๋ ๋ชจ๋ ๊ฑธ Kubernetes API ๋ฐฉ์์ ์ด์ฉํ๊ณ ์ถ๋ค.
Gateway API ๋ฐฉ์์ ์ด์ฉํ๋ฉด ์ด ๋ชจ๋ ๊ฑธ ๊น๋ํ๊ฒ ํด๊ฒฐํ ์ ์๋ค!
๋ค์ ๊ธ์์๋ Gateway API ๋ฐฉ์์ ํ์ฉํด์ Wildcard Google Managed Certificate ๋ฅผ ์ฌ์ฉํ๋ GKE L7 LB ๋ฅผ ๋ง๋ค์ด๋ณด๊ฒ ๋ค!
