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

Kubernetes Pod调度基础

        在传统架构中,我们总在考虑或者面临一个问题,我们的应用需要部署在哪里,我们的应用下载在哪里运行着?有一个服务不可访问了,去哪里排査?诸如此类的问题总是会出现在工作中。
        但是在使用 Kubernetes 部署应用后,我们无需再关心应用到底部署在了哪台服务器,也无需登录某台服务器去排査应用的问题,而是使用 Kubernetes 提供的 Kubect1 或者 Dashboard 即可快速地定位到应用,之后便可以进行执行命令、查看日志、监控等操作。
        对于 Kubernetes 的应用部署,我们可以用 Pod 进行单独的部署,也可以使用更高级的资源调度方法,比如 Deployment、statefulset。

一、Replication Controller(复制控制器,RC)和ReplicaSet

1.Replication controller

        Replication controller(复制控制器,RC)
        RC 用来确保 Pod 副本数达到期望值,这样可以确保一个或多个同类 Pod 总是可用的。让你的pod副本数,保持在你的预期值

        如果存在的 Pod 数量大于设定的值,Replication controller 将终止额外的 Pod,如果太少,Replication controller 将会启动更多的 Pod 用于保证达到期望值,与手动创建 Pod 不同的是,用 Replication controller 维护的 Pod 在失败、删除或终止时会自动替换。因此,即使应用程序只需要一个 Pod,也应该使用 Replication controller 或其他方式管理。ReplicationController 类似于进程管理程序,但是 Replication controller 不是监视单个节点上的各个进程,而是监视多个节点上的多个 Pod。

        Replication controller 的使用如下列示例。

(1)编辑 ReplicationController 文件
vim replicationcontroller-nginx.yamlapiVersion: v1
kind: ReplicationController
metadata:name: nginx
spec:replicas: 3selector:app: nginxtemplate:metadata:name: nginxlabels:app: nginxspec:containers:- name: nginximage: nginx:1.7.9ports:- containerPort: 80
(2)创建 ReplicationController
kubectl apply -f replicationcontroller-nginx.yaml
[root@master ~]# ku get pod
NAME          READY   STATUS    RESTARTS   AGE
nginx-8rtw9   1/1     Running   0          13s
nginx-h8hht   1/1     Running   0          13s
nginx-qjzjj   1/1     Running   0          13s
ku delete pod nginx-qjzjj 
[root@master ~]# ku get pod
NAME          READY   STATUS    RESTARTS   AGE
nginx-8rtw9   1/1     Running   0          2m12s
nginx-h8hht   1/1     Running   0          2m12s
nginx-sxtgr   1/1     Running   0          37s
(4)删除 ReplicationController
ku delete -f replicationcontroller-nginx.yaml 

2.Replicaset

        Replicaset(复制集,RS)是支持基于集合的标签选择器的下一代 Replication controller,它主要用于 Deployment 协调创建、删除和更新 Pod,和 Replication controller 唯一的区别是Replicaset 支持标签选择器。在实际应用中,虽然 Replicaset 可以单独使用,但是一般建议使用 Deployment 来自动管理 Replicaset,除非自定义的 Pod 不需要更新或有其他编排等。
        定义一个 Replicaset 的实例如下:

(1)编辑 Replicaset 文件
vim replicaset-example.yamlapiVersion: apps/v1
kind: ReplicaSet
metadata:name: frontendlabels:app: guestbooktier: frontend
spec:# modify replicas according to your casereplicas: 3selector:matchLabels:tier: frontendmatchExpressions:- {key: tier, operator: In, values: [frontend]}template:metadata:labels:app: guestbooktier: frontendspec:containers:- name: php-redisimage: nginx:1.7.9resources:requests:cpu: 100mmemory: 100Mienv:- name: GET_HOSTS_FROMvalue: dns# If your cluster config does not include a dns service, then to# instead access environment variables to find service host# info, comment out the 'value: dns' line above, and uncomment the# line below.# value: envports:- containerPort: 80

 备注:
requests:代表容器启动请求的资源限制,分配的资源必须要达到此要求limits:代表最多可以请求多少资源单位 m:CPU 的计量单位叫毫核(m)。一个节点的 CPU 核心数量乘以 1080,得到的就是节点总的 CPU 总数量。如,一个节点有两个核,那么该节点的 CPU总量为 2000m。该容器启动时请求 100/2000 的核心(5%)

(2)创建 RS
kubectl create -f replicaset-example.yaml
root@master ~]# ku get pod
NAME             READY   STATUS    RESTARTS   AGE
frontend-ltf94   1/1     Running   0          8s
frontend-mkzc4   1/1     Running   0          8s
frontend-n8ggb   1/1     Running   0          8s
[root@master ~]# ku get rs
NAME       DESIRED   CURRENT   READY   AGE
frontend   3         3         3       78s
kubectl delete -f replicaset-example.yaml

3.标签与标签选择器

