statefulset和deployment的区别
英文解释:Two commonly used ones are Deployments and StatefulSets. A Deployment manages multiple pods by automating the creation, updating, and deletion of ReplicaSets. By contrast, a StatefulSet helps orchestrate stateful pods by guaranteeing the ordering and uniqueness of pod replicas.
简单的说就是deployment管理的副本是相同状态的,比如一个deployment里有6个pod,这6个pod是一样的,通过workload负载到哪一个都能正常提供服务。 statefulset是有状态的,statefulset模式下的6个pod是不一样的,比如6个redis的三主三从节点,这6个pod相互不同,协同工作
如何暴露statefulset服务到外部-redis
我们知道,暴露一个deployment是非常简单的,通过如下yaml即可
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app.kubernetes.io/name: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 9379
因为我们刚刚说过,deployment的pod相互是等价的,所以只需要这样一个nodeport的service即可对外提供服务。
但对于statefulset,比如redis,三主三从的6个redis节点的6个pod是不等价的,这意味着,我需要对6个pod单独expose,如何做呢?
其实deployment为我们提供了一个标签,叫statefulset.kubernetes.io/pod-name
,这个是个内置标签,这个参数允许我们表达我们这个service是expose哪个pod,也就是这个参数可以使我们定义到pod的级别。
apiVersion: v1
kind: Service
metadata:
name: redis-0
spec:
type: LoadBalancer
selector:
statefulset.kubernetes.io/pod-name: redis-0
ports:
- protocol: TCP
port: 6379
targetPort: 9000
如果是6个redis,那我们就配置6个这样的nodeport,就可以将整个redis服务暴露出来。当然要注意targetPort不能一样,毕竟一个端口只能暴露一个服务
END