cluster ip(hostname->clusterip->pod ip)
访问流程:
1.客户端通过DNS(coreDNS)查找服务的clusterip
2.客户端将请求发送到服务的clusterip(虚拟ip),如果访问的端口和service定义的端口一样,那么访问会被处理。
3.kube-proxy在节点上监听该端口。
4.kube-proxy(一般通过轮转方式选择)kube-proxy 根据 Selector 选择一组 Pod,根据自身 mode 选择其中一个 Pod,并且转发到pod的ip和port(targetport)
5.后端pod处理请求并响应发送回客户端。
pod内访问一个service时,一般对Hostname发起请求
Hostname:.
dns kube-proxy
NodePort: (hostname–>nodeip-----> pod ip)
1.客户端通过DNS(coreDNS)查找服务的nodeip
2.客户端将请求发送到服务的Nodeip(虚拟ip)和Nodeport端口
3.kube-proxy在节点上监听该端口。
4.kube-proxy(一般通过轮转方式选择)kube-proxy 根据 Selector 选择一组 Pod,根据自身 mode 选择其中一个 Pod,并且转发到pod的ip和port(targetport)
5.后端pod处理请求并响应发送回客户端。
DNS
Headless(hostname–> pod ip):
Headless 服务的优点是:
- 安全性高,因为客户端无法直接访问后端 Pod,只能通过 DNS 来访问。
- 性能好,因为请求直接发送到后端 Pod,而不需要经过 kube-proxy 的转发。
Headless 服务的缺点是:
- 客户端无法直接访问后端 Pod 的 IP 地址,只能通过 DNS 来访问。
Deployment和StatefulSet
deployment适合无状态服务,而statefulset适合有状态服务。
无状态服务是不需要保存状态的服务。这意味着每个 Pod 都是独立的,它们之间没有任何关联。无状态服务适用于以下场景:
- Web 应用程序
- 缓存服务
- 消息处理服务
有状态服务是需要保存状态的服务。这意味着每个 Pod 都需要共享相同的状态。有状态服务适用于以下场景:
- 数据库
- 文件系统
- 消息队列
ingress类型
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- host: www.example.com
http:
paths:
- path: /
backend:
serviceName: my-service
servicePort: 80
yaml文件中的域名解析到service
如果service是clusterip,那么serviceport是pod的port,如果是nodeport,那么serviceport是nodeport