GKE内のサービスをTLSで外部に公開したい場合、kubernetesのingressを使ってGCPのL7LBをたてるのが楽ですが、その時のTSL証明書の設定で苦戦したのでメモよりのメモ

証明書の結合ファイルを作る

ingressはGCPのhttpLBのように中間証明書をインストールするディレクティブがありません。そこで中間証明書等がある場合はサーバ証明書に中間証明書を結合してあげる必要があります。

$ cat wildcard.example.com_20190430.cer tyukan_cert.cer >> cert.pem

このようにコマンドで結合するとマジ卍です。

secretを作る

次に結合した証明書と鍵をkubernetesのsecretとして登録します。
secretは値をbase64でエンコードする必要があるのですが、kubectlコマンドを使うと簡単にkubernetesの定義ファイルを吐き出すことができます。

$ kubectl create secret tls wildcard-example-com-20190420 --key=wildcard.example.com_20190430.key --cert=cert.pem -o yaml --dry-run > tls_secret.template.yaml

作成した定義ファイルを適用すればsecretの完成です。

$ kubectl apply -f tls_secret.template.yaml

ドメイン

予めドメインと静的IPアドレスのヒモ付は行っておいて下さい。
管理はterraformを使うと便利なので一応tfファイルの書き方ものせておきます。

resource "google_compute_global_address" "example-lb" {
  name = "example-lb"
}
resource "google_dns_record_set" "test_example_com" {
  managed_zone = "XXX"
  name         = "test.example.com."
  type         = "A"
  ttl          = 300
  rrdatas      = ["${google_compute_global_address.example-lb.address}"]
}

これでexample-lbという名前の静的IPアドレスがGCP上に登録されます。

ingressを作る

あとはingressをたてるだけです。
ingressには先程作成した静的IPアドレスをannotationsに、secretをtlsディレクティブに指定します。

example-ingress.yaml
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    kubernetes.io/ingress.allow-http: "false"
    kubernetes.io/ingress.global-static-ip-name: example-lb #ここに静的IPアドレスの名前
  tls:
  - secretName: wildcard-example-com-20190420 #ここにsecretの名前
  rules:
  - host: test.example.com
    http:
      paths:
      - backend:
          serviceName: example-service
          servicePort: 9000

上記の定義ファイルをkubectlでapplyするとしばらくすると(10分程度)httpsLoadbalancerが動き始めます。テンアゲ!

$ kubectl apply -f example-ingress.yaml

確認

確認は確認用のサイトを使うといいでしょう。
ブラウザからの確認だと中間証明書がうまく設定できてなくても普通に通信できてしまったりします。
下記のサイト等を使って証明書にエラーが無いことを確認すると良いです。

GeoTrustCryptoReport

参考記事

SSLサーバー証明書に中間証明書を結合する [(全部俺)何でも Advent Calendar 2013 8日目]

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.