首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法覆盖部署k8s的“副本”

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

Stack Overflow用户
提问于 2020-07-22 08:38:37
回答 4查看 3.9K关注 0票数 2

我遇到过这样的问题:

首先,我使用helm创建了一个发行版nginx

代码语言:javascript
复制
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/"

K8s只创建一个有一个豆荚的部署:

代码语言:javascript
复制
# 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
  ...

其次,我使用kubectl命令将部署编辑为最多可扩展到2个

代码语言:javascript
复制
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
  ...

我保存它,检查状态以查看部署已经扩展到2个豆荚:

代码语言:javascript
复制
kubectl -n test get deployment

NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   2/2     2            2           7m50s

最后,我使用helm来升级发行版,就像第一步一样,helm将覆盖部署到1 pod,但是现在,部署将保持值replicas: 2,即使您将值(在values.yaml文件中)设置为任意数字。我使用了选项--recreate-pods of helm命令:

代码语言:javascript
复制
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/"

结果:在手动编辑部署中的replicas后,我无法使用helm覆盖此值replicas,但仍然可以更改图像等。只有副本不会改变,我已经运行了--debug,helm仍然用replicas: 1创建部署

代码语言:javascript
复制
# 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

但是k8s部署将使值replicas保持与编辑手册( replicas: 2 )相同。

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

提前准备!

我只想知道这里的行为是什么,Tks

舵机版本

代码语言:javascript
复制
Client: &version.Version{SemVer:"v2.13.1", GitCommit:"618447cbf203d147601b4b9bd7f8c37a5d39fbb4", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.13.0", GitCommit:"79d07943b03aea2b76c12644b4b54733bc5958d6", GitTreeState:"clean"}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-12-09 11:00:13

遵循Helm舵机文件的官方文档

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

这一点将在Helm v3中得到改进,因为Helm v3删除了Tiller,您的值将精确地应用于Kubernetes resources,而HelmKubernetes的值将是一致的。

==>的结果是,如果使用Helm version 3,您将不会再次遇到这个问题。

票数 3
EN

Stack Overflow用户

发布于 2020-07-30 08:34:05

请看一下支持版本偏斜

当Helm的新版本发布时,它是针对Kubernetes的特定次要版本进行编译的。例如,Helm 3.0.0使用Kubernetes 1.16.2客户端与Kubernetes进行交互,因此它与Kubernetes 1.16兼容。从Helm 3开始,Helm被假定与编译时针对的的n-3版本兼容。由于Kubernetes在小版本之间的更改,Helm 2的支持策略稍微更严格一些,假设它与n-1版本的Kubernetes兼容。例如,如果您使用的是针对Kubernetes 1.17 客户端API编译的的Helm 3版本,那么与Kubernetes 1.17、1.16、1.15和1.14一起使用应该是安全的。如果您使用的是针对 Kubernetes 1.16客户端API编译的Helm 2版本,那么与Kubernetes 1.16和1.15一起使用应该是安全的。不建议将Helm与Kubernetes的版本一起使用,因为Helm不提供任何向前兼容性保证,该版本比针对其编译的版本更新。如果您选择将Helm与它不支持的Kubernetes版本一起使用,则您将冒着风险使用它。

我使用1.17.9 k8s版本和helm3.2v测试了这些行为,下面提到的部署更新方法都如出一辙。

代码语言:javascript
复制
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

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

所以我的建议是让你的工具及时更新。

注释:舵机2支援计划. 对于Helm 2,我们将继续接受错误修复,并修复出现的任何安全问题,但不会接受任何新特性。所有功能开发将转移到Helm 3。 在Helm 3公开发布6个月后,Helm 2将停止接受错误修复。只有安全问题才会被接受,。 在Helm 3公开发布12个月后,对Helm 2的支持将正式结束。

票数 2
EN

Stack Overflow用户

发布于 2020-07-22 08:45:26

请使用helm中的replicaCount字段来管理副本。

我把它看作是选项这里

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63030156

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档