Google 容器引擎 - 如何更新 L7 入口以加载新的 TLS 证书?

Google Container Engine - How to update L7 ingress to load new TLS certificate?

我使用的是标准 L7 load balancing ingress on Google Container Engine。我已经通过以下入口定义安装了它:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: l7-ingress-{{environment}}
spec:
  tls:
    - secretName: web-secret
  backend:
    serviceName: web
    servicePort: 80

现在,我的问题是,一旦密钥 web-secret 更改,我如何确保更新 TLS 证书? AFAICT,即使底层秘密发生变化,它目前仍保持不变。

显然,L7 入口当前不监视 TLS 机密的更改。不过a PR解决这个问题已经合并了,所以应该只是时间问题。

我的解决方法是删除并创建入口,但要确保在传递给 kubectl create -f 的 YAML 中指定 IP:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: dev-ing
spec:
  tls:
    - secretName: tls-sekret
  rules:
  - host: tryout.example.com
    http:
      paths:
      - backend:
          serviceName: nginx
          servicePort: 80
status:
  loadBalancer:
    ingress:
    - ip: 130.211.n.n

我找不到任何文档说明这是确保您获得相同 IP 的方法,但对我来说它有效。在无法承受丢失 IP 的生产系统上谨慎使用!

我刚刚尝试对已编辑的机密进行简单应用,是的,它成功了。 Web 控制台和 gcloud compute ssl-certificates list 立即报告更改,负载均衡器在大约 10 分钟后开始提供服务。如果能正式记录下来就好了!特别是因为 k8s 的其他角落不会自动获取对秘密的更改,比如部署,所以我们不认为这是理所当然的。

Google L7 负载均衡器在更新后会交换基础证书。您必须应用正确的注释:

秘密

apiVersion: v1
kind: Secret
data:
  tls.crt: xxx
  tls.key: xxx
metadata:
  name: tls-secret
type: kubernetes.io/tls

入口

kind: Ingress
apiVersion: extensions/v1beta1
metadata:
  name: dev-ing
  annotations:
    # Do not forget this annotation
    kubernetes.io/ingress.class: "gce"
spec:
  tls:
    - hosts:
        - tryout.example.com
      secretName: tls-secret
  backend:
    serviceName: nginx
    servicePort: 80

交换以某种方式在后台发生,请注意它所花费的时间(5-15 分钟)。