(1)标签

        标签是用来标识 K8S 对象的一组附加在其上的键值对,通过标签我们可以方便地筛选或排除组对象。借鉴资料中的话来讲,集群中的应用部署或是批处理的程序部署通常都是多维度的,为了实现对这些对象的管理,往往需要对某一特定维度的对象进行操作,而标签可以通过用户的意愿组织集群中的对象之间的结构,而不需要对集群进行修改。
        在同一个对象之下标签的 Key 值必须唯一的。名称方面,标签名不得多于 63 个字符且必须由字母或数字开头或结尾,可以包含字母、数字、-、_、·;标签前缀是可选的,必须以 DNS 子域名的方式指定,例如:kubernetes.io,后用/将其与标签名分隔。通常情况下,若不使用标签前缀那么该标签的 Key 将被视为专属于用户的,在 K8s 的系统组件向对象添加标签时,必须指定前缀。在标签值方面,若标签值不为空,则其长度不得多于 63 个字符且必须由字母或数字开头或结尾,可以包含字母、数字、-、_、·。

(2)标签选择器

        标签选择器可以用来选择一组对象(标签并不能唯一标识一个对象),APIServer 支持两种标签选择器:基于等式的标签选择器与基于集合的标签选器:
        基于等式的标签选择方式:在这种选择方式下可以使用=、==、!=三种操作符来进行选择,前两个的含义是一样的,都代表相等,第三种代表不等。选择条件可以通过,叠加,例如date=day1,name!=build 代表选择 date 值为 day1 且 name 值不为 build 的对象。

        基于集合的标签选择方式:这种选择器可以同时选择一组对象。支持的操作符有:in、notin、exists。具体的使用方法为:
选择 date 包含有值为 day1、day2、day3 的标签:date in(day1,day2,day3)选择 name 值不为 build、pipline 的标签:name notin(build,pipline)选择所有包含 test 的标签:test

选择所有不包含 test 的标签:!test
基于集合的标签选择器也支持使用“,”分隔以同时叠加选择,相同意义上的选择条件在这两种选择方式之间是等价的。

(3)标签与标签选择器举例
标签定义的方式:基于等式的定义 app=nginx
基于键值对定义方式 app: nginx
基于集合的标签定义方式:{key:app,operator: In,values: [nginx,apache])app: nginxapp: apache

基于等式的标签选择器
selector:
        component:redis

基于集合的标签选择器
selector:
  matchLabels:
     component:redis
  matchExpressions:
       - {key:tier,operator:In,values:[cache]}

       - {key:environment,operator:NotIn,values:[dev]}

        matchlabels 是{key,value}对的映射。matchlabels 映射中的单个{key,value}等价于matchexpressions 的元素,其键字段为“key”,运算符为“in”,值数组仅包含“value”matchexpressions 是 pod 选择器需求的列表。有效的运算符包括 in、notin、exists 和doesnotexist。对于 in 和 notin,设置的值必须为非空。matchlabels 和 matchexpressions中的所有要求都被放在一起-必须满足所有这些要求才能匹配

二、无状态应用管理Deployment

定义:
        无状态服务(stateless service)对单次请求的处理,不依赖其他请求,也就是说,处理一次请求所需的全部信息,要么都包含在这个请求里,要么可以从外部获取到(比如说数据库),服务器本身不存储任何信息。这种服务叫做无状态服务。
        无状态服务:就是没有特殊状态的服务,各个请求对于服务器来说统一无差别处理,请求自身携带了所有服务端所需要的所有参数(服务端自身不存储跟请求相关的任何数据,不包括数据库存储信息)
        如果在启动一个服务时,不依赖于该服务之前的运行状态,或者不依赖于其他服务,这个服务就是无状态服务;反之,就是有状态服务。

无状态服务特点

1、数据方面:无状态服务不会在本地存储持久化数据,多个实例可以共享相同的持久化数据
2、结果方面:多个服务实例对于同一个用户请求的响应结果是完全一致的
3、关系方面:这种多服务实例之间是没有依赖关系
4、影响方面:在 k8s 控制器中动态启停无状态服务的 pod 并不会对其它的 pod 产生影响

5、示例方面:nginx实例,tomcat 实例,web 应用

6、资源方面:相关的k8s 资源有:Replicaset、ReplicationController、Deployment

7、创建方式:Deployment 被设计用来管理无状态服务的 pod

  • 每个 pod 完全一致,原因如下:
  • 无状态服务内的多个 Pod 创建的顺序是没有顺序的
  • 无状态服务内的多个 Pod 的名称是随机的
  • pod 被重新启动调度后,它的名称与 IP 都会发生变化
  • 无状态服务内的多个 Pod 背后是共享存储的

8、扩缩容方式:随机缩容

        由于是无状态服务,所以这些控制器创建的 pod 序号都是随机值。并且在缩容也是随机,并不会明确缩容某一个 pod。因为所有实例得到的返回值都是一样,所以缩容任何一个 pod 都可以。

        Deployment 用来管理 RS,并为 Pod 和 RS 提供声明性更新,以及许多其他的新的功能,生产环境中使用 Deployment 替代 RS。
        Deployment 一般用于部署公司的无状态服务,因为企业内部现在都是以微服务为主,微服务实现无状态化也是最佳实践。可以利用 Deployment 的高级功能做到无缝迁移、自动扩容缩容、自动灾难恢复、一键回滚等功能。

        无状态服务不会在本地存储持久化数据,多个服务实例对于同一个用户请求的响应结果是完全-致的。这种多服务实例之间是没有依赖关系,比如 web 应用,在 k8s 控制器中动态启停无状态服务的 pod 并不会对其它的 pod 产生影响。
        Deployment 被设计用来管理无状态服务的 pod,每个 pod 完全一致

        无状态服务内的多个 Pod 创建的顺序是没有顺序的。

        无状态服务内的多个 Pod 的名称是随机的.pod 被重新启动调度后,它的名称与 IP 都会发生变

        无状态服务内的多个 Pod 背后是共享存储的。

1.创建Deployment

(1)编写Deployment文件
vim nginx-deployment.yaml apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploymentlabels:name: nginx-deployment
spec:replicas: 2selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.7.9ports:- name: nginxcontainerPort: 80

备注:
从 1.16 开始,彻底废弃了其他的 apiVersion,只能使用 app/v1replicas:pod 的副本数
selector:定义 Deployment 如何找到要管理的 Pod,与 template 的 label 标签对应,app/v1必须指定
template:
        app:nginx使用 label 标记 pod
        spec:定义 pod 的详细信息
        name:nginx 表示 pod 运行一个名字为 nginx 的容器
        image:运行此 pod 使用的镜像
        port:容器用于发送和接收流量的端口

(2)使用kubectl create 创建此 Deployment
kubectl create -f nginx-deployment.yaml
(3)查看 Deployment 的状态
kubectl get deploy
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   2/2     2            2           13s
(4)使用rollout 查看整个 Deployment 的创建过程状态
kubectl rollout status deployment/nginx-deployment
(5)查看这个 Deployment 对应的 RS
kubectl get rs -l app=nginx
(6)查看此 Deployment 创建的 pod
kubectl get pods --show-labels

2.更新 Deployment

        通过 Deployment 部署应用后,如果需要对 Deployment 文件的配置文件或者镜像版本进行更新,更改后该 Deployment 会创建新的 RepliccaSet,之后会对管理的 Pod 进行滚动升级。

(1)更新 pod 的 image
kubectl set image deployment nginx-deployment nginx=nginx:1.9.1 --record
kubectlset image deployment nginx-deployment nginx=nginx:1.12.0 --record

 或直接修改 deployment 文件,效果相同
kubectl edit deployment.v1.apps/nginx-deployment

(2)查看更新过程
kubectl rollout status deployment.v1.apps/nginx-deployment
(3)此时的 RS 有新的和旧的
kubectl get rs
NAME                          DESIRED   CURRENT   READY   AGE
nginx-deployment-5bf97d5c4c   1         1         0       16s
nginx-deployment-6cf9b75cdd   0         0         0       9m36s
nginx-deployment-7569c477b6   2         2         2       5m18s
(4)通过 describe 查看 deployment 的详细信息
kubectl describe deploy nginx-deployment

3.回滚 deployment

当更新的版本不稳定或者配置不合理时,可以对其进行回滚操作。

(1)多更新几次 deployment
Kubectl set image deployment nginx-deployment nginx=dotbalo/canary:v1 --record
kubectl set image deployment nginx-deployment nginx=dotbalo/canary:v2 --record
(2)查看更新历史
kubectl rollout history deployment/nginx-deployment

备注:
最后的一个版本是当前版本

(3)查看某次更新的详情
kubectl rollout history deployment/nginx-deployment --revision=2
(4)回滚到指定版本
kubectl rollout undo deployment/nginx-deployment --to-revision=2

查看:

kubectl rollout history deployment/nginx-deployment
(5)回滚到上次版本
kubectl rollout undo deployment/nginx-deployment

查看

kubectl rollout history deployment/nginx-deployment

4.扩容 deployment

(1)调整 pod 的副本数
kubectl scale deployment.vl.apps/nginx-deployment --replicas=3

查看

kubectl get pods

5.暂停和恢复 deployment 更新

        可以先暂停更新,然后对 deployment 进行相关的操作,比如更新镜像,对其资源进行限制等,可以进行多次更新或修改,此时只是设置出更新的参数,但实际整体的 depolyment 更新是停滞状态
        最后可以统一开始更新

(1)暂停 deployment 更新
kubectl rollout pause deployment/nginx-deployment
(2)恢复 deployment 更新
kubectl rollout resume deployment.v1.apps/nginx-deployment

6.删除 Deployment

Kubectl delete -f nginx-deployment.yaml

三、有状态应用管理 statefulset

定义:
        StatefulSet(有状态集,缩写为sts)常用于部署有状态的且需要有序启动的应用程序。比如在生产环境中,可以部署 Elasticsearch 集群、MongoD8 集群或者需要持久化的 RabbitMQ 集群、Redis 集群、Kafka 集群和ZooKeeper 集群等,
        一个 statefulset 管理着基于相同容器规范的 Pod。与Deployment 不同的是,statefulset 为每个 Pod 维护了一个标识。这些 Pod 是根据相同规范创建的,但是不可互换,每个Pod 都有一个持久的标识符,在重新调度时也会被保留。

有状态服务:容器数据持久化保持

  • 有状态服务 可以说是 需要数据存储功能的服务、或者指多线程类型的服务,队列等。(mysq1数据库、kafka、zookeeper等)
  • 每个实例都需要有自己独立的持久化存储,并且在 k8s 中是通过申明模板来进行定义。持久卷申明模板在创建 pod 之前创建,绑定到 pod 中,模板可以定义多个。

        有状态服务常常用于实现事务(并不是唯一办法,下文有另外的方案)。举一个常见的例子,在商城里购买一件商品。需要经过放入购物车、确认订单、付款等多个步骤。由于 HTTP 协议本身是无状态的,所以为了实现有状态服务,就需要通过一些额外的方案。比如最常见的 session,将用户挑选的商品(购物车),保存到session 中,当付款的时候,再从购物车里取出商品信息。

有状态服务的特征

1、数据方面:有状态服务需要在本地存储持久化数据,典型的应用是分布式数据库

2、结果方面:实例之间,请求结果可能存在不一致
3、关系方面:分布式节点实例之间有依赖的拓扑关系,比如主从关系。
4、影响方面:如果 K8S 停止分布式集群中任一实例 pod,就可能会导致数据丢失或者集群的 crash(崩溃)
5、示例方面:mysq1数据库、kafka、zookeeper、Redis 主从架构
6、资源方面:statefulset
7、创建方式:statefulset 管理
        Statefu1 管理有状态的应用,Pod 有如下特征:

  • 唯一性:每个 Pod 会被分配一个唯一序号,
  • 顺序性:Pod 启动,更新,销毁是按顺序进行
  • 稳定的网络标识:Pod 主机名,DNS地址不会随着 Pod 被重新调度而发生变化,
  • 稳定的持久化存储:Pod 被重新调度后,仍然能挂载原有的PV,从而保证了数据的完整性和一致性

        有状态的 pod 是用来运行有状态应用的,所以其在数据卷上存储的数据非常重要,在Statefulset 缩容时删除这个声明将是灾难性的,特别是对于 statefulset 来说,缩容就像减少其 replicas 数值一样简单。基于这个原因,当需要释放特定的持久卷时,需要手动删除对应的持久卷声明。

备注:有状态服务
        有状态服务需要在本地存储持久化数据,典型的是分布式数据库的应用,分布式节点实例之间有
依赖的拓扑关系.比如,主从关系。如果 K8S 停止分布式集群中任一实例 pod,就可能会导致数据丢失或者集群的 crash(崩溃)。

无状态服务和有状态服务的比较:

无状态服务
服务不依赖自身的状态,实例的状态数据可以维护在内存中。
任何一个请求都可以被任意一个实例处理。
不存储状态数据,实例可以水平拓展,通过负载均衡将请求分发到各个节点。
在一个封闭的系统中,只存在一个数据闭环。
通常存在于单体架构的集群中。

有状态服务
服务本身依赖或者存在局部的状态数据,这些数据需要自身持久化或者可以通过其他节点恢复。
一个请求只能被某个节点(或者同等状态下的节点)处理。
存储状态数据,实例的拓展需要整个系统参与状态的迁移。
在一个封闭的系统中,存在多个数据闭环,需要考虑这些闭环的数据一致性问题。
通常存在于分布式架构中。

1.编写 statefulset 资源文件

(1)定义一个 statefulset 资源文件
vim redis-statefulset.yaml apiVersion: v1
kind: Service
metadata:name: redis-svcspec:selector:app: redis-stsports:- port: 6379protocol: TCPtargetPort: 6379apiVersion: apps/v1
kind: StatefulSet
metadata:name: redis-stsspec:serviceName: redis-svcreplicas: 2selector:matchLabels:app: redis-ststemplate:metadata:labels:app: redis-stsspec:containers:- image: redis:5-alpinename: redisports:- containerPort: 6379

备注:
kind:service 定义了一个名字为redis-svc 的服务,定义了一个名字为redis-sts的 statefulset,replicas 表示部署 Podkind: statefulset的副本数。

(2)创建statefulset
kubectl create -f redis-statefulset.yaml
(3)查看statefilset 状态
kubectl get sts
(4)查看群集状态
kubectl get service
[root@master ~]# ku get pod -l app=redis-sts
NAME                                READY   STATUS    RESTARTS   AGE
redis-sts-0                         1/1     Running   0          18s
redis-sts-1                         1/1     Running   0          16s

备注:
-1:指定标签(labe1)
注意 NAME 列,名称是 sts 的 name-序号,这里序号越小则说明创建的越早从 AGE 列也可以看出来,这就解决了有状态应用中的启动顺序问题,比如可以让 redis-sts-0 作为 redis 的主节点,redis-sts-1作为从节点

2.statefulset 扩容

(1)扩容,将副本数修改为 3
kubectl scale sts redis-sts --replicas=3
[root@master ~]# ku get pod
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-7569c477b6-67qkg   1/1     Running   0          53m
nginx-deployment-7569c477b6-fbb4j   1/1     Running   0          53m
redis-sts-0                         1/1     Running   0          2m42s
redis-sts-1                         1/1     Running   0          2m40s
redis-sts-2                         1/1     Running   0          4s

3.缩容

(1)打开第二个终端,动态显示缩容流程
kubectl get pods -w -l app=redis-sts

备注:
-w:动态监听所有的 pod

(2)在原来第一个终端修改副本数为 2
kubectl patch sts redis-sts -p '{"spec":{"replicas":2}}'

注意:
此时可以查看第二个终端上的变化

(3)在第一个终端上查看最终结果
kubectl get pods -l app=redis-sts

4.非级联删除 statefulset

        删除 statefulset 有两种方式:级联删除和非级联删除。
        使用非级联方式删除 statefulset 时,statefulset 的 Pod 不会被删除。使用级联方式删除Statefulset 时,statefulset 和它的 Pod 都会被删除。

(1)采用非级联删除
kubectl delete statefulsetredis-sts--cascade=false

查看

kubectl get sts
(2)查看管理的 pod
kubectl get po

发现 pod 并没有被删除

(3)删除 pod
kubectl delete po redis-sts-0
kubectl delete po redis-sts-1

5.级联删除statefulset

(1)先创建出 statefulset
kubectl create -f redis-statefulset.yaml

备注:
如果提示服务已存在,先删除
kubectl delete -f redis-statefulset.yam1

(2)级联删除
kubectl delete statefulset redis-sts

查看

kubectl get po

两个 pod 全都没了

(3)删除 redis 服务
kubectl delete -f redis-statefulset.yaml

四、守护进程集Daemonset

Daemonset(守护进程集,缩写为ds)和守护进程类似,

1.什么是 Daemonset

        有时候我们需要在每个 Kubernetes 节点或符合条件的节点上都部署某个应用,那么就可以使用 Kubernetes 的 DaemonSet 调度 Pod。Daemonset确保全部(或符合条件)的节点上运行一个Pod 副本。当有新的节点加入集群时,也会为他们新增一个 Pod,当节点从集群中移除时,这些 Pod会被回收,删除 Daemonset 将会删除它创建的所有的 Pod。

2.定义一个 Daemonset

vim daemonset-nginx.yamlapiVersion: apps/v1
kind: DaemonSet
metadata:name: pod-controllernamespace: devlabels:controller: daemonset
spec:selector:matchLabels:app: nginx-podtemplate:metadata:labels:app: nginx-podspec:containers:- name: nginximage: nginx:1.7.9ports:- name: nginx-portcontainerPort: 80protocol: TCP

3.创建 Daemonset

kubectl create namespace dev
kubectl create -f daemonset-nginx.yaml

4.查看Daemonset

kubectl get ds -n dev -o wideNAME             DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE   CONTAINERS   IMAGES        SELECTOR
pod-controller   2         2         2       2            2           <none>          18m   nginx        nginx:1.7.9   app=nginx-pod

5.查看pod所在的节点

[root@master ~]# ku get pod -n dev -owide
NAME                   READY   STATUS    RESTARTS   AGE   IP               NODE    NOMINATED NODE   READINESS GATES
pod-controller-462lq   1/1     Running   0          34s   10.244.104.15    node2   <none>           <none>
pod-controller-jwmv5   1/1     Running   0          34s   10.244.166.140   node1   <none>           <none>

6.删除DaemonSet

kubectl delete ds pod-controller -n dev

五、CronJob

        Cronjob(计划任务,缩写为 c)用于以时间为基准的周期性地执行任务,这些自动化任务和运行在 Linux系统上的 cronJob 一样。

1.创建 CronJob

(1)编辑 cronjob 文件
vim cronjob-example.yaml apiVersion: batch/v1  #1.21版本以上  改为batch/v1
kind: CronJob
metadata:name: hello
spec:schedule: "*/1 * * * *"jobTemplate:spec:template:spec:containers:- name: helloimage: busybox:v1args:- /bin/sh- -c- date; echo Hello from the Kubernetes clusterrestartPolicy: OnFailure

备注:
这个案例会在每分钟执行一次计划任务,并输出当前时间和“Hello from the Kubernetes cluster”3

(2)创建 cronjob
kubectl create -f cronjob-example.yaml
(3)查看
kubectl get cj
NAME    SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
hello   */1 * * * *   False     0        <none>          11s

等待一会后可以查看生成的 pod

