Kubernetes中Ingress控制器中找不到证书的问题

71次阅读
没有评论

问题描述

在将一些Web应用程序部署到Kubernetes时,遇到了通过Ingress控制器将域映射到集群的问题。当用户进入Ingress控制器Pod时,他们可以看到以下日志条目:

Error getting SSL certificate "sitecore/global-cd-tls": local SSL certificate sitecore/global-cd-tls was not found. Using default certificate
Error getting SSL certificate "sitecore/global-cm-tls": local SSL certificate sitecore/global-cm-tls was not found. Using default certificate
Error getting SSL certificate "sitecore/global-id-tls": local SSL certificate sitecore/global-id-tls was not found. Using default certificate
processed ingress via admission controller {testedIngressLength:1 testedIngressTime:0.051s renderingIngressLength:1 renderingIngressTime:0.001s admissionTime:26.2kBs testedConfigurationSize:0.052}
"successfully validated configuration, accepting" ingress="sitecore/sitecore-ingress"
"Found valid IngressClass" ingress="sitecore/sitecore-ingress" ingressclass="nginx"
"Adding secret to local store" name="sitecore/global-cd-tls"
"Adding secret to local store" name="sitecore/global-cm-tls"
"Adding secret to local store" name="sitecore/global-id-tls"

然而,相关的证书已经生成并部署为与Ingress资源和控制器相同命名空间中的Secret。

用户尝试了一些解决方案,但并没有获得与证书类型相关的其他错误日志条目。以下是用户使用的部署控制器命令:

.\helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
.\helm repo update
.\helm install nginx-ingress ingress-nginx/ingress-nginx \
    --namespace sitecore \
    --set controller.replicaCount=2 \
    --set controller.nodeSelector."kubernetes\.io/os"=linux \
    --set defaultBackend.nodeSelector."kubernetes\.io/os"=linux \
    --set controller.admissionWebhooks.patch.nodeSelector."kubernetes\.io/os"=linux

用户提供了一个示例的ingress.yaml文件,但为了简洁起见,已删除了cd和id的部分。

用户确认以下内容:
– cm/cd/id Pods已部署并显示出Initialized/Ready/ContainersReady/PodScheduled的TRUE状态。
– 使用kubectl get ingress命令返回了(cd.globalhost, cm.globalhost, id.globalhost)的Ingress资源,带有来自负载均衡器的外部IP。
– 使用kubectl get services命令返回了一个(nginx-ingress-ingress-nginx-controller LoadBalancer (有效的外部IP))的Service条目。
– 用户已运行脚本生成了TLS .crt和.key文件。
– 用户已部署了Secret。
– 用户已创建了将cm.globalhost映射到nginx外部负载均衡器IP地址的本地主机条目。
– 所有其他的Pod都处于健康状态。
– 所有组件都部署到了相同的”sitecore”命名空间。

访问站点
尝试访问URL时,无法访问站点。在Ingress Pod内部,以下命令会得到308重定向:

curl -H "HOST: cm.globalhost" localhost

解决方案

根据问题描述,用户在部署Kubernetes集群和Ingress控制器时遇到了证书问题,导致无法访问站点。以下是解决该问题的可能方案:

步骤1:检查Secret

首先,确保在部署证书时没有出现错误。检查已部署的Secret,确保其名称和证书文件正确。使用以下命令查看Secret的详细信息:

kubectl get secrets -n sitecore
kubectl describe secret <secret_name> -n sitecore

步骤2:证书路径

确认Ingress资源中证书的路径是否正确。在你的ingress.yaml文件中,确保secretNametls部分的配置正确指向了部署的Secret。

...
tls:
  - secretName: global-cm-tls
    hosts:
      - cm.globalhost
...

步骤3:Ingress Controller配置

确认Ingress Controller的配置是否正确。检查Ingress Controller的配置文件,确保其命名空间和证书配置正确。你可以通过以下步骤检查:
1. 获取Ingress Controller的Pod名称:
bash
kubectl get pods -n sitecore | grep ingress-nginx-controller

2. 进入Ingress Controller Pod:
bash
kubectl exec -it <pod_name> -n sitecore -- /bin/sh

3. 在Pod内部,检查以下文件内容:
/etc/nginx/nginx.conf
/etc/nginx/conf.d/default-ssl.conf

步骤4:证书文件路径

确认证书文件的路径是否正确。在Ingress Controller的配置文件中,确保证书文件的路径与Secret中的文件名相匹配。你可以在Ingress Controller的Pod内部查看这些文件:

ls /etc/ssl/certs

步骤5:域名解析

检查域名解析是否正确。确保在你的本地计算机或其他主机上,将域名解析正确映射到了外部负载均衡器的IP地址。

步骤6:TLS配置

检查TLS配置是否正确。你可以使用以下命令查看Ingress Controller Pod中的TLS配置情况:

kubectl exec -it <pod_name> -n sitecore -- cat /etc/nginx/nginx.conf | grep ssl_certificate

步骤7:验证日志

检查Ingress Controller Pod的日志,查看是否有其他有关证书的错误消息。你可以使用以下命令查看日志:

kubectl logs <pod_name> -n sitecore

如果经过以上步骤后仍然无法解决问题,可能需要进一步检查网络配置、负载均衡器

正文完