K8S的更新、回滚、伸缩

k8s 应用更新策略:灰度发布和蓝绿发布 阅读详情

 

2018年05月04日 17:16:53 迷途的攻城狮(798570156) 阅读数:2258

 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.youkuaiyun.com/chenleiking/article/details/80197975

K8S的应用更新、回滚、伸缩

1、应用结构

以一个简单的deployment为例来进行说明:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 4
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: 192.168.101.88:5000/nginx:1.7.9
        ports:
        - containerPort: 80
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

一个相对完整的应用可能还包括:volume、env、service、ingress等

root@master-1:~/kubernetes/example# kubectl apply -f nginx-deployment.yaml 
deployment.apps "nginx-deployment" created
root@master-1:~/kubernetes/example# kubectl get all
NAME                                    READY     STATUS    RESTARTS   AGE
pod/nginx-deployment-85b548b894-ct66d   1/1       Running   0          20s
pod/nginx-deployment-85b548b894-pfmvl   1/1       Running   0          20s
pod/nginx-deployment-85b548b894-v88qq   1/1       Running   0          20s
pod/nginx-deployment-85b548b894-zxml8   1/1       Running   0          20s

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   7d

NAME                               DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-deployment   4         4         4            4           20s

NAME                                          DESIRED   CURRENT   READY     AGE
replicaset.apps/nginx-deployment-85b548b894   4         4         4         20s
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

忽略service/kubernetes~~

graph TB;
    deployment.apps/nginx-deployment --> replicaset.apps/nginx-deployment-85b548b894
    replicaset.apps/nginx-deployment-85b548b894 --> pod/nginx-deployment-85b548b894-ct66d
    replicaset.apps/nginx-deployment-85b548b894 --> pod/nginx-deployment-85b548b894-pfmvl
    replicaset.apps/nginx-deployment-85b548b894 --> pod/nginx-deployment-85b548b894-v88qq
    replicaset.apps/nginx-deployment-85b548b894 --> pod/nginx-deployment-85b548b894-zxml8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 每个deployment会包含一个或者多个replicaset
  • 每个replicaset会可以包含零个或者多个pod
  • 每个replicaset对应deployment的一个revision
  • 每次更新时,pod总是在一个replicaset中创建,然后在现有的replicaset中销毁

2、更新与回滚

只有spec.template.spec.containers.image或者spec.template.metadata.labels发生变化时才会出发更新rolout操作~~

  • 更新
root@master-1:~/kubernetes/example# kubectl set image deployment nginx-deployment nginx=192.168.101.88:5000/nginx:1.9.1
deployment.apps "nginx-deployment" image updated
  • 1
  • 2

![deployment-update](/Users/lion/Documents/markdown/2018 - Kubernetes/deployment-update.gif)> gif图片太大,连接:https://pan.baidu.com/s/1cR7l4anB6FrQ27UNvJ1h0g

更新过程如图所示:

  • 首先,因为没有匹配的replicaset,创建一个新的replicaset replicaset.apps/nginx-deployment-767fdf8df6
  • 然后根据spec.strategy.rollingUpdate.maxUnavailable的值(默认25%)终止掉 replicaset.apps/nginx-deployment-85b548b894 中对应数量的pod
  • 最后根据spec.strategy.rollingUpdate.maxSurge的值(默认25%)在 replicaset.apps/nginx-deployment-767fdf8df6 中启动对应数量多pod
  • 最终,replicaset.apps/nginx-deployment-85b548b894 中的pod全部终止, replicaset.apps/nginx-deployment-767fdf8df6 中的pod达到预期值
  • replicaset的名字组成:deploymentName + podTemplate的Hash值
  • maxUnavailable:表示最大不可用pod数量,可以是整数或者百分比。这里的4个pod,25%就是一个,也就是说一次只能停止一个pod
  • maxSurge:表示可超过预期值的pod数量,可以是整数或者百分比。预期值4,25%就是可以超出一个,也就是说同时可以存在5个可用的pod
graph TB;
    deployment.apps/nginx-deployment --> replicaset.apps/nginx-deployment-85b548b894
    deployment.apps/nginx-deployment --> replicaset.apps/nginx-deployment-767fdf8df6
    replicaset.apps/nginx-deployment-767fdf8df6 --> pod/nginx-deployment-767fdf8df6-5zj8c
    replicaset.apps/nginx-deployment-767fdf8df6 --> pod/nginx-deployment-767fdf8df6-7668l
    replicaset.apps/nginx-deployment-767fdf8df6 --> pod/nginx-deployment-767fdf8df6-s7rpq
    replicaset.apps/nginx-deployment-767fdf8df6 --> pod/nginx-deployment-767fdf8df6-vgm2m
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 回滚
### 查看更新记录 ###
root@master-1:~# kubectl rollout history deployment nginx-deployment
deployments "nginx-deployment"
REVISION  CHANGE-CAUSE
1         <none>
2         <none>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

默认的部署方式不会记录CHANGE-CAUSE,需要在部署的时候添加 --record 选项~~

spec.revisionHistoryLimit被用来设置保留的历史记录数量,默认为2,设置为0时将不能回滚~~

root@master-1:~/kubernetes/example# kubectl delete -f nginx-deployment.yaml 
deployment.apps "nginx-deployment" deleted
root@master-1:~/kubernetes/example# kubectl apply -f nginx-deployment.yaml --record
deployment.apps "nginx-deployment" created
root@master-1:~/kubernetes/example# kubectl set image deployment nginx-deployment nginx=192.168.101.88:5000/nginx:1.9.1
deployment.apps "nginx-deployment" image updated
root@master-1:~/kubernetes/example# kubectl rollout history deployment nginx-deployment
deployments "nginx-deployment"
REVISION  CHANGE-CAUSE
1         kubectl apply --filename=nginx-deployment.yaml --record=true
2         kubectl set image deployment nginx-deployment nginx=192.168.101.88:5000/nginx:1.9.1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
### 回滚到上一个版本 ###
root@master-1:~/kubernetes/example# kubectl rollout undo deployment nginx-deployment
deployment.apps "nginx-deployment" 
root@master-1:~/kubernetes/example# kubectl rollout history deployment nginx-deployment
deployments "nginx-deployment"
REVISION  CHANGE-CAUSE
2         kubectl set image deployment nginx-deployment nginx=192.168.101.88:5000/nginx:1.9.1
3         kubectl apply --filename=nginx-deployment.yaml --record=true
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

回滚操作的执行流程与更新一样,都是按照spec.strategy.rollingUpdate.maxUnavailable和spec.strategy.rollingUpdate.maxSurge在当前replicaset中终止pod,在符合条件的replicaset中启动新的pod~~

### 回滚到指定版本 ###
root@master-1:~/kubernetes/example# kubectl rollout undo deployment nginx-deployment --to-revision=2
deployment.apps "nginx-deployment" 
root@master-1:~/kubernetes/example# kubectl rollout history deployment nginx-deployment
deployments "nginx-deployment"
REVISION  CHANGE-CAUSE
3         kubectl apply --filename=nginx-deployment.yaml --record=true
4         kubectl set image deployment nginx-deployment nginx=192.168.101.88:5000/nginx:1.9.1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
root@master-1:~/kubernetes/example# kubectl get all
NAME                                    READY     STATUS    RESTARTS   AGE
pod/nginx-deployment-767fdf8df6-56bmx   1/1       Running   0          42s
pod/nginx-deployment-767fdf8df6-bjbx4   1/1       Running   0          42s
pod/nginx-deployment-767fdf8df6-p6xll   1/1       Running   0          45s
pod/nginx-deployment-767fdf8df6-rf5tm   1/1       Running   0          44s

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   7d

NAME                               DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-deployment   4         4         4            4           6m

NAME                                          DESIRED   CURRENT   READY     AGE
replicaset.apps/nginx-deployment-767fdf8df6   4         4         4         6m
replicaset.apps/nginx-deployment-85b548b894   0         0         0         6m
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

因为上面的更新与回滚一直在两个版本之间来回修改,deploymentName + podTemplate的Hash值并没有改变,所以没有产生新的replicaset,但是版本号回一直递增~~~

3、伸缩

3.1、手动伸缩

root@master-1:~/kubernetes/example# kubectl scale deployment nginx-deployment --replicas=10
deployment.extensions "nginx-deployment" scaled
root@master-1:~/kubernetes/example# kubectl get all
NAME                                    READY     STATUS    RESTARTS   AGE
pod/nginx-deployment-767fdf8df6-4zz4k   1/1       Running   0          11s
pod/nginx-deployment-767fdf8df6-56bmx   1/1       Running   0          5m
pod/nginx-deployment-767fdf8df6-9rqk6   1/1       Running   0          11s
pod/nginx-deployment-767fdf8df6-bjbx4   1/1       Running   0          5m
pod/nginx-deployment-767fdf8df6-ksrc2   1/1       Running   0          11s
pod/nginx-deployment-767fdf8df6-p6xll   1/1       Running   0          5m
pod/nginx-deployment-767fdf8df6-qcj9q   1/1       Running   0          11s
pod/nginx-deployment-767fdf8df6-rf5tm   1/1       Running   0          5m
pod/nginx-deployment-767fdf8df6-rljpn   1/1       Running   0          11s
pod/nginx-deployment-767fdf8df6-ts8sn   1/1       Running   0          11s

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   7d

NAME                               DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-deployment   10        10        10           10          11m

NAME                                          DESIRED   CURRENT   READY     AGE
replicaset.apps/nginx-deployment-767fdf8df6   10        10        10        11m
replicaset.apps/nginx-deployment-85b548b894   0         0         0         11m
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

