跳到主要内容

k8s服务service相关

1.service工作原理

service 工作原理有三种模式:

  • userspace:kube-proxy 监听 APIServer,修改本地 iptables 规则,代理用户请求
  • iptables:kube-proxy 功能解耦,压力较小
  • ipvs:性能最优

svc DNS 域名格式: svcName.nsName.svc.cluster.local.

a.service-userspace

image-20250510170837017

b.service-iptables

image-20250510170948770

c.service-ipvs

image-20250510171017598

# 修改ipvs模式
kubectl edit configmaps kube-proxy -n kube-system
# mode: ipvs
kubectl delete pod -n kube-system -l k8s-app=kube-proxy

2.service 工作类型

image-20250324232216791

a.ClusterIP(默认)

集群内部可访问,外部不可访问。

kubectl create svc clusterip myapp --tcp=80:80

b.NodePort

在每个节点上开放一个静态端口(30000-32767),外部可通过 NodeIP:NodePort 访问。

c.LoadBalancer

结合云供应商的负载均衡器使用,提供外部访问入口。

d.ExternalName

将 Service 映射到外部 DNS 名称(CNAME)。

kind: Service
apiVersion: v1
metadata:
name: my-service-1
spec:
type: ExternalName
externalName: www.baidu.com

3.service 组件协同

image-20250510172148439

4.Endpoint

自动关联:配置 selector

Service 通过 selector 自动关联 Pod,创建同名的 Endpoints。

手动关联:无配置 selector

apiVersion: v1
kind: Service
metadata:
name: nginx-noselect
spec:
ports:
- protocol: TCP
port: 6666
targetPort: 80
---
apiVersion: v1
kind: Endpoints
metadata:
name: nginx-noselect
subsets:
- addresses:
- ip: 192.168.123.12
ports:
- port: 80

5.publishNotReadyAddresses

默认情况下 Service 只匹配就绪状态的 Pod。设置 publishNotReadyAddresses: true 后可匹配未就绪 Pod。

kubectl patch service myapp -p '{"spec":{"publishNotReadyAddresses": true}}'