跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
Kubernetes Service概念
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= Kubernetes Service概念 = == 介绍 == '''Kubernetes Service''' 是 Kubernetes 中用于定义一组 Pod 的逻辑集合及其访问策略的核心抽象。它提供了一种稳定的网络端点,使得应用程序可以通过固定的 IP 地址或 DNS 名称访问动态变化的 Pod 实例。Service 解决了 Pod 因重启、扩展或故障导致 IP 地址变化的问题,是 Kubernetes 网络模型的关键组件。 Service 的主要功能包括: * 提供稳定的虚拟 IP(ClusterIP)和 DNS 名称 * 负载均衡流量到后端 Pod * 支持多种服务类型(ClusterIP、NodePort、LoadBalancer、ExternalName) * 通过标签选择器(Label Selector)动态关联 Pod == Service 类型 == Kubernetes 支持四种主要 Service 类型: === 1. ClusterIP === 默认类型,为服务分配一个集群内部IP,只能在集群内部访问。 === 2. NodePort === 在 ClusterIP 基础上,在每个节点上开放一个静态端口(NodePort),外部可通过 <节点IP>:<NodePort> 访问服务。 === 3. LoadBalancer === 在 NodePort 基础上,使用云提供商的负载均衡器将外部流量导入服务。 === 4. ExternalName === 通过 CNAME 记录将服务映射到外部 DNS 名称。 <mermaid> graph LR A[Client] -->|ClusterIP| B[Service] A -->|NodePort| C[NodeIP:Port] A -->|LoadBalancer| D[Cloud LB] B --> E[Pod] B --> F[Pod] C --> E C --> F D --> E D --> F </mermaid> == 核心机制 == === 标签选择器 === Service 通过标签选择器(Label Selector)确定哪些 Pod 属于服务后端: <syntaxhighlight lang="yaml"> apiVersion: v1 kind: Service metadata: name: my-service spec: selector: app: my-app tier: frontend ports: - protocol: TCP port: 80 targetPort: 9376 </syntaxhighlight> 此配置会选择所有带有 <code>app=my-app</code> 和 <code>tier=frontend</code> 标签的 Pod。 === 服务发现 === Kubernetes 提供两种服务发现方式: 1. '''环境变量''':Pod 启动时,kubelet 会为每个活动 Service 注入环境变量 2. '''DNS'''(推荐):集群 DNS 服务(如 CoreDNS)会为 Service 创建 DNS 记录 == 实际案例 == === 案例1:部署Web应用服务 === 部署一个Nginx服务并通过ClusterIP访问: <syntaxhighlight lang="yaml"> # 部署Pod apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: selector: matchLabels: app: nginx replicas: 3 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80 # 创建Service apiVersion: v1 kind: Service metadata: name: nginx-service spec: selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 </syntaxhighlight> 应用后可通过以下命令验证: <syntaxhighlight lang="bash"> # 获取Service信息 kubectl get svc nginx-service # 从集群内部访问 kubectl run curl --image=curlimages/curl -it --rm -- curl http://nginx-service </syntaxhighlight> === 案例2:暴露服务到外部 === 将上述服务改为NodePort类型: <syntaxhighlight lang="yaml"> apiVersion: v1 kind: Service metadata: name: nginx-nodeport spec: type: NodePort selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 nodePort: 30007 </syntaxhighlight> 此时可通过任何节点IP的30007端口访问服务。 == 高级主题 == === 会话保持(Session Affinity) === 通过设置 <code>sessionAffinity: ClientIP</code> 可将来自同一客户端的请求转发到同一Pod: <syntaxhighlight lang="yaml"> apiVersion: v1 kind: Service metadata: name: affinity-service spec: sessionAffinity: ClientIP selector: app: webapp ports: - protocol: TCP port: 80 targetPort: 8080 </syntaxhighlight> === 无头服务(Headless Service) === 指定 <code>clusterIP: None</code> 可创建无头服务,直接返回Pod IP而非代理: <syntaxhighlight lang="yaml"> apiVersion: v1 kind: Service metadata: name: headless-service spec: clusterIP: None selector: app: stateful-app ports: - protocol: TCP port: 80 targetPort: 9376 </syntaxhighlight> == 数学表示 == Service的负载均衡可表示为权重分配问题: <math> W_i = \frac{1}{n} \quad \text{对于} \ i = 1,2,...,n </math> 其中<math>W_i</math>是第i个Pod的权重,n是后端Pod数量(默认均等分配)。 == 常见问题 == '''Q: Service和Ingress有什么区别?''' A: Service是L4(TCP/UDP)抽象,而Ingress是L7(HTTP/HTTPS)抽象,提供基于路径和主机的路由。 '''Q: 如何调试Service连接问题?''' A: 可按以下步骤检查: 1. 验证Endpoints是否存在:<code>kubectl get endpoints <service-name></code> 2. 检查标签选择器匹配 3. 测试从Pod内部直接访问目标端口 4. 检查网络策略(NetworkPolicy)是否阻止流量 == 总结 == Kubernetes Service是微服务架构中的关键网络抽象,它: * 提供稳定的服务端点 * 实现负载均衡 * 支持多种暴露方式 * 通过标签实现动态后端关联 理解Service概念是掌握Kubernetes网络模型的基础,对于构建可靠、可扩展的分布式系统至关重要。 [[Category:集成部署]] [[Category:Kubernetes]] [[Category:Kubernetes服务与网络]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)