当前位置: 首页 > news >正文

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

相关文章:

kubernetes调度2

1、各种缩写的应用 [rootk8s-master test]# kubectl get rsNAME DESIRED CURRENT READY AGEtest001-64c7957b5c 2 2 2 8m59stest001-698b98bb8f 0 0 0 12m[rootk8s-master test]# kubectl get replicas…...

Android中如何处理运行时权限?

在Android中&#xff0c;处理运行时权限是开发过程中一个至关重要的环节&#xff0c;它自Android 6.0&#xff08;API级别23&#xff09;引入&#xff0c;旨在提高用户隐私保护和应用的透明度。以下将详细阐述Android中处理运行时权限的方法、步骤、注意事项以及相关的最佳实践…...

【PyCharm】PyCharm:让开发者效率倍增的编程利器

在现代软件开发过程中&#xff0c;选择一款得心应手的编程工具不仅能提高效率&#xff0c;还能让编程过程更加愉悦。而在众多集成开发环境&#xff08;IDE&#xff09;中&#xff0c;PyCharm无疑是Python开发者的首选之一。作为一款功能强大、设计精良的IDE&#xff0c;PyCharm…...

Spring Boot- 配置中心问题

Spring Boot 配置中心相关问题探讨 在现代微服务架构中&#xff0c;随着系统规模的扩展和复杂度的增加&#xff0c;配置管理变得越来越重要。每个微服务都可能有大量的配置文件&#xff0c;包括数据库连接信息、缓存配置、消息队列配置等。如果每个服务独立管理配置文件&#…...

字符串专题-1

目录 1.简介 2.例题 2.1找出字符串第一个匹配项的下标 2.2最长公共前缀 2.3最长回文子串 2.4二进制求和 2.5字符串相乘 1.简介 关于字符串匹配的常用算法KMP&#xff0c;我这里只做思路上的说明&#xff0c;具体内容文字和图片写来写去还是有点怪异&#xff0c;这边推荐…...

Unsupervised Deep Representation Learning for Real-Time Tracking

摘要 我们的无监督学习的动机是稳健的跟踪器应该在双向跟踪中有效。具体来说&#xff0c;跟踪器能够在连续帧中前向定位目标对象&#xff0c;并回溯到其在第一帧中的初始位置。基于这样的动机&#xff0c;在训练过程中&#xff0c;我们测量前向和后向轨迹之间的一致性&#xf…...

第二讲 数据结构

单链表 826. 单链表 - Acwing题库 数据结构&#xff1a; e[N]&#xff1a;用于存储节点的值的数组。ne[N]&#xff1a;作为“下一个”指针的数组&#xff0c;用于连接节点。head&#xff1a;指向链表头部的索引。idx&#xff1a;当前可用的下一个索引。 初始化&#xff1a; …...

docker部署excalidraw画图工具

0&#xff09;效果 0.1&#xff09;实时协作 0.2&#xff09;导出格式 1&#xff09;docker安装 docker脚本 bash <(curl -sSL https://cdn.jsdelivr.net/gh/SuperManito/LinuxMirrorsmain/DockerInstallation.sh)docker-compose脚本 curl -L "https://github.com/…...

5G技术对IT行业的影响及未来发展

5G技术对IT行业的影响及未来发展 随着5G网络的快速部署&#xff0c;全球正进入一个全新的高速连接时代。5G不仅仅是移动通信的升级&#xff0c;它将带来更多的应用场景和改变各个行业的运作方式。本文将探讨5G技术的核心特点、对IT行业的影响&#xff0c;以及未来可能的发展方向…...

字节跳动的微服务独家面经

在之前的文章中也介绍了相关微服务的项目开发知识&#xff0c;那么在本文中我将分享一份来自字节跳动相关岗位的面试经历&#xff0c;在其中我们一起来看看面试问题的详细内容&#xff0c;如果有对微服务的感兴趣的朋友们也可以联系我了解我们的微服务项目&#xff0c;也希望该…...

嵌套函数的例子(TypeScript)

在 TypeScript 中&#xff0c;嵌套函数是指在一个函数内部定义另一个函数。嵌套函数可以访问外部函数的变量&#xff08;闭包&#xff09;&#xff0c;并且可以在内部进行调用。下面是一个简单的例子来说明嵌套函数的使用&#xff1a; function outerFunction(outerVariable: …...

0915,SOCKET网络编程部分,三种I/O多路复用模型(select ,poll,epoll)

