K8S之Pod控制器

k8s——pod控制器 服务发现:就是应用服务之间相互定位的过程。动态性强:Pod会飘到别的node节点更新发布频繁:互联网思维小步快跑,先实现再优化,老板永远是先上线再慢慢优化,先把idea变成产品挣到钱然后再慢慢一点一点优化支持自动伸缩:一来大促,肯定是要扩容多个副本K8S里服务发现的方式—DNS,使K8S集群能够自动关联Service资源的“名称”和“CLUSTER-IP”,从而达到服务被集群自动发现的目的。一个完整的 StatefulSet 控制器由。 阅读详情

我们之前通过资源配置清单,自己创建了一个Pod资源,如果此时这个Pod被删除了,K8S是不会帮我们重新创建的。通过这种方式创建的Pod称之为自主式Pod资源,如果线上所有的服务都需要我们来手动管理Pod,那将是一个巨大的运维开销,那K8S就失去了其存在的意义,所以,K8S为我们提供了Pod控制器资源,专门用于对Pod的管理。Pod控制器可以帮我们自动保持Pod状态处于我们期望的状态,例如Pod的副本数,Pod中使用的容器镜像版本,Pod的更新策略等等。

当我们在创建Pod时,会给Pod打上标签,而我们的Pod控制器正是通过标签选择器来选中指定标签的Pod,从而实现对Pod的管理。

一、Pod控制器类型

常见的Pod控制器有如下类型:

ReplicationController:简称RC,旧版本K8S中使用的Pod控制器,ReplicaSet的前身,仅支持等式的标签选择器,官方不建议使用。

ReplicaSet:简称RS,新版本中用于顶替ReplicationController的Pod控制器,其支持集合式的标签选择器。ReplicaSet可以单独使用,但是单独使用时其并不支持rolling-update,官方建议通过Deployment来自动管理ReplicaSet。其由三部分组成:用户期望的副本数,标签选择器,Pod资源模板。用户期望的副本数表示启动的Pod的数量,标签选择器用来筛选那些被控制的Pod,Pod资源模板则定义了Pod的名称,容器,镜像等等,其本质上就是Pod资源的metadata和spec字段。

Deployment:简称deploy,最常用的Pod控制器,需要注意的是,其并不直接控制Pod,而是直接控制ReplicaSet,然后通过ReplicaSet来控制Pod,Deployment支持rolling-update,版本记录,回滚,暂停更新等操作。其每次更新时都会自动创建一个ReplicaSet,每一个ReplicaSet就是表示一个版本,这就表明在同一个Deployment下会有多个ReplicaSet,但是同一时间只有一个ReplicaSet在工作。

DaemonSet:简称DS,DaemonSet控制器会在K8S集群中所有Node节点上都启动且仅启动一个Pod,一般这类Pod都是用来运行集群中的公共服务,例如监控、日志收集等等。当有新的Node节点加入集群后,DaemonSet会立即在新的节点上创建Pod。

Job:负责一次性任务的处理,其控制下的Pod仅执行一次并成功退出。

CronJob:定时任务,负责在某个时间点或者以一定时间规律运行的任务。

StatefulSet:用于管理有状态应用的Pod控制器。

1、ReplicaSet

了解了Pod控制器的类型后,我们通过资源配置清单来创建一个ReplicaSet类型的Pod控制器。

[root@k8s7-200 ReplicaSet]# pwd
/data/k8s-yaml/ReplicaSet
[root@k8s7-200 ReplicaSet]# cat myapp-rs.yaml 
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: myapp-rs
  namespace: default
spec:
  replicas: 2
  selector:
    matchLabels:
      app: myapp
      release: test-v1
  template:
    metadata:
      name: myapp
      labels:
        app: myapp
        release: test-v1
    spec:
      containers:
      - name: myapp-container
        image: harbor.od.com/public/myapp:v1

ReplicaSet.spec字段有如下几个二级字段:

replicas:副本数,即用户期望的Pod数量

selector:标签选择器,用来指定筛选Pod的标签,其下级字段有matchLabels用于匹配键值,matchExpressions用于匹配集合类型标签

template:定义Pod资源模板,其下就是Pod资源的metada和spec字段,此处需要注意,Pod资源的标签一定要能被selector中定义的标签选择器所匹配到。此字段下的metadata和spec字段可以参见《K8S系列 -- K8S资源配置清单》,此处不再赘述

定义好资源配置清单后,我们就可以来创建Pod控制器了

