1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

GKEで複数domainを指定したManagedCertificate作成の簡単メモ

Posted at

Intro

ManagedCertificateは、googleによってマネージされているSSL証明書です。ドメイン名認証(DV)を行い、 GCPが自動更新と管理をしてくれます。OV、EV系の認証は行いません。

また、external HTTPS LBとSSLプロキシーLBでは使えますが、内部のHTTPS LBでは使えません。

gcloudからでなく、kubectlを使ってGKEリソースとしてManagedCertificateをデプロイしたい時があります。

例えば、

  • defaultではないnamespaceにあるIngressなどのリソースから参照したい時(同じネームスペースにないとずっとProvisioningのままで、結局Failする時があります)。kubenskubectlで簡単に同じネームスペースにデプロイできます。
  • そのspecを他のGKEのリソースと一緒にyamlとして管理したいです。

やり方

例えば、以下のようなmanifestで実現できます。

(exampleのため、シンプルにCloud Endpointsで作ったendpointを指定します)。

mycert.yaml
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でも行けるようです。

mycert.yaml
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の中でそういうドメイン名を指定しようとするとこういう怒られ方をします:

mycert.yaml

# ...(略)...
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証明書なら使えます。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?