Kubernetes Ingress不接受自签名SSL证书问题求助
问题:Minikube部署Ingress后无法加载自定义自签名SSL证书
在VMware虚拟机的Kali Linux环境中,使用minikube本地部署Kubernetes Ingress时,出现Ingress不加载自定义自签名SSL证书的问题:通过Firefox或curl访问时,返回的是Kubernetes Ingress Controller Fake Certificate,而非自行配置的证书。
相关配置与操作
Ingress YAML配置
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: first-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: / nginx.ingress.kubernetes.io/force-ssl-redirect: "true" nginx.ingress.kubernetes.io/ssl-redirect: "true" spec: tls: - hosts: - example.com secretName: myssl rules: - host: example.com http: paths: - path: / pathType: Prefix backend: service: name: first-service port: number: 8080
自签名证书生成命令
openssl genrsa -out s.key 2048 openssl req -new -key s.key -out s.csr -subj "/CN=example.com" openssl x509 -req -days 365 -in s.csr -signkey s.key -out s.crt
创建Secret命令
kubectl create secret tls myssl --cert s.crt --key s.key
curl验证输出(关键片段)
* Server certificate: * subject: O=Acme Co; CN=Kubernetes Ingress Controller Fake Certificate * start date: Oct 22 09:57:19 2022 GMT * expire date: Oct 22 09:57:19 2023 GMT * issuer: O=Acme Co; CN=Kubernetes Ingress Controller Fake Certificate
调试发现:通过minikube addons enable ingress安装的Ingress Controller位于ingress-nginx命名空间,而存储证书的Secret在default命名空间。
问题原因与解决方案
原因确认
是的,这就是导致证书无法加载的核心问题。Nginx Ingress Controller运行在ingress-nginx命名空间,默认只能读取同一命名空间下的Secret资源。如果证书Secret在其他命名空间,Controller无法访问到该资源,就会自动使用内置的Fake Certificate作为 fallback。
解决方法
方法1:将Secret迁移至Ingress Controller所在命名空间(推荐)
- 删除
default命名空间下的旧Secret:
kubectl delete secret myssl -n default
- 在
ingress-nginx命名空间重新创建证书Secret:
kubectl create secret tls myssl --cert s.crt --key s.key -n ingress-nginx
- 更新Ingress配置,指定Secret所在的命名空间:
修改Ingress YAML的tls段,添加secretNamespace字段:
spec: tls: - hosts: - example.com secretName: myssl secretNamespace: ingress-nginx # 新增字段,指定Secret的命名空间
- 应用更新后的Ingress配置:
kubectl apply -f your-ingress-file.yaml
方法2:扩展Ingress Controller权限,允许跨命名空间读取Secret
适用于需要在多个命名空间共享证书的场景,但需注意权限范围:
- 编辑Ingress Controller的ClusterRole,添加读取所有命名空间Secret的权限:
kubectl edit clusterrole ingress-nginx
- 在
rules节点下添加以下规则:
- apiGroups: [""] resources: ["secrets"] verbs: ["get", "list", "watch"]
- 重启Ingress Controller Pod,使权限变更生效:
kubectl rollout restart deployment ingress-nginx-controller -n ingress-nginx
验证步骤
- 配置本地域名映射:在
/etc/hosts中添加一行,将example.com指向Ingress的IP:
192.168.49.2 example.com
- 用
curl验证证书是否生效:
curl -kv https://example.com
此时输出中应显示你自定义的example.com证书信息,而非Fake Certificate。
内容的提问来源于stack exchange,提问作者yogihosting
相关产品推荐
相关产品推荐

