在Kubernetes中

时间:2016-10-17 19:50:44

标签: redis kubernetes

我打算部署依赖于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有什么东西帮我实现目标吗?

1 个答案:

答案 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中的数据。