一句话总结Kubernetes的Headless服务( 二 )


有状态应用有固定的名称和存储,会受到同一组内的其他Pod的影响 。Pod对象如果被替换,新的Pod仍然具有相同的标识和相同的存储 。
StatefulSet使用存储卷模板为每个 Pod 对象创建专用的 PVC存储卷,通过volumeClaimTemplate自动创建绑定的存储PVC不变 。
删除 Pod 对象并不会删除相关的 PV 资源,如果Pod 对象由于节点故障等原因被重新调度到其他节点时,之前同名Pod实例专用的 PV数据可以继续复用 。
稳定服务发现因为是有状态的,所以想找到自己想找到的Pod,可以直接通过pod名称.svc名称.命名空间.svc.cluster.local访问 。
4、Yaml示例示例部署一个Headless Service + StatefulSet,比如部署一个带有存储的Nginx服务 。文中使用到了volumeClaimTemplates,前提要创建一个storageClassName 。后面会单独写一篇讲解PV、PVC、StorageClass、Provisioner 。
apiVersion: v1kind: Servicemetadata:name: nginx-statefulset-svcnamespace: devspec:# ClusterIP | NodePort | LoadBalancertype: ClusterIP# headless service 这里的clusterIP使用NoneclusterIP: Noneselector:App: nginx-statefulset-tplports:- name: httpport: 80targetPort: 80---apiVersion: apps/v1kind: StatefulSetmetadata:name: nginx-statefulsetnamespace: devlabels:app: nginx-statefulsetspec:replicas: 2serviceName: nginx-statefulset-svcselector:matchLabels:app: nginx-statefulset-tpltemplate:metadata:labels:app: nginx-statefulset-tplspec:containers:- name: nginximage: nginximagePullPolicy: IfNotPresentvolumeMounts:- name: wwwmountPath: /usr/share/nginx/html# volumeClaimTemplates是StatefulSet独有的配置,前提要先创建一个storageClassNamevolumeClaimTemplates:- metadata:name: wwwspec:resources:requests:storage: 200MiaccessModes:- ReadWriteOncestorageClassName: nfs-client5、总结一句话总结:Headless服务就是一组Pod组成的只供集群内访问(没有ClusterIP)的Service,一般结合StatefulSet用于部署有状态应用的场景 。
既然是Headless Service,那首先它是Service,一般的Service能被内部和外部访问 。之所以叫Headless Service是因为只对内提供访问 。既然只对内访问,那肯定就需要提供稳定的访问能力了,否则就没什么作用了 。比如说拥有固定的Pod名称和存储,所以一般会结合StatefulSet一起使用,用来部署有状态的应用 。




推荐阅读