3.2、自动伸缩(Horizontal Pod Autoscaling)

自动伸缩需要部署Heapster和metrics-server~

root@master-1:~/kubernetes/example# cat nginx-deployment.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 4
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: 192.168.101.88:5000/nginx:1.7.9
        ports:
        - containerPort: 80
        resources:
          requests:
            memory: "64Mi"
            cpu: "25m"
          limits:
            memory: "128Mi"
            cpu: "50m"
---
kind: Service
apiVersion: v1
metadata:
  labels:
    app: nginx-deployment
  name: nginx-deployment-service
spec:
  ports:
    - port: 80
      targetPort: 80
      name: http
  selector:
    app: nginx

---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx-deployment-service-ingress
spec:
  rules:
    - host: nginx-deployment.chenlei.com
      http:
        paths:
          - backend:
              serviceName: nginx-deployment-service
              servicePort: 80
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 使用HPA需要在部署文件中明确指定资源配置情况 resources ,最少需要配置 resources.requests.cpu
  • 为了测试,向部署文件中增加了service和ingress
root@master-1:~/kubernetes/example# kubectl apply -f nginx-deployment.yaml 
deployment.apps "nginx-deployment" created
service "nginx-deployment-service" created
ingress.extensions "nginx-deployment-service-ingress" created

root@master-1:~/kubernetes/example# kubectl get all
NAME                                    READY     STATUS    RESTARTS   AGE
pod/nginx-deployment-5f79d4fc87-7k6cn   1/1       Running   0          9s
pod/nginx-deployment-5f79d4fc87-f5v27   1/1       Running   0          9s
pod/nginx-deployment-5f79d4fc87-ls6hz   1/1       Running   0          9s
pod/nginx-deployment-5f79d4fc87-rlwh4   1/1       Running   0          9s

NAME                               TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service/kubernetes                 ClusterIP   10.96.0.1       <none>        443/TCP   8d
service/nginx-deployment-service   ClusterIP   10.97.127.155   <none>        80/TCP    9s

NAME                               DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-deployment   4         4         4            4           10s

NAME                                          DESIRED   CURRENT   READY     AGE
replicaset.apps/nginx-deployment-5f79d4fc87   4         4         4         9s
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
root@master-1:~/kubernetes/example# kubectl autoscale deployment nginx-deployment --min=1 --max=10 --cpu-percent=20
deployment.apps "nginx-deployment" autoscaled

root@master-1:~/kubernetes/example# kubectl get all
NAME                                    READY     STATUS        RESTARTS   AGE
pod/nginx-deployment-5f79d4fc87-7k6cn   1/1       Running       0          2m
pod/nginx-deployment-5f79d4fc87-f5v27   0/1       Terminating   0          2m
pod/nginx-deployment-5f79d4fc87-ls6hz   0/1       Terminating   0          2m
pod/nginx-deployment-5f79d4fc87-rlwh4   0/1       Terminating   0          2m

NAME                               TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service/kubernetes                 ClusterIP   10.96.0.1       <none>        443/TCP   8d
service/nginx-deployment-service   ClusterIP   10.97.127.155   <none>        80/TCP    2m

NAME                               DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-deployment   1         1         1            1           2m

NAME                                          DESIRED   CURRENT   READY     AGE
replicaset.apps/nginx-deployment-5f79d4fc87   1         1         1         2m

NAME                                                   REFERENCE                     TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
horizontalpodautoscaler.autoscaling/nginx-deployment   Deployment/nginx-deployment   0%/20%    1         10        4          34s
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

HPA创建之后,会在30秒(根据controller-manager的参数配置)内根据CPU的负载情况自动调整POD数量。因为负载为零,所以自动终止了三个pod,仅保留一个~~~

kube-controller-manage的调度日志如下:

