跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
Kubernetes NodePort
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
{{DISPLAYTITLE:Kubernetes NodePort}} '''Kubernetes NodePort''' 是一种服务类型,允许从集群外部通过任意节点的IP地址和静态端口(NodePort)访问应用程序。它是Kubernetes中实现服务暴露的基础方式之一,适用于开发测试或需要直接节点访问的场景。 == 概述 == NodePort服务会在每个集群节点的相同端口上开放服务,并将流量路由到后端的Pod。其工作原理如下: 1. 在30000-32767范围内分配一个静态端口(可手动指定) 2. 所有节点监听该端口 3. 流量通过kube-proxy转发到对应Service的ClusterIP 4. 最终通过Endpoints路由到Pod NodePort是ClusterIP的超集,会自动创建ClusterIP作为中间层。 == 基本语法 == NodePort服务的YAML定义包含以下关键字段: <syntaxhighlight lang="yaml"> apiVersion: v1 kind: Service metadata: name: my-nodeport-service spec: type: NodePort selector: app: my-app ports: - protocol: TCP port: 80 # Service监听的端口 targetPort: 80 # 容器暴露的端口 nodePort: 31000 # 可选的指定端口(默认随机) </syntaxhighlight> == 工作原理 == <mermaid> graph LR ExternalUser([外部用户]) -->|访问 nodeIP:nodePort| Node1[节点1:31000] ExternalUser -->|访问 nodeIP:nodePort| Node2[节点2:31000] Node1 -->|通过kube-proxy转发| Service[Service:ClusterIP] Node2 -->|通过kube-proxy转发| Service Service -->|负载均衡| Pod1[Pod1] Service -->|负载均衡| Pod2[Pod2] </mermaid> 数学表达上,端口映射关系为: <math>nodePort \rightarrow port \rightarrow targetPort</math> == 创建示例 == 1. 首先部署示例应用: <syntaxhighlight lang="yaml"> apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80 </syntaxhighlight> 2. 创建NodePort服务: <syntaxhighlight lang="yaml"> apiVersion: v1 kind: Service metadata: name: nginx-service spec: type: NodePort selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 nodePort: 31000 </syntaxhighlight> 3. 验证服务: <syntaxhighlight lang="bash"> kubectl get svc nginx-service # 输出示例: # NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE # nginx-service NodePort 10.96.123.123 <none> 80:31000/TCP 2m </syntaxhighlight> == 访问方式 == 假设节点IP为192.168.1.100和192.168.1.101,可通过以下任一种方式访问: * http://192.168.1.100:31000 * http://192.168.1.101:31000 == 使用场景 == '''典型用例''': * 开发环境快速暴露服务 * 需要直接节点访问的特定场景 * 与外部负载均衡器配合使用前的临时方案 '''生产环境注意事项''': 1. 建议配合Ingress或LoadBalancer使用 2. 节点IP变化时需要更新客户端配置 3. 需要手动管理端口冲突 == 高级配置 == === 多端口暴露 === <syntaxhighlight lang="yaml"> ports: - name: http protocol: TCP port: 80 targetPort: 80 nodePort: 31000 - name: metrics protocol: TCP port: 8080 targetPort: 8080 nodePort: 31001 </syntaxhighlight> === 保留客户端源IP === 需要设置externalTrafficPolicy: <syntaxhighlight lang="yaml"> spec: externalTrafficPolicy: Local </syntaxhighlight> == 限制与替代方案 == '''局限性''': * 端口范围受限(30000-32767) * 需要手动管理节点IP * 节点故障时不会自动转移 '''替代方案比较''': {| class="wikitable" |- ! 类型 || 适用场景 || 特点 |- | ClusterIP || 集群内部访问 || 默认类型,最安全 |- | NodePort || 节点直接暴露 || 需要知道节点IP |- | LoadBalancer || 云环境生产使用 || 自动分配外部IP |- | Ingress || HTTP服务管理 || 提供高级路由功能 |} == 故障排查 == 常见问题及解决方法: 1. '''无法访问NodePort''': - 检查节点防火墙规则 - 验证kube-proxy是否正常运行 - 确认Pod的ready状态 2. '''端口冲突''': <syntaxhighlight lang="bash"> netstat -tuln | grep 31000 </syntaxhighlight> 3. '''查看服务详情''': <syntaxhighlight lang="bash"> kubectl describe svc nginx-service </syntaxhighlight> == 最佳实践 == 1. 在测试环境使用自动分配的NodePort 2. 生产环境指定明确的nodePort避免冲突 3. 配合网络策略限制访问来源 4. 监控节点端口使用情况 通过理解NodePort的工作原理和适用场景,可以更有效地设计Kubernetes的网络暴露策略。 [[Category:集成部署]] [[Category:Kubernetes]] [[Category:Kubernetes服务与网络]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)