Kubernetes 应用连接到 Service 完全指南
1. Kubernetes 连接容器模型
Kubernetes 网络模型与 Docker 核心差异:
Docker 默认行为:容器使用私有主机网络,跨节点通信需手动配置端口映射 / 代理,端口协调难度大。
Kubernetes 网络模型:
每个 Pod 分配独立集群私有 IP,无需 NAT 即可跨节点与其他 Pod 通信。
Pod 内容器共享网络命名空间,可通过本地端口直接通信。
避免依赖主机端口映射,支持多 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:803. 创建 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-nginx4. 访问 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=804.2 DNS(推荐,灵活稳定)
依赖:需启用
kube-dns集群插件(默认多数集群已安装)。原理:DNS 自动为 Service 分配域名(格式:
<service-name>.<namespace>.svc.cluster.local),同命名空间可省略命名空间部分。验证步骤:
- 检查 kube-dns 状态:
$ kubectl get services kube-dns --namespace=kube-system- 启动测试 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- 通过域名访问 Service:
[root@curl-pod:/]# curl my-nginx:805. Service 安全
重点保障跨 Pod/Service 通信的安全性,核心方案为 HTTPS 加密:
5.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- 配置 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-nginxapiVersion: 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.crt6. 暴露 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://> -k7. 进一步阅读
Kubernetes Service 官方文档
联合 Service(跨集群服务发现)
Kubernetes 网络模型深度解析
8. 下一步
实践 Service 会话亲和性(Session Affinity),实现同一客户端请求路由到同一 Pod。
探索无头服务(Headless Service),适用于自主管理负载均衡的场景。
结合 Ingress 实现 HTTP/HTTPS 路由优化(替代 NodePort/LoadBalancer 直接暴露)。