【发布时间】:2021-07-08 16:07:18
【问题描述】:
我要做的是在 Kubernetes 上部署一个 API,并使用 Google 管理的 SSL 证书将其重定向到我的 HTTPS 协议上的域。
我已经花了一些时间,做了很多调试,但是有一点我无法成功修复。
已经完成的工作:
- 静态 IP 已保留
- Google 管理的 SSL 证书有效且经过验证
- Ingress 和 Service NodePort 均使用 443 HTTPS 协议部署。
- 我还设法在 HTTPS 上进行了健康检查。
问题:
- 我无法更改负载均衡器后端服务的默认配置。它始终在 HTTP 上。
但是如果我手动将其更改为 HTTPS,API 在我的域上按预期工作 api.mydomain.com。问题是5分钟后,默认配置与K8s当前配置同步,协议自动变为HTTP。
我的问题:如何为后端服务设置默认配置为 HTTPS,之后不会被覆盖。
这是我部分遵循的指南:
https://cloud.google.com/kubernetes-engine/docs/how-to/managed-certs#console
以及我对 Ingress、Service 和 Health Check 的配置
healthcheck.yaml
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
name: api-default-config
spec:
healthCheck:
checkIntervalSec: 60
timeoutSec: 60
healthyThreshold: 1
unhealthyThreshold: 10
type: HTTPS
requestPath: /
port: 31303
service.yaml
apiVersion: v1
kind: Service
metadata:
name: management-api-test-service
annotations:
cloud.google.com/backend-config: '{"default": "api-default-config"}'
spec:
type: NodePort
selector:
app: management-api-test
environment: test
ports:
- protocol: TCP
port: 443
targetPort: 5000
nodePort: 31303
ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: api-ingress
annotations:
kubernetes.io/ingress.global-static-ip-name: api-test2
networking.gke.io/managed-certificates: test-cert
kubernetes.io/ingress.class: "gce"
kubernetes.io/ingress.allow-http: "false"
spec:
defaultBackend:
service:
name: management-api-test-service
port:
number: 443
rules:
- host: api.mydomain.com
http:
paths:
- path: /*
pathType: ImplementationSpecific
backend:
service:
name: management-api-test-service
port:
number: 443
kubectl 描述 svc management-api-test-service -n web-application
Name: management-api-test-service
Namespace: web-application
Labels: <none>
Annotations: cloud.google.com/backend-config: {"default": "api-default-config"}
Selector: app=management-api-test,environment=test
Type: NodePort
IP Families: <none>
IP: **.***.**.130
IPs: <none>
Port: <unset> 443/TCP
TargetPort: 5000/TCP
NodePort: <unset> 31303/TCP
Endpoints: **.***.*.13:5000
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
kubectl 描述入口 api-ingress -n web-application
Name: api-ingress
Namespace: web-application
Address: **.***.***.196
Default backend: management-api-test-service:443 (***.**.**.13:5000)
Rules:
Host Path Backends
---- ---- --------
api.mydomain.com
/* management-api-test-service:443 (***.**.**.13:5000)
Annotations: ingress.gcp.kubernetes.io/pre-shared-cert: mcrt-blablabla
ingress.kubernetes.io/backends: {"k8s-be-31303--efb221b572e568cb":"HEALTHY"}
ingress.kubernetes.io/https-forwarding-rule: k8s2-fs-1xka7p8q-web-application-api-ingress-5jc6y1ty
ingress.kubernetes.io/https-target-proxy: k8s2-ts-1xka7p8q-web-application-api-ingress-5jc6y1ty
ingress.kubernetes.io/ssl-cert: mcrt-blablabla
ingress.kubernetes.io/url-map: k8s2-um-1xka7p8q-web-application-api-ingress-5jc6y1ty
kubernetes.io/ingress.allow-http: false
kubernetes.io/ingress.class: gce
kubernetes.io/ingress.global-static-ip-name: api-test2
networking.gke.io/managed-certificates: test-cert
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Sync 5m2s (x22 over 155m) loadbalancer-controller Scheduled for sync
我试过了:
-
kubernetes.io/ingress.allow-http: false没有任何改变 - 一些使用 nginx 的配置,其中 http 设置为“false”,但我找不到它并且它不起作用。
提前致谢!
【问题讨论】:
标签: ssl kubernetes google-cloud-platform