在Kubernetes,如何设置pods'使用复制控制器时的名称?

时间:2016-10-27 00:01:36

标签: kubernetes

我有一个简单的复制控制器yaml文件,如下所示:

apiVersion: v1
kind: ReplicationController
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    app: nginx
  template:
    spec:
      containers:
      - image: library/nginx:3.2
        imagePullPolicy: IfNotPresent
        name: nginx
        ports:
        - containerPort: 80
    metadata:
      labels:
        app: nginx

运行此复制控制器后,我将获得3个不同的pod,其名称为" nginx-xxx",其中" xxx"代表一个随机的字母和数字字符串。

我想要的是指定由复制控制器创建的pod的名称,以便pods' name可以是" nginx-01"," nginx-02"," nginx-03"。而且,如果pod" nginx-02"由于某种原因出现故障,复制控制器将自动创建另一个nginx pod,我希望这个新的nginx pod的名称保持为" nginx-02"。

我想知道这是否可行?提前谢谢。

3 个答案:

答案 0 :(得分:5)

如果您正在运行无状态工作负载,我无法想象如果您打算运行特定pod的N个副本,为什么您希望拥有与每个对象关联的固定标识。

使用ReplicaSet / ReplicationController无法执行此操作。当控制器创建新的pod时,它将在pod名称后面生成一个名称后缀。

如果这是您真正想要的(固定身份/序数索引),则StatefulSet resource满足该属性,自Kubernetes v1.9起稳定。但是,它还附带了您可能不需要的额外保证。

答案 1 :(得分:4)

这可以使用statefulsets来实现,该版本从1.9版开始就处于beta版。引用文档:使用kind: StatefulSet时,

  

Pods具有唯一的身份,该身份由序数,稳定的网络身份和稳定的存储组成。身份将固定在Pod上,而不管它在(重新)安排在哪个节点上。

     

StatefulSet中的每个Pod都从StatefulSet的名称和Pod的序数派生其主机名。构造的主机名的模式为$(statefulset name)-$(ordinal)

因此在上面的示例中,您将获得nginx-0nginx-1nginx-2

答案 2 :(得分:2)

您应该使用statefulset而不是复制控制器。此外,复制控制器已替换为ReplicaSets。

StatefulSet Pod具有由序号组成的唯一标识。对于具有N个副本的StatefulSet,将为StatefulSet中的每个Pod分配一个从0到N-1的整数序数,该序数在Set上是唯一的。 StatefulSet中的每个Pod都从StatefulSet的名称和Pod的序数派生其主机名。

StatefulSets符合您的要求,因此可以在您的部署中使用它。

尝试以下部署文件:

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  selector:
    matchLabels:
      app: nginx # has to match .spec.template.metadata.labels
  serviceName: "nginx"
  replicas: 3 # by default is 1
  template:
    metadata:
      labels:
        app: nginx # has to match .spec.selector.matchLabels
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: nginx
        image: k8s.gcr.io/nginx-slim:0.8
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
      volumes:
      - name: www
        emptyDir: