跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
Kubernetes ClusterIP
”︁(章节)
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= Kubernetes ClusterIP = == 介绍 == '''ClusterIP''' 是 Kubernetes 中默认的 Service 类型,它为集群内部的其他组件提供一个稳定的虚拟 IP 地址(VIP),用于访问一组 Pod。ClusterIP 服务仅在集群内部可用,外部流量无法直接访问它。它通常用于微服务架构中的内部通信,例如后端服务之间的调用。 ClusterIP 的主要特点: * 提供一个稳定的 IP 地址和 DNS 名称,供集群内部使用。 * 通过标签选择器(Label Selector)动态关联后端 Pod。 * 支持 TCP、UDP 和 SCTP 协议。 * 默认情况下,ClusterIP 是自动分配的,但也可以手动指定。 == 工作原理 == ClusterIP 服务通过以下机制工作: 1. 用户创建一个 ClusterIP 类型的 Service,并定义标签选择器(Selector)来匹配目标 Pod。 2. Kubernetes 的控制平面会为该 Service 分配一个虚拟 IP(ClusterIP)。 3. kube-proxy 组件在每个节点上配置 iptables 或 IPVS 规则,将发往 ClusterIP 的流量转发到后端 Pod。 4. 集群内的其他组件可以通过 ClusterIP 或 Service 的 DNS 名称访问该服务。 <mermaid> graph LR A[Client Pod] -->|Request| B(ClusterIP: 10.96.123.456) B --> C[Pod 1] B --> D[Pod 2] B --> E[Pod 3] </mermaid> == 创建 ClusterIP 服务 == 以下是一个典型的 ClusterIP Service 的 YAML 定义示例: <syntaxhighlight lang="yaml"> apiVersion: v1 kind: Service metadata: name: my-service spec: type: ClusterIP # 可省略,因为这是默认类型 selector: app: my-app # 匹配具有标签 app=my-app 的 Pod ports: - protocol: TCP port: 80 # Service 监听的端口 targetPort: 9376 # Pod 上实际暴露的端口 </syntaxhighlight> 应用此配置: <syntaxhighlight lang="bash"> kubectl apply -f service.yaml </syntaxhighlight> 验证服务: <syntaxhighlight lang="bash"> kubectl get svc my-service </syntaxhighlight> 输出示例: <pre> NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE my-service ClusterIP 10.96.123.456 <none> 80/TCP 5s </pre> == DNS 解析 == Kubernetes 为每个 Service 提供 DNS 名称解析。在同一个命名空间中,可以通过 <code>my-service</code> 访问该服务。跨命名空间则需要使用完全限定域名(FQDN): <code>my-service.my-namespace.svc.cluster.local</code> 示例(在 Pod 内部测试): <syntaxhighlight lang="bash"> nslookup my-service </syntaxhighlight> == 实际应用场景 == '''场景1:前端访问后端API''' 假设您有一个前端应用(frontend)需要访问后端API服务(backend-api): 1. 后端部署: <syntaxhighlight lang="yaml"> apiVersion: apps/v1 kind: Deployment metadata: name: backend-api spec: selector: matchLabels: app: backend-api template: metadata: labels: app: backend-api spec: containers: - name: api image: my-api-image ports: - containerPort: 8080 </syntaxhighlight> 2. 后端服务: <syntaxhighlight lang="yaml"> apiVersion: v1 kind: Service metadata: name: backend-api spec: selector: app: backend-api ports: - protocol: TCP port: 80 targetPort: 8080 </syntaxhighlight> 3. 前端配置可以通过 <code>http://backend-api</code> 访问后端服务。 '''场景2:数据库访问''' 为数据库创建 ClusterIP 服务可以确保应用始终通过固定地址访问数据库,即使数据库 Pod 重启或重新调度: <syntaxhighlight lang="yaml"> apiVersion: v1 kind: Service metadata: name: mysql-service spec: selector: app: mysql ports: - protocol: TCP port: 3306 targetPort: 3306 </syntaxhighlight> 应用可以通过 <code>mysql-service:3306</code> 访问 MySQL 数据库。 == 高级配置 == === 手动指定 ClusterIP === 您可以在创建 Service 时指定特定的 ClusterIP(必须在有效的 ClusterIP 范围内): <syntaxhighlight lang="yaml"> apiVersion: v1 kind: Service metadata: name: static-ip-service spec: clusterIP: 10.96.100.100 # 手动指定的 IP selector: app: my-app ports: - protocol: TCP port: 80 targetPort: 8080 </syntaxhighlight> === 多端口服务 === ClusterIP 服务可以暴露多个端口: <syntaxhighlight lang="yaml"> apiVersion: v1 kind: Service metadata: name: multi-port-service spec: selector: app: my-app ports: - name: http protocol: TCP port: 80 targetPort: 8080 - name: metrics protocol: TCP port: 9090 targetPort: 9090 </syntaxhighlight> == 负载均衡机制 == ClusterIP 服务默认使用 kube-proxy 实现负载均衡: * '''iptables 模式''':默认模式,通过 iptables 规则随机选择后端 Pod * '''IPVS 模式''':更高效的负载均衡,支持多种调度算法(rr, wrr, lc, wlc 等) 可以通过以下命令检查 kube-proxy 模式: <syntaxhighlight lang="bash"> kubectl get configmap -n kube-system kube-proxy -o yaml | grep mode </syntaxhighlight> == 限制与注意事项 == 1. ClusterIP 只能在集群内部访问 2. ClusterIP 是虚拟IP,无法 ping 通 3. 服务发现依赖于 Kubernetes DNS 4. 如果 Pod 没有正确标签,服务将无法关联到任何端点 == 故障排查 == 如果 ClusterIP 服务无法正常工作: 1. 检查服务是否已创建: <syntaxhighlight lang="bash"> kubectl get svc </syntaxhighlight> 2. 检查端点是否正确: <syntaxhighlight lang="bash"> kubectl get endpoints <service-name> </syntaxhighlight> 3. 检查 Pod 标签是否匹配服务的选择器: <syntaxhighlight lang="bash"> kubectl get pods --show-labels </syntaxhighlight> 4. 从集群内部测试连接: <syntaxhighlight lang="bash"> kubectl run -it --rm test --image=busybox --restart=Never -- sh wget -O- http://my-service:80 </syntaxhighlight> == 数学表示 == ClusterIP 服务的负载均衡可以表示为: <math> P_i = \frac{1}{N}, \quad i = 1,2,...,N </math> 其中: * <math>P_i</math> 是请求被路由到第 i 个 Pod 的概率 * <math>N</math> 是后端 Pod 的数量 == 总结 == ClusterIP 是 Kubernetes 网络模型的基础组件,为集群内部通信提供了稳定可靠的抽象层。通过理解 ClusterIP 的工作原理和配置方法,您可以更好地设计和管理 Kubernetes 中的微服务架构。 [[Category:集成部署]] [[Category:Kubernetes]] [[Category:Kubernetes服务与网络]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)