kubernetes中的基本概念(六) service && ingress

分类: AUTOMATION 发布于:

上层网络服务抽象过程。

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

好用的treafik