kubernetes调度2

1、各种缩写的应用

 [root@k8s-master test]# kubectl get rsNAME                 DESIRED   CURRENT   READY   AGEtest001-64c7957b5c   2         2         2       8m59stest001-698b98bb8f   0         0         0       12m[root@k8s-master test]# kubectl get replicasets.apps NAME                 DESIRED   CURRENT   READY   AGEtest001-64c7957b5c   2         2         2       9m19stest001-698b98bb8f   0         0         0       12m[root@k8s-master test]# kubectl get deployments.apps NAME      READY   UP-TO-DATE   AVAILABLE   AGEtest001   2/2     2            2           12m[root@k8s-master test]# kubectl get deploymentsNAME      READY   UP-TO-DATE   AVAILABLE   AGEtest001   2/2     2            2           12m[root@k8s-master test]# kubectl get deployNAME      READY   UP-TO-DATE   AVAILABLE   AGEtest001   2/2     2            2           12m[root@k8s-master test]# kubectl get poNAME                       READY   STATUS    RESTARTS      AGEtest001-64c7957b5c-2w5jt   1/1     Running   0             7m2stest001-64c7957b5c-gr5vp   1/1     Running   1 (69s ago)   11m[root@k8s-master test]# kubectl get podNAME                       READY   STATUS    RESTARTS      AGEtest001-64c7957b5c-2w5jt   1/1     Running   0             7m4stest001-64c7957b5c-gr5vp   1/1     Running   1 (71s ago)   11m[root@k8s-master test]# kubectl get podsNAME                       READY   STATUS    RESTARTS      AGEtest001-64c7957b5c-2w5jt   1/1     Running   0             7m8stest001-64c7957b5c-gr5vp   1/1     Running   1 (75s ago)   11m​

2、StatefulSet 有状态应用

StatefulSet管理有差别容器

1)StatefulSet 概念

StatefulSet 是 k8s 中的一个控制器资源对象,用于管理 有状态应用的部署和运行。

2)StatefulSet 特点

稳定的网络标识:StatefulSet 管理的 Pod 实例都有 一个唯一的网络标识符(通常为 DNS 名称),用于在 有状态应用中进行唯一标识和访问。

有序部署和扩展:StatefulSet 在部署和扩展 Pod 实 例时,会按照序号的顺序逐个创建和启动,确保有状 态应用的有序初始化和配置。

稳定的持久化存储:StatefulSet 具备与 Pod 实例关 联的持久化存储卷 (Persistent Volume)的能力,确保 每个实例可以访问和使用相应的持久化数据。

有状态应用的有序终止:在进行有状态应用的缩容或 删除时,StatefulSet 会按照序号的逆序进行有序的终 止操作,以确保数据的完整性和有状态应用的正常关 闭。

3)Headless Service

Headless Services 是一种特殊的 Service,其 spec:clusterIP 表示为 None,这样在实际运行时就不会 被分配 ClusterIP,使用 Endpoint 在 Pod 之间互相通 信。Headless Service 也被称为无头服务。

4)Headless Service和普通Service的区别:

Headless 不分配 ClusterIP。

Headless service 可以通过解析 Service 的 DNS,返回 所有Pod的地址和DNS (statefulSet部署的Pod才有 DNS)。

普通的 Service,只能通过解析 Service 的 DNS 返回 Service 的 ClusterIP。

5)StatefulSet 和 Deployment 控制器的区别:

StatefulSet 下的 Pod 有 DNS 地址,通过解析 Pod 的 DNS 可以返回 Pod 的 IP。

Deployment 下的 Pod 没有 DNS。

6)Headless 一般格式

statefulSetName-{0..N1}.serviceName.namespace.svc.cluster.local

serviceName:Headless Service 的名字,创建 StatefulSet 时,必须指定 Headless Service 名称

0..N-1:Pod 所在的序号,从 0 开始到 N-1

statefulSetName:StatefulSet 的名字;

namespace:服务所在的命名空间

.cluster.local:Cluster Domain (集群域)

注:Headless Service需提前创建