[root@k8s7-22 ~]# kubectl create -f http://k8s-yaml.od.com/ReplicaSet/myapp-rs.yaml  # 创建控制器
replicaset.apps/myapp-rs created
[root@k8s7-22 ~]# kubectl get rs     # 查看rs资源
NAME                  DESIRED   CURRENT   READY   AGE
myapp-rs              2         2         2       33m
[root@k8s7-22 ~]# kubectl get pods -l app=myapp,release=test-v1 --show-labels  # 查看pod
NAME             READY   STATUS    RESTARTS   AGE   LABELS
myapp-rs-v26gm   1/1     Running   0          34m   app=myapp,release=test-v1
myapp-rs-xvp5z   1/1     Running   0          34m   app=myapp,release=test-v1

我们将资源配置清单中的副本数量改成5,然后就可以对当前pod进行扩容了:

[root@k8s7-22 ~]# kubectl apply -f http://k8s-yaml.od.com/ReplicaSet/myapp-rs.yaml  # 应用新的配置清单
replicaset.apps/myapp-rs configured
[root@k8s7-22 ~]# kubectl get pods -l app=myapp,release=test-v1 --show-labels
NAME             READY   STATUS    RESTARTS   AGE   LABELS
myapp-rs-5vk9s   1/1     Running   0          9s    app=myapp,release=test-v1
myapp-rs-6sbvz   1/1     Running   0          9s    app=myapp,release=test-v1
myapp-rs-fqwdc   1/1     Running   0          9s    app=myapp,release=test-v1
myapp-rs-v26gm   1/1     Running   0          73m   app=myapp,release=test-v1
myapp-rs-xvp5z   1/1     Running   0          73m   app=myapp,release=test-v1

[root@k8s7-22 ~]# kubectl edit rs myapp-rs   # 动态修改资源配置

此时我们可以看到,我们集群中的Pod数量变成了5个,同理,我们也可以将集群Pod数量改回2,以此完成对集群的扩缩容。

除了对集群Pod的扩缩容外,我们还可以发布更新。比如我们要将我们的Pod镜像版本由V1升级为V2,我们可以直接编辑rs的配置清单:

[root@k8s7-22 ~]# kubectl edit rs myapp-rs
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: extensions/v1beta1
kind: ReplicaSet
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"apps/v1","kind":"ReplicaSet","metadata":{"annotations":{},"name":"myapp-rs","namespace":"default"},"spec":{"replicas":5,"selector":{"matchLabels":{"app":"myapp","release":"test-v1"}},"template":{"metadata":{"labels":{"app":"myapp","release":"test-v1"},"name":"myapp"},"spec":{"containers":[{"image":"harbor.od.com/public/myapp:v1","name":"myapp-container"}]}}}}
  creationTimestamp: "2020-01-15T08:33:05Z"
  generation: 5
  labels:
    app: myapp
    release: test-v1
  name: myapp-rs
  namespace: default
  resourceVersion: "3349727"
  selfLink: /apis/extensions/v1beta1/namespaces/default/replicasets/myapp-rs
  uid: f161c8ee-7506-4461-a7a1-579f3a661e78
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
      release: test-v1
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: myapp
        release: test-v1
      name: myapp
    spec:
      containers:
      - image: harbor.od.com/public/myapp:v2    # 修改镜像版本为V2
        imagePullPolicy: IfNotPresent

此时,我们再来看下rs的详细信息以及pod内的版本:

[root@k8s7-22 ~]# kubectl get rs -o wide
NAME                  DESIRED   CURRENT   READY   AGE   CONTAINERS        IMAGES                          SELECTOR
myapp-rs              3         3         3       19h   myapp-container   harbor.od.com/public/myapp:v2   app=myapp,release=test-v1
[root@k8s7-22 ~]# kubectl get pods -o wide -l app=myapp,release=test-v1
NAME             READY   STATUS    RESTARTS   AGE   IP            NODE               NOMINATED NODE   READINESS GATES
myapp-rs-5vk9s   1/1     Running   0          18h   172.17.21.5   k8s7-21.host.com   <none>           <none>
myapp-rs-v26gm   1/1     Running   0          19h   172.17.22.4   k8s7-22.host.com   <none>           <none>
myapp-rs-xvp5z   1/1     Running   0          19h   172.17.21.3   k8s7-21.host.com   <none>           <none>
[root@k8s7-22 ~]# curl 172.17.21.5
abc
[root@k8s7-22 ~]# curl 172.17.22.4
abc
[root@k8s7-22 ~]# curl 172.17.21.3
abc

此时我们可以看到,我们的rs中镜像的版本已经变成了v2,但是我们的pod却没有被更新,依然是v1版本的内容。这是因为,我们更改了镜像的版本后,我们的ReplicaSet并不会去更新我们的Pod,而是当我们的Pod退出后,才会使用新版的镜像来重新创建,所以,我们来删掉其中一个Pod,让ReplicaSet为我们重建一个Pod,此时我们再来看新Pod中的应用版本:

[root@k8s7-22 ~]# kubectl delete pods myapp-rs-5vk9s
pod "myapp-rs-5vk9s" deleted
[root@k8s7-22 ~]# kubectl get pods -o wide -l app=myapp,release=test-v1
NAME             READY   STATUS    RESTARTS   AGE   IP            NODE               NOMINATED NODE   READINESS GATES
myapp-rs-8gmt4   1/1     Running   0          12s   172.17.21.4   k8s7-21.host.com   <none>           <none>
myapp-rs-v26gm   1/1     Running   0          19h   172.17.22.4   k8s7-22.host.com   <none>           <none>
myapp-rs-xvp5z   1/1     Running   0          19h   172.17.21.3   k8s7-21.host.com   <none>           <none>
[root@k8s7-22 ~]# curl 172.17.21.4
myapp | v2
[root@k8s7-22 ~]# curl 172.17.22.4
abc

此时我们就可以看到,当我们删除一个Pod后,我的ReplicaSet为我们自动重建了一个新的Pod,而此时新的Pod中就变成了V2版本,此时集群中新旧版本的Pod都存在,如果我们依次删除旧的Pod,就能实现灰度发布的效果,如果我们只删除部分Pod,就能实现金丝雀发布的效果。但是这些操作都是我们手动进行的,虽然便于控制更新频率,但是如果此时如果新版本有问题,我们想要快速回滚的话,依然需要改回旧版本,然后再手动删掉新Pod,这样就不是很方便了。

2、Deployment

Deployment类型的Pod控制器,其实并不会直接控制Pod,而是直接控制ReplicaSet,然后再通过ReplicaSet来控制Pod,这样,不同的ReplicaSet就会有不同的版本,如果需要回滚时,直接启用旧的ReplicaSet即可,这样就可以实现快速回滚的操作。接下来我们就创建一个Deployment类型的Pod控制器,其资源配置清单如下:

[root@k8s7-200 Deployment]# cat myapp-dp.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-dp
  namespace: default
spec:
  replicas: 2
  selector: 
    matchLabels:
      app: myapp-dp
      release: v1
  strategy:
    type: RollingUpdate
    rollingUpdate: 
      maxSurge: 10
      maxUnavailable: 0
  revisionHistoryLimit: 3
  paused: True
  template: 
    metadata: 
      name: myapp-dp
      labels:
        app: myapp-dp
        release: v1
    spec: 
      containers: 
      - name: myapp-dp-container
        image: harbor.od.com/public/myapp:v1
        imagePullPolicy: IfNotPresent
        ports: 
        - name: http
          containerPort: 80
        livenessProbe:
          httpGet: 
            port: http
            path: "/index.html"
          failureThreshold: 4
          periodSeconds: 20
          timeoutSeconds: 10
          initialDelaySeconds: 10
        readinessProbe:
          httpGet: 
            port: http
            path: "/index.html"
          failureThreshold: 4
          periodSeconds: 20
          timeoutSeconds: 10
          initialDelaySeconds: 10

我们可以看到,在Deployment的资源配置清单中,spec字段下除了有和ReplicaSet相同的replicas、selector、template字段外,还多了如下字段:

strategy:用于指定更新策略,其下级字段如下:
  type: 更新的类型,支持 Recreate及RollingUpdate,默认值是RollingUpdate
  rollingUpdate:滚动更新策略,当type值是RollingUpdate时此字段才生效,其有如下下级字段:
  maxSurge: 最多可以多创建Pod数量,可以是数字,也可以是百分比。
  maxUnavailable: 最多不可用的Pod数量,可以是数字,也可以是百分比。
  
  注意:maxSurge和maxUnavailable的值不能同时为0。

  revisionHistoryLimit:保留的历史版本数,默认是10,及保留10个旧版本
  paused: 暂停设置,当设置此项后,在K8S集群中新建Deployment时,只会先创建Deployment,其下并不会创建ReplicaSet以及Pod,此时可以用来编辑我们的Deployment,默认是False。如果创建Deployment完成后,再将paused改为True,则此时再更改其配置清单后不会自动更新Pod。

至于template的内容,与ReplicaSet是一样的,也不再赘述。现在,我们创建一下Deployment。

