无法覆盖部署k8s的“副本”

时间:2020-07-22 08:38:37

标签: kubernetes kubernetes-helm

我遇到了这样的问题:

首先,我使用掌舵来创建发布 protected $preserveGlobalState = FALSE; protected $runTestInSeparateProcess = TRUE;

nginx

K8仅创建具有1个Pod的部署:

helm upgrade --install --namespace test nginx bitnami/nginx --debug

LAST DEPLOYED: Wed Jul 22 15:17:50 2020
NAMESPACE: test
STATUS: DEPLOYED

RESOURCES:
==> v1/ConfigMap
NAME                DATA  AGE
nginx-server-block  1     2s

==> v1/Deployment
NAME   READY  UP-TO-DATE  AVAILABLE  AGE
nginx  0/1    1           0          2s

==> v1/Pod(related)
NAME                    READY  STATUS             RESTARTS  AGE
nginx-6bcbfcd548-kdf4x  0/1    ContainerCreating  0         1s

==> v1/Service
NAME   TYPE          CLUSTER-IP    EXTERNAL-IP  PORT(S)                     AGE
nginx  LoadBalancer  10.219.6.148  <pending>    80:30811/TCP,443:31260/TCP  2s


NOTES:
Get the NGINX URL:

  NOTE: It may take a few minutes for the LoadBalancer IP to be available.
        Watch the status with: 'kubectl get svc --namespace test -w nginx'

  export SERVICE_IP=$(kubectl get svc --namespace test nginx --template "{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}")
  echo "NGINX URL: http://$SERVICE_IP/"

第二,我使用# Source: nginx/templates/deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx labels: app.kubernetes.io/name: nginx helm.sh/chart: nginx-6.0.2 app.kubernetes.io/instance: nginx app.kubernetes.io/managed-by: Tiller spec: selector: matchLabels: app.kubernetes.io/name: nginx app.kubernetes.io/instance: nginx replicas: 1 ... 命令来编辑部署,以扩展到最多2个Pod。

kubectl

我将其保存,请检查状态以查看部署已扩展到2个容器:

kubectl -n test  edit deployment nginx

# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "1"
  creationTimestamp: "2020-07-22T08:17:51Z"
  generation: 1
  labels:
    app.kubernetes.io/instance: nginx
    app.kubernetes.io/managed-by: Tiller
    app.kubernetes.io/name: nginx
    helm.sh/chart: nginx-6.0.2
  name: nginx
  namespace: test
  resourceVersion: "128636260"
  selfLink: /apis/extensions/v1beta1/namespaces/test/deployments/nginx
  uid: d63b0f05-cbf3-11ea-99d5-42010a8a00f1
spec:
  progressDeadlineSeconds: 600
  replicas: 2
  ...

最后,我按预期使用Helm升级发行版,Helm将像第一步那样将部署覆盖到1个吊舱,但是现在,即使您设置了值,部署也将保留值kubectl -n test get deployment NAME READY UP-TO-DATE AVAILABLE AGE nginx 2/2 2 2 7m50s .yaml的头盔文件)为任意数字。 我使用了replicas: 2命令的选项--recreate-pods

helm

结果:在手动编辑部署中的helm upgrade --install --namespace test nginx bitnami/nginx --debug --recreate-pods Release "nginx" has been upgraded. Happy Helming! LAST DEPLOYED: Wed Jul 22 15:31:24 2020 NAMESPACE: test STATUS: DEPLOYED RESOURCES: ==> v1/ConfigMap NAME DATA AGE nginx-server-block 1 13m ==> v1/Deployment NAME READY UP-TO-DATE AVAILABLE AGE nginx 0/2 2 0 13m ==> v1/Pod(related) NAME READY STATUS RESTARTS AGE nginx-6bcbfcd548-b4bfs 0/1 ContainerCreating 0 1s nginx-6bcbfcd548-bzhf2 0/1 ContainerCreating 0 1s nginx-6bcbfcd548-kdf4x 0/1 Terminating 0 13m nginx-6bcbfcd548-xfxbv 1/1 Terminating 0 6m16s ==> v1/Service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx LoadBalancer 10.219.6.148 34.82.120.134 80:30811/TCP,443:31260/TCP 13m NOTES: Get the NGINX URL: NOTE: It may take a few minutes for the LoadBalancer IP to be available. Watch the status with: 'kubectl get svc --namespace test -w nginx' export SERVICE_IP=$(kubectl get svc --namespace test nginx --template "{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}") echo "NGINX URL: http://$SERVICE_IP/" 之后,我无法使用helm覆盖此值replicas,但是我仍然可以更改映像等,...仅副本不会更改 我已经运行replicas,并且仍然使用--debug

创建部署
replicas: 1