7)使用yaml文件创建删除 StatefulSet应用
(1)下载并引入镜像
 [root@k8s-master pods]# docker pull redis:latest[root@k8s-master pods]# docker pull redis:7.0.14[root@k8s-master pods]# docker save -o redis.7.0.14.tar redis:7.0.14[root@k8s-master pods]# docker save -o redis.latest.tar redis:latest[root@k8s-master pods]# scp redis.7.0.14.tar k8s-node01:/rootredis.7.0.14.tar                                              100%  128MB  67.0MB/s   00:01    [root@k8s-master pods]# scp redis.7.0.14.tar k8s-node02:/rootredis.7.0.14.tar                                              100%  128MB  73.2MB/s   00:01    [root@k8s-master pods]# scp redis.latest.tar k8s-node02:/rootredis.latest.tar                                              100%  115MB  73.1MB/s   00:01    [root@k8s-master pods]# scp redis.latest.tar k8s-node01:/rootredis.latest.tar                                              100%  115MB  64.5MB/s   00:01    [root@k8s-node01 ~]# ctr -n k8s.io images import redis.latest.tar --platform=linux/amd64[root@k8s-node01 ~]# ctr -n k8s.io images import redis.7.0.14.tar --platform=linux/amd64[root@k8s-node02 ~]# ctr -n k8s.io images import redis.7.0.14.tar --platform=linux/amd64[root@k8s-node02 ~]# ctr -n k8s.io images import redis.latest.tar --platform=linux/amd64[root@k8s-node01 ~]# crictl imagesIMAGE                                                            TAG                 IMAGE ID            SIZEdocker.io/library/redis                                          7.0.14              d9c89935bd08c       134MBdocker.io/library/redis                                          latest              590b81f2fea1a       120MB
(2)服务的创建与删除
 # 查看service的文件结构# explain读取说明[root@k8s-master pods]# kubectl explain service[root@k8s-master pods]# kubectl explain service.apiVersion[root@k8s-master pods]# kubectl explain service.kind[root@k8s-master pods]# kubectl explain service.metadata[root@k8s-master pods]# kubectl explain service.spec# 创建了一个无头服务[root@k8s-master pods]# vim test0027.yamlapiVersion: v1# 定义的是statefulSet的headless service(无头服务)kind: Servicemetadata:# 定义redis的headless servicename: redislabels:app: redis-dbspec:ports:- name: redisportport: 27017clusterIP: Noneselector:app: redis-db[root@k8s-master pods]# kubectl create -f test0027.yaml service/redis created[root@k8s-master pods]# kubectl get serviceNAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)     AGEkubernetes   ClusterIP   10.96.0.1    <none>        443/TCP     7d16hredis        ClusterIP   None         <none>        27017/TCP   52s# 删除服务[root@k8s-master pods]# kubectl delete -f test0027.yaml service "redis" deleted[root@k8s-master pods]# kubectl get serviceNAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGEkubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   7d16h
(3)StatefulSet的创建
 # 查看statefulset的文件结构[root@k8s-master pods]# kubectl explain statefulset[root@k8s-master pods]# kubectl explain statefulset.apiVersion[root@k8s-master pods]# kubectl explain statefulset.kind[root@k8s-master pods]# kubectl explain statefulset.metadata[root@k8s-master pods]# kubectl explain statefulset.spec# 在服务后面加下面内容[root@k8s-master pods]# vim test0027.yaml ---apiVersion: apps/v1# 资源类型kind: StatefulSetmetadata:name: redis-dbnamespace: defaultlabels:# 必须匹配 spec.template.metadata.labelsapp: redisspec:selector:matchLabels:app: redisreplicas: 3serviceName: "redis"# 用于指定在进⾏滚动更新或⾸次创建 Pod 时,Pod 实例需要等待准备就绪的最⼩时间(以秒为单位)默认0minReadySeconds: 10template:metadata:labels:# 必须匹配 spec.selector.matchLabelsapp: redisspec:# pod接到终⽌信号后,多等待10秒terminationGracePeriodSeconds: 10containers:- name: redisimage: docker.io/library/redis:latestimagePullPolicy: Neverports:- name: redisportcontainerPort: 27017[root@k8s-master pods]# kubectl create -f test0027.yaml service/redis createdstatefulset.apps/redis-db created# statefulset控制的pod,数量为定义好的3,并且与deployment不同的是,statefulset是按照序号顺序标识并控制pod启停的[root@k8s-master pods]# kubectl get podNAME                            READY   STATUS    RESTARTS   AGEcluster-test-66bb44bd88-cqkx5   1/1     Running   0          7m17sredis-db-0                      1/1     Running   0          53sredis-db-1                      1/1     Running   0          33sredis-db-2                      1/1     Running   0          13s
(4)查看 StatefulSet
 # 查看 kube-system 命名空间内的服务[root@k8s-master pods]# kubectl get svc -n kube-system NAME             TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                  AGEkube-dns         ClusterIP   10.96.0.10      <none>        53/UDP,53/TCP,9153/TCP   7d17hmetrics-server   ClusterIP   10.96.195.245   <none>        443/TCP                  7d# 查看默认命名空间内的服务[root@k8s-master pods]# kubectl get svc -n default NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)     AGEkubernetes   ClusterIP   10.96.0.1    <none>        443/TCP     7d17hredis        ClusterIP   None         <none>        27017/TCP   16m# 查看默认命名空间下的statefulSet控制器[root@k8s-master pods]# kubectl get stsNAME       READY   AGEredis-db   3/3     16m       [root@k8s-master pods]# kubectl get statefulsets.apps NAME       READY   AGEredis-db   3/3     17m​
