【问题标题】:How to create a loadbalancer backend service with HTTPS protocol by default in kubernetes ingress on GCP如何在 GCP 上的 kubernetes 入口中默认使用 HTTPS 协议创建负载均衡器后端服务
【发布时间】:2021-07-08 16:07:18
【问题描述】:

我要做的是在 Kubernetes 上部署一个 API,并使用 Google 管理的 SSL 证书将其重定向到我的 HTTPS 协议上的域。

我已经花了一些时间,做了很多调试,但是有一点我无法成功修复。

已经完成的工作:

  • 静态 IP 已保留
  • Google 管理的 SSL 证书有效且经过验证
  • Ingress 和 Service NodePort 均使用 443 HTTPS 协议部署。
  • 我还设法在 HTTPS 上进行了健康检查。

问题:

  • 我无法更改负载均衡器后端服务的默认配置。它始终在 HTTP 上。

Problematic place

但是如果我手动将其更改为 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


    【解决方案1】:

    找到了!!!

    在注释中的 service.yaml 中必须添加另一个配置并为我的端口添加一个名称。这是一个新的配置

    service.yaml

    apiVersion: v1
    kind: Service
    metadata:
      name: management-api-test-service
      annotations:
        cloud.google.com/backend-config: '{"default": "api-default-config"}'
        cloud.google.com/app-protocols: '{"my-https-port":"HTTPS"}' # new line
    spec:
      type: NodePort
      selector:
        app: management-api-test
        environment: test
      ports:
      - name: my-https-port # add port name
        protocol: TCP
        port: 443
        targetPort: 5000
        nodePort: 31303
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-12
      • 2019-07-11
      • 2017-12-22
      • 1970-01-01
      • 2019-03-31
      • 2020-05-08
      • 1970-01-01
      相关资源
      最近更新 更多