Kubernetes:为什么我的极限挑战收到 EOF/没有响应?

问题描述 投票:0回答:2

我正在使用 Kops 在 AWS 中设置 Kubernetes 集群。我有一个 nginx 入口控制器,我正在尝试使用 LetsEncrypt 来设置 tls。现在我无法启动并运行我的入口,因为我的证书挑战出现此错误:

Waiting for http-01 challenge propagation: failed to perform self check GET request 'http://critsit.io/.well-known/acme-challenge/[challengeId]': Get http://critsit.io/.well-known/acme-challenge/[challengeId]: EOF

我有一个正在占用公共流量的 LoadBalancer 服务,并且证书颁发者会自动创建另外 2 个没有公共 IP 的服务。

我在这里做错了什么?是否存在某些网络问题阻止 Pod 完成 acme 流程?或者也许还有其他什么?

注意:我在 Route53 中设置了一条 A 记录,以将流量引导至 LoadBalancer。

> kubectl get services
NAME                        TYPE           CLUSTER-IP       EXTERNAL-IP                                                               PORT(S)                      AGE
cm-acme-http-solver-m2q2g   NodePort       100.69.86.241    <none>                                                                    8089:31574/TCP               3m34s
cm-acme-http-solver-zs2sd   NodePort       100.67.15.149    <none>                                                                    8089:30710/TCP               3m34s
default-http-backend        NodePort       100.65.125.130   <none>                                                                    80:32485/TCP                 19h
kubernetes                  ClusterIP      100.64.0.1       <none>                                                                    443/TCP                      19h
landing                     ClusterIP      100.68.115.188   <none>                                                                    3001/TCP                     93m
nginx-ingress               LoadBalancer   100.67.204.166   [myELB].us-east-1.elb.amazonaws.com                                       443:30596/TCP,80:30877/TCP   19h

这是我的入口设置:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: critsit-ingress
  namespace: default
  annotations:
    kubernetes.io/ingress.class: "nginx"
    cert-manager.io/acme-challenge-type: "http01"
    cert-manager.io/cluster-issuer: "letsencrypt-prod"
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  tls:
    - hosts:
      - critsit.io
      - app.critsit.io
      secretName: letsencrypt-prod
  rules:
    - host: critsit.io
      http:
        paths:
          - path: /
            backend:
              serviceName: landing
              servicePort: 3001

我的证书颁发者:

apiVersion: cert-manager.io/v1alpha2
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    # The ACME server URL
    server: https://acme-v02.api.letsencrypt.org/directory
    # Email address used for ACME registration
    email: [email protected]
    # Name of a secret used to store the ACME account private key
    privateKeySecretRef:
      name: letsencrypt-prod
    # Enable the HTTP-01 challenge provider
    solvers:
    - http01:
        ingress:
          class:  nginx
      selector: {}

更新:我注意到我的负载均衡器将所有实例标记为 OutOfOrder,因为它们未通过运行状况检查。我想知道这是否与问题有关。

第二次更新:我完全放弃了这条路线,并使用 Istio 重建了我的网络/入口系统

ssl kubernetes kubernetes-ingress lets-encrypt
2个回答
1
投票

您收到的错误消息可能意味着各种各样的问题。但是,为了使其正常工作,您可以检查/执行一些操作:

  1. 完全删除 Ingress、证书和证书管理器。之后将它们全部添加回来以确保其安装干净。有时,过时的证书或错误/多入口路径可能是问题所在。例如,您可以使用 Helm:
helm install my-nginx-ingress stable/nginx-ingress helm repo add jetstack https://charts.jetstack.io helm repo update helm install cert-manager jetstack/cert-manager --namespace cert-manager --version v0.15.0 --set installCRDs=true


    确保您的流量允许 HTTP 或具有受信任证书的 HTTPS。
  1. 检查负载均衡器的发夹模式并确保其正常工作。
  2. 添加:
  3. nginx.ingress.kubernetes.io/ssl-redirect: "false"

    注释到 Ingress 规则。稍等一下,看看是否会创建有效的证书。

    
    

  4. 您可以在 Kubernetes 集群中手动颁发证书。为此,请遵循
  5. 本指南

  6. 问题能够及时解决。目前如果自检失败, 更新状态信息及其原因(例如:自检失败)并且比 稍后重试(以允许传播)。这是预期的行为。
  7. 这是一个持续存在的问题,正在
此处

此处进行跟踪。


0
投票

第一种情况,负载均衡器充当代理,请添加

use-proxy-protocol = "true"

在入口控制器配置中

如果不确保将其设置为 false

有关更多信息,请参阅此文档:

https://docs.digitalocean.com/support/how-do-i-enable-proxy-protocol-when-my-load-balancer-sends-requests-to-the- nginx-ingress-controller/

proxy lbs

© www.soinside.com 2019 - 2024. All rights reserved.