(5)删除StatefulSet应用创建出的pod(两种方式:级联与非级联)
 # 普通方式删除不了StatefulSet应用创建出的pod[root@k8s-master pods]# kubectl delete pod redis-db-0pod "redis-db-0" deleted# 重新创建一个pod顶替删除的pod[root@k8s-master pods]# kubectl get podNAME                            READY   STATUS    RESTARTS   AGEcluster-test-66bb44bd88-cqkx5   1/1     Running   0          25mredis-db-0                      1/1     Running   0          7sredis-db-1                      1/1     Running   0          18mredis-db-2                      1/1     Running   0          18m# 直接删除statefulset应用[root@k8s-master pods]# kubectl delete statefulsets.apps redis-db statefulset.apps "redis-db" deleted[root@k8s-master pods]# kubectl get podNAME                            READY   STATUS    RESTARTS   AGEcluster-test-66bb44bd88-cqkx5   1/1     Running   0          26m# 再次使用yaml文件创建statefulset应用,会发生报错# 由于service已存在[root@k8s-master pods]# kubectl create -f test0027.yaml statefulset.apps/redis-db createdError from server (AlreadyExists): error when creating "test0027.yaml": services "redis" already exists# 先删除service(一般不这样)[root@k8s-master pods]# kubectl delete svc redis service "redis" deleted[root@k8s-master pods]# kubectl create -f test0027.yaml service/redis createdError from server (AlreadyExists): error when creating "test0027.yaml": statefulsets.apps "redis-db" already exists# 直接使用yaml文件删除所有相关文件[root@k8s-master pods]# kubectl delete -f test0027.yaml service "redis" deletedstatefulset.apps "redis-db" deleted# 创建StatefulSet应用[root@k8s-master pods]# kubectl create -f test0027.yaml service/redis createdstatefulset.apps/redis-db created[root@k8s-master pods]# kubectl get podNAME                            READY   STATUS    RESTARTS   AGEcluster-test-66bb44bd88-cqkx5   1/1     Running   0          29mredis-db-0                      1/1     Running   0          56sredis-db-1                      1/1     Running   0          36sredis-db-2                      1/1     Running   0          16s​
 # 非级联删除pod# 先将其service与statefulset.apps删除,但此时pod还存在并运行[root@k8s-master pods]# kubectl delete -f test0027.yaml --cascade=falsewarning: --cascade=false is deprecated (boolean value) and can be replaced with --cascade=orphan.service "redis" deletedstatefulset.apps "redis-db" deleted[root@k8s-master pods]# kubectl get podNAME                            READY   STATUS    RESTARTS   AGEcluster-test-66bb44bd88-cqkx5   1/1     Running   0          30mredis-db-0                      1/1     Running   0          2m51sredis-db-1                      1/1     Running   0          2m31sredis-db-2                      1/1     Running   0          2m11s[root@k8s-master pods]# kubectl get statefulsets.apps No resources found in default namespace.[root@k8s-master pods]# kubectl get svcNAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGEkubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   7d17h# 然后可以一个一个删除pod[root@k8s-master pods]# for i in 0 1 2;do kubectl delete pod redis-db-$i;donepod "redis-db-0" deletedpod "redis-db-1" deletedpod "redis-db-2" deleted[root@k8s-master pods]# kubectl get podNAME                            READY   STATUS    RESTARTS   AGEcluster-test-66bb44bd88-cqkx5   1/1     Running   0          33m
(6)StatefulSet 创建 Pod 流程

1、对于具有 N 个副本的 StatefulSet,将按顺序从 0 到 N-1 开始创建 Pod。

2、当删除 Pod 时,将按照 N-1 到 0 的逆序终止并删 除。

3、在缩容 Pod 之前,必须保证当前的 Pod 是 Running 或 Ready 状态。

4、在终止 Pod 之前,它所有的继任者必须是完全关闭状 态。

5、如果前一个 Pod 状态不处于 Running 或 Ready,那 么下一任 Pod 不会被创建,并且即使在特殊情况下第 二个 Pod 创建成功,而第三个 Pod 也不会被创建。

