我在kubernetes中滚动更新之前执行生产测试的方法正确吗?
以下是与我的生产群集相匹配的群集设置示例:我在kubernetes中滚动更新之前执行生产测试的方法正确吗?,kubernetes,Kubernetes,以下是与我的生产群集相匹配的群集设置示例: Ingress rule abc.com > Service-AB > Pod-A, Pod-B > cluster-A, cluster-B > image-0.1.1 Ingress rule xyz.com > Service-CD > Pod-C, Pod-D > cluster-C, cluster-D > image-1.3.2 假设我需要将cluster1的映像更新为v0.1.2,为此,
Ingress rule abc.com > Service-AB > Pod-A, Pod-B > cluster-A, cluster-B > image-0.1.1
Ingress rule xyz.com > Service-CD > Pod-C, Pod-D > cluster-C, cluster-D > image-1.3.2
假设我需要将cluster1的映像更新为v0.1.2
,为此,我可以更改部署清单并应用它来执行滚动更新,但在此之前,我想在生产集群中进行e2e测试,以确保新映像的行为符合预期
为了实现这一点,我创建了一个新的应用程序,其中包括一个新的映像版本和一个新的服务,该服务只选择那个新的pod和一个进入规则来访问这个新的服务。看起来是这样的,
Ingress rule abc.com/update > Service-Z > Pod-Z > cluster-Z > image-0.1.2
现在,我将e2e测试指向端点abc.com/update
,一旦成功,我将删除新的入口规则、服务和pod,并通过使用新的容器映像版本更新部署并执行apply
来遵循滚动更新的正常过程
在生产集群中进行测试是否正确,是否有更好(更简单)的方法?我认为这取决于您使用的技术。考虑到你的情况,它使用的是普通的kubernetes。我会在两者之间使用代理来进行a/B测试。以下是描述:
升级前:
入口规则abc.com->svc proxy->pod proxy-->svc my pod(v1.0.0)
升级(A/B)测试后:
入口规则abc.com->svc proxy->pod proxy-->svc-my-pod-1(v1.0.0)
|
--> svc-my-pod-2(v1.1.0)
完全升级
入口规则abc.com->svc proxy->pod proxy->my pod(v1.1.0)
请注意,在A/B测试阶段,您必须添加一个带有权重的上游(如果使用nginx),以模拟所需的权重策略
upstream dynamic {
server pod-proxy-1 weight=2;
server pod-proxy-2 weight=4;
}
server {
location / {
proxy_pass http://dynamic;
}
}
使用服务和端点在POD之间切换
有一个名为pod-v1的带有v1的yaml。您可以像以下yaml一样定义其匹配标签:
spec:
selector:
matchLabels:
app: pod-v1
spec:
selector:
matchLabels:
app: pod-v2
apiVersion: v1
kind: Service
metadata:
name: pod
labels:
app: pod
spec:
ports:
- name: "8000"
port: 8000
targetPort: 8000
selector:
app: pod-v1
status:
loadBalancer: {}
有一个名为pod-v2的带有v2的yaml。您可以像以下yaml一样定义其匹配标签:
spec:
selector:
matchLabels:
app: pod-v1
spec:
selector:
matchLabels:
app: pod-v2
apiVersion: v1
kind: Service
metadata:
name: pod
labels:
app: pod
spec:
ports:
- name: "8000"
port: 8000
targetPort: 8000
selector:
app: pod-v1
status:
loadBalancer: {}
然后,您可以通过更改服务的选择器轻松地更改POD之间的路由。类似于以下yaml:
spec:
selector:
matchLabels:
app: pod-v1
spec:
selector:
matchLabels:
app: pod-v2
apiVersion: v1
kind: Service
metadata:
name: pod
labels:
app: pod
spec:
ports:
- name: "8000"
port: 8000
targetPort: 8000
selector:
app: pod-v1
status:
loadBalancer: {}
请注意,要将流量路由到v2,只需更改选择器以匹配标签pod-v2
selector:
app: pod-v2
我认为这取决于您使用的技术。考虑到你的情况,它使用的是普通的kubernetes。我会在两者之间使用代理来进行a/B测试。以下是描述:
升级前:
入口规则abc.com->svc proxy->pod proxy-->svc my pod(v1.0.0)
升级(A/B)测试后:
入口规则abc.com->svc proxy->pod proxy-->svc-my-pod-1(v1.0.0)
|
--> svc-my-pod-2(v1.1.0)
完全升级
入口规则abc.com->svc proxy->pod proxy->my pod(v1.1.0)
请注意,在A/B测试阶段,您必须添加一个带有权重的上游(如果使用nginx),以模拟所需的权重策略
upstream dynamic {
server pod-proxy-1 weight=2;
server pod-proxy-2 weight=4;
}
server {
location / {
proxy_pass http://dynamic;
}
}
使用服务和端点在POD之间切换
有一个名为pod-v1的带有v1的yaml。您可以像以下yaml一样定义其匹配标签:
spec:
selector:
matchLabels:
app: pod-v1
spec:
selector:
matchLabels:
app: pod-v2
apiVersion: v1
kind: Service
metadata:
name: pod
labels:
app: pod
spec:
ports:
- name: "8000"
port: 8000
targetPort: 8000
selector:
app: pod-v1
status:
loadBalancer: {}
有一个名为pod-v2的带有v2的yaml。您可以像以下yaml一样定义其匹配标签:
spec:
selector:
matchLabels:
app: pod-v1
spec:
selector:
matchLabels:
app: pod-v2
apiVersion: v1
kind: Service
metadata:
name: pod
labels:
app: pod
spec:
ports:
- name: "8000"
port: 8000
targetPort: 8000
selector:
app: pod-v1
status:
loadBalancer: {}
然后,您可以通过更改服务的选择器轻松地更改POD之间的路由。类似于以下yaml:
spec:
selector:
matchLabels:
app: pod-v1
spec:
selector:
matchLabels:
app: pod-v2
apiVersion: v1
kind: Service
metadata:
name: pod
labels:
app: pod
spec:
ports:
- name: "8000"
port: 8000
targetPort: 8000
selector:
app: pod-v1
status:
loadBalancer: {}
请注意,要将流量路由到v2,只需更改选择器以匹配标签pod-v2
selector:
app: pod-v2
对不起,我不太明白,你是说一些特定的入口技术吗?什么是服务和pod代理?另外,我不是在进行a/b测试,而是在部署新版本之前在生产环境中进行测试。请注意,这与您遵循的逻辑相同。显然,ingress是一种常见的kubernetes入口,如果您愿意,可以说nginx。我想向您展示的是如何进行canary部署,以及如何在v1.0.0和v1.1.0之间分配流量。这就是代理中的权重所代表的。好吧,我明白你想说的,关键是我根本不想分割流量,因为流量不是我需要在新版本上执行的e2e测试,我需要将测试指向新版本,成功测试它,然后进行正常升级。我发现ingress nginx的canary deplpyment方法在这里可能会有所帮助,我可能会在e2e测试请求中使用一个特殊的“头值”,ingress会将其发送到新版本。你提到的金丝雀是正确的,谢谢。我会在实施后写下我自己的答案并接受。根据你的描述,我有一个超级简单的答案给你,我在工作中实际使用过。让我描述一下。查看最新编辑。特别是标题“使用服务和端点在POD之间切换”对不起,我不太明白,你是说一些特定的入口技术吗?什么是服务和pod代理?另外,我不是在进行a/b测试,而是在部署新版本之前在生产环境中进行测试。请注意,这与您遵循的逻辑相同。显然,ingress是一种常见的kubernetes入口,如果您愿意,可以说nginx。我想向您展示的是如何进行canary部署,以及如何在v1.0.0和v1.1.0之间分配流量。这就是代理中的权重所代表的。好吧,我明白你想说的,关键是我根本不想分割流量,因为流量不是我需要在新版本上执行的e2e测试,我需要将测试指向新版本,成功测试它,然后进行正常升级。我发现ingress nginx的canary deplpyment方法可能在这里有所帮助,我也许可以在e2e测试请求和ingress中使用一个特殊的“头值”