Ingressでhttps通信
TL;DR
ドメインごとのgoogle managed 証明書を取得,Ingressに定義するところまで、
その過程ではまったポイントも少々記述しています
Service, Deployment
ここはいろんな例があるので参考程度に
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
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}
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を行いたい場合は
apiVersion: apps/v1
kind: Deployment
metadata:
name: 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、証明書を定義して対応しています
もし良いやり方があれば教えていただけると助かります