8)修改更新StatefulSet(升级策略)
(1)创建pod
 # 创建pod[root@k8s-master pods]# kubectl create -f test0027.yaml service/redis createdstatefulset.apps/redis-db created[root@k8s-master pods]# kubectl get podNAME                            READY   STATUS    RESTARTS      AGEcluster-test-66bb44bd88-cqkx5   1/1     Running   3 (19m ago)   3h19mredis-db-0                      1/1     Running   0             68sredis-db-1                      1/1     Running   0             48sredis-db-2                      1/1     Running   0             28s
(2)镜像修改
 # 滚动更新,从序号最大的pod开始更新# 镜像修改[root@k8s-master pods]# kubectl set image sts redis-db redis=docker.io/library/redis:7.0.14statefulset.apps/redis-db image updated[root@k8s-master pods]# kubectl describe pod redis-db-1 | grep Image:Image:          docker.io/library/redis:7.0.14[root@k8s-master pods]# for i in 0 1 2;do kubectl describe pod redis-db-$i | grep Image:;doneImage:          docker.io/library/redis:7.0.14Image:          docker.io/library/redis:7.0.14Image:          docker.io/library/redis:7.0.14
(3)扩容缩容方法1
 # 扩容[root@k8s-master pods]# kubectl scale statefulset redis-db --replicas 5statefulset.apps/redis-db scaled[root@k8s-master pods]# kubectl get podNAME                            READY   STATUS    RESTARTS      AGEcluster-test-66bb44bd88-cqkx5   1/1     Running   3 (30m ago)   3h30mredis-db-0                      1/1     Running   0             3m2sredis-db-1                      1/1     Running   0             3m23sredis-db-2                      1/1     Running   0             3m39sredis-db-3                      1/1     Running   0             78sredis-db-4                      1/1     Running   0             58s# 缩容(从大到小删除)[root@k8s-master pods]# kubectl scale statefulset redis-db --replicas 2statefulset.apps/redis-db scaled[root@k8s-master pods]# kubectl get podNAME                            READY   STATUS    RESTARTS      AGEcluster-test-66bb44bd88-cqkx5   1/1     Running   3 (32m ago)   3h32mredis-db-0                      1/1     Running   0             4m57sredis-db-1                      1/1     Running   0             5m18s
(4)扩容缩容方法2(观察扩容缩容过程)
 [root@k8s-master pods]# kubectl get po -w# -w表示在当前终端查看过程

 # 新开一终端执行命令[root@k8s-master pods]# kubectl patch statefulsets.apps redis-db -p '{"spec":{"replicas":10}}'statefulset.apps/redis-db patched# 观察上一终端的创建过程# ctrl+c退出观察

 [root@k8s-master pods]# kubectl get po -w

 [root@k8s-master pods]# kubectl patch statefulsets.apps redis-db -p '{"spec":{"replicas":3}}'statefulset.apps/redis-db patched

(5)分段更新
 [root@k8s-master pods]# kubectl delete -f test0027.yaml service "redis" deletedstatefulset.apps "redis-db" deleted[root@k8s-master pods]# vim test0027.yaml # 增加修改此部分

 updateStrategy: # 更新策略模块partition: 3 # 分段更新参数,序号大于或等于3的副本type: RollingUpdate # 更新策略类型[root@k8s-master pods]# kubectl delete -f test0027.yaml service "redis" deletedstatefulset.apps "redis-db" deleted[root@k8s-master pods]# kubectl create -f test0027.yaml service/redis createdstatefulset.apps/redis-db created[root@k8s-master pods]# kubectl get podNAME                            READY   STATUS    RESTARTS      AGEcluster-test-66bb44bd88-cqkx5   1/1     Running   4 (13m ago)   4h13mredis-db-0                      1/1     Running   0             7m52sredis-db-1                      1/1     Running   0             7m37sredis-db-2                      1/1     Running   0             7m17sredis-db-3                      1/1     Running   0             6m57sredis-db-4                      1/1     Running   0             6m37s[root@k8s-master pods]# for i in 0 1 2 3 4;do kubectl describe pod redis-db-1 | grep Image:;doneImage:          docker.io/library/redis:latestImage:          docker.io/library/redis:latestImage:          docker.io/library/redis:latestImage:          docker.io/library/redis:latestImage:          docker.io/library/redis:latest[root@k8s-master pods]# kubectl set image sts redis-db redis=docker.io/library/redis:7.0.14statefulset.apps/redis-db image updated[root@k8s-master pods]# for i in 0 1 2 3 4;do kubectl describe pod redis-db-$i | grep Image:;doneImage:          docker.io/library/redis:latestImage:          docker.io/library/redis:latestImage:          docker.io/library/redis:latestImage:          docker.io/library/redis:7.0.14Image:          docker.io/library/redis:7.0.14