[root@k8s7-22 ~]# kubectl create -f http://k8s-yaml.od.com/Deployment/myapp-dp.yaml
deployment.apps/myapp-dp created
[root@k8s7-22 ~]# kubectl get rs
No resources found.
[root@k8s7-22 ~]# kubectl get pods 
No resources found.
[root@k8s7-22 ~]# kubectl get deploy
NAME       READY   UP-TO-DATE   AVAILABLE   AGE
myapp-dp   0/2     0            0           17s

此时我们可以看到,我们创建了Deployment,但是ReplicaSet和Pod都没有被创建,就是因为我们在资源配置清单中指定了paused为True,接下来,我们将此项配置删掉,然后再看下我们的Pod资源:

[root@k8s7-22 ~]# kubectl edit deploy myapp-dp
deployment.extensions/myapp-dp edited
[root@k8s7-22 ~]# kubectl get deploy
NAME       READY   UP-TO-DATE   AVAILABLE   AGE
myapp-dp   0/2     2            0           39s
[root@k8s7-22 ~]# kubectl get rs
NAME                  DESIRED   CURRENT   READY   AGE
myapp-dp-7f46b784cc   2         2         0       7s
[root@k8s7-22 ~]# kubectl get pods
NAME                        READY   STATUS    RESTARTS   AGE
myapp-dp-7f46b784cc-jtv52   0/1     Running   0          11s
myapp-dp-7f46b784cc-lbnwf   0/1     Running   0          11s
[root@k8s7-22 ~]# kubectl get pods
NAME                        READY   STATUS    RESTARTS   AGE
myapp-dp-7f46b784cc-jtv52   0/1     Running   0          23s
myapp-dp-7f46b784cc-lbnwf   1/1     Running   0          23s
[root@k8s7-22 ~]# kubectl get pods
NAME                        READY   STATUS    RESTARTS   AGE
myapp-dp-7f46b784cc-jtv52   0/1     Running   0          25s
myapp-dp-7f46b784cc-lbnwf   1/1     Running   0          25s
[root@k8s7-22 ~]# kubectl get pods
NAME                        READY   STATUS    RESTARTS   AGE
myapp-dp-7f46b784cc-jtv52   1/1     Running   0          29s
myapp-dp-7f46b784cc-lbnwf   1/1     Running   0          29s

当我们将myapp-dp的资源配置清单编辑完成后,删除了paused配置项,我们可以看到,Deployment立即继续执行了剩下的操作,创建了ReplicaSet,创建了Pod,因为我们的Pod设置了readinessProbe,所以直到可用性检测完成后,我们的Pod才标记为READY状态,此时,我们的Pod才可以对外提供服务,如果其前端有service资源的话,此时才能被加入service之中。

接下来,我们将我们的Pod升级到v2版本,我们来看下Deployment更新的过程,我们定义了更新策略是滚动更新,且最多可以多创建10个临时Pod用于升级,所以,我们直接用kubectl edit命令实时编辑其资源配置清单,此时就会立即触发更新操作:

[root@k8s7-22 ~]# kubectl edit deploy myapp-dp
deployment.extensions/myapp-dp edited
[root@k8s7-22 ~]# kubectl get pods -o wide
NAME                        READY   STATUS    RESTARTS   AGE     IP            NODE               NOMINATED NODE   READINESS GATES
myapp-dp-7f46b784cc-jtv52   1/1     Running   0          8m59s   172.17.22.2   k8s7-22.host.com   <none>           <none>
myapp-dp-7f46b784cc-lbnwf   1/1     Running   0          8m59s   172.17.21.3   k8s7-21.host.com   <none>           <none>
myapp-dp-b99666748-d8rhh    0/1     Running   0          12s     172.17.21.4   k8s7-21.host.com   <none>           <none>
myapp-dp-b99666748-kvt6w    0/1     Running   0          12s     172.17.22.3   k8s7-22.host.com   <none>           <none>
[root@k8s7-22 ~]# kubectl get rs -o wide
NAME                  DESIRED   CURRENT   READY   AGE     CONTAINERS           IMAGES                          SELECTOR
myapp-dp-7f46b784cc   0         0         0       9m12s   myapp-dp-container   harbor.od.com/public/myapp:v1   app=myapp-dp,pod-template-hash=7f46b784cc,release=v1
myapp-dp-b99666748    2         2         2       25s     myapp-dp-container   harbor.od.com/public/myapp:v2   app=myapp-dp,pod-template-hash=b99666748,release=v1
[root@k8s7-22 ~]# kubectl get pods -o wide
NAME                       READY   STATUS    RESTARTS   AGE   IP            NODE               NOMINATED NODE   READINESS GATES
myapp-dp-b99666748-d8rhh   1/1     Running   0          30s   172.17.21.4   k8s7-21.host.com   <none>           <none>
myapp-dp-b99666748-kvt6w   1/1     Running   0          30s   172.17.22.3   k8s7-22.host.com   <none>           <none>
[root@k8s7-22 ~]# curl 172.17.22.3
myapp | v2
[root@k8s7-22 ~]# curl 172.17.21.4
myapp | v2

我们看到,当我们编辑完成后,Deployment立即新建了两个新的Pod,而且这两个新的Pod是通过新的ReplicaSet创建的,而旧的ReplicaSet的期望副本数变成了0,此时我们还可以查看一下Deployment资源的更新版本号:

[root@k8s7-22 ~]# kubectl rollout history deploy myapp-dp
deployment.extensions/myapp-dp 
REVISION  CHANGE-CAUSE
1         <none>
2         <none>

此时,已经有两个版本了,通过kubectl rollout undo命令可以来回滚版本,例如,回退到上一个版本:

[root@k8s7-22 ~]# kubectl rollout undo deploy myapp-dp
deployment.extensions/myapp-dp rolled back
[root@k8s7-22 ~]# kubectl rollout history deploy myapp-dp
deployment.extensions/myapp-dp 
REVISION  CHANGE-CAUSE
2         <none>
3         <none>

[root@k8s7-22 ~]# kubectl get rs -o wide
NAME                  DESIRED   CURRENT   READY   AGE   CONTAINERS           IMAGES                          SELECTOR
myapp-dp-7f46b784cc   2         2         2       20m   myapp-dp-container   harbor.od.com/public/myapp:v1   app=myapp-dp,pod-template-hash=7f46b784cc,release=v1
myapp-dp-b99666748    0         0         0       11m   myapp-dp-container   harbor.od.com/public/myapp:v2   app=myapp-dp,pod-template-hash=b99666748,release=v1
[root@k8s7-22 ~]# kubectl get pods -o wide
NAME                        READY   STATUS    RESTARTS   AGE   IP            NODE               NOMINATED NODE   READINESS GATES
myapp-dp-7f46b784cc-jnq65   1/1     Running   0          54s   172.17.22.2   k8s7-22.host.com   <none>           <none>
myapp-dp-7f46b784cc-p4q6l   1/1     Running   0          54s   172.17.21.3   k8s7-21.host.com   <none>           <none>
[root@k8s7-22 ~]# curl 172.17.22.2
abc
[root@k8s7-22 ~]# curl 172.17.21.3
abc

除了能回退到上一个版本外,我们还可以回退到某个指定版本,只需要在回滚操作时加上参数 --to-revision=版本号 即可回滚到指定版本:

[root@k8s7-22 ~]# kubectl rollout undo deploy myapp-dp --to-revision=2
deployment.extensions/myapp-dp rolled back
[root@k8s7-22 ~]# kubectl get pods -o wide
NAME                       READY   STATUS    RESTARTS   AGE    IP            NODE               NOMINATED NODE   READINESS GATES
myapp-dp-b99666748-kxlxv   1/1     Running   0          63s    172.17.22.4   k8s7-22.host.com   <none>           <none>
myapp-dp-b99666748-nlp2z   1/1     Running   0          112s   172.17.22.2   k8s7-22.host.com   <none>           <none>
[root@k8s7-22 ~]# curl 172.17.22.4
myapp | v2
[root@k8s7-22 ~]# curl 172.17.22.2
myapp | v2

3、DeamonSet

DaemonSet型的Pod控制器,会在集群中所有的Node节点上启动且仅启动一个Pod,DaemonSet一般用于部署集群基础服务,例如监控、日志收集等等。我们来看一个DaemonSet的资源配置清单:

[root@k8s7-200 DaemonSet]# cat myapp-ds.yaml 
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: myapp-ds
  namespace: default
spec:
  selector:
    matchLabels:
      app: myapp-ds
      release: ds
  revisionHistoryLimit: 3
  updateStrategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
  template:
    metadata:
      labels:
        app: myapp-ds
        release: ds
    spec:
      hostNetwork: True           # 使用Node节点的网络,此时Pod的IP地址会使用Node的地址,从集群中其他Node会直接访问到Pod的服务
      containers:
      - name: myapp-ds
        image: harbor.od.com/public/myapp:v1
        imagePullPolicy: IfNotPresent
        ports: 
        - name: http
          containerPort: 80
        livenessProbe:
          httpGet: 
            port: http
            path: "/index.html"
          failureThreshold: 4
          periodSeconds: 20
          timeoutSeconds: 10
          initialDelaySeconds: 10
        readinessProbe:
          httpGet: 
            port: http
            path: "/index.html"
          failureThreshold: 4
          periodSeconds: 20
          timeoutSeconds: 10
          initialDelaySeconds: 10

