Kubernetes使用命名targetPort无法连接服务的问题
问题分析与解决
你的配置核心问题并非端口命名不能用于Service的targetPort,而是容器健康探针的配置错误,导致Pod无法进入就绪状态,Service无法将流量转发到Pod上。
具体错误点
在Deployment的startupProbe和livenessProbe中,你指定了port: http,但容器端口的名称是http-port而非http。K8s无法识别这个不存在的端口名称,导致探针检查失败,Pod会一直处于未就绪状态——而Service只会将流量转发到就绪的Pod,因此你无法访问站点。
另外需要明确:Service中使用端口名称作为targetPort是完全合法的,这一方式适用于所有关联Pod的Service,和Deployment本身没有关系。
修正后的配置
只需将探针里的port: http改为port: http-port,同时保留Service的targetPort: http-port即可正常工作:
apiVersion: apps/v1 kind: Deployment metadata: name: app-deployment spec: revisionHistoryLimit: 3 selector: matchLabels: pod: 338f54d2-8f89-4602-a848-efcbcb63233f template: metadata: labels: pod: 338f54d2-8f89-4602-a848-efcbcb63233f svc: app spec: imagePullSecrets: - name: regcred containers: - name: server image: server ports: - name: http-port containerPort: 3000 resources: limits: memory: 128Mi requests: memory: 36Mi envFrom: - secretRef: name: db-env - secretRef: name: oauth-env startupProbe: httpGet: port: http-port # 修正为正确的端口名称 path: / initialDelaySeconds: 1 periodSeconds: 1 failureThreshold: 10 livenessProbe: httpGet: port: http-port # 修正为正确的端口名称 path: / periodSeconds: 15 --- apiVersion: v1 kind: Service metadata: name: app-service spec: selector: pod: 338f54d2-8f89-4602-a848-efcbcb63233f ports: - port: 80 targetPort: http-port
为什么改targetPort: 3000能访问?
当你直接用端口号作为targetPort时,若容器确实在3000端口正常提供服务,且Pod尚未因探针失败被K8s重启,可能存在短暂窗口让你能访问,但这不是稳定状态——长期来看,失败的探针会导致Pod不断重启,服务依然会出现异常。正确做法是修正探针的端口名称,让Pod能正常通过健康检查,进入就绪状态。
内容的提问来源于stack exchange,提问作者mpen
相关产品推荐
相关产品推荐