3、守护进程集 DaemonSet

1)DaemonSet 概念

DaemonSet 是 Kubernetes 中的一个重要概念,它是一 种特殊的控制器,用于在集群中的每个节点上运行一个 Pod 副本。

DaemonSet 可以确保在集群的每个节点上都有相关的 Pod 运行,这对于一些需要每个节点都运行的应用非常 有用,例如日志收集、资源监控等。

当有新节点加入集群时,DaemonSet 会自动为新节点创 建一个 Pod,而当某个节点从集群中移除时, DaemonSet 会自动回收该节点上的 Pod。

此外, DaemonSet 还可以通过节点选择器和标签来指定仅在部 分具有特定特征的节点上运行指定的 Pod。

2)定义创建 DaemonSet
 [root@k8s-master pods]# vim test0028.yamlapiVersion: apps/v1# 资源类型:DaemonSetkind: DaemonSet# 元信息metadate:# 该DaemonSet资源名name: nginxspec:# 标签选择器selector:# 匹配标签matchLabels:# 与上面的标签相同app: nginx# 定义podtemplate:metadata:labels:# 定义的标签,与上面标签相同app: nginxspec:# 定义pod的配置containers:# 容器名- name: nginx# 使用的镜像image: docker.io/library/nginx:1.25.0imagePullPolicy: Neverports:- name: nginxportcontainerPort: 80[root@k8s-master pods]# kubectl delete -f test0027.yaml service "redis" deletedstatefulset.apps "redis-db" deleted[root@k8s-master pods]# kubectl create -f test0028.yaml daemonset.apps/nginx created# 通过使用DaemonSet,使每个node节点都建立了一个pod,创建了两个pod节点[root@k8s-master pods]# kubectl get podNAME                            READY   STATUS    RESTARTS        AGEcluster-test-66bb44bd88-cqkx5   1/1     Running   6 (4m14s ago)   5h15mnginx-hh542                     1/1     Running   0               7snginx-pbx4w                     1/1     Running   0               7s
3)通过标签指定节点部署
 [root@k8s-master pods]# vim test0028.yaml # 增加下面内容# nodeSelector: 添加node标签选择器# abc: "1" 选择自定义的标签或node自带标签

 # 查看node节点携带的标签[root@k8s-master pods]# kubectl get node --show-labelsNAME         STATUS   ROLES           AGE     VERSION   LABELSk8s-master   Ready    control-plane   7d22h   v1.28.2   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-master,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node.kubernetes.io/exclude-from-external-load-balancers=k8s-node01   Ready    <none>          7d7h    v1.28.2   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node01,kubernetes.io/os=linuxk8s-node02   Ready    <none>          7d22h   v1.28.2   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node02,kubernetes.io/os=linux# 为node1节点设置指定的标签[root@k8s-master pods]# kubectl label nodes k8s-node01 abc=1node/k8s-node01 labeled# 查看node节点标签[root@k8s-master pods]# kubectl get node --show-labelsNAME         STATUS   ROLES           AGE     VERSION   LABELSk8s-master   Ready    control-plane   7d22h   v1.28.2   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-master,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node.kubernetes.io/exclude-from-external-load-balancers=k8s-node01   Ready    <none>          7d7h    v1.28.2   abc=1,beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node01,kubernetes.io/os=linuxk8s-node02   Ready    <none>          7d22h   v1.28.2   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node02,kubernetes.io/os=linux# 删除pod节点指定yaml文件重新创建pod节点[root@k8s-master pods]# kubectl delete -f test0028.yaml daemonset.apps "nginx" deleted[root@k8s-master pods]# kubectl create -f test0028.yaml daemonset.apps/nginx created# 查看pod节点,发现只创建了一个pod节点[root@k8s-master pods]# kubectl get podNAME                            READY   STATUS    RESTARTS        AGEcluster-test-66bb44bd88-cqkx5   1/1     Running   6 (9m11s ago)   5h20mnginx-fnxnz                     1/1     Running   0               7s# 查看pod节点的ip地址与所在node节点,发现确实只创建到了node01上[root@k8s-master pods]# kubectl get pod -owideNAME                            READY   STATUS    RESTARTS        AGE     IP              NODE         NOMINATED NODE   READINESS GATEScluster-test-66bb44bd88-cqkx5   1/1     Running   6 (9m54s ago)   5h20m   172.16.85.242   k8s-node01   <none>           <none>nginx-fnxnz                     1/1     Running   0               50s     172.16.85.245   k8s-node01   <none>           <none>
4)更新和回滚 DaemonSet