其实DaemonSet的资源配置清单和Deployment的资源配置清单字段差不多,只是DaemonSet需要在每个Node节点上部署一个Pod,所以不用再指定replicas字段了。DaemonSet也支持滚动更新,也可以定义滚动更新的策略,updateStrategy字段就是来定义更新策略的,其下级字段type可指定更新类型,支持 RollingUpdate 及 OnDelete,默认是RollingUpdate,当type选择RollingUpdate时,还可以设置rollingUpdate字段,其下级字段只有maxUnavailable可选,且这个字段不能为0,默认值是1。

【我的Android进阶之旅】Android自定义View实现一个游戏摇杆,来实现监听遥动的方向或者监听摇动的角度的功能 一、需求描述 去年有个需求,需要使用自定义View实现一个游戏摇杆,来识别上下左右摇动的方向。 有点类似下面这样的王者荣耀游戏摇杆的效果 二、业界已有的参考资料 在下面这篇博客介绍了如何自定义游戏摇杆 2.1 博客介绍 Android自定义摇杆 2.1.1 功能 支持自适应大小 支持2个方向、4个方向、8个方向的摇动监听 支持摇动角度获取 可选回调模式 支持可摇动区域自定义 支持摇杆自定义 支持设置图片、色值、Shape图形 2.1.2 效果图 2.1.3 设置回调方式 setCallBac 阅读详情

相关推荐

BERTopic模型入门教程(附代码+参数调节)

BERTopic 是一种用于从文本数据中提取主题模型的新型方法。通过结合 BERT嵌入和传统的主题模型来生成语义丰富的主题。传统的主题模型(如LDA)主要依赖于词频矩阵,而 BERTopic 通过预训练语言模型生成高维语义嵌入来捕捉词语间的复杂关系,因此可以更好地处理上下文信息。BERTopic模型可以看作是创建其主题表示的一系列步骤。核心原理如下:就本质而言,BERTopic就是一个拼装框架,可以把每部分都替换成其他模型,只要完成任务即可。

m0_52069102的博客 1万+

readness健康性检测与maxSurge 和 maxUnavailable更新策略

对于多副本应用,当执行 Scale Up 操作时,新副本会作为 backend 被添加到 Service 的负责均衡中,与已有副本一起处理客户的请求。考虑到应用启动通常都需要一个准备阶段,比如加载缓存数据,连接数据库等,从容器启动到正真能够提供服务是需要一段时间的。我们可以通过 Readiness 探测判断容器是否就绪,避免将请求发送到还没有 ready 的 backend。下面是示例应用的配置文......

不忘初心,方得始终 3097

头歌操作系统2023春季课堂练习2.1:外部中断

