我有一个简单的复制控制器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"。
我想知道这是否可行?提前谢谢。
答案 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-0
,nginx-1
,nginx-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: