跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
Kubernetes服务
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= Kubernetes服务 = == 介绍 == '''Kubernetes服务'''(Service)是Kubernetes中的核心概念之一,用于为一组功能相同的Pod提供稳定的网络访问入口。由于Pod是临时性的(可能会被调度、重启或替换),直接通过Pod IP访问是不可靠的。服务通过抽象的方式,为Pod提供固定的虚拟IP(ClusterIP)、DNS名称或外部可访问的端点(NodePort/LoadBalancer),从而确保应用程序的可靠访问。 服务的主要功能包括: * '''负载均衡''':将流量均匀分配到后端Pod。 * '''服务发现''':通过DNS或环境变量让其他服务发现当前服务。 * '''解耦''':客户端无需关心后端Pod的具体位置或状态变化。 == 服务类型 == Kubernetes支持以下服务类型: {| class="wikitable" |- ! 类型 !! 描述 !! 适用场景 |- | '''ClusterIP''' || 默认类型,分配集群内部IP,仅集群内可访问 || 内部服务通信 |- | '''NodePort''' || 在每个节点上开放静态端口(30000-32767),外部可通过<code>节点IP:端口</code>访问 || 开发测试或简单外部访问 |- | '''LoadBalancer''' || 通过云提供商的负载均衡器分配外部IP || 生产环境外部访问 |- | '''ExternalName''' || 将服务映射到外部DNS名称(如数据库服务) || 集成外部服务 |} == 服务工作原理 == 服务通过'''标签选择器'''(Label Selector)关联一组Pod。当创建服务时,Kubernetes会创建对应的Endpoints对象,动态更新后端Pod的IP列表。 <mermaid> graph LR Client -->|请求| Service[Service: my-svc] Service -->|负载均衡| Pod1[Pod A] Service -->|负载均衡| Pod2[Pod B] Service -->|负载均衡| Pod3[Pod C] </mermaid> === 流量路由流程 === 1. 客户端向服务的虚拟IP(ClusterIP)发送请求。 2. kube-proxy组件通过iptables/ipvs规则将流量转发到后端Pod。 3. 如果使用NodePort或LoadBalancer,流量会先到达节点或外部负载均衡器。 == YAML配置示例 == 以下是一个ClusterIP服务的定义示例: <syntaxhighlight lang="yaml"> apiVersion: v1 kind: Service metadata: name: my-web-service spec: type: ClusterIP # 可省略,默认为ClusterIP selector: app: nginx # 选择标签为app=nginx的Pod ports: - protocol: TCP port: 80 # 服务端口 targetPort: 80 # Pod上的端口 </syntaxhighlight> 创建后,集群内其他组件可通过以下方式访问该服务: * DNS名称:<code>my-web-service.default.svc.cluster.local</code> * 环境变量:<code>MY_WEB_SERVICE_SERVICE_HOST</code> == 实际案例 == === 案例1:部署Web应用 === 假设有一个三副本的Nginx Deployment: <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:alpine ports: - containerPort: 80 </syntaxhighlight> 为其创建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: 30080 # 手动指定(可选) </syntaxhighlight> 此时可通过任意节点IP的30080端口访问Nginx。 === 案例2:数据库服务抽象 === 对于需要连接外部数据库的场景,可以使用ExternalName: <syntaxhighlight lang="yaml"> apiVersion: v1 kind: Service metadata: name: mysql-service spec: type: ExternalName externalName: mysql.prod.example.com # 实际数据库地址 </syntaxhighlight> 应用程序只需连接<code>mysql-service</code>即可,无需关心实际数据库位置变化。 == 高级主题 == === 会话保持(Session Affinity) === 通过设置<code>sessionAffinity: ClientIP</code>,可将同一客户端的请求始终路由到同一个Pod: <syntaxhighlight lang="yaml"> spec: sessionAffinity: ClientIP sessionAffinityConfig: clientIP: timeoutSeconds: 3600 </syntaxhighlight> === Headless服务 === 当不需要负载均衡时(如StatefulSet),可创建无ClusterIP的服务: <syntaxhighlight lang="yaml"> spec: clusterIP: None # 标记为Headless </syntaxhighlight> 客户端将直接获取所有后端Pod的IP列表。 === 服务拓扑路由 === Kubernetes 1.17+支持基于节点拓扑的路由: <syntaxhighlight lang="yaml"> spec: topologyKeys: - "kubernetes.io/hostname" - "topology.kubernetes.io/zone" </syntaxhighlight> == 数学原理 == 服务的负载均衡可建模为流量分配问题。设: * 有<math>n</math>个后端Pod * 第<math>i</math>个Pod的权重为<math>w_i</math>(默认为1) 则请求分配到Pod<math>i</math>的概率为: <math> P_i = \frac{w_i}{\sum_{j=1}^{n} w_j} </math> == 常见问题 == '''Q:服务与Ingress有什么区别?''' A:服务是L4(TCP/UDP)抽象,而Ingress是L7(HTTP/HTTPS)路由规则,通常需要配合Ingress Controller使用。 '''Q:如何调试服务无法访问的问题?''' 1. 检查Endpoints是否包含预期Pod:<code>kubectl get endpoints <service-name></code> 2. 检查kube-proxy是否正常运行 3. 验证网络策略(NetworkPolicy)是否允许流量 == 总结 == Kubernetes服务是微服务架构中的关键组件,它: * 提供稳定的访问端点 * 实现自动负载均衡 * 支持多种暴露方式 * 与服务发现机制深度集成 通过合理使用服务,开发者可以构建高可用、松耦合的分布式系统。 [[Category:集成部署]] [[Category:Kubernetes]] [[Category:Kubernetes核心概念]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)