【问题标题】:Managed Certificate in Ingress, Domain Status is FailedNotVisibleIngress 中的托管证书,域状态为 FailedNotVisible
【发布时间】:2020-05-04 13:19:00
【问题描述】:

我只是按照这里的教程进行操作:https://cloud.google.com/kubernetes-engine/docs/how-to/managed-certs#creating_an_ingress_with_a_managed_certificate

一切正常,直到我部署我的证书并等待 20 分钟让它显示为:

Status:
  Certificate Name:    daojnfiwlefielwrfn
  Certificate Status:  Provisioning
  Domain Status:
    Domain:  moviedecisionengine.com
    Status:  FailedNotVisible

该域显然有效,所以我错过了什么?

编辑:

这是证书:

apiVersion: networking.gke.io/v1beta1
kind: ManagedCertificate
metadata:
    name: moviedecisionengine
spec:
    domains:
        - moviedecisionengine.com

入口:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    ingress.gcp.kubernetes.io/pre-shared-cert: mcrt-14cb8169-25ba-4712-bca5-cb612562a00b
    ingress.kubernetes.io/backends: '{"k8s-be-31721--1cd1f38313af9089":"HEALTHY"}'
    ingress.kubernetes.io/forwarding-rule: k8s-fw-default-showcase-mde-ingress--1cd1f38313af9089
    ingress.kubernetes.io/https-forwarding-rule: k8s-fws-default-showcase-mde-ingress--1cd1f38313af9089
    ingress.kubernetes.io/https-target-proxy: k8s-tps-default-showcase-mde-ingress--1cd1f38313af9089
    ingress.kubernetes.io/ssl-cert: mcrt-14cb8169-25ba-4712-bca5-cb612562a00b
    ingress.kubernetes.io/target-proxy: k8s-tp-default-showcase-mde-ingress--1cd1f38313af9089
    ingress.kubernetes.io/url-map: k8s-um-default-showcase-mde-ingress--1cd1f38313af9089
    kubernetes.io/ingress.global-static-ip-name: 34.107.208.110
    networking.gke.io/managed-certificates: moviedecisionengine
  creationTimestamp: "2020-01-16T19:44:13Z"
  generation: 4
  name: showcase-mde-ingress
  namespace: default
  resourceVersion: "1039270"
  selfLink: /apis/extensions/v1beta1/namespaces/default/ingresses/showcase-mde-ingress
  uid: 92a2f91f-3898-11ea-b820-42010a800045
spec:
  backend:
    serviceName: showcase-mde
    servicePort: 80
  rules:
  - host: moviedecisionengine.com
    http:
      paths:
      - backend:
          serviceName: showcase-mde
          servicePort: 80
  - host: www.moviedecisionengine.com
    http:
      paths:
      - backend:
          serviceName: showcase-mde
          servicePort: 80
status:
  loadBalancer:
    ingress:
    - ip: 34.107.208.110

最后是负载均衡器:

apiVersion: v1
kind: Service
metadata:
  creationTimestamp: "2020-01-13T22:41:27Z"
  labels:
    app: showcase-mde
  name: showcase-mde
  namespace: default
  resourceVersion: "2298"
  selfLink: /api/v1/namespaces/default/services/showcase-mde
  uid: d5a77d7b-3655-11ea-af7f-42010a800157
spec:
  clusterIP: 10.31.251.46
  externalTrafficPolicy: Cluster
  ports:
  - nodePort: 31721
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: showcase-mde
  sessionAffinity: None
  type: LoadBalancer
status:
  loadBalancer:
    ingress:
    - ip: 35.232.156.172

对于kubectl describe managedcertificate moviedecisionengine的完整输出:

