我打算部署依赖于Kubernetes中的Redis服务器的在线服务。到目前为止,我有:
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
name: "redis"
spec:
replicas: 1
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
image: redis
ports:
- containerPort: 6379
protocol: TCP
我还可以将redis作为服务公开:
apiVersion: v1
kind: Service
metadata:
name: redis
labels:
app: redis
spec:
ports:
- port: 6379
protocol: TCP
selector:
app: redis
有了这个,我可以使用Redis服务器运行一个pod并公开它。
但是,我的应用程序需要联系多个Redis服务器(这可以配置,但理想情况下不应该更改)。 它关心Redis服务器与之交谈所以我不能只使用副本并将其暴露给单个服务,因为服务抽象不允许我知道我在说什么实例。我理解,我的应用程序需要知道这会妨碍可扩展性,并且很乐意因此失去一些灵活性。
我想过多次部署相同的部署并为每个部署声明一项服务,但我在Kubernetes文档中找不到任何相关内容。我当然可以复制粘贴我的部署和服务YAML文件并为每个文件添加一个后缀,但这看起来很愚蠢而且过于手动(而且过于复杂)。
Kubernetes有什么东西帮我实现目标吗?
答案 0 :(得分:1)
你应该研究pet sets。宠物集将获得每个实例的唯一但可确定的名称,如redis0,redis1,redis2。 它们也被视为与部署豆荚相对的宠物,后者被视为牛。
请注意,宠物套装一般都难以升级,删除和处理,但这是获得可靠性和可确定性的代价。
您作为宠物集的部署:
apiVersion: apps/v1alpha1
kind: PetSet
metadata:
name: redis
spec:
serviceName: "redis"
replicas: 3
template:
metadata:
labels:
app: redis
annotations:
pod.alpha.kubernetes.io/initialized: "true"
spec:
terminationGracePeriodSeconds: 0
containers:
- name: redis
image: redis
ports:
- containerPort: 6379
protocol: TCP
还要考虑使用卷来更轻松地访问pod中的数据。