目录
Service的三种工作模式:
Service的类型:
Service的会话粘性:
无头Service (Headless Service)
Service的三种工作模式:
- userspace: k8s 1.1之前;
- iptables : k8s 1.10之前;
- ipvs : k8s 1.11+
Service的类型:
- ClusterIP: 只能被集群内部的应用访问,没指定类型时,默认就是ClusterIP;
- NodePort:可以被集群外部的应用访问;
- LoadBalancer: 参考https://blog.csdn.net/cleverfoxloving/article/details/79186574
- ExternalName: 当Service类型是ExternalName时,Service所关联的不是本地Pod应用,而是集群外部的服务。从而实现集群内部的Pod应用调用集群外部的服务,可以把集群外部的服务当作内部服务一样去调用它。当Service类型是ExternalName时,
spec.externalName
字段才生效。这个字段值应该是一个CNAME记录。
Service的会话粘性:
- Service的spec下还有一个
sessionAffinity
字段,就是用来设定会话粘性的。此字段有ClientIP
和None
两个值可选。默认是None
,表示不具有会话粘性。ClientIP
表示同一个源IP的访问请求都调度到同一个后端Pod上去(类似于Nginx的ip_hash负载调度算法)。
下面是一个完整的Service资源清单示例:
apiVersion: v1
kind: Service
metadata:
name: redis-svc
namespace: default
labels:
group: redis
spec:
clusterIP: 10.106.106.106 # clusterIP就是给service分配的IP,如果不定这个字段,K8S会自动给service分配一个IP。
selector:
app: redis
role: log_storage
ports:
- name: redis # 给端口取个名称
protocol: TCP # 协议,默认就是TCP
port: 6379 # service的端口
targetPort: 6379 # Pod的端口
无头Service (Headless Service)
无头Service没有ClusterIP。直接将Service名称解析到后端Pod的IP。
在定义无头Service时,只需要将clusterIP
设为None
即可。
清单文件内容如下:
[root@k8s-master manifests]# cat myapp-headless-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: myapp-headless-svc
namespace: default
spec:
clusterIP: None # 关键点,将clusterIP设为None
selector:
app: myapp
release: canary
ports:
- name: http
port: 80
targetPort: 80
创建:kubectl apply -f myapp-headless-svc.yaml
查看创建成功的无头Service
利用dig命令去解析myapp-headless-svc,最终解析到的是五个后端Pod的IP
命令:dig -t A myapp-headless-svc.default.svc.cluster.local. @10.96.0.10
命令:kubectl get pods -l app=myapp,release=canary -o wide