I0504 08:25:48.431218       1 horizontal.go:512] Successful rescale of nginx-deployment, old size: 4, new size: 1, reason: All metrics below target
I0504 08:25:48.431412       1 event.go:218] Event(v1.ObjectReference{Kind:"HorizontalPodAutoscaler", Namespace:"default", Name:"nginx-deployment", UID:"adb4b7a9-4f74-11e8-9807-0050568e3344", APIVersion:"autoscaling/v2beta1", ResourceVersion:"1314846", FieldPath:""}): type: 'Normal' reason: 'SuccessfulRescale' New size: 1; reason: All metrics below target
I0504 08:25:48.475085       1 event.go:218] Event(v1.ObjectReference{Kind:"Deployment", Namespace:"default", Name:"nginx-deployment", UID:"79043755-4f74-11e8-9807-0050568e3344", APIVersion:"extensions", ResourceVersion:"1314901", FieldPath:""}): type: 'Normal' reason: 'ScalingReplicaSet' Scaled down replica set nginx-deployment-5f79d4fc87 to 1
I0504 08:25:48.599598       1 event.go:218] Event(v1.ObjectReference{Kind:"ReplicaSet", Namespace:"default", Name:"nginx-deployment-5f79d4fc87", UID:"79075132-4f74-11e8-9807-0050568e3344", APIVersion:"extensions", ResourceVersion:"1314904", FieldPath:""}): type: 'Normal' reason: 'SuccessfulDelete' Deleted pod: nginx-deployment-5f79d4fc87-ls6hz
I0504 08:25:48.599622       1 event.go:218] Event(v1.ObjectReference{Kind:"ReplicaSet", Namespace:"default", Name:"nginx-deployment-5f79d4fc87", UID:"79075132-4f74-11e8-9807-0050568e3344", APIVersion:"extensions", ResourceVersion:"1314904", FieldPath:""}): type: 'Normal' reason: 'SuccessfulDelete' Deleted pod: nginx-deployment-5f79d4fc87-rlwh4
I0504 08:25:48.599634       1 event.go:218] Event(v1.ObjectReference{Kind:"ReplicaSet", Namespace:"default", Name:"nginx-deployment-5f79d4fc87", UID:"79075132-4f74-11e8-9807-0050568e3344", APIVersion:"extensions", ResourceVersion:"1314904", FieldPath:""}): type: 'Normal' reason: 'SuccessfulDelete' Deleted pod: nginx-deployment-5f79d4fc87-f5v27
W0504 08:27:12.650959       1 reflector.go:341] k8s.io/kubernetes/pkg/controller/garbagecollector/graph_builder.go:125: watch of <nil> ended with: very short watch: k8s.io/kubernetes/pkg/controller/garbagecollector/graph_builder.go:125: Unexpected watch close - watch lasted less than a second and no items received
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

增加负载:

LiondeMacBook-Pro:~ lion$ for i in {1..10000}; do curl http://nginx-deployment.chenlei.com/ > /dev/null -s; done;
  • 1

这里打开四个终端分别执行,然后观察pod伸缩情况

root@master-1:~/kubernetes/example# kubectl get all
NAME                                    READY     STATUS    RESTARTS   AGE
pod/nginx-deployment-5f79d4fc87-7k6cn   1/1       Running   0          12m
pod/nginx-deployment-5f79d4fc87-gvfpr   1/1       Running   0          4s
pod/nginx-deployment-5f79d4fc87-mzd58   1/1       Running   0          4s

NAME                               TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service/kubernetes                 ClusterIP   10.96.0.1       <none>        443/TCP   8d
service/nginx-deployment-service   ClusterIP   10.97.127.155   <none>        80/TCP    12m

NAME                               DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-deployment   3         3         3            3           12m

NAME                                          DESIRED   CURRENT   READY     AGE
replicaset.apps/nginx-deployment-5f79d4fc87   3         3         3         12m

NAME                                                   REFERENCE                     TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
horizontalpodautoscaler.autoscaling/nginx-deployment   Deployment/nginx-deployment   44%/20%   1         10        1          11m
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

当CPU压力增加时,kubernetes自动创建了两个新的pod来分摊压力,新增pod的数量取决于CPU压力打下

kube-controller-maanage的调度日志:

I0504 08:36:14.996758       1 horizontal.go:512] Successful rescale of nginx-deployment, old size: 1, new size: 3, reason: cpu resource utilization (percentage of request) above target
I0504 08:36:14.997180       1 event.go:218] Event(v1.ObjectReference{Kind:"HorizontalPodAutoscaler", Namespace:"default", Name:"nginx-deployment", UID:"adb4b7a9-4f74-11e8-9807-0050568e3344", APIVersion:"autoscaling/v2beta1", ResourceVersion:"1315533", FieldPath:""}): type: 'Normal' reason: 'SuccessfulRescale' New size: 3; reason: cpu resource utilization (percentage of request) above target
I0504 08:36:15.061094       1 event.go:218] Event(v1.ObjectReference{Kind:"Deployment", Namespace:"default", Name:"nginx-deployment", UID:"79043755-4f74-11e8-9807-0050568e3344", APIVersion:"extensions", ResourceVersion:"1316131", FieldPath:""}): type: 'Normal' reason: 'ScalingReplicaSet' Scaled up replica set nginx-deployment-5f79d4fc87 to 3
I0504 08:36:15.163244       1 event.go:218] Event(v1.ObjectReference{Kind:"ReplicaSet", Namespace:"default", Name:"nginx-deployment-5f79d4fc87", UID:"79075132-4f74-11e8-9807-0050568e3344", APIVersion:"extensions", ResourceVersion:"1316134", FieldPath:""}): type: 'Normal' reason: 'SuccessfulCreate' Created pod: nginx-deployment-5f79d4fc87-mzd58
I0504 08:36:15.208366       1 event.go:218] Event(v1.ObjectReference{Kind:"ReplicaSet", Namespace:"default", Name:"nginx-deployment-5f79d4fc87", UID:"79075132-4f74-11e8-9807-0050568e3344", APIVersion:"extensions", ResourceVersion:"1316134", FieldPath:""}): type: 'Normal' reason: 'SuccessfulCreate' Created pod: nginx-deployment-5f79d4fc87-gvfpr
  • 1
  • 2
  • 3
  • 4
  • 5