如果添加了新节点或修改了节点标签 (Label), DaemonSet 将立刻向新匹配上的节点添加 Pod 同时删 除不能匹配的节点上的 Pod。

DaemonSet 滚动更新可参考:DaemonSet | Kubernetes

DaemonSet 更新策略和 StatefulSet 类似,也有 OnDelete 和 RollingUpdate 两种方式。(若需要更新请 查看 Deployment 更新方式,将资源类型和名称替换即 可)

4、自动扩缩容 HPA

1)HPA 概念

Horizontal Pod Autoscaler(HPA)是Kubernetes中的 一个功能,可以根据观察到的CPU 利用率或其他应用程 序提供的指标自动伸缩副本数量。

HPA 监视指定的资源(通常是 Deployment )。

当负载增加时,HPA 可自动增加 Pod 副本数量以满足 需求。

当负载减小时,HPA 可自动缩减 Pod 副本数量以节省 资源。

HPA 接口类型:

HPAv1 为稳定版自动水平伸缩,只支持CPU指标

V2 为 beta 版本,分为 v2beta1 (支持CPU、内存和自 定义指标)

v2beta2 (支持CPU、内存、自定义指标 Custom 和额 外指标 ExternalMetrics)

 [root@k8s-master pods]# kubectl get apiservices | grep autoscav1.autoscaling                         Local                        True        8dv2.autoscaling                         Local                        True        8d[root@k8s-master pods]# kubectl top nodeNAME         CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   k8s-master   140m         7%     1121Mi          65%       k8s-node01   52m          2%     905Mi           52%       k8s-node02   56m          2%     911Mi           53%
2)HPA 实战

注: 必须安装 metrics-server 或其他自定义 metrics-server

必须配置 requests 参数

不能扩容无法缩放的对象,比如 DaemonSet

(1)创建一个deployment设置hpa的属性
 [root@k8s-master pods]# kubectl create deployment test0029 --image=docker.io/library/nginx:1.25.0 --replicas=1 -o=yaml --dry-run=client > test0029.yaml[root@k8s-master pods]# vim test0029.yaml # 查看并修改yaml文件# requests: 配置requests参数# cpu: 10m 指定cpu指标为10m

 [root@k8s-master pods]# kubectl create -f test0029.yaml deployment.apps/test0029 created[root@k8s-master pods]# kubectl get podNAME                            READY   STATUS    RESTARTS      AGEcluster-test-66bb44bd88-cqkx5   1/1     Running   6 (29m ago)   5h40mnginx-fnxnz                     1/1     Running   0             19mtest0029-844d5495cf-rl5kk       1/1     Running   0             11s[root@k8s-master pods]# kubectl get pod -owideNAME                            READY   STATUS    RESTARTS      AGE     IP              NODE         NOMINATED NODE   READINESS GATEScluster-test-66bb44bd88-cqkx5   1/1     Running   6 (30m ago)   5h41m   172.16.85.242   k8s-node01   <none>           <none>test0029-844d5495cf-rl5kk       1/1     Running   0             118s    172.16.58.198   k8s-node02   <none>           <none>[root@k8s-master pods]# curl 172.16.58.198<!DOCTYPE html><html><head><title>Welcome to nginx!</title><style>html { color-scheme: light dark; }body { width: 35em; margin: 0 auto;font-family: Tahoma, Verdana, Arial, sans-serif; }</style></head><body><h1>Welcome to nginx!</h1><p>If you see this page, the nginx web server is successfully installed andworking. Further configuration is required.</p>​<p>For online documentation and support please refer to<a href="http://nginx.org/">nginx.org</a>.<br/>Commercial support is available at<a href="http://nginx.com/">nginx.com</a>.</p>​<p><em>Thank you for using nginx.</em></p></body></html>
(2)映射端口
 [root@k8s-master pods]# kubectl expose deployment test0029 --port=80service/test0029 exposed[root@k8s-master pods]# kubectl get svcNAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGEkubernetes   ClusterIP   10.96.0.1     <none>        443/TCP   7d23htest0029     ClusterIP   10.96.56.90   <none>        80/TCP    31s[root@k8s-master pods]# curl 10.96.56.90<!DOCTYPE html><html><head><title>Welcome to nginx!</title><style>html { color-scheme: light dark; }body { width: 35em; margin: 0 auto;font-family: Tahoma, Verdana, Arial, sans-serif; }</style></head><body><h1>Welcome to nginx!</h1><p>If you see this page, the nginx web server is successfully installed andworking. Further configuration is required.</p>​<p>For online documentation and support please refer to<a href="http://nginx.org/">nginx.org</a>.<br/>Commercial support is available at<a href="http://nginx.com/">nginx.com</a>.</p>​<p><em>Thank you for using nginx.</em></p></body></html>