kubectl get jobs
NAME             COMPLETIONS   DURATION   AGE
hello-28738271   1/1           1s         59s
(4)查看生成的 pod,并查看 pod 的执行日志
kubectl get pod
[root@master ~]# ku logs -f hello-28738272-nmcdf
Thu Aug 22 03:12:01 UTC 2024
Hello from the Kubernetes cluster
(5)删除
ku delete cronjob hello

相关文章:

Kubernetes Pod调度基础

在传统架构中&#xff0c;我们总在考虑或者面临一个问题&#xff0c;我们的应用需要部署在哪里&#xff0c;我们的应用下载在哪里运行着?有一个服务不可访问了&#xff0c;去哪里排査?诸如此类的问题总是会出现在工作中。 但是在使用 Kubernetes 部署应用后&#xff…...

80页WORD方案深入了解大数据治理+大数据资产管理+数据运营

文档是一份80页可编辑的企业大数据智能管理与治理平台建设项目技术方案标书文档&#xff0c;涵盖了从项目需求分析、技术方案、建设方案、服务方案到类似案例介绍等多个方面的内容。 1. 项目需求分析 项目建设目标&#xff1a;旨在实现数据的可视化&#xff0c;确保决策者、行…...

OCC安装、VS2019编译运行(新手教程)

OCC安装、VS2019编译运行(新手教程) 简介1、OpenCasCade的下载和安装官网下载安装2、OpenCasCade的运行和编译(VS2019)修改配置文件环境变量配置3、验证代码项目配置运行cpp文件简介 作为一个刚接触OCC的程序员,可能会不知所措,无从下手,甚至在OCC的安装使用都困难重重…...

Mojo 实现排序功能

sort排序 实现排序功能。 您可以从包中导入这些 API。例如&#xff1a;algorithm from algorithm.sort import sortpartition partition[type: AnyRegType, cmp_fn: fn[AnyRegType]($0, $0, /) capturing -> Bool](buff: Pointer[*"type", 0], k: Int, size: …...

信息学奥赛一本通编程启蒙题解(3031~3035)

前言 Hello大家好我是文宇 正文 3031 #include<bits/stdc.h> using namespace std; double n,m,x; int main(){cin>>n>>m;xn-m*0.8;cout<<fixed<<setprecision(2)<<x;return 0; } 3032 #include<bits/stdc.h> using namespace…...

字符函数内存函数———C语言

字符分类函数 头文件&#xff1a; ctype.h 函数功能iscntrl判断字符是否为控制字符isspace判断字符是否为空白字符&#xff08;空格&#xff0c;换页、换行、回车、制表符或垂直制表符&#xff09;isdigit判断字符是否为十进制数字isxdigit判断字符是否为十六进制数字(0-9)(a…...

c语言跨文件传输数据

在 C 语言中&#xff0c;可以通过以下几种方式获取其他 C 文件中定义的变量&#xff1a; 一、使用 extern 关键字 在需要获取变量的文件中&#xff0c;使用extern关键字声明该变量。 例如&#xff0c;如果在other.c文件中有一个全局变量int globalVar;&#xff0c;在当前文件中…...

企业文件防泄密怎么做?10款透明加密软件排行榜

在信息时代&#xff0c;企业的核心竞争力往往体现在其拥有的知识和信息上&#xff0c;而企业文件的安全性直接关系到这些信息的保护。文件防泄密已成为企业管理中的重要议题&#xff0c;透明加密技术因其无缝集成和高效保护的特性&#xff0c;成为企业防泄密的首选方案。2024年…...

AI编程工具的力量:以AWS Toolkit与百度Comate为例,加速程序员开发效率

在当今的数字化转型浪潮中&#xff0c;人工智能&#xff08;AI&#xff09;技术不仅重塑了众多行业&#xff0c;也为软件开发领域带来了革命性的变化。AI编程工具&#xff0c;凭借其智能化的特性&#xff0c;正在成为程序员提高开发效率、优化代码质量和加速产品迭代的重要助力…...

smallpdf: 免费高效的PDF水印添加工具

引言 在数字文档管理和分享的过程中&#xff0c;保护版权和确保文档的原创性变得尤为重要。PDF文件作为一种广泛使用的格式&#xff0c;经常需要添加水印来表明所有权或提醒查看者注意文档的敏感性。本文将介绍一款名为smallpdf的免费工具&#xff0c;它能够轻松地为PDF文件添…...

java整合modbusRTU与modbusTCP

理解 Modbus TCP 报文格式,Modbus TCP 报文格式如下: | Transaction ID (2 bytes) | Protocol ID (2 bytes) | Length (2 bytes) | Unit ID (1 byte) | Function Code (1 byte) | Data (N bytes) |Transaction ID:标识事务的唯一标识符,确保正确的 Transaction ID:每个请求…...

四、Docker使用

1. 快速入门 1.1. Docker背景介绍 Docker是一个开源的平台&#xff0c;用于开发、交付和运行应用程序。它能够在Windows&#xff0c;macOS&#xff0c;Linux计算机上运行&#xff0c;并将某一应用程序及其依赖项打包至一个容器中&#xff0c;这些容器可以在任何支持Docker的环…...