压力较低之后又会消减pod数量

3.3、自定义指标

这一块内容留在下次补充~~~~

3.4、异常记录

  • 问题一:
root@master-1:~/kubernetes/example# kubectl get hpa
NAME               REFERENCE                     TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
nginx-deployment   Deployment/nginx-deployment   <unknown>/10%   1         10        4          37s

root@master-1:~/kubernetes/example# kubectl get hpa
NAME               REFERENCE                     TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
nginx-deployment   Deployment/nginx-deployment   <unknown>/10%   1         10        4          37s

root@master-1:~/kubernetes/example# kubectl describe hpa nginx-deployment
Name:                                                  nginx-deployment
Namespace:                                             default
Labels:                                                <none>
Annotations:                                           <none>
CreationTimestamp:                                     Fri, 04 May 2018 04:46:16 -0400
Reference:                                             Deployment/nginx-deployment
Metrics:                                               ( current / target )
  resource cpu on pods  (as a percentage of request):  <unknown> / 10%
Min replicas:                                          1
Max replicas:                                          10
Conditions:
  Type           Status  Reason                   Message
  ----           ------  ------                   -------
  AbleToScale    True    SucceededGetScale        the HPA controller was able to get the target's current scale
  ScalingActive  False   FailedGetResourceMetric  the HPA was unable to compute the replica count: unable to get metrics for resource cpu: no metrics returned from resource metrics API
Events:
  Type     Reason                        Age   From                       Message
  ----     ------                        ----  ----                       -------
  Warning  FailedGetResourceMetric       21s   horizontal-pod-autoscaler  unable to get metrics for resource cpu: no metrics returned from resource metrics API
  Warning  FailedComputeMetricsReplicas  21s   horizontal-pod-autoscaler  failed to get cpu utilization: unable to get metrics for resource cpu: no metrics returned from resource metrics API
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

kube-controller-manage日志:

I0504 08:47:16.381435       1 event.go:218] Event(v1.ObjectReference{Kind:"HorizontalPodAutoscaler", Namespace:"default", Name:"nginx-deployment", UID:"9b7a46ff-4f77-11e8-9807-0050568e3344", APIVersion:"autoscaling/v2beta1", ResourceVersion:"1317451", FieldPath:""}): type: 'Warning' reason: 'FailedGetResourceMetric' missing request for cpu on container nginx in pod default/nginx-deployment-85b548b894-2lzg8
E0504 08:47:16.391281       1 horizontal.go:189] failed to compute desired number of replicas based on listed metrics for Deployment/default/nginx-deployment: failed to get cpu utilization: missing request for cpu on container nginx in pod default/nginx-deployment-85b548b894-2lzg8
I0504 08:47:16.391308       1 event.go:218] Event(v1.ObjectReference{Kind:"HorizontalPodAutoscaler", Namespace:"default", Name:"nginx-deployment", UID:"9b7a46ff-4f77-11e8-9807-0050568e3344", APIVersion:"autoscaling/v2beta1", ResourceVersion:"1317451", FieldPath:""}): type: 'Warning' reason: 'FailedComputeMetricsReplicas' failed to get cpu utilization: missing request for cpu on container nginx in pod default/nginx-deployment-85b548b894-2lzg8
  • 1
  • 2
  • 3

原因:

定义pod的时候,没有设置resources,HPA取不到CPU当前值

        resources:
          requests:
            memory: "64Mi"
            cpu: "25m"
          limits:
            memory: "128Mi"
            cpu: "50m"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 问题二
root@master-1:~/kubernetes/example# kubectl autoscale deployment nginx-deployment --min=1 --max=10 --cpu-percent=10
deployment.apps "nginx-deployment" autoscaled
root@master-1:~/kubernetes/example# kubectl describe hpa nginx-deployment
Name:                                                  nginx-deployment
Namespace:                                             default
Labels:                                                <none>
Annotations:                                           <none>
CreationTimestamp:                                     Fri, 04 May 2018 04:53:20 -0400
Reference:                                             Deployment/nginx-deployment
Metrics:                                               ( current / target )
  resource cpu on pods  (as a percentage of request):  <unknown> / 10%
Min replicas:                                          1
Max replicas:                                          10
Conditions:
  Type           Status  Reason                   Message
  ----           ------  ------                   -------
  AbleToScale    True    SucceededGetScale        the HPA controller was able to get the target's current scale
  ScalingActive  False   FailedGetResourceMetric  the HPA was unable to compute the replica count: unable to get metrics for resource cpu: unable to fetch metrics from resource metrics API: the server could not find the requested resource (get pods.metrics.k8s.io)
