问题 - 具有多个活动 ReplicaSet 的 Kubernetes 部署

Arp*_*ran 6 kubernetes kubernetes-helm

我有一个 Kubernetes 部署,它是两个具有不同配置的 ACTIVE ReplicaSet 的所有者/父级。

此设置由 Helm 管理。

我已经尝试过制作revisionHistory: 0. 这不起作用,因为 ReplicaSet 并未处于非活动状态。这个旧的 ReplicaSet 尝试启动一个 Pod,但由于节点上的资源限制,它仍处于挂起状态。

我尝试更新 Deployment,但只更新了新的 ReplicaSet。旧的还是一样。

我也无法删除此 ReplicaSet。这给我带来了很多麻烦。

有人可以帮我解决这个问题吗?

Helm 部署模板 -

apiVersion: apps/v1
kind: Deployment
metadata:
  name: example
  namespace: kube-system
spec:
  selector:
    matchLabels:
      k8s-app: example
  replicas: 1
  template:
    metadata:
      labels:
        k8s-app: example
    spec:
      serviceAccountName: example
      nodeSelector:
        node-role: example-node
      containers:
      - name: example
        image: example-image:vX.X.X
        resources:
          requests:
            cpu: 100m
        ports:
        - name: example-port
          containerPort: XXXX
        - name: example-port-1
          containerPort: XXXX
        readinessProbe:
          httpGet:
            path: /example
            port: XXXX
          initialDelaySeconds: 5
          timeoutSeconds: 5
      - name: example-sidecar
        image: example-image-sidecar:vX.X.X
        resources:
          limits:
            memory: 400Mi
          requests:
            cpu: 100m
        env:
          - name: MY_POD_NAME
            valueFrom:
              fieldRef:
                fieldPath: metadata.name
          - name: MY_POD_NAMESPACE
            valueFrom:
              fieldRef:
                fieldPath: metadata.namespace
        command:
          - command
          - --container=example
          - --cpu=200m
          - --extra-cpu=10m
          - --memory=300Mi
          - --extra-memory=2Mi
          - --threshold=5
          - --deployment=example
Run Code Online (Sandbox Code Playgroud)

堆栈:使用 Kops 和 Helm 2.13.1 在 AWS EC2 上部署独立 K8

输出 -

kubectl get rs -o wide -n kube-system | grep example

NAME               DESIRED  CURRENT READY   AGE     CONTAINERS IMAGES SELECTOR
example-6d4f99bc54 0        0       0       12h     example,example-sidecar example-image:vX.X.X,example-image-sidecar:vX.X.X k8s-app=example,pod-template-hash=6d4f99bc54
example-59d46955b6 0        0       0       13h     example,example-sidecar example-image:vX.X.X,example-image-sidecar:vX.X.X k8s-app=example,pod-template-hash=59d46955b6
example-5855866cdb 0        0       0       18h     example,example-sidecar example-image:vX.X.X,example-image-sidecar:vX.X.X k8s-app=example,pod-template-hash=5855866cdb
example-ccc5cf5cd0 0        0       0       18h     example,example-sidecar example-image:vX.X.X,example-image-sidecar:vX.X.X k8s-app=example,pod-template-hash=ccc5cf5cd
example-66db79f578 1        1       0       19h     example,example-sidecar example-image:vX.X.X,example-image-sidecar:vX.X.X k8s-app=example,pod-template-hash=66db79f578
example-759469945f 1        1       1       19h     example,example-sidecar example-image:vX.X.X,example-image-sidecar:vX.X.X k8s-app=example,pod-template-hash=759469945f
example-ff8f986960 0        0       0       19h     example,example-sidecar example-image:vX.X.X,example-image-sidecar:vX.X.X k8s-app=example,pod-template-hash=ff8f98696

Run Code Online (Sandbox Code Playgroud)
kubectl describe deployments example -n kube-system