Name:         moviedecisionengine
Namespace:    default
Labels:       <none>
Annotations:  kubectl.kubernetes.io/last-applied-configuration:
                {"apiVersion":"networking.gke.io/v1beta1","kind":"ManagedCertificate","metadata":{"annotations":{},"name":"moviedecisionengine","namespace...
API Version:  networking.gke.io/v1beta1
Kind:         ManagedCertificate
Metadata:
  Creation Timestamp:  2020-01-17T16:47:19Z
  Generation:          3
  Resource Version:    1042869
  Self Link:           /apis/networking.gke.io/v1beta1/namespaces/default/managedcertificates/moviedecisionengine
  UID:                 06c97b69-3949-11ea-b820-42010a800045
Spec:
  Domains:
    moviedecisionengine.com
Status:
  Certificate Name:    mcrt-14cb8169-25ba-4712-bca5-cb612562a00b
  Certificate Status:  Provisioning
  Domain Status:
    Domain:  moviedecisionengine.com
    Status:  FailedNotVisible
Events:      <none>

【问题讨论】:

标签: kubernetes google-kubernetes-engine kubernetes-ingress


【解决方案1】:

我成功地将 Managedcertificate 与 GKE Ingress 资源一起使用。

让我详细说明一下:

重现步骤:

  • 使用gcloud 创建 IP 地址
  • 更新 DNS 条目
  • 创建部署
  • 创建服务
  • 创建证书
  • 创建入口资源

使用 gcloud 创建 IP 地址

调用以下命令创建静态 IP 地址:

$ gcloud compute addresses create example-address --global

使用以下命令检查新创建的 IP 地址:

$ gcloud compute addresses describe example-address --global

更新 DNS 条目

转到GCP -> Network Services -> Cloud DNS

使用与上面创建的地址相同的A record 编辑您的区域。

等待它应用。

如果条目指向适当的地址,请检查 $ nslookup DOMAIN.NAME

创建部署

以下是响应流量的示例部署:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello
spec:
  selector:
    matchLabels:
      app: hello
      version: 1.0.0
  replicas: 3
  template:
    metadata:
      labels:
        app: hello
        version: 1.0.0
    spec:
      containers:
      - name: hello
        image: "gcr.io/google-samples/hello-app:1.0"
        env:
        - name: "PORT"
          value: "50001"

使用命令$ kubectl apply -f FILE_NAME.yaml应用它

您可以更改此部署以适合您的应用程序,但请注意您的应用程序将响应的端口。

创建服务

使用NodePort,因为它与提供的链接中的相同:

apiVersion: v1
kind: Service
metadata:
  name: hello-service
spec:
  type: NodePort
  selector:
    app: hello
    version: 1.0.0
  ports:
  - name: hello-port
    protocol: TCP
    port: 50001
    targetPort: 50001

使用命令$ kubectl apply -f FILE_NAME.yaml应用它

创建证书

如指南所示,您可以使用以下示例创建ManagedCertificate

apiVersion: networking.gke.io/v1beta1
kind: ManagedCertificate
metadata:
  name: example-certificate 
spec:
  domains:
    - DOMAIN.NAME

使用命令$ kubectl apply -f FILE_NAME.yaml应用它

FAILED_NOT_VISIBLE 状态表示由于 DNS 或负载平衡配置问题,域的证书配置失败。确保已配置 DNS,以便证书的域解析为负载均衡器的 IP 地址。 -- Google Cloud documentation

此证书的创建应受您之前提供的 DNS 条目的影响。

创建入口资源

下面是Ingress 资源的示例,它将使用ManagedCertificate

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress
  annotations:
    kubernetes.io/ingress.global-static-ip-name: example-address
    networking.gke.io/managed-certificates: example-certificate
spec:
  rules:
  - host: DOMAIN.NAME
    http:
      paths:
      - path: /
        backend:
          serviceName: hello-service
          servicePort: hello-port

使用命令$ kubectl apply -f FILE_NAME.yaml应用它

完全工作大约需要 20-25 分钟。

【讨论】:

  • 文档中哪里说您需要在 DNS 设置中编辑区域?我没有设置任何区域。
  • 另外,为什么我需要一个 Nodeport?我没有在任何端口之间路由...
  • A DNS zone 是 Google Cloud DNS 中的 DNS 记录容器。如果您不使用 Google Cloud DNS,请在适合您情况的解决方案中设置所需条目。为了让您的 GKE Ingress 访问应用程序,您需要使用 NodePort 服务类型:Explanation
  • 我正在使用本教程:cloud.google.com/kubernetes-engine/docs/tutorials/hello-app 并且在任何地方都没有提到 NodePort。在我的情况下,我使用的是集群。那么让 Ingress 指向负载均衡器 -> 集群与 NodePort 有什么区别?
  • 在链接的教程中,您必须创建一个 L4 网络负载均衡器。为了使用您的Managed Certificate,您需要使用上面提供的 L7 之一。请参考:Traffic TypeTLS TerminationLimitations and troubleshooting
猜你喜欢
  • 1970-01-01
  • 2021-01-13
  • 2023-03-10
  • 1970-01-01
  • 2019-07-21
  • 2019-11-22
  • 1970-01-01
  • 1970-01-01
  • 2021-02-09
相关资源
最近更新 更多