Events:
  Type     Reason                        Age   From                       Message
  ----     ------                        ----  ----                       -------
  Warning  FailedGetResourceMetric       27s   horizontal-pod-autoscaler  unable to get metrics for resource cpu: unable to fetch metrics from resource metrics API: the server could not find the requested resource (get pods.metrics.k8s.io)
  Warning  FailedComputeMetricsReplicas  27s   horizontal-pod-autoscaler  failed to get cpu utilization: unable to get metrics for resource cpu: unable to fetch metrics from resource metrics API: the server could not find the requested resource (get pods.metrics.k8s.io)
root@master-1:~/kubernetes/example# 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

kube-controller-manage日志:

E0504 08:54:20.852828       1 horizontal.go:189] failed to compute desired number of replicas based on listed metrics for Deployment/default/nginx-deployment: failed to get cpu utilization: unable to get metrics for resource cpu: unable to fetch metrics from resource metrics API: the server could not find the requested resource (get pods.metrics.k8s.io)
I0504 08:54:20.852958       1 event.go:218] Event(v1.ObjectReference{Kind:"HorizontalPodAutoscaler", Namespace:"default", Name:"nginx-deployment", UID:"987a4389-4f78-11e8-9807-0050568e3344", APIVersion:"autoscaling/v2beta1", ResourceVersion:"1318418", FieldPath:""}): type: 'Warning' reason: 'FailedGetResourceMetric' unable to get metrics for resource cpu: unable to fetch metrics from resource metrics API: the server could not find the requested resource (get pods.metrics.k8s.io)
  • 1
  • 2

原因:

没有部署metrics-server服务,部署后任然无法解决的可参考GitHub上的这个问题。

4、参考资料

https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/

https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/

k8s 滚动更新控制(一) 在传统的应用升级时,通常采用的方式是先停止服务,然后升级部署,最后将新应用启动。这个过程面临一个问题,就是在某段时间内,服务是不可用的,对于用户来说是非常不友好的。而kubernetes滚动更新,将避免这种情况的发生。对于Kubernetes集群来说,一个service可能有多个pod,滚动升级(RollingUpdate)就是指每次更新部分Pod,直至所有的Pod更新完成,达到平滑升级的效果,而不是在同一时刻将该Service下面的所有Pod停止。 阅读详情

相关推荐

联想服务器ThinkSystemRAID阵列设置教程

关注我不迷路,全是干货! 以联想ThinkSystemSR530为例子进行示范。 开机点按【F1】 点击——【UEFI设置】 依次点击——【系统设置】——【存储】 点击——【RAID卡】 PS:本次服务器配置的是730-8i 阵列卡,按实际情况选中需要设置的阵列卡即可。 点击——【Main Menu】 点击——【Configuration Management】 点击——【Create Virtual Drive】 点击——【Select RAID Leve..

littlelotusK的博客 2万+

K8S:应用pod滚动更新、回滚pod版本

K8S:应用pod滚动更新、回滚pod版本 一、背景描述 k8s版本:v1.16.6 系统版本:entOS Linux release 8.2.2004 (Core) 文档内容:测试K8S环境中如何实现pod滚动更新(更新时业务不中断),以及更新后回滚到上一版本或指定版本。 二、业务pod滚动更新 ①、非滚动更新yaml 对于多实例服务,滚动更新采用对各个实例逐批次进行单独更新而非同一时刻对所有实例进行全部更新,来达到不中断服务的更新升级方式。 对于Kubernetes集群来说,一个service可能有多个

那个那个 4391

CANoe信号波形分析保姆级教程:Graphic窗口从配置到实战避坑

本文详细解析了CANoe的Graphic窗口在信号波形分析中的高效配置与实战应用技巧。从信号显示模式选择、测量光标进阶操作到信号分组策略,提供工程化解决方案,帮助工程师快速定位总线信号异常,提升汽车电子开发与测试效率。

weixin_29279047的博客 270

Kubernetes 学习笔记(四)--- K8S Pod控制器应用进阶