杰发科技AC7840——CAN通信简介(8)_通过波特率和时钟计算SEG_1/SEG_2/SJW/PRESC

通过公式计算 * 波特率和采样点计算公式&#xff1a;* tSeg1 (S_SEG_1 2); tSeg2 (S_SEG_2 1).* BandRate (SCR_CLK / (S_PRESC 1) / ((S_SEG_1 2) (S_SEG_2 1))), SCR_CLK 为CAN 模块源时钟* SamplePoint (tSeg1 / (tSeg1 tSeg2)). {0x0D, 0x04, 0x04, 0x3B},…...

开发日记-EaxyExcel修改模板sheet名称

引入pom&#xff1a; <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel-core</artifactId><version>3.1.1</version><scope>compile</scope></dependency> 编写自定义拦截器&#xff1a; impo…...

微软AI人工智能认证有哪些?

微软提供的人工智能认证主要包括以下几个方面&#xff1a; Azure AI Fundamentals&#xff08;AI900认证&#xff09;&#xff1a;这是一个基础认证&#xff0c;旨在展示与Microsoft Azure软件和服务开发相关的基本AI概念&#xff0c;以创建AI解决方案。它面向具有技术和非技术…...

基于缓存提高Java模板文件处理性能:减少磁盘I/O的实践与探索

1、优化背景及动机 背景 线上有一个需求&#xff1a;读取模板文件&#xff0c;并根据不同的业务将数据写入模板文件&#xff0c;生成一个新的文件。模板文件本身是不会变的&#xff0c;所以每次生成文件都要去读取一遍模板文件&#xff0c;会有很多的磁盘IO操作&#xff0c;并…...

C/C++ 线程局部存储(TLS)

在C或C中&#xff0c;线程局部存储&#xff08;Thread-Local Storage&#xff0c;简称TLS&#xff09;是一种用于存储线程特有数据的方法。这意味着每个线程都可以访问它自己的变量实例&#xff0c;而不会影响到其他线程中的同名变量。这在多线程程序中非常有用&#xff0c;因为…...

碰撞检测 | 基于ROS Rviz插件的多边形碰撞检测仿真平台

目录 0 专栏介绍1 基于多边形的碰撞检测2 碰撞检测仿真平台搭建2.1 多边形实例2.2 外部服务接口2.3 Rviz插件化 3 案例演示3.1 功能介绍3.2 绘制多边形 0 专栏介绍 &#x1f525;课设、毕设、创新竞赛必备&#xff01;&#x1f525;本专栏涉及更高阶的运动规划算法轨迹优化实战…...

nginx实验

源码编译 解压 进入目录查看文件 环境监测文件 下载c语言编译工具 指定功能 成功 拷贝 关闭 删除 关闭debug 启动 nginx的平滑升级以及版本回滚 解压 备份 查看进程 回滚 nginx命令的常用参数 查看参数 检测配置文件中的语法 测试并打印 静默模式 设置全局指令&#xff08;不能…...

新技术能够区分真实照片和 AI 伪造图片,但为何平台没有使用?|TodayAI

随着生成式 AI 图像工具的快速发展&#xff0c;网络上越来越多的图像真假难辨。尽管已有技术能够区分真实照片和 AI 伪造图片&#xff0c;但大多数在线平台尚未充分利用这一技术。随着美国总统大选临近&#xff0c;网络上充斥着关于候选人唐纳德特朗普和卡玛拉哈里斯的各种照片…...

测量 Redis 服务器的固有延迟

redis-cli --intrinsic-latency redis-cli --intrinsic-latency 命令用于测量 Redis 服务器的固有延迟。 固有延迟指的是 Redis 服务器处理一个命令所需的最短时间&#xff0c;不包括网络延迟。通过这个测量&#xff0c;我们可以了解 Redis 服务器本身的性能&#xff0c;而不…...

【JVM】JVM内存模型与操作系统内存模型(一)

JVM内存模型与操作系统内存模型 Java进程在操作系统内存中的结构 JVM内存模型 可以这样理解:JVM内存模型其实就是JVM在启动的时候从操作系统内存中要了一块大内存&#xff0c;然后将这个大内存分成五个区域:方法区、堆区、虚拟机栈、本地方法栈、本地方法栈、程序计数器.其实叫…...

构建基于LLM的应用程序——为您的应用程序选择合适的LLM

。 在本章中&#xff0c;将引导您完成为应用程序选择合适LLM的过程。我们将涵盖以下几个主题&#xff1a; 市场上最具前景的LLM概览比较LLM时应使用的主要标准和工具规模与性能之间的权衡 在本章结束时&#xff0c;您应该能够清楚地理解如何为您的应用程序选择合适的LLM&…...

raksmart站群服务器多IP配置要求

RakSmart是一家提供多种服务器解决方案的服务商&#xff0c;其中包括针对站群服务的多IP服务器。这类服务器特别适合那些需要大量独立IP地址的业务&#xff0c;例如站群、多域名托管等。下面我们就来了解一下RakSmart站群服务器的多IP配置要求及相关信息。 什么是站群服务器? …...

