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ディレクティブに指定します。
---
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アドレスの名前
spec:
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
確認
確認は確認用のサイトを使うといいでしょう。
ブラウザからの確認だと中間証明書がうまく設定できてなくても普通に通信できてしまったりします。
下記のサイト等を使って証明書にエラーが無いことを確認すると良いです。