在k8s中,StatefulSet用来解决有状态服务的问题,当一些有状态服务需要相互访问的时候就需要用到Headless Service来进行代理。
apiVersion: v1
kind: Service
metadata:
name: consul
namespace: consul
labels:
name: consul
spec:
type: ClusterIP
clusterIP: None
ports:
- name: http
port: 8500
targetPort: 8500
selector:
app: consul
---
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
namespace: consul
name: consul
spec:
serviceName: consul
replicas: 3
template:
metadata:
labels:
app: consul
....
其中Service的spec.selector选中对应需要代理的StatefulSet,StatefulSet中spec.serviceName使用的是Service的metadata.name,当启动之后可以通过一下规则来实现pod之间的互相访问,statefulSetName-{0..N-1}.serviceName.namespace.svc.cluster.local,其中serviceName为spec.serviceName,并且需要Service和StatefulSet必须在同一个namespace下。
网友评论