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

Moh*_*ang 16 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
Run Code Online (Sandbox Code Playgroud)

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

我想要的是指定由复制控制器创建的pod的名称,以便pod的名称可以是"nginx-01","nginx-02","nginx-03".而且,更确切地说,如果pod"nginx-02"由于某种原因而关闭,并且复制控制器将自动创建另一个nginx pod,我希望这个新的nginx pod名称保持为"nginx-02".

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

P E*_*ram 11

您应该使用有状态集而不是复制控制器。此外,复制控制器被替换为ReplicaSet。

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:
Run Code Online (Sandbox Code Playgroud)


Gas*_*rdP 6

可以使用从1.9版开始测试的statefulsets来实现。引用文档:使用时kind: StatefulSet

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

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

所以在上面的例子中,你会得到nginx-0nginx-1nginx-2


Ani*_*han 5

如果您正在运行无状态工作负载,那么我无法想象如果您打算运行特定Pod的N个副本,为什么想要与每个对象相关联的固定身份。

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

如果那是您真正想要的(固定身份/序号索引),则该属性由StatefulSet资源满足,该资源自Kubernetes v1.9起稳定。但是,它还附带了您可能不需要的其他保证。