我们在 Kubernetes 中部署了一个 API。该 API 通过复制控制器部署到 pod 和管理 rc。我想使用滚动更新将配置更新到 API pod。我可以这样做,但是我让滚动更新命令不出错的唯一方法是更改 RC 的名称。但这样做会破坏从我的服务(作为负载平衡器公开)到 RC 的链接,并且它再也找不到我的 pod。有人有在不更改名称的情况下更新复制控制器的示例配置吗?
apiVersion: v1
kind: ReplicationController
metadata:
name: my-api
labels:
name: my-api
spec:
replicas: 4
selector:
name: my-api
template:
metadata:
labels:
name: my-api
spec:
containers:
- name: my-api
image: docker-registry.example.com/mynamespace/my-api
command: [ "sh", "-c", "/do/the/thing/run"]
resources:
limits:
cpu: 0
ports:
- name: web
containerPort: 80
env:
- name: "HELLO"
value: "WORLD"
例如,我想将环境变量“HELLO”更改为“Bob”或其他内容。
答案1
所以我想出了一个可能有效的策略。我所研究的大多数文档都基于 pod 的名称来选择服务。这行不通,因为执行滚动更新时名称必须更改。最好将 service.spec.selector 设置为“type=api-server”或其他元数据标签,然后将 type=api-server 添加到您的 pod。(请记住,服务直接指向 pod,而不是 RC)
复制控制器:
apiVersion: v1
kind: ReplicationController
metadata:
name: my-api-{{randomDigits}}
labels:
name: my-api-{{randomDigits}}
spec:
replicas: 4
selector:
name: my-api-{{randomDigits}}
template:
metadata:
labels:
name: my-api-{{randomDigits}}
type: api-server
spec:
containers:
- name: my-api
image: docker-registry.example.com/mynamespace/my-api
command: [ "sh", "-c", "/do/the/thing/run"]
resources:
limits:
cpu: 0
ports:
- name: web
containerPort: 80
env:
- name: "HELLO"
value: "WORLD"
服务:
apiVersion: v1
kind: Service
metadata:
name: my-api-service
labels:
name: my-api-service
spec:
type: LoadBalancer
ports:
- port: 80
selector:
type: api-server
然后,如果您想更新您的 pod 的配置,您只需将 {{randomDigits}} 更改为新的内容,您就可以执行滚动更新,而无需破坏从您的服务到您的 pod 的链接。