kubernetes中的基本概念(六) service && ingress
上层网络服务抽象过程。
Service 的实现方式
service是对pod访问入口的抽象。
kube-proxy 进程
这个进程负责为service实现network映射规则。
- 代理模式: userspace
这种模式是直连模式
,任何访问到service定义的端口的数据都被映射到对应的后端端口。
使用轮询
的方式查找可用节点。
- 代理模式: iptables
这种模式工作在内核空间, 直接解析网络包,匹配地址和端口,然后完成映射。
- 代理模式: ipvs
实现在netfilter钩子的基础之上。可以提供更多的可配置的负载均衡算法
rr: round-robin(轮询) lc: least connection 最小连接数 dh: destination hashing 目标哈希 sh: source hashing 源哈希 sed: shortest expected delay 最小延迟 nq: never queue 队列长度
服务发现
k8s支持2中模式来查找service
- 最简单的方式,所有pods共享service环境变量
比如, redis服务成功发布后,以下变量可以在container中取到
REDIS_MASTER_SERVICE_HOST=10.0.0.11
REDIS_MASTER_SERVICE_PORT=6379
REDIS_MASTER_PORT=tcp://10.0.0.11:6379
REDIS_MASTER_PORT_6379_TCP=tcp://10.0.0.11:6379
REDIS_MASTER_PORT_6379_TCP_PROTO=tcp
REDIS_MASTER_PORT_6379_TCP_PORT=6379
REDIS_MASTER_PORT_6379_TCP_ADDR=10.0.0.11
这种方式潜在的问题是,service之间相互引用时,存在初始化顺序问题。
- 通过dns
k8s 为每个服务生成一条srv格式的解析记录
可以通过 my-service.my-ns 访问特定服务。
A记录
my-svc.my-namespace.svc.cluster.local
SRV 记录
_my-port-name._my-port-protocol.my-svc.my-namespace.svc.cluster.local
无头服务(headless service)
TODO
服务类型
- ClusterIP
默认模式, 只能在集群内部访问
- NodePort
生成一个静态端口。可以从集群外部访问。默认创建一个ClusterIP
- loadBalancer
向负载均衡器暴露服务
- externalName
使用外部服务
pods 的DNS策略
-
默认 从node宿主机继承。
-
ClusterFirst
所有不匹配集群域名的查询,被转发到上游解析。
-
ClusterFirstWithHostNet
-
None
Ingress
ingress 是工作在7层(应用层[http])上的路由器
。
常用的ingress controller:
kubectl create -f https://raw.githubusercontent.com/jcmoraisjr/haproxy-ingress/master/docs/haproxy-ingress.yaml
kubectl label node <node-name> role=ingress-controller