Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我在kubernetes中滚动更新之前执行生产测试的方法正确吗?_Kubernetes - Fatal编程技术网

我在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中使用一个特殊的“头值”