以下のページに書かれているとおりmanifestで設定することで証明書の作成からGCLBへの割り付けまでやってくれる。
https://cloud.google.com/kubernetes-engine/docs/how-to/managed-certs?hl=ja
お試し用のクラスタで静的IPアドレスを指定していないが、エフェメラルIPアドレスでも可能。
https://cloud.google.com/kubernetes-engine/docs/tutorials/http-balancer#step_5_optional_configure_a_static_ip_address
手順
-
GKEクラスタを用意する。
- Ingress/GCLBがまだない状態を想定しているけど、先にGCLBのIPアドレスがわかる状況なら、利用したいFQDNのAレコードをGCLBのIPアドレスに向ける。
-
manifestを適用する。yamlがカレントディレクトリにある前提。
$ kustomize build . | kubectl apply -f -
-
kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: - cert.yaml - ingress.yaml
-
cert.yaml
apiVersion: networking.gke.io/v1beta2 kind: ManagedCertificate metadata: name: hello-cert spec: domains: - hello.mydomain.example
-
ingress.yaml
kubernetes.io/ingress.allow-http: "false"
を指定することでhttpsのみ有効にできる(httpでアクセスすると404になる)
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: hello-ingress annotations: networking.gke.io/managed-certificates: hello-cert kubernetes.io/ingress.allow-http: "false" spec: rules: - http: paths: - path: /hello/* backend: serviceName: hellosvc servicePort: 80
-
service参考
apiVersion: v1 kind: Service metadata: name: hellosvc annotations: cloud.google.com/neg: '{"ingress": true}' spec: ports: - name: http port: 80 protocol: TCP targetPort: 80 selector: app: hellosvc sessionAffinity: None type: ClusterIP
-
-
GCLBがまだない状態かつエフェメラルIPアドレス使用の場合、applyした後にIPアドレスがわかるのでFQDNのAレコードをGCLBに向ける。
試した限りでは10分ぐらいで証明書が作成されるが、実際に当該URLにアクセスできるようになるまでの時間を含めると20分ぐらいかかった。
GCLBの証明書のステータスが「有効」になった後もしばらくは以下のようなエラーになった。
-
Firefoxの場合
hello.mydomain.example への接続中にエラーが発生しました。Cannot communicate securely with peer: no common encryption algorithm(s). エラーコード: SSL_ERROR_NO_CYPHER_OVERLAP
-
curlの場合
$ curl https://hello.mydomain.example/hello/aa curl: (35) error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure
環境
- GKE 1.18.9-gke.2501
- kubectl 1.19.3
- kustomize 3.6.1