Intro
ManagedCertificateは、googleによってマネージされているSSL証明書です。ドメイン名認証(DV)を行い、 GCPが自動更新と管理をしてくれます。OV、EV系の認証は行いません。
また、external HTTPS LBとSSLプロキシーLBでは使えますが、内部のHTTPS LBでは使えません。
gcloud
からでなく、kubectl
を使ってGKEリソースとしてManagedCertificateをデプロイしたい時があります。
例えば、
- defaultではないnamespaceにあるIngressなどのリソースから参照したい時(同じネームスペースにないとずっとProvisioningのままで、結局Failする時があります)。
kubens
+kubectl
で簡単に同じネームスペースにデプロイできます。 - そのspecを他のGKEのリソースと一緒にyamlとして管理したいです。
やり方
例えば、以下のようなmanifestで実現できます。
(exampleのため、シンプルにCloud Endpointsで作ったendpointを指定します)。
apiVersion: networking.gke.io/v1beta1
kind: ManagedCertificate
metadata:
name: what-a-cool-cert
spec:
domains:
- domain1.endpoints.a-gcp-project-name.cloud.goog
- domain2.endpoints.a-gcp-project-name.cloud.goog
domains
フィールドが複数形なので、複数ドメインのcertもデプロイできるはず、と想像できます。
しかし、トライすると怒られます:
The ManagedCertificate "what-a-cool-cert" is invalid: spec.domains: Invalid value: "": spec.domains in body should have at most 1 items
GKEのofficial docsで確認すると、v1beta1
では対応しておらず、そもそもv1beta1
はdeprecatedのためもう使うな、ということのようです。
↑のdocsでは networking.gke.io/v1
で複数ドメイン指定の例がありますが、実はv1beta2
でも行けるようです。
apiVersion: networking.gke.io/v1
kind: ManagedCertificate
metadata:
name: what-a-cool-cert
spec:
domains:
- domain1.endpoints.a-gcp-project-name.cloud.goog
- domain2.endpoints.a-gcp-project-name.cloud.goog
まず、kubectl api-versions
でクラスターがこのAPIに対応していることを確認します:
$ kubectl api-versions
...
networking.gke.io/v1
networking.gke.io/v1beta1
networking.gke.io/v1beta2
networking.k8s.io/v1
networking.k8s.io/v1beta1
...
networking.gke.io/v1
もしくはnetworking.gke.io/v1beta2
が存在していればokです。どちらも存在していなければClusterが古すぎてdeprecatedなAPIバージョン(Master version1.15系以前)を使っている可能性があるので、まずClusterのMaster versionをアップグレードしましょう。
networking.gke.io/v1
はMaster version 1.17系以降存在しているようです。
1.15系にでも
networking.k8s.io/v1
というものが存在しているのですが、これではなくてnetworking.gke.io/v1
を使うのでご注意ください。
そして正しいネームスペースを指定し、mycert.yaml
をデプロイしてみると:
$ kubens the-correct-ns && kubectl apply -f mycert.yaml
managedcertificate.networking.gke.io/what-a-cool-cert created
普通のGKEリソースとして確認できます(mcrt
とは、kubectlリソースのmanagedcertificates
の略になります):
$ kubectl get mcrt
NAME AGE STATUS
an-older-cert 20d Active
what-a-cool-cert 3m Provisioning
注意点
domain名は63文字まで
GCPのcloud endpoints APIで、63文字より長いドメイン名を普通に作れますが、ManagedCertificateの中でそういうドメイン名を指定しようとするとこういう怒られ方をします:
# ...(略)...
spec:
domains:
- this-domain-name-is-ok.endpoints.myproject.cloud.goog
- this-domain-name-is-too-long-and-gke-will-hate-you-if-you-even-try.endpoints.myproject.cloud.goog
$ kubectl apply -f mycert.yaml
The ManagedCertificate "what-a-cool-cert" is invalid: spec.domains: Invalid value: "": spec.domains in body should be at most 63 chars long
WildCardは使えない
ManagedCertificateはwildcardを使ったdomain指定はダメっぽいので気を付ける必要があるようです。self-managed証明書なら使えます。