【Web IDE】WebContainer容器在浏览器中启动运行nodejs并使用vite启动项目

参考了文章WebContainer/api 基础&#xff08;Web IDE 技术探索 一&#xff09; 在浏览器中运行vite的vue3项目 示例站点 最终效果 主要流程 加载WebContainer》加载代码压缩包>解压代码压缩包》生成文件树》挂载文件树》pnpm安装依赖》启动项目 代码 <script setup…...

Linux 多线程

目录 1 多线程的概念 1.1 再次理解进程的地址空间和页表 1.2 线程 2 线程控制 2.1 创建线程 pthread_create 2.2终止线程 2.3 线程等待 2.4 线程取消 2.5 线程分离 3 原生线程库 4 互斥 &#xff08;锁&#xff09; pthread_mutex_t pthread_mutex_init pthread_mute…...

C语言编写三子棋游戏:从概念到思路到实现

目录 一.文章概述 二.游戏规则概述 三.理解思路 1. 定义游戏数据结构 2. 游戏搭建思路及其步骤 菜单选择列表&#xff1a; 初始化棋盘&#xff1a;所有位置均为空格 创建棋盘样式 设置玩家下棋 设置电脑下棋 检查游戏状态&#xff1a; 四.代码示例 一.game.c部分 …...

React.js如何使用Bootstrap

在 React.js 项目中使用 Bootstrap 有多种方法&#xff0c;主要包括直接引入 Bootstrap CSS 文件和使用 React Bootstrap 库。下面将详细介绍这两种方法。 方法一&#xff1a;直接引入 Bootstrap CSS 文件 这是最简单的方式&#xff0c;只需在项目中引入 Bootstrap 的 CSS 文…...

深入解析:Redis与Nacos分布式锁在业务中的具体应用

时间&#xff1a;2024年08月22日 作者&#xff1a;小蒋聊技术 邮箱&#xff1a;wei_wei10163.com 微信&#xff1a;wei_wei10 音频地址&#xff1a;https://xima.tv/1_HBPYxC?_sonic0 希望大家帮个忙&#xff01;如果大家有工作机会&#xff0c;希望帮小蒋内推一下&#x…...

MySQL索引的性能优化

1.数据库服务器的优化步骤 在数据库调优中&#xff0c;我们的目标就是响应时间更快&#xff0c;吞吐量更大。利用宏观的监控工具和微观的日志分析可以帮我们快速找到调优的思路和方式 数据库服务器的优化步骤 当我们遇到数据库调优问题的时候&#xff0c;该如何思考呢&#xf…...

小说网站怎么做词/情感营销的十大案例

二叉树的后序遍历 题目描述&#xff1a;给定一个二叉树&#xff0c;返回它的 后序 遍历。 示例说明请见LeetCode官网。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode-cn.com/problems/binary-tree-postorder-traversal/ 著作权归领…...

手机网站的制作/铜仁搜狗推广

JavaScript的变量是松散类型的&#xff0c;即可以用来保存任何类型的数据。换句话说&#xff0c;每个变量仅仅是一个用于保存值的占位符而已。定义变量时要使用var操作符&#xff0c;后跟变量名&#xff0c;如下&#xff1a;var test;这行代码定义了一个名为test的变量&#xf…...

武汉网站推广怎么做/郑州百度seo网站优化

家长是孩子最好的老师&#xff0c;为了能让家长随时随地的对孩子进行认知理解&#xff0c;本期给各位家长推荐7款APP。分享的9款app主要包含替代与辅助沟通以及视觉提示&#xff08;视觉流程表、工作程序&#xff09;等等方面&#xff0c;家长们可根据实际情况在应用商店下。同…...

无锡网站建设 首选无锡立威云商/怎样在百度上发表文章

前言 一直听说过反编译,感觉很高大上,一直没自己用过,今天因缘巧合之下,终于要开始逐渐认识,了解和学习一下反编译了~先给自己说下加油,鼓励一下下 apktool的下载和安装 apktool 下载地址: Apktool [![Join the chat athttps://gitter.im/iBotPeaches/Apktool] apktool 安装教程…...

网站建设人员考核/重庆seo整站优化系统

洪锦祥在实验室洪锦祥供图每次乘坐G8次“复兴号”高铁&#xff0c;当列车以350公里时速驶过“滕州—枣庄”路段时&#xff0c;江苏省建筑科学研究院高性能土木工程材料国家重点实验室副主任洪锦祥&#xff0c;都会下意识地从座位上起身&#xff0c;看看车窗外自己曾经日夜奋战过…...

做网站订单/推广普通话手抄报内容简短

OSD进程的启动停止&#xff1a;https://blog.csdn.net/bandaoyu/article/details/119894927 1. OSD概念 OSD&#xff1a;Object Storage Device&#xff0c;主要负责响应客户端请求返回具体数据的守护进程&#xff0c;一般一个集群会有多个OSD&#xff0c;每一块盘都会对应一个…...