我有一个简单的复制控制器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)
可以使用从1.9版开始测试的statefulsets来实现。引用文档:使用时kind: StatefulSet
,
Pod具有由序号,稳定的网络身份和稳定的存储组成的唯一身份。身份坚持在Pod上,而不管它是在(重新)安排在哪个节点上。
StatefulSet中的每个Pod都从StatefulSet的名称和Pod的序数派生其主机名。构造的主机名的模式为
$(statefulset name)-$(ordinal)
。
所以在上面的例子中,你会得到nginx-0
,nginx-1
,nginx-2
如果您正在运行无状态工作负载,那么我无法想象如果您打算运行特定Pod的N个副本,为什么想要与每个对象相关联的固定身份。
无法使用ReplicaSet / ReplicationController来执行此操作。当控制器创建新的Pod时,它将在Pod名称之后具有一个生成的名称后缀。
如果那是您真正想要的(固定身份/序号索引),则该属性由StatefulSet资源满足,该资源自Kubernetes v1.9起稳定。但是,它还附带了您可能不需要的其他保证。
归档时间: |
|
查看次数: |
7399 次 |
最近记录: |