Kubernetes服务发布基础

发布于:2025-07-05 ⋅ 阅读:(21) ⋅ 点赞:(0)

一、服务核心类型详解

类型 工作原理 适用场景 配置文件示例
ClusterIP 创建集群内部虚拟 IP,通过 kube-proxy 实现负载均衡 内部微服务通信 webapp-service.yaml
NodePort 在所有节点开放静态端口(30000-32767),将外部流量转发到 Service 开发测试环境、简单外部访问 tomcat-service.yaml
LoadBalancer 云厂商自动创建外部负载均衡器,分配公网 IP 生产环境公网暴露 nginx-service.yaml
ExternalName 创建 CNAME 记录指向外部 DNS 名称 访问集群外部服务(如云数据库) myapp-svc-extername01.yaml
Headless clusterIP: None,DNS 直接返回 Pod IP StatefulSet、DNS 发现、直接 Pod 访问 myapp-svc-headless01.yaml

二、服务高级配置

1. 多端口服务
# service-multiple-ports.yaml
ports:
- port: 8080         # Service 端口
  targetPort: 8080    # 容器端口
  name: http          # 必需命名(唯一标识)
  protocol: TCP       # TCP/UDP/SCTP
- port: 8005
  targetPort: 8005
  name: jmx
  protocol: TCP
2. 会话保持 (Session Affinity)
spec:
  sessionAffinity: ClientIP  # 基于客户端 IP 的会话保持
  sessionAffinityConfig:
    clientIP:
      timeoutSeconds: 3600   # 会话保持时间
3. 流量策略
spec:
  externalTrafficPolicy: Local  # 保留客户端源 IP,避免额外跳转
  internalTrafficPolicy: Local  # 内部流量优先本节点

三、服务发现机制

1. DNS 解析规则
服务类型 DNS 记录格式 返回结果
ClusterIP <svc>.<ns>.svc.cluster.local ClusterIP 虚拟 IP
Headless <svc>.<ns>.svc.cluster.local 所有 Pod IP 列表
ExternalName <svc>.<ns>.svc.cluster.local 配置的 CNAME 记录
2. 环境变量注入

Pod 启动时自动注入:

text

复制

下载

WEBAPP_SERVICE_HOST=10.96.128.5
WEBAPP_SERVICE_PORT=8080

四、跨命名空间通信

1. ExternalName 跨 NS 访问
# myapp-svc-extername01.yaml
externalName: myapp-svc02.test02.svc.cluster.local
2. 直接 DNS 访问
curl http://myapp-svc02.test02.svc.cluster.local:39320

五、端点(Endpoints)与选择器

1. 手动 Endpoints(无 Selector)
apiVersion: v1
kind: Service
metadata:
  name: external-db
spec:
  ports:
  - port: 5432

---
kind: Endpoints
apiVersion: v1
metadata:
  name: external-db
subsets:
- addresses:
  - ip: 192.168.1.100
  ports:
  - port: 5432
2. 选择器高级匹配
selector:
  matchExpressions:
  - {key: tier, operator: In, values: [frontend]}
  - {key: env, operator: NotIn, values: [dev]}

六、服务与部署全生命周期

1. 完整部署流程

创建 Deployment

定义 Pod 模板

设置副本数

配置容器镜像

暴露容器端口

创建 Service

配置 Selector

定义端口映射

选择服务类型

2. 金丝雀发布示例
# myapp01.yaml (v1)
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: myapp01
        version: v1

# myapp-canary.yaml (v2)
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: myapp01
        version: v2

七、网络策略与安全

1. 网络策略示例
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: frontend-policy
spec:
  podSelector:
    matchLabels:
      app: frontend
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: backend
    ports:
    - protocol: TCP
      port: 80
2. 服务账户授权
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: test01
  name: service-access
rules:
- apiGroups: [""]
  resources: ["services"]
  verbs: ["get", "list"]

八、服务监控与调试

1. 关键监控指标
  • 服务请求延迟 (kube_service_request_duration_seconds)

  • 端点变化次数 (kube_endpoint_changes)

  • Pod 就绪状态 (kube_pod_status_ready)

2. 诊断命令
# 检查端点映射
kubectl get endpoints <service-name>

# 查看服务详情
kubectl describe svc <service-name>

# 测试服务发现
kubectl run test -it --rm --image=busybox --restart=Never -- nslookup <service-name>

# 检查网络策略
kubectl network-policy analyze

九、高级服务模式

1. Topology-Aware Hints
spec:
  topologyKeys: ["topology.kubernetes.io/zone"]
2. Service Mesh 集成
# Istio VirtualService 示例
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: webapp-vs
spec:
  hosts:
  - webapp.example.com
  http:
  - route:
    - destination:
        host: webapp.default.svc.cluster.local

网站公告

今日签到

点亮在社区的每一天
去签到