news 2026/4/26 6:23:47

Kubernetes 应用连接到 Service 完全指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Kubernetes 应用连接到 Service 完全指南

Kubernetes 应用连接到 Service 完全指南

1. Kubernetes 连接容器模型

Kubernetes 网络模型与 Docker 核心差异:

  • Docker 默认行为:容器使用私有主机网络,跨节点通信需手动配置端口映射 / 代理,端口协调难度大。

  • Kubernetes 网络模型

  1. 每个 Pod 分配独立集群私有 IP,无需 NAT 即可跨节点与其他 Pod 通信。

  2. Pod 内容器共享网络命名空间,可通过本地端口直接通信。

  3. 避免依赖主机端口映射,支持多 Pod 共享相同容器端口(通过 Pod IP 区分)。

  • 核心原则:Pod 是网络通信的基本单元,集群内所有 Pod 处于扁平网络空间。

2. 在集群中暴露 Pod

通过 Deployment 创建带网络配置的 Nginx Pod(示例):

# run-my-nginx.yaml apiVersion: apps/v1beta1 kind: Deployment metadata: name: my-nginx spec: replicas: 2 # 2个副本保证高可用 template: metadata: labels: run: my-nginx # 标签用于关联 Service spec: containers: - name: my-nginx image: nginx ports: - containerPort: 80 # 声明容器暴露端口(仅标识作用,非端口映射)

执行部署与验证:

# 创建 Deployment $ kubectl create -f ./run-my-nginx.yaml # 查看 Pod 状态及 IP(确保 STATUS 为 Running) $ kubectl get pods -l run=my-nginx -o wide # 验证 Pod 网络可达性(集群内任意节点执行) $ curl 0 # 如 curl 10.244.3.4:80

3. 创建 Service

Service 解决 Pod 动态 IP 问题,提供固定访问入口和负载均衡:

3.1 核心作用
  • 为一组相同功能的 Pod 分配固定集群 IP(ClusterIP)。

  • 自动负载均衡流量到后端 Pod。

  • 动态维护 Endpoints 列表(Pod 新增 / 删除时自动更新)。

3.2 创建方式
方式 1:kubectl expose 快速创建
# 基于 Deployment 自动关联标签选择器 $ kubectl expose deployment/my-nginx
方式 2:YAML 配置创建(推荐,可定制化)
# nginx-svc.yaml apiVersion: v1 kind: Service metadata: name: my-nginx labels: run: my-nginx spec: ports: - port: 80 # Service 暴露端口(集群内访问用) protocol: TCP targetPort: 80 # 对应 Pod 的容器端口 selector: run: my-nginx # 匹配 Pod 标签(关键关联字段)

执行创建与验证:

$ kubectl create -f ./nginx-svc.yaml # 查看 Service 信息(获取 ClusterIP) $ kubectl get svc my-nginx # 查看关联的 Endpoints(应包含所有 Pod IP:端口) $ kubectl get ep my-nginx

4. 访问 Service

Kubernetes 支持两种服务发现模式,优先推荐 DNS 方式:

4.1 环境变量(适用于简单场景)
  • 原理:kubelet 为每个活跃 Service 向 Pod 注入环境变量,Pod 可通过变量获取 Service 地址。

  • 限制:Service 必须在 Pod 创建前存在,否则变量注入失败。

  • 验证命令:

# 查看 Pod 内的 Service 环境变量 $ kubectl exec > -- printenv | grep SERVICE # 示例输出(包含 Service IP 和端口) MY_NGINX_SERVICE_HOST=10.0.162.149 MY_NGINX_SERVICE_PORT=80
4.2 DNS(推荐,灵活稳定)
  • 依赖:需启用kube-dns集群插件(默认多数集群已安装)。

  • 原理:DNS 自动为 Service 分配域名(格式:<service-name>.<namespace>.svc.cluster.local),同命名空间可省略命名空间部分。

  • 验证步骤:

  1. 检查 kube-dns 状态:
$ kubectl get services kube-dns --namespace=kube-system
  1. 启动测试 Pod 验证 DNS 解析:
# 启动带 curl 的交互式 Pod $ kubectl run curl --image=radial/busyboxplus:curl -i --tty # 执行 DNS 解析(同命名空间) [root@curl-pod:/]# nslookup my-nginx # 成功输出:Address 1: 10.0.162.149(Service ClusterIP) # 跨命名空间解析(示例:访问 default 命名空间的 my-nginx) [root@curl-pod:/]# nslookup my-nginx.default
  1. 通过域名访问 Service:
[root@curl-pod:/]# curl my-nginx:80

5. Service 安全

重点保障跨 Pod/Service 通信的安全性,核心方案为 HTTPS 加密:

5.1 实现步骤
  1. 生成 SSL 证书与 Secret(存储证书):
# 生成自签名证书(或使用已有证书) $ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /tmp/nginx.key -out /tmp/nginx.crt # 创建 Secret 存储证书(集群内安全分发) $ kubectl create secret tls nginxsecret --key /tmp/nginx.key --cert /tmp/nginx.crt
  1. 配置 HTTPS 服务(Deployment + Service):