目录 nc 127.0.0.1 port 01_socket_client.cc 01_socket_server.cc 02_select_client.cc 02_select_server.cc 03_poll_server.cc 04_epoll_server.cc 01_socket_client.cc #include <stdlib.h> #include <string.h> #include <sys/stat.h> #inclu…...

HarmonyOS 应用获取公钥和 MD5 指纹签名信息

鸿蒙版本获取 MD5 指纹和公钥可参考如下方式; 首先,通过 AGC 官网 将所需证书下载至本地; 其次,通过记事本或者文本编译器的方式将其正式打开,将其内容中前两项 BEGIN CERTIFICATE 和 END CERTIFICATE 的段落删除,仅保留最后一段中的内容(包括 BEGIN CERTIFICATE 和 END CERTI…...

封装一个录音声音振动效果的组件

目标&#xff1a;根据声音的大小实现声音振动特效 实现步骤&#xff1a; 通过 getAudioCapturerMaxAmplitude 观察音频区间封装振动组件&#xff0c;通过声音振幅数据实现振动效果 落地代码&#xff1a; 1&#xff09;获取振幅数据&#xff0c;出入振动组件 AudioPage.ets …...

Java、JS与Go的扩展操作符,揭秘它们的‘魔法’!

在这个快节奏的互联网时代&#xff0c;程序员们总是希望能够用更简洁、更高效的方式来编写代码。扩展操作符&#xff08;Spread Operator&#xff09;是 JavaScript ES6 引入的重要特性&#xff0c;而 Java 和 Go 也有各自的方式来实现类似的功能。今天&#xff0c;我们就来深入…...

ROS学习笔记13——rosbag功能包的简单使用

rosbag是用于录制和回放 ROS 主题的一个工具集&#xff0c;实现了数据的复用&#xff0c;方便调试和测试。rosbag本质也是ros的节点&#xff0c;当录制时&#xff0c;rosbag是一个订阅节点&#xff0c;可以订阅话题消息并将订阅到的数据写入磁盘文件&#xff1b;当重放时&#…...

Python Flask网页开发基本框架

注&#xff1a;Flask详细学习请见Flask学习合集。 直接上代码: app.py from flask import Flaskapp Flask(__name__)app.route("/") def hello():return "Hello, World!"if __name__ "__init__":app.run(host "127.0.0.1", port…...

Mybatis-plus进阶篇(五)

文章目录 条件构造器补充知识TypeHandlerWrappers示例&#xff1a; 线程安全性示例&#xff1a; 使用 Wrapper 自定义 SQL示例&#xff1a;使用方法 使用注解查询使用XML配置查询链式调用与Lambda式调用 条件构造器补充知识 TypeHandler 在 wrapper 中使用 typeHandler 需要特…...

交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面

一、介绍 交通标志识别系统。本系统使用Python作为主要编程语言&#xff0c;在交通标志图像识别功能实现中&#xff0c;基于TensorFlow搭建卷积神经网络算法模型&#xff0c;通过对收集到的58种常见的交通标志图像作为数据集&#xff0c;进行迭代训练最后得到一个识别精度较高…...

【QT】定时器使用

文章目录 关于 Qt 定时器使用的注意细节总结实例-检查工具使用周期时间是否合理UI设计头文件 remind.h源文件 remind.cpp实现效果 关于 Qt 定时器使用的注意细节总结 一、创建与初始化 使用 QTimer 类来创建定时器。可以在构造函数中指定父对象&#xff0c;确保定时器在正确的…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...

站群服务器的应用场景都有哪些?

站群服务器主要是为了多个网站的托管和管理所设计的&#xff0c;可以通过集中管理和高效资源的分配&#xff0c;来支持多个独立的网站同时运行&#xff0c;让每一个网站都可以分配到独立的IP地址&#xff0c;避免出现IP关联的风险&#xff0c;用户还可以通过控制面板进行管理功…...

篇章二 论坛系统——系统设计

目录 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 1. 数据库设计 1.1 数据库名: forum db 1.2 表的设计 1.3 编写SQL 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 通过需求分析获得概念类并结合业务实现过程中的技术需要&#x…...

Python常用模块:time、os、shutil与flask初探

一、Flask初探 & PyCharm终端配置 目的: 快速搭建小型Web服务器以提供数据。 工具: 第三方Web框架 Flask (需 pip install flask 安装)。 安装 Flask: 建议: 使用 PyCharm 内置的 Terminal (模拟命令行) 进行安装,避免频繁切换。 PyCharm Terminal 配置建议: 打开 Py…...