但是k8s部署将# Source: nginx/templates/deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx labels: app.kubernetes.io/name: nginx helm.sh/chart: nginx-6.0.2 app.kubernetes.io/instance: nginx app.kubernetes.io/managed-by: Tiller spec: selector: matchLabels: app.kubernetes.io/name: nginx app.kubernetes.io/instance: nginx replicas: 1 template: metadata: labels: app.kubernetes.io/name: nginx helm.sh/chart: nginx-6.0.2 app.kubernetes.io/instance: nginx app.kubernetes.io/managed-by: Tiller spec: containers: - name: nginx image: docker.io/bitnami/nginx:1.19.1-debian-10-r0 imagePullPolicy: "IfNotPresent" ports: - name: http containerPort: 8080 livenessProbe: failureThreshold: 6 initialDelaySeconds: 30 tcpSocket: port: http timeoutSeconds: 5 readinessProbe: initialDelaySeconds: 5 periodSeconds: 5 tcpSocket: port: http timeoutSeconds: 3 resources: limits: {} requests: {} volumeMounts: - name: nginx-server-block-paths mountPath: /opt/bitnami/nginx/conf/server_blocks volumes: - name: nginx-server-block-paths configMap: name: nginx-server-block items: - key: server-blocks-paths.conf path: server-blocks-paths.conf 的值与replicas相同,一旦编辑replicas: 2

据我所知,helm命令的输出是create k8s yaml文件,为什么在这种情况下不能使用helm覆盖特定值replicas

提前谢谢!

P / S:Tks,我只是想知道这里的行为

头盔版本

Client: &version.Version{SemVer:"v2.13.1", GitCommit:"618447cbf203d147601b4b9bd7f8c37a5d39fbb4", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.13.0", GitCommit:"79d07943b03aea2b76c12644b4b54733bc5958d6", GitTreeState:"clean"}

4 个答案:

答案 0 :(得分:2)

遵循Helm中的官方文档:Helm | Docs

头盔2使用了双向战略合并补丁。在升级期间,它将最新图表的清单与提议的图表清单(在头盔升级期间提供的清单)进行了比较。它比较了这两个图表之间的差异,以确定需要对Kubernetes中的资源进行哪些更改。如果将更改应用于带外群集(例如在kubectl编辑期间),则不会考虑这些更改。这导致资源无法回滚到以前的状态:因为Helm仅将最后应用的图表清单视为当前状态,所以如果图表状态没有变化,则活动状态将保持不变。

由于Helm v3已删除Helm v3,因此Tiller中的问题将得到改善,您的值将完全应用于Kubernetes resources,而值{{1} }和Helm将保持一致。

==>结果是,如果您使用Kubernetes

,您将不会再遇到此问题。

答案 1 :(得分:1)

请查看Supported Version Skew

当发布新版本的Helm时,它将针对特定的次要版本的Kubernetes进行编译。例如,Helm 3.0.0使用Kubernetes 1.16.2客户端与Kubernetes进行交互,因此它与Kubernetes 1.16兼容。

从Helm 3开始,Helm被认为与它所针对的n-3版本的Kubernetes兼容。由于Kubernetes在次要版本之间进行了更改,因此 Helm 2的支持政策要严格一些,前提是要与n-1个Kubernetes版本兼容

例如,如果您使用的是 Helm 3 的版本,该版本是针对Kubernetes 1.17 客户端API编译的,则应该可以安全地与Kubernetes 1.17、1.16、1.15和1.14 。如果您使用的是根据 Kubernetes 1.16 客户端API编译的 Helm 2 版本,那么与Kubernetes 1.16和1.15一起使用应该是安全的

由于Helm不提供任何前向兼容性保证,因此不建议将Helm与Kubernetes的版本相比对其进行编译的版本更高。

如果选择将Helm与不支持的Kubernetes版本一起使用,则后果自负。

我已经使用带有头盔3.2v的 1.17.9 k8s版本测试了这些行为,下面提到的所有部署更新方法都可以正常工作。

helm upgrade --install nginx bitnami/nginx 
helm fetch bitnami/nginx --untar (create custom vaules.yaml and change the replicaCount parameter in values.yaml and save it)
helm upgrade --install nginx bitnami/nginx -f values.yaml ./nginx
helm upgrade --install nginx bitnami/nginx -f values.yaml ./nginx --set replicaCount=2

注意Values Files

values.yaml是默认设置,可以被父图表的values.yaml覆盖,而后者又可以由用户提供的值文件覆盖,而后者又可以由--set参数覆盖。 >

所以我的建议是使您的工具保持最新。

注意Helm 2 support plan

对于Helm 2,我们将继续接受错误修复并修复出现的任何安全问题,但不会接受任何新功能。所有功能开发将移至Helm 3。

在Helm 3公开发布6个月后,Helm 2将停止接受错误修复。仅接受安全问题

Helm 3公开发布12个月后,对Helm 2的支持将正式终止

答案 2 :(得分:0)

请使用掌舵人的copyCount字段来管理副本。

我将其视为选项here

答案 3 :(得分:0)

让我知道您使用的头盔版本。还有一个已知的错误,即它不升级副本,请检查链接 https://github.com/helm/helm/issues/4654