本关任务:通过相关知识以及实验回答:版本 1 内核的第 6 次时钟中断发生时,断点和恢复点(指令地址)分别是多少?回答问题:当第一行 0/1 字符全部输出完毕的时候一共发生了几次时钟中断,即第一行完全填满时 jiffies 记录的已发生次数为多少?本关任务:通过实际操作回答在输出第一行 0/1 字符的过程中(如下图所示),共发生了几次时钟中断?2.此时 bochs 虚拟机输出的 0/1 字符串是什么?(只填写数字,不填写空格!根据相关知识进行实际操作,一直输入 c 直到 0/1 将第一行完全填满。

weixin_64821608的博客 8127

K8s Deployment ymal文件详解

apiVersion: extensions/v1beta1 #接口版本 kind: Deployment #接口类型 metadata: name: cango-demo #Deployment名称 namespace: cango-prd #命名空间 labels: app: cango-...

月夜楓 2056

开关电源EMC整改实录:用WSX系列共模电感搞定30MHz辐射超标

本文详细介绍了开关电源EMC整改实战,通过WSX系列共模电感成功解决30MHz频段辐射超标问题。文章分析了共模干扰的产生机制,对比了不同磁芯材料的性能差异,并提供了电路布局优化与安装技巧,最终通过实测数据验证了整改方案的有效性。

weixin_29305313的博客 414

遗传病变异注释预测工具安装系列之------Exomiser 安装及bug处理

Exomiser是一个Java程序,它从全外显子组或全基因组测序数据中发现潜在的致病变异。 Java 版本必须为1.8以上。 Exomiser 最新版本下载 wget -c https://github.com/exomiser/Exomiser/releases/download/11.0.0/exomiser-cli-11.0.0-distribution.zip unzip ...

qq_37329349的博客 1535

Kubernetes基础:Pod中的Pause容器

在构建Kubernetes集群的时候我们使用到了一个名为Pause的镜像,这篇文章中我们来看一下在一个最基础的单元中Pause镜像的使用状况。

知行合一 止于至善 6887

使用 Vosk 实现语音识别

在近两年里,如果说想要在本地部署离线语音识别模型,那么和肯定是首选项。所以为什么要使用呢?

weixin_48967543的博客 9719

K8S系列四:服务管理

本文是K8S系列第四篇,主要面向对k8s新手同学。阅读本文需要读者对k8s的基本概念,比如Pod、Deployment、Service、Namespace等基础概念有所了解,尚且不了解的同学推荐先阅读本系列的第一篇文章《K8S系列一:概念入门》[1];阅读本文还需要读者对k8s的服务部署有一定深入的了解,特别是怎么通过Pod部署自己的服务,尚且不熟悉的同学推荐阅读本系列前一篇文章《K8S系列三:单服务部署》[2]。本文旨在讲述如何基于k8s集群管理一群服务,包括如何做。

一个天蝎座的程序猿 1214

Claude Code + 自定义模型体验

AI 编程工具的发展突飞猛进:Cursor 横空出世,推出了“Agent 模式”;新竞争者如 Windsurf 也纷纷加入战局。几乎所有产品都开始转向“代理式(agentic)”开发模式——不再依赖单次 LLM 响应进行补全,而是让大模型在一个循环中调用各种工具,来完成更复杂的任务:分析代码库上下文、读取网页与文档、编译程序、运行测试、修复失败构建或测试、不断迭代等。

西京刀客 5791

实验7:机器学习油田产量预测-代码数据-完整代码数据可直接运行-计算机毕设

实验7:机器学习油田产量预测-代码数据-完整代码数据可直接运行-计算机毕设

机器学习深度学习业余选手 478

Kubernetes 灰度/滚动发布 滚动更新速率控制解读 maxUnavailable,maxSurge

利用kubernetes的滚动更新时,可能经常遇到发布“太快不稳定”或“太慢体验差”的情况。本文将介绍kubernetes滚动更新控制速率的特性。 含义 服务在滚动更新时,deployment控制器的目的是:给旧版本(old_rs)副本数减少至0、给新版本(new_rs)副本数量增至期望值(replicas)。大家在使用时,通常容易忽视控制速率的特性,以下是kubernetes提供的两个参数: maxUnavailable:和期望ready的副本数比,不可用副本数最大比例(或最大值),这个....

小楼一夜听春雨,深巷明朝卖杏花 1万+

FX5U PLC运动控制库安装(PLCopen Motion Control FB参考)

下面我们介绍三菱FX5U PLC的运动控制库PLCopen Motion Control FB的安装。

RXXW_Dor的博客 1523

【Kubernetes】k8s集群的Pod控制器

k8s集群的Pod控制器

weixin_68840588的博客 1394

计算机控制技术及应用

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

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Kubernetes—K8S的Pod控制器

帮助用户管理无状态的pod资源,精确反应用户定义的目标数量,但是RelicaSet不是直接使用的控。字段决定的,默认为OrderedReady,如果设置为Parallel则并行的管理Pod)创建、扩容是升序进行的(顺序为Pod标识从0到n-1),滚动升级、缩容是倒序进行的(顺序为。一次性的部署短期任务的Pod资源,Pod容器不会持续运行,并要求任务执行完毕后容器成功退出。周期性的部署短期任务的Pod资源,Pod容器不会持续运行,并要求任务执行完毕后容器成功退出。制器,而是使用Deployment。

aran2002的博客 1042

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【Kubernetes】k8s集群Pod控制器

理论是将简单的东西复杂化,理念是将复杂的东西简单化

F12138X的博客 2134

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【k8s应用管理】kubernetes Pod控制器

作用:用于管理 Pod 的中间层,确保 Pod 资源符合预期状态。当 Pod 出现故障时,控制器会尝试重启或重建 Pod。常见类型ReplicaSet:确保指定数量的 Pod 副本运行。Deployment:管理无状态应用,支持滚动更新和回滚。DaemonSet:确保每个节点运行一个 Pod 副本。:管理有状态应用,支持稳定的网络标识和持久化存储。Job:运行一次性任务。CronJob:运行周期性任务。

Karoku的博客 1316

Kubernetes(K8s)Pod控制器详解-06

Pod控制器详解

qq_36255346的博客 6355

【kubernetes】关于k8s集群的pod控制器

1、statefulset用于部署有状态的应用(有实时数据需要存储的应用)2、部署statefulset之前,需要先创建一个headless service(表示clusterip为node的特殊service类型),statefulset的配置清单模板需要去指定servicename为headless service的名称。3、statefulset创建的pod名称是固定不变的,且唯一的。

liu_xueyin的博客 1675

K8S—Pod控制器

Pod控制器是 Kubernetes 中用于管理和控制 Pod 的重要资源,包括 ReplicaSet 和 Deployment 等。它们通过定义 Pod 模板来创建和管理 Pod 副本,实现自动扩缩容、滚动更新、故障恢复等功能。Pod 控制器负责监控 Pod 的运行状态,确保其符合用户定义的规则和策略。Pod 控制器是 Kubernetes 应用生命周期管理的关键组件,提供了丰富的功能和灵活的配置选项,帮助用户轻松管理和运维应用程序的 Pod 资源。

qq_64441401的博客 1466

Kubernetes的pod控制器

Pod 控制器(工作负载workload)是 Kubernetes 中用于管理 Pod 的中间层资源,其主要职责是确保 Pod 的运行状态符合用户的期望。在 Pod 出现异常时,控制器会根据设定的策略尝试恢复 Pod 的运行(会先重启,当重启策略无效的时候,重新创建新的pod资源,再删除旧的不好用的pod)。

2301_80613136的博客 1016

Kubernetes Pod控制器深度解析(K8s)

摘要: Kubernetes中的Pod创建方式分为自主式Pod和控制器创建的Pod。Pod控制器是管理Pod的中间层,常见类型包括ReplicaSet(保证Pod正常运行)、Deployment(管理ReplicaSet,支持滚动升级)、DaemonSet(节点守护进程)、Job(一次性任务)等。ReplicaSet通过标签选择器管理Pod,确保指定数量的Pod运行,支持扩缩容和镜像升级。Deployment则间接管理Pod,提供更强大的功能如版本回退和滚动更新。两者均通过YAML文件定义,使用kubect

weixin_46287157的博客 685

K8S中POD的控制器

Pod控制器,又称之为工作负载(workload),是用于实现管理pod的中间层,确保pod资源符合预期的状态,pod的资源出现故障时,会尝试进行重启,当根据重启策略无效,则会重新新建pod的资源。pod控制器有多种类型: 1、ReplicaSet: 代用户创建指定数量的pod副本,确保pod副本数量符合预期状态,并且支持滚动式自动扩容和缩容功能。 ReplicaSet主要三个组件组成: (1)用户期望的pod副本数量 (2)标签选择器,判断哪个pod归自己管理 (3)当现存的pod数量不足,会根据pod资

m0_65299341的博客 933

Kubernetes 启动Pod的方法-Pod的调度算法-Pod间的通信-k8s的控制器-Pod资源控制-发布Service服务

目录Pod参考文档:Pod | KubernetesPod配置文件:simple-pod.yaml对master进行如下操作Pod的状态有:参考文档:(70条消息) Pod生命周期中的状态解释_pod状态_闹玩儿扣眼珠子的博客-优快云博客进入Pod内的nginx容器:当我们创建一个Pod,其中的步骤是什么?(启动Pob的流程)大概步骤:k8s的 控制器有哪些:创建Pod过程中提出的问题: Scheduler在做任务的时候,使用了那些调度算法呢?根据Pod的调度策略和方法:(K8s有哪些调度算法?)Pod与

lpfstudy的博客 2058

K8S中Pod控制器之Horizontal Pod Autoscaler(HPA)控制器

HPA可以获取每个Pod利用率,然后和HPA中定义的指标进行对比,同时计算出需要伸缩的具体值,最后实现Pod的数量的调整。其实HPA与之前Deployment一样,也属于一种Kubernetes资源对象,它通过追踪分析RC控制的所有目标Pod的负载变化情况,来确定是否需要针对性地调整目标Pod的副本数,这是HPA的实现原理。MetricsServer是Kubernetes集群中的一个关键组件,用于收集和报告集群中资源的使用情况,如CPU和内存的使用率。的Pod,它会持续执行。

杜小帅的博客 2141

k8s (五) --- Kubernetes Pod控制器详举例详解

Pod控制器一、Pod控制器Pod 的分类控制器类型Replication Controller和ReplicaSetDeploymentDaemonSetStatefulSetJobCronJobHPA二、Pod控制器使用示例ReplicaSet举例Deployment控制器示例DaemonSet举例Job控制器举例CronJob控制器举例 一、Pod控制器 Pod 的分类 自主式 Pod:Po...

qq_35887546的博客 1343
上一篇: K8S资源配置清单
下一篇: 如何把kafka Log4j1.x升级到Log4j2.x ?
后场技术
博客等级 码龄11年 156粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值