目录 一、Pod控制器类别 1.1 ReplicaSet 1.2 Deployment 1.3 DaemonSet 1.4 Job 1.5 CronJob 1.6 StatufulSet 1.7 CDR 1.8 Helm 二、ReplicaSet资源清单 三、Deployment资源清单 3.1 strategy(Pod更...

yshir 736

具身智能与空天具身智能:从理论到实践的跨领域融合

本文深入探讨了具身智能从理论到实践的发展,重点分析了空天具身智能这一前沿领域。文章阐述了如何为AI赋予“身体”,使其通过与环境实时交互进化智能,并详细拆解了构建空天智能体所需的核心技术模块,包括多模态感知、基于大模型的决策规划以及鲁棒控制。同时,结合山区电力线自主巡检等实战案例,展望了多智能体协同与标准化等未来方向。

weixin_29045585的博客 536

system_stm32f10x.c文件分析

配置系统时钟(包括系统时钟源、锁相环(PLL)倍频系数、高级高性能总线(AHB)/ 高级外设总线(APBx)预分频器以及闪存相关设置)。该函数在系统复位后的启动阶段被调用,且调用时机早于跳转到主程序之前。

Jia shuheng的博客 603

Kubernetes 中的 revisionHistoryLimit 配置详解

在 Kubernetes 中, 是 和 等资源的重要配置之一。它决定了在应用更新时,Kubernetes 保留多少个历史版本,以便在需要时回滚到某个历史版本。今天,我们将深入探讨 的作用、如何使用它、以及在实际场景中的最佳实践。 是 或 资源中的一个字段,指定了 Kubernetes 在进行滚动更新时保留的历史版本的数量。它主要用于控制版本历史的数量,防止因过多的历史版本堆积而导致系统资源消耗过大。 的主要作用是管理和控制历史版本的数量。每次应用进行滚动更新时,Kubernetes 会生成一个新的

qq_36291550的博客 1307

Dify 部署与使用

本文介绍了Dify社区版的快速部署指南,涵盖系统架构、环境配置和初始化流程。Dify采用微服务架构,通过Docker Compose一键部署8个核心容器,包括前端、后端、数据库等组件。部署过程包括克隆代码、配置环境变量和启动服务,首次启动需3-10分钟下载镜像。文章详细讲解了.env文件的配置要点,包括服务地址、数据库连接和向量存储设置,并提供了生产环境安全加固建议。最后通过访问/install页面完成管理员账号初始化,即可开始使用Dify构建AI应用。

海兰 595

基于k8s实现动态弹性伸缩 动态的回滚和滚动更新

K8S是一个使用 Docker 容器进行编排的系统,主要围绕 pods 进行工作。 Pods 是 k8s 生态中最小的调度单位,可以包含一个或多个容器。 k8s是一个开源的容器集群管理系统,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。......

u010797364的博客 1419

浅析ArcGis中的软件——ArcMap、ArcScene、 ArcGlobe、ArcCatalog

ArcMap:是集空间数据显示、矢量数据编辑、冲突数据检查(拓扑检查)、查询检索(地理编码)、统计(字段属性表)、报表生成、空间分析(ArcGIS Spatial Analyst)和高级制图(制图表达)等众多功能干一体的桌面应用平台软件。而且提供所见即所得的符号编辑器,令用户可以随心所欲地生成任意复杂的点、线、面符号。所支持的空间数据格式包括Arclnfo coverages、ESRI shapefiles、ArcSDE lavers、DXF、DWG、DGN、常见的图像格式、GRIDs、TINs等。

lxlmycsdnfree的博客 6567

【即插即用模块】Transformer篇 | TCSVT 2025 | DAFM:双注意力聚合+反向跨模态筛选,特征精准捕捉并融合!

本文提出了一种双模态注意力融合模块(DAFM),用于增强多模态图像融合任务中的特征交互。该模块通过双注意力聚合机制,结合自注意力与跨模态注意力,有效提升特征融合效果。DAFM采用可学习平衡因子动态调整注意力权重,并运用深度卷积降低计算复杂度。实验结果表明,该模块能显著提升多模态图像融合质量,适用于RGB-红外等双模态视觉任务。模块代码实现简洁,可直接集成到现有网络中作为特征融合层使用。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 177

[K8S] Deployment滚动更新和回滚、水平伸缩

@创建Deployment 首先创建一个deployment,pod副本数为3,使用镜像nginx:1.19,并创建服务 test-deploy-svc.yaml 的内容如下 apiVersion: apps/v1 kind: Deployment metadata: labels: app: web name: web namespace: default spec: replicas: 3 selector: matchLabels: app: w

皮卡丘在充电 736

5G NR资源网格详解:RE、RB、符号、时隙与帧

本文以ETSI发布的3GPP TS 38.211 V18.3.0(Release 18)为协议基线,从二维资源网格出发,建立这些对象的严格关系;随后解释Numerology如何改变时间和频率粒度,并给出索引换算、带宽计算、内存布局和排障方法。

jifen0bianhuan的博客 182

k8s学习笔记:缩扩容&更新

1. 前言 自动缩扩容是现代化的容器调度平台带给我们的最激动人心的一项能力。在上规模的业务系统中我们无时无刻不面临着这样的难题:用户的流量往往随着时间波动,甚至偶尔出现不可预测的峰值(毛刺流量),每当流量增加时都需要手工的对应用进行扩容,峰值流量消失后又需要将扩容的机器回收,运维起来费时费力。 幸运的是,k8s这样的容器调度平台正在逐渐帮助我们解决这样的问题,它带来的AutoScaler功能目前已经支持在多个不同维度上的弹性缩扩容,可以根据应用的负载情况进行自适应。尽管在一些较为苛刻的场景下,由于容器启动速

不见其长,日有所长 2277

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

k8s的基本概念与基本功能

k8s的基本概念与基本功能k8s基本概念kubernetes架构Master 节点API Server(kube-apiserver)Scheduler(kube-scheduler)Controller Manager(kube-controller-manager)etcdNode 节点kubeletkube-proxyPod 网络k8s基本功能部署应用:访问应用:Scale 伸缩滚动更新更新回滚: k8s基本概念 kubernetes架构 Master 节点 Master 是 Kubernetes C

weixin_44848382的博客 752

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

K8s扩容

https://blog.youkuaiyun.com/lijingjingchn/article/details/115248195 手动: 2. 手动调整服务规模 我们可以使用kubectl提供的命令来手动调整某个Deployment的规模,也就是其包含的Pod数量,这里拿上一节里创建的HelloWorld服务来作为例子,当前的deployment状态如下: DISIRED表示配置时声明的期望副本数 CURRENT表示当前正在运行的副本数 UP-TO-DATE表示符合预期状态的副本数(比如某个副本...

lucky的专栏 4701

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

k8s服务编排

编写 YAML 或 JSON 格式的配置文件,描述应用的各个组件,如 Pod、Deployment、Service 等。

游戏全栈,技术合作 962

K8S简介(Kubernetes)

K8s简介

GSl0408的博客 3268

K8S控制器之Deployment详解及配置。

一,引入Deployment 对于kubernetes来说Pod是资源调度最小单元,kubernetes主要的功能就是管理多个Pod,Pod中可以包含一个或多个容器,而kubernetes是如可管理多个Pod的呢?对,没错,就是通过控制器,比如Deployment和ReplicaSet(rs)。 kubernetes下有多个Deployment,Deployment下管理RepliceSet,通过RepliceSet管理多个Pod,通过Pod管理容器。 它们之间的关系图如下: 二,Deploy.

无求道贾的博客 1万+

【Kubernetes】使用Deployment进行的资源调度,资源清理,伸缩与更新管控

场景推荐操作优势清理闲置资源kubectl delete rs <闲置RS>保持集群资源列表简洁,避免资源冗余动态调整副本数kubectl scale deploy <名称> --replicas=<数量>一键伸缩,比手动编辑更高效安全更新配置pause→ 修改 →resume分步验证配置,降低更新风险版本管理与回滚追踪更新记录,支持快速回滚到稳定版本。

m0_74282926的博客 1050

k8s之deployment应用

k8s之deployment应用

魏志标的博客 1780

k8s应用生命周期管理

k8s应用生命周期管理在K8S中部署应用流程使用Deployment部署Java应用服务编排Deployment工作负载均衡器介绍Deployment的主要功能Deployment的应用场景应用生命周期管理流程应用部署应用升级实验:升级nginx版本水平扩伸缩回滚滚动升级与回滚实现机制 在K8S中部署应用流程 使用Deployment部署Java应用 # 使用Department控制器部署镜像 kubectl create deployment web --images=lizhenliang/java

教Linux的李老师 2384

第2章:工作负载管理 - 可视化应用部署

通过本章学习,你已经掌握了:✅三大工作负载的区别和应用场景✅完整应用栈的可视化部署流程✅高级功能:滚动更新、版本回滚、弹性伸缩✅效率对比:可视化操作的实际优势互动挑战:尝试通过Dashboard部署一个包含前端、后端、数据库的完整应用,并在评论区分享你的部署时间和体验感受!最快的同学有惊喜哦!🎁。

huangxuanheng的专栏 940

Kubernetes,(简称k8s)

混合云和多云:Kubernetes 可以在不同的云环境(如 AWS、Azure、Google Cloud)和本地数据中心中运行,实现混合云和多云部署。自动扩展:Kubernetes 可以根据资源使用情况自动扩展或缩减应用程序的实例数量,以适应流量或资源需求的变化。自愈能力:如果某个容器或节点发生故障,Kubernetes 可以自动重启或重新调度容器,确保应用程序的持续运行。密钥管理:Kubernetes 提供了安全的密钥管理机制,用于存储和管理敏感信息,如数据库密码或 API 密钥。

dbq___的博客 301

K8S--功能与架构

原文网址: 简介 本文介绍K8S,包括:起源、功能、架构。 来源 K8S全称:kubernetes,因为中间有8个字母,所以简称K8S。 之前Docker有自己的一套编排软件:Docker Swarm,它可以在多台主机中创建一个docker集群,docker在很早就放弃了这个项目。 K8S的创造者是Google。K8S并不是一件全新的发明,它的前身,是Google自己捣鼓了十多年的Borg系统。 K8S是2014年...

IT利刃出鞘的博客 2650
上一篇: Kubernetes资源管理
下一篇: helm命令
王树民
博客等级 码龄10年 912粉丝 560原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值