问题描述
在将一些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
文件中,确保secretName
和tls
部分的配置正确指向了部署的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
如果经过以上步骤后仍然无法解决问题,可能需要进一步检查网络配置、负载均衡器