Help us understand the problem. What is going on with this article?

GCE Ingressでhttps通信

Ingressでhttps通信

TL;DR

ドメインごとのgoogle managed 証明書を取得,Ingressに定義するところまで、
その過程ではまったポイントも少々記述しています

Service, Deployment

ここはいろんな例があるので参考程度に

deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: queen-gateway
spec:
  replicas: 1
  selector:
    matchLabels:
      app: hogehoge
      tier: api
  template:
    metadata:
      labels:
        app: hogehoge
        tier: api
  spec:
    replicas: 1
    template:
      spec:
        containers:
          - name: api
            image: {docker_image}
            ports:
              - containerPort: 8080

service.yaml
apiVersion: v1
kind: "Service"
metadata:
  name: "hogehoge-service"
  namespace: "default"
spec:
  type: "NodePort" // NodePort or ClusterIP
  ports:
  - name: "http-port"
    protocol: "TCP"
    port: 8080
    targetPort: 8080
  selector:
    app: "hogehoge"
    tier: "api"

Ingress

ingressを立ち上げるたびにIPが変わってはload balancingできないのでglobalIPを取得します
gcloudのcontextが対象のclusterであることを確認して

gcloud compute addresses create https-ip --global

google managed ssl certificateを取得します

gcloud beta compute ssl-certificates create https-cert \
    --domains ${YOUR_DOMAIN}
ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: hogehoge-ingress
  annotations:
    kubernetes.io/ingress.global-static-ip-name: https-ip # 取得したglobalIP
  ingress.gcp.kubernetes.io/pre-shared-cert: https-cert # 取得した証明書
    kubernetes.io/ingress.allow-http: "false" # httpからのアクセス禁止
spec:
  backend:
    serviceName: hogehoge-service # serviceのmetadateのname
    servicePort: 8080 # serviceで指定したport

証明書,Ingress共に適用されるまでに少々時間がかかるので繋がらなくてやり直すのは少し間を置いた方が良いです

~  curl https://hogehoge.com/status
{"status":200}% 

はまったポイント

health check

コンテナのGET"/"が200を返すようにしておかないと、Ingressのトラフィックが正常にリクエストの処理ができないと判断し、
トラフィックが流されなくなります。
もしroot以外でhealth checkを行いたい場合は

deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: queen-gateway
spec:
  replicas: 1
  selector:
    matchLabels:
      app: hogehoge
      tier: api
  template:
    metadata:
      labels:
        app: hogehoge
        tier: api
  spec:
    replicas: 1
    template:
      spec:
        containers:
          - name: api
            image: {docker_image}
            readinessProbe:
            httpGet:
              path: /status #200を返すパス
              port: 80
            initialDelaySeconds: 5
            timeoutSeconds: 10
            ports:
              - containerPort: 8080

のようにすると良いでしょう
ちなみにk8sのhealth checkには2種類あります
https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/
今回はunhealthyなコンテナにはトラフィックを流さないreadinessProbeを使用しています

サブドメインごとの証明書

調べてみたのですが、上記の証明書ではワイルドカードでの証明書取得ができないようです
よってドメインごとのIngress、証明書を定義して対応しています
もし良いやり方があれば教えていただけると助かります

参考資料

公式 docs
GKE でマネージド証明書を用いた https 通信を設定する

0daryo
webエンジニア Goが仕事 Javaかきます
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away