Name:                   example
Namespace:              kube-system
CreationTimestamp:      Tue, 03 Mar 2020 00:48:18 +0530
Labels:                 k8s-app=example
Annotations:            deployment.kubernetes.io/revision: 27
Selector:               k8s-app=example
Replicas:               1 desired | 1 updated | 2 total | 1 available | 1 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:           k8s-app=example
  Service Account:  example
  Containers:
   example:
    Image:       example-image:vX.X.X
    Ports:       8080/TCP, 8081/TCP
    Host Ports:  0/TCP, 0/TCP
    Limits:
      cpu:     1630m
      memory:  586Mi
    Requests:
      cpu:        1630m
      memory:     586Mi
    Readiness:    http-get http://:8080/healthz delay=5s timeout=5s period=10s #success=1 #failure=3
    Environment:  <none>
    Mounts:       <none>
   example-sidecar:
    Image:      example-image-sidecar:vX.X.X
    Port:       <none>
    Host Port:  <none>
    Command:
      command
      --container=example
      --cpu=200m
      --extra-cpu=10m
      --memory=300Mi
      --extra-memory=2Mi
      --threshold=5
      --deployment=example
    Limits:
      memory:  400Mi
    Requests:
      cpu:  100m
    Environment:
      MY_POD_NAME:        (v1:metadata.name)
      MY_POD_NAMESPACE:   (v1:metadata.namespace)
    Mounts:              <none>
  Volumes:               <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
OldReplicaSets:  example-759469945f (1/1 replicas created)
NewReplicaSet:   example-66db79f578 (1/1 replicas created)
Events:          <none>
Run Code Online (Sandbox Code Playgroud)
kubectl rollout history deployments example -n kube-system

deployment.extensions/example 
REVISION  CHANGE-CAUSE
1         <none>
16        <none>
17        <none>
21        <none>
24        <none>
26        <none>
27        <none>
Run Code Online (Sandbox Code Playgroud)

Nic*_*ick 1

理论

我尝试更新 Deployment,但只更新了新的 ReplicaSet。旧的还是一样。

在这种情况下,问题是您有 2 个不同的Deployments. 您正在编辑的一个(因此rs会更新)和以其他方式创建的另一个(“旧”)。

通常,您无法ReplicaSet轻易删除,因为它由另一个实体控制。

在 Kubernetes 中,可以rs通过以下方式删除:

  • rs使用查找“old”的名称kubectl get replicaset -n kube-system
  • rs找到“old”所控制的对象:kubectl describe <rs-name>
  • 删除该对象的父对象rs

实践

您观察到多个 'es 的事实rs意味着您一直在尝试更新Deployment.

kubectl get rs -o wide -n kube-system | grep example

NAME               DESIRED  CURRENT     READY   AGE     
example-6d4f99bc54 0        0       0   12h 
example-59d46955b6 0        0       0   13h 
example-5855866cdb 0        0       0   18h 
example-ccc5cf5cd0 0        0       0   18h 
example-66db79f578 1        1       0   19h     
example-759469945f 1        1       1   19h 
example-ff8f986960 0        0       0   19h 
Run Code Online (Sandbox Code Playgroud)

从该输出中我们可以看到example-759469945f19 小时前创建的内容还活着 ( DESIRED/CURRENT/READY= 1/1/1) 。之后又尝试更新它,所以rs通过更新过程一一创建了其他的。

由于问题Deployment(我们稍后会讨论),所有这些尝试都失败了。

经过几次不成功的尝试后,您回滚到example-66db79f578创建时Deployment也已损坏的位置(这就是为什么最新的一个而example-6d4f99bc54不是 )0/0/01/1/0

这种损坏Deployment是你有 2 个=1的副本集(分别为和)的根本原因CURRENTexample-759469945fexample-66db79f5781/1/11/1/0

请注意,RollingUpdate这里使用的是策略Deployment

StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Run Code Online (Sandbox Code Playgroud)

这就是为什么旧的rs没有退役,而新的没有完全“启动并运行”(具有匹配的值DESIRED/CURRENT/READY

rs一旦您修复并应用更改,您最终将只剩下一个Deployment

为了修复部署,需要检查 k8s 尝试创建podfor时出了什么问题example-66db79f578

您可以通过以下方式进行操作:

# check the pod name
kubectl get pods -n kube-system | grep 66db79f578

# describe pod. it shall give you the root cause in "Events:" section
kubectl describe pod example-66db79f578-<somehash>

# additionally you can try checking logs for the containers on that pod.

kubectl logs example-66db79f578-<somehash>  example
kubectl logs example-66db79f578-<somehash>  example-sidecar

# fix :)
# apply changes
Run Code Online (Sandbox Code Playgroud)

一旦修复了损坏的部分,Deployment您就可以毫无问题地应用它。

希望有帮助。