Ingressサービスで外部IPと証明書の指定をする。
マネージドSSL証明書を使用する場合3回のkubrctl applyが必要。
GKEのアプリケーションがブラウザで動作するところまでできていることを前提としている。以下を参照のこと。
https://trueman-developer.blogspot.com/2020/08/gkenodejs.html
NodePortサービスの作成
NodePortで外部からアクセスできるように設定していた場合記述を削除する必要がある。
service.yaml
kind: Service apiVersion: v1 metadata: name: example-service spec: type: NodePort selector: app: example-service ports: - protocol: TCP port: 80 targetPort: 3000 type: LoadBalancer loadBalancerIP: "35.xxx.xxx.9"
kubectl apply -f service.yaml
のちほどIngressで設定するため下二行(type, loadBalancerIP)を削除する。
port(80)は後ほど指定する必要があるので控えておく。
マネージド証明書の設定
証明書はGCPのサービスを利用できる。
自動更新、しかも無料。ベータ版なのが少しネックか。
内部的にLet's Encryptを使用しているらしい。
certificate-hata-free.yaml
apiVersion: networking.gke.io/v1beta2 kind: ManagedCertificate metadata: name: certificate-app spec: domains: - example.com
domainsは設定予定のドメイン。
nameは後ほどingressで指定する。
DNSの設定は基本的にどのタイミングでもいいがうまくいくまでTTLは短めにしておいた方がいいかもしれない。
kubectl apply -f certificate-hata-free.yaml
Ingressの構築
Ingressは負荷分散、SSL終端などの外部アクセスを制御する機能を持つ。
ingress.yaml
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: ingress-app annotations: kubernetes.io/ingress.global-static-ip-name: "app-address" networking.gke.io/managed-certificates: certificate-app spec: backend: serviceName: example-service servicePort: 80
kubernetes.io/ingress.global-static-ip-nameはグローバルIPアドレスリソースを指定する。
静的IPアドレスはGCPのVPCネットワークから予約可能。
名前をダブルクォーテーションで括り、グローバルでなければいけない。リージョンを指定していた場合作り直す必要がある。
DNSひも付けなどもしていた場合はそこも書き換えないといけない(TTLを短くしておいた方がいいというのはこのため)
以下参考
https://console.cloud.google.com/networking/addresses/list
外部IPアドレス → 静的アドレスを予約
赤く囲っているリージョン部分が空白である必要がある。
アドレス未使用の場合費用がかかるとのことなので注意。
networking.gke.io/managed-certificatesで証明書の自動設定が可能。マネージド証明書を設定したときのnameを指定する。
指定しない場合は自動で静的IPが割り振られる(VPCネットワークから確認可能)
serviceNameはサービス名と同じにすること。
servicePortはNodePortのサービスで設定していたport(80)と同じ値にすること。
kubectl apply -f ingress.yaml
自動で証明書発行まで行われるが少し時間がかかる。
kubectl get ingress NAME HOSTS ADDRESS PORTS AGE ingress-app * 34.xxx.xxx.228 80 4h29m
で状態確認。
https://domain...にアクセスして確認する。