我不推荐这种方法,但最接近你想要的方法是使用 stateful-set 并使用 pod 名称作为索引。
当您部署有状态集时,pod 将以其有状态集名称命名,在以下示例中:
apiVersion: v1
kind: Service
metadata:
name: kuard
labels:
app: kuard
spec:
type: NodePort
ports:
- port: 8080
name: web
selector:
app: kuard
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: kuard
spec:
serviceName: "kuard"
replicas: 3
selector:
matchLabels:
app: kuard
template:
metadata:
labels:
app: kuard
spec:
containers:
- name: kuard
image: gcr.io/kuar-demo/kuard-amd64:1
ports:
- containerPort: 8080
name: web
statefulset 创建的 Pod 将被命名为:
kuard-0
kuard-1
kuard-2
这样,您可以根据类命名有状态集,即:class-name
创建的 pod 将是class-name-0
并且您可以替换_
by -
。或者只是去掉名称以获取最后的索引。
要获取名称,只需读取环境变量HOSTNAME
此命名是一致的,因此您可以确保名称后始终有 0、1、2、3。如果2
失败,它将被重新创建。
就像我说的那样,我不会推荐这种方法,因为您将基础架构与代码绑定在一起,并且也无法扩展(如果需要),因为每个服务都是唯一的,并且添加新实例会获得新的 id。
更好的方法是为每个类使用一个部署,并将正确的值作为环境变量传递。