K8s应用NodePort公网访问故障排查及TLS通信配置求助
现有配置文件
Deployment.yml
apiVersion: apps/v1 kind: Deployment metadata: name: wc-deployment spec: replicas: 1 selector: matchLabels: app: wc template: metadata: labels: app: wc spec: containers: - name: wc image: myrepo33/wc:latest ports: - containerPort: 4499
Service.yml
apiVersion: v1 kind: Service metadata: name: wc-service spec: selector: app: wc ports: - protocol: TCP port: 80 targetPort: 4499 nodePort: 30001 type: NodePort
问题解决方案
一、Minikube NodePort公网无法访问修复
- 确认访问IP
Minikube默认运行在虚拟环境中,不能直接用宿主机公网IP访问NodePort。先获取Minikube节点IP:
minikube ip
用这个IP加上30001端口访问。如果是云服务器上用--driver=none运行Minikube,则直接用宿主机公网IP访问。
- 检查网络与关联状态
- 确认云安全组已开放
30001端口TCP入站规则 - 验证Service与Pod的关联:
kubectl get svc wc-service kubectl describe svc wc-service
查看Endpoints字段是否包含Pod IP,为空则检查Deployment标签与Service selector是否一致(当前配置已匹配)。
- Pod连通性测试
通过端口转发验证Pod本身可用性:
kubectl port-forward pod/$(kubectl get pods -l app=wc -o jsonpath='{.items[0].metadata.name}') 4499:4499
本地访问localhost:4499正常则说明Pod无问题,问题出在Service或网络路由。
二、应用TLS通信配置
推荐用Ingress实现TLS终止,更易管理证书与路由。
方案1:Ingress TLS终止(推荐)
- 启用Minikube Ingress插件
minikube addons enable ingress
- 创建TLS证书与Secret
生成自签名证书(生产环境建议用权威CA证书):
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=wc.example.com/O=wc"
将证书存入K8s Secret:
kubectl create secret tls wc-tls --key tls.key --cert tls.crt
- 创建Ingress配置(ingress.yml)
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: wc-ingress annotations: nginx.ingress.kubernetes.io/ssl-redirect: "true" spec: tls: - hosts: - wc.example.com secretName: wc-tls rules: - host: wc.example.com http: paths: - path: / pathType: Prefix backend: service: name: wc-service port: number: 80
应用配置:
kubectl apply -f ingress.yml
- 访问测试
获取Ingress控制器IP:minikube ip,在本地hosts添加Minikube_IP wc.example.com映射,访问https://wc.example.com即可通过TLS访问应用。公网访问需将域名解析到Minikube节点公网IP。
方案2:容器内直接配置TLS
- 创建应用证书Secret
kubectl create secret generic wc-app-tls --from-file=server.crt=tls.crt --from-file=server.key=tls.key
- 修改Deployment挂载证书
apiVersion: apps/v1 kind: Deployment metadata: name: wc-deployment spec: replicas: 1 selector: matchLabels: app: wc template: metadata: labels: app: wc spec: containers: - name: wc image: myrepo33/wc:latest ports: - containerPort: 443 volumeMounts: - name: tls-secret mountPath: /app/tls # 替换为应用证书存放路径 readOnly: true volumes: - name: tls-secret secret: secretName: wc-app-tls
- 修改Service指向443端口
apiVersion: v1 kind: Service metadata: name: wc-service spec: selector: app: wc ports: - protocol: TCP port: 443 targetPort: 443 nodePort: 30001 type: NodePort
重新应用配置后,访问https://Minikube_IP:30001即可通过TLS访问。
内容的提问来源于stack exchange,提问作者Patil
相关产品推荐
相关产品推荐