(3)设置自动扩容参数
 [root@k8s-master pods]# kubectl autoscale deployment test0029 --cpu-percent=10 --max=10 --min=1horizontalpodautoscaler.autoscaling/test0029 autoscaled# 新开一终端,输入下面指令,死循环访问服务ip地址[root@k8s-master ~]# while true;do wget -q -O- http://10.96.56.90 > /dev/null;done

 # 查看pod数量,发现可以自动创建pod直到达到最大标准数10[root@k8s-master pods]# kubectl get pod | wc -l12# 另一终端停止访问[root@k8s-master ~]# while true;do wget -q -O- http://10.96.56.90 > /dev/null;done^C# 等一段时间后,发现可以自动删除pod直到达到最小标准数1[root@k8s-master pods]# kubectl get pod | wc -l3

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/54244.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

昂科烧录器支持Senasic琻捷电子的蓝牙低功耗芯片SNP746

芯片烧录行业领导者-昂科技术近日发布最新的烧录软件更新及新增支持的芯片型号列表&#xff0c;其中Senasic琻捷电子的蓝牙低功耗芯片SNP746已经被昂科的通用烧录平台AP8000所支持。 SNP746是一款蓝牙低功耗芯片&#xff0c;集成了压力传感器和加速度传感器的测量电路。它是为…

git报错:无法读取远程分支 ‘origin‘ does not appear to be a git repository

问题分析 push上传的时候本地分支和远程分支断开连接 所以重新链接即可 排查问题 1. 查看是否有分支&#xff0c;检查分支是否正确 git branch -v 2. 查看连接是否断开&#xff0c;断开无内容展示 查看远程仓库详细信息&#xff0c;可看到仓库地址 git remote -v 解决…

Linux 信号的产生

1. 概念 在Linux系统中&#xff0c;信号是一种进程间通信的机制&#xff0c;它允许操作系统或其他进程向特定进程发送异步通知。我们可以通过命令 kill -l来查看信号的种类&#xff1a; Linux系统中的信号可以分为两大类&#xff1a;传统信号和实时信号。从上图可以看出它们分…

htop(1) command

文章目录 1.简介2.格式3.选项4.交互式命令5.示例6.小结参考文献 1.简介 htop 是一种交互式、跨平台的基于 ncurses 的进程查看器。 类似于 top&#xff0c;但 htop 允许您垂直和水平滚动&#xff0c;并使用指向设备(鼠标)进行交互。您可以观察系统上运行的所有进程&#xff0…

24年蓝桥杯及攻防世界赛题-MISC-2

11 Railfence fliglifcpooaae_hgggrnee_o{cr} 随波逐流编码工具 分为5栏时,解密结果为:flag{railfence_cipher_gogogo} 12 Caesar rxms{kag_tmhq_xqmdzqp_omqemd_qzodkbfuaz} mode1 #12: flag{you_have_learned_caesar_encryption} 随波逐流编码工具 13 base64 base64解…

iOS17找不到developer mode

iOS17找不到开发者模式 developer mode 下载过app之后、弹窗Developer Mode Required之后&#xff0c;这个菜单就出现了&#xff08;之前死活找不到&#xff09;。 背景&#xff1a;用蒲公英分发测试app&#xff0c;有个同事买了新机(iphone 15 pro max)&#xff0c;添加了白名…

ppt一键生成免费版软件有哪些?如何高效生成论文答辩?

答辩经验丰富的人都知道&#xff0c;制作论文答辩ppt是一项既繁琐又耗时的工作。 我们需要从数万字的论文中提炼关键点&#xff0c;梳理内容的逻辑关系&#xff0c;然后进行细致的排版和美化&#xff0c;最后还要进行反复的检查和试讲。整个过程不仅耗费时间&#xff0c;而且需…

硬件工程师笔试面试——变压器

目录 9、变压器 9.1 基础 变压器原理图 变压器实物图 9.1.1 概念 9.1.2 变压器组成结构 9.1.3 变压器原理 9.1.4 变压器的类型 9.1.5 应用领域 9.2 相关问题 9.2.1 变压器的工作原理是什么? 9.2.2 如何选择合适的变压器类型? 9.2.3 变压器在实际应用中,如何进行…

8.1差分边缘检测

基本概念 差分边缘检测是一种图像处理技术&#xff0c;用于检测图像中的边缘。边缘是指图像中灰度值发生显著变化的区域。差分边缘检测通常通过计算图像的梯度来实现&#xff0c;梯度反映了灰度值的变化率。在OpenCV中&#xff0c;可以使用不同的算子来检测不同方向的边缘&…