# nginx-secure-app.yaml apiVersion: v1 kind: Service metadata: name: my-nginx spec: ports: - port: 443 name: https targetPort: 443 selector: run: my-nginx

apiVersion: apps/v1beta1

kind: Deployment

metadata:

name: my-nginx

spec:

replicas: 1

template:

metadata:

labels:

run: my-nginx

spec:

volumes:

  • name: secret-volume

    secret:

    secretName: nginxsecret # 挂载 Secret

    containers:

  • name: nginxhttps

    image: bprashanth/nginxhttps:1.0

    ports:

    • containerPort: 443

      volumeMounts:

    • mountPath: /etc/nginx/ssl # 证书挂载路径

      name: secret-volume

3. 安全访问测试: ```bash # 从 Pod 访问(使用证书验证) $ kubectl exec -name> -- curl https://my-nginx --cacert /etc/nginx/ssl/tls.crt

6. 暴露 Service 到集群外部

Kubernetes 支持两种外部暴露方式,满足不同场景需求:

类型适用场景核心特点
NodePort测试 / 小型应用集群每个节点开放相同端口,通过<Node-IP>:Port>访问
LoadBalancer生产环境 / 高可用需求集成云厂商负载均衡器,自动分配公网 IP
6.1 NodePort 方式(已在安全示例中配置)
  • 查看 NodePort 端口:
$ kubectl get svc my-nginx -o yaml | grep nodePort -C 2
  • 外部访问:
# 使用节点公网 IP + NodePort $ curl https://External-IP>:Port> -k # -k 忽略证书验证(测试用)
6.2 LoadBalancer 方式(云环境推荐)
  • 修改 Service 类型:
# 编辑 Service,将 type 改为 LoadBalancer $ kubectl edit svc my-nginx
  • 验证外部 IP:
$ kubectl get svc my-nginx # 查看 EXTERNAL-IP 列(云厂商分配的公网 IP)
  • 外部访问:
$ curl https://> -k

7. 进一步阅读

  • Kubernetes Service 官方文档

  • 联合 Service(跨集群服务发现)

  • Kubernetes 网络模型深度解析

8. 下一步

  1. 实践 Service 会话亲和性(Session Affinity),实现同一客户端请求路由到同一 Pod。

  2. 探索无头服务(Headless Service),适用于自主管理负载均衡的场景。

  3. 结合 Ingress 实现 HTTP/HTTPS 路由优化(替代 NodePort/LoadBalancer 直接暴露)。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/26 6:23:04

Qwen3-4B-Thinking效果展示:科学领域复杂公式推导与解释生成实例

Qwen3-4B-Thinking效果展示&#xff1a;科学领域复杂公式推导与解释生成实例 1. 模型简介与部署验证 Qwen3-4B-Thinking-2507-Gemini-2.5-Flash-Distill是基于Qwen3-4B架构的文本生成模型&#xff0c;经过特殊训练专注于复杂推理任务。该模型在约5440万个由Gemini 2.5 Flash生…

作者头像 李华
网站建设 2026/4/26 6:07:42

STS-Bcut语音转字幕工具:3步实现视频音频自动字幕生成

STS-Bcut语音转字幕工具&#xff1a;3步实现视频音频自动字幕生成 【免费下载链接】STS-Bcut 使用必剪API&#xff0c;语音转字幕&#xff0c;支持输入声音文件&#xff0c;也支持输入视频文件自动提取音频。 项目地址: https://gitcode.com/gh_mirrors/st/STS-Bcut 你是…

作者头像 李华
网站建设 2026/4/26 6:07:42

AI自主科研智能体框架解析:从模块化设计到实战部署

1. 项目概述&#xff1a;当AI决定自己搞科研 最近在开源社区里&#xff0c;一个名为“AI-Scientist-v2”的项目引起了我的注意。这名字听起来就挺唬人的&#xff0c;对吧&#xff1f;它来自SakanaAI&#xff0c;一个专注于探索AI前沿&#xff0c;特别是“AI for Science”和“A…

作者头像 李华
网站建设 2026/4/26 6:03:38

移动端UI自动化测试框架Maestro:YAML驱动,跨平台高效测试实践

1. 项目概述&#xff1a;一个面向移动端UI测试的自动化框架如果你是一名移动端开发者或测试工程师&#xff0c;那么对UI自动化测试的繁琐和脆弱性一定深有体会。传统的基于坐标或图像识别的方案&#xff0c;在设备分辨率、系统版本、甚至UI组件微小的样式变动面前&#xff0c;常…

作者头像 李华
网站建设 2026/4/26 5:58:44

BitNet-b1.58-2B-4T-GGUF 前端开发实战:JavaScript交互应用构建

BitNet-b1.58-2B-4T-GGUF 前端开发实战&#xff1a;JavaScript交互应用构建 1. 为什么前端开发者需要关注AI集成 最近两年&#xff0c;AI能力正快速渗透到各类Web应用中。作为前端开发者&#xff0c;我们可能习惯了处理UI交互和数据展示&#xff0c;但现在有机会通过集成像Bi…

作者头像 李华