Posted at

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、証明書を定義して対応しています

もし良いやり方があれば教えていただけると助かります


参考資料

公式Ingress

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