[docker]入门

本文章主要讲述的是&#xff0c;docker基本实现原理&#xff0c;docker概念的解释&#xff0c;docker的使用场景以及docker打包与部署的应用。 文章中docker所运行的系统&#xff1a;CentOS Linux release 7.9.2009 (Core) 目录 docker是什么&#xff0c;什么时候需要去使用 …

【Git原理与使用】版本管理与分支管理(1)

目录 一、基本操作 1、初识Git 2、Git安装[Linux-centos] 3、Git安装[ Linnx-ubuntu] 4、创建git本地仓库 5、配置Git 6、认识工作区、暂存区、版本库 7、添加文件 8、查看历史提交记录 9、查看.git文件目录结构 10、查看版本库对象的内容 11、小结&#xff08;在本地的.git仓库…

回归预测|基于饥饿游戏搜索优化随机森林的数据回归预测Matlab程序HGS-RF 多特征输入单输出 高引用先用先创新

回归预测|基于饥饿游戏搜索优化随机森林的数据回归预测Matlab程序HGS-RF 多特征输入单输出 高引用先用先创新 文章目录 一、基本原理1. 饥饿游戏搜索优化算法&#xff08;HGS&#xff09;简介2. 随机森林&#xff08;RF&#xff09;简介3. HGS-RF回归预测流程1. 初始化2. 随机森…

基于SpringBoot+Vue+MySQL的在线宠物用品商城销售系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着人们生活质量的提升和宠物经济的蓬勃发展&#xff0c;宠物已成为众多家庭不可或缺的一员。宠物市场的需求日益增长&#xff0c;涵盖了食品、用品、医疗、美容等多个领域。基于SpringBootVueMySQL的在线宠物用品商城销售系统…

新发布的OpenAI o1生成式AI模型在强化学习方面迈出了重要的一步

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

【Unity杂谈】iOS 18中文字体显示问题的调查

一、问题现象 最近苹果iOS 18系统正式版推送&#xff0c;周围升级系统的同事越来越多&#xff0c;有些同事发现&#xff0c;iOS 18上很多游戏&#xff08;尤其是海外游戏&#xff09;的中文版&#xff0c;显示的字很奇怪&#xff0c;就像一些字被“吞掉了”&#xff0c;无法显示…

考研数据结构——C语言实现无向图邻接矩阵

首先&#xff0c;定义了一些基本的数据结构和常量&#xff1a; VertexType 和 EdgeType 分别用于表示图中的顶点和边的权重。MAXVEX 定义了图中最大顶点数为100。INFINITY 用于表示顶点之间没有直接的边相连&#xff0c;这里用65535作为无穷大的表示。 定义了一个图的结构体 MG…

MiniCPM3-4B | 笔记本电脑运行端侧大模型OpenBMB/MiniCPM3-4B-GPTQ-Int4量化版 | PyCharm环境

MiniCPM3-4B&#xff0c;轻松在笔记本电脑上运行大模型&#xff1f; 背景一、选择模型二、模型下载三、模型运行四、总结 背景 2024年9月5日&#xff0c;面壁智能发布了MiniCPM3-4B&#xff0c;面壁的测试结果声称MiniCPM3-4B表现超越 Phi-3.5-mini-instruct 和 GPT-3.5-Turbo-…

卸载完mathtype后,删除word加载项中的mathtype

请参考博客“卸载完mathtype后&#xff0c;word加载项中还是有mathtype的解决方法_怎么删除word加载项里的mathtype-CSDN博客”以及 “安装卸载MathType经验解决MathType DLL找不到的问题——超实用_mathtype dll cannot-CSDN博客” 如果在删除.dotm文件时&#xff0c;删不掉…

随着访问范围的扩大 OpenAI o1-mini 现已向免费用户开放

上周&#xff0c;OpenAI 展示了其最新的大型语言模型&#xff08;LLM&#xff09;–OpenAI o1及其小兄弟 OpenAI o1-mini。该公司在公告中称&#xff0c;Plus 和 Team 用户可在公告发布之日起访问该模型。企业和教育用户将在本周获得该模型&#xff0c;而免费用户最终将获得 o1…

Golang | Leetcode Golang题解之第404题左叶子之和

题目&#xff1a; 题解&#xff1a; func isLeafNode(node *TreeNode) bool {return node.Left nil && node.Right nil }func sumOfLeftLeaves(root *TreeNode) (ans int) {if root nil {return}q : []*TreeNode{root}for len(q) > 0 {node : q[0]q q[1:]if no…