第33讲:K8S集群StorageClass使用Ceph CSI供应商与Cephfs文件系统集成

news2024/9/25 18:29:03

文章目录

    • 1.Ceph CSI供应商简介
    • 2.创建Cephfs文件系统为StorageCLass提供底层存储端
      • 2.1.创建Cephfs文件系统
      • 2.2.在Cephfs文件系统中为Storageclass创建子目录
      • 2.3.在Cephfs文件系统中创建一个子卷
    • 3.在K8S集群中部署Cephfs-CSI供应商客户端
      • 3.1.下载Cephfs-CSI客户端的资源编排文件
      • 3.2.配置CSI连接Ceph集群的ConfigMap资源
      • 3.3.将Ceph的配置文件保存在Configmap中
      • 3.4.调整资源编排文件的命名空间以及镜像地址
      • 3.5.部署CSI客户端
    • 4.基于Cephfs文件系统创建Storageclass资源并进行使用
      • 4.1.将K8S访问Cephfs文件系统的用户信息存储在Secret资源中
      • 4.2.创建一个StorageClass资源控制器
      • 4.3.创建PVC存储卷从StorageClass中自动分配PV
      • 4.4.创建Pod资源挂载PVC存储卷
      • 4.5.进入Pod资源进行数据持久化操作
      • 4.6.查看由StorageClass分配的PV与Cephfs文件存储中子目录的对应关系
      • 4.7.观察Cephfs文件系统中是否有Pod产生的数据
    • 5.Statefulset控制器结合Storageclass为每个Pod分配独立存储
      • 5.1.编写Statefulset控制器资源编排文件
      • 5.2.创建资源控制器并观察PV和PVC的状态
      • 5.3.查看PV对应在Cephfs文件系统中的目录结构

1.Ceph CSI供应商简介

K8S StorageClass对接Ceph集群的Cephfs文件系统有两种方法,一种是cephfs-provisioner另一种是cephfs-csi。

Cephfs-csi是第三方的客户端程序,部署简单,只需要拉取下来镜像就可以部署成功,而cephfs-provisioner则有很多的故障,相对于对接RBD的存储时,rbd-provisioner非常简单,rbd-csi则有很多故障。

Cephfs-csi官方文档:https://github.com/ceph/ceph-csi/blob/devel/docs/deploy-cephfs.md

2.创建Cephfs文件系统为StorageCLass提供底层存储端

2.1.创建Cephfs文件系统

Cephfs类型的CSI提供了指定使用哪一个Cephfs文件系统的参数,我们可以在Ceph集群中再创建一个Cephfs文件系统,专门为Storageclass使用。

1.创建Cephfs使用的资源池
[root@ceph-node-1 ~]# ceph osd pool create kubernetes_cephfs_data 16 16
pool 'kubernetes_cephfs_data' created
[root@ceph-node-1 ~]# ceph osd pool create kubernetes_cephfs_metadata 16 16
pool 'kubernetes_cephfs_metadata' created

2.创建cephfs文件系统
[root@ceph-node-1 ~]# ceph fs new kubernetes_cephfs  kubernetes_cephfs_metadata kubernetes_cephfs_data
new fs with metadata pool 24 and data pool 23

2.2.在Cephfs文件系统中为Storageclass创建子目录

这一步无需做,在2.3中说明。

我们可以将这一个Cephfs文件系统仅针对K8S集群进行使用,所有的K8S持久化数据都存在这个Cephfs文件系统中,在这个文件系统里可以针对不同的应用程序,创建出不同的子目录,然后将子目录挂载到具体的应用程序上。ll

[root@ceph-node-1 ~]# mkdir /kubernetes_cephfs/k8s_data/storageclass_storage

cephfs文件系统就相当于系统中的一块磁盘,按照目录结构创建即可。

2.3.在Cephfs文件系统中创建一个子卷

StorageClass使用Cephfs-CSI客户端将数据持久化到Cephfs文件系统时,无法指定Cephfs文件系统中现有的子目录进行挂载,只能将数据写在文件系统的/目录中,这是Cephfs-CSI程序内部写死的,无法进行配置,除非修改源代码。

如下图所示,StorageClass分配PV时,会通过Cephfs-CSI在Cephfs文件系统中/目录中创建一个volumes的子目录,在volumes中再创建一个子目录叫做csi,在csi目录中存放的都是PV持久化的数据,每个PV都会对应生成一个目录。

image-20220419171140172

volumes目录是无法修改的,只能修改volumes目录中的子目录csi,Cephfs-CSI会在Ceph集群指定的Cephfs文件系统中创建一个子卷,这个目录就对应的就是子卷的名称。

下面我们来创建一个子卷。

命令格式:ceph fs subvolumegroup create {cephfs文件系统名称} {子卷名称}

1.创建子卷
[root@ceph-node-1 ~]# ceph fs subvolumegroup create kubernetes_cephfs k8s-storageclass-volumes

2.查看文件系统下所有的子卷
[root@ceph-node-1 ~]# ceph fs subvolumegroup ls kubernetes_cephfs
[
    {
        "name": "k8s-storageclass-volumes"
    }
]

3.删除子卷的命令:
[root@ceph-node-1 ~]# ceph fs subvolumegroup create kubernetes_cephfs k8s-storageclass-volumes

3.在K8S集群中部署Cephfs-CSI供应商客户端

3.1.下载Cephfs-CSI客户端的资源编排文件

[root@k8s-master cephfs-csi]# git clone https://github.com/ceph/ceph-csi.git -b release-v3.4
[root@k8s-master cephfs-csi]# cd ceph-csi/deploy/cephfs/kubernetes

3.2.配置CSI连接Ceph集群的ConfigMap资源

[root@k8s-master kubernetes]# vim csi-config-map.yaml
apiVersion: v1
kind: ConfigMap
data:
  config.json: |-
    [
      {
       "clusterID": "a5ec192a-8d13-4624-b253-5b350a616041",
       "monitors": [
          "192.168.20.20:6789",
          "192.168.20.21:6789",
          "192.168.20.22:6789"
       ],
        "cephFS": {
          "subvolumeGroup": "k8s-storageclass-volumes"
        }
      }
    ]
metadata:
  name: ceph-csi-config

clusterID:集群的ID号

monitors:Monitor组件的地址

subvolumeGroup:Cephfs文件系统中的子卷名称,StorageClass分配的PV,产生的持久化数据都会存储在这里。

3.3.将Ceph的配置文件保存在Configmap中

需要将Ceph的基础配置文件写入到Configmap资源中,CSI客户端的两个容器都需要挂载。

[root@k8s-master kubernetes]# vim ceph-config.yaml 
apiVersion: v1
kind: ConfigMap
data:
  ceph.conf: |
    [global]
    auth_cluster_required = cephx
    auth_service_required = cephx
    auth_client_required = cephx
  # keyring is a required key and its value should be empty
  keyring: |
metadata:
  name: ceph-config

3.4.调整资源编排文件的命名空间以及镜像地址

CSI的镜像在国外,拉取会超时,需要替换成DockerHub上的地址。

[root@k8s-master kubernetes]# NAMESPACE=cephfs-storage
[root@k8s-master kubernetes]# sed -ri "s/namespace: [^ ]+/namespace: $NAMESPACE/g" *.yaml

[root@k8s-master kubernetes]# sed -ri 's/k8s.gcr.io\/sig-storage/jiangxlrepo/' *.yaml
[root@k8s-master kubernetes]# sed -ri 's/quay.io\/cephcsi/jiangxlrepo/' *.yaml

3.5.部署CSI客户端

1)在K8S集群中部署CSI客户端

1.创建CSI客户端所在的Namespace
[root@k8s-master kubernetes]# kubectl create ns cephfs-storage
namespace/cephfs-storage created

2.部署所有的CSI资源控制器
[root@k8s-master kubernetes]# kubectl apply -f ./ -n cephfs-storage 
configmap/ceph-config created
service/csi-cephfsplugin-provisioner created
deployment.apps/csi-cephfsplugin-provisioner created
daemonset.apps/csi-cephfsplugin created
service/csi-metrics-cephfsplugin created
configmap/ceph-csi-config created
podsecuritypolicy.policy/cephfs-csi-nodeplugin-psp created
role.rbac.authorization.k8s.io/cephfs-csi-nodeplugin-psp created
rolebinding.rbac.authorization.k8s.io/cephfs-csi-nodeplugin-psp created
serviceaccount/cephfs-csi-nodeplugin created
clusterrole.rbac.authorization.k8s.io/cephfs-csi-nodeplugin created
clusterrolebinding.rbac.authorization.k8s.io/cephfs-csi-nodeplugin created
podsecuritypolicy.policy/cephfs-csi-provisioner-psp created
role.rbac.authorization.k8s.io/cephfs-csi-provisioner-psp created
rolebinding.rbac.authorization.k8s.io/cephfs-csi-provisioner-psp created
serviceaccount/cephfs-csi-provisioner created
clusterrole.rbac.authorization.k8s.io/cephfs-external-provisioner-runner created
clusterrolebinding.rbac.authorization.k8s.io/cephfs-csi-provisioner-role created
role.rbac.authorization.k8s.io/cephfs-external-provisioner-cfg created
rolebinding.rbac.authorization.k8s.io/cephfs-csi-provisioner-role-cfg created
csidriver.storage.k8s.io/cephfs.csi.ceph.com created

2)查看部署的CSI客户端Pod资源

[root@k8s-master kubernetes]# kubectl get pod -n cephfs-storage 
NAME                                            READY   STATUS    RESTARTS   AGE
csi-cephfsplugin-bfdvj                          3/3     Running   0          39s
csi-cephfsplugin-ngv84                          3/3     Running   0          39s
csi-cephfsplugin-provisioner-7bffb54f69-d26ms   6/6     Running   0          38s
csi-cephfsplugin-provisioner-7bffb54f69-q2wsn   6/6     Running   0          38s
csi-cephfsplugin-provisioner-7bffb54f69-q6hw9   6/6     Running   0          38s
csi-cephfsplugin-qlj4k                          3/3     Running   0          39s

全部处于Running状态,下面可以来创建StorageClass存储类,将数据持久化到Cephfs文件系统了。

4.基于Cephfs文件系统创建Storageclass资源并进行使用

Cephfs的CSI客户端驱动已经在集群中部署完成了,下面可以创建一个StorageClass资源通过CSI驱动连接Ceph集群的块存储设备。

创建完StorageClass后,可以创建一个PVC存储卷,观察PV是否会自动创建,最后在Pod中使用PVC。

使用CSI之前,先在每一个K8S节点中安装Ceph的相关命令。

yum -y install ceph-common

4.1.将K8S访问Cephfs文件系统的用户信息存储在Secret资源中

将用户信息的Secret资源固定存放在一个Namespace下,然后在StorageClass中引用即可。

1)编写资源编排文件

[root@k8s-master cephfs-csi]# vim cephfs-sc-secret.yaml 
apiVersion: v1
kind: Secret
metadata:
  name: cephfs-sc-secret
  namespace: kube-system
stringData:
  userID: admin
  userKey: AQBIWUhiEmaFOBAA6Jr6itUeHiLVVOeYFVpRog==
  adminID: admin
  adminKey: AQBIWUhiEmaFOBAA6Jr6itUeHiLVVOeYFVpRog==

2)创建Secret资源

[root@k8s-master cephfs-csi]# kubectl apply -f cephfs-sc-secret.yaml
secret/csi-cephfs-secret created

4.2.创建一个StorageClass资源控制器

1)编写资源编排文件

[root@k8s-master cephfs-csi]# vim cephfs-storageclass.yaml 
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: cephfs-storageclass
provisioner: cephfs.csi.ceph.com				#cephfs csi客户端的驱动名称
parameters:
  clusterID: a5ec192a-8d13-4624-b253-5b350a616041			#集群的ID
  fsName: kubernetes_cephfs									#使用Ceph集群的哪一个Cephfs文件系统
  pool: kubernetes_cephfs_data								#Cephfs文件系统的数据资源池名称
  #rootPath: /k8s_data/storageclass_storage					 #无需指定Cephfs文件系统中的子目录,CSi会自动在/下的volumes目录中存储,无法修改
  csi.storage.k8s.io/provisioner-secret-name: cephfs-sc-secret				
  csi.storage.k8s.io/provisioner-secret-namespace: kube-system
  csi.storage.k8s.io/controller-expand-secret-name: cephfs-sc-secret
  csi.storage.k8s.io/controller-expand-secret-namespace: kube-system
  csi.storage.k8s.io/node-stage-secret-name: cephfs-sc-secret
  csi.storage.k8s.io/node-stage-secret-namespace: kube-system
reclaimPolicy: Delete
allowVolumeExpansion: true

2)创建StorageClass并查看资源的状态

[root@k8s-master cephfs-csi]# kubectl apply -f cephfs-sc-secret.yaml 
secret/cephfs-sc-secret created

[root@k8s-master cephfs-csi]# kubectl get sc
NAME                  PROVISIONER           RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
cephfs-storageclass   cephfs.csi.ceph.com   Delete          Immediate           true                   3s

4.3.创建PVC存储卷从StorageClass中自动分配PV

1)编写PVC的资源编排文件

[root@k8s-master cephfs-csi]# vim cephfs-sc-pvc.yaml 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: cephfs-sc-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
  storageClassName: cephfs-storageclass

2)创建资源并查看资源的状态

[root@k8s-master cephfs-csi]# kubectl apply -f cephfs-sc-pvc.yaml
persistentvolumeclaim/cephfs-sc-pvc created

[root@k8s-master cephfs-csi]# kubectl get pvc
NAME            STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS          AGE
cephfs-sc-pvc   Bound    pvc-9fcb0460-6547-4e9f-8efe-6e2266bc4aab   1Gi        RWX            cephfs-storageclass   68s

可以看到PVC已经与pvc-f5ce8114-088e-41fa-91da-63d759f1dd9c这个PV进行了绑定,这个PV就是由Storageclass自动创建的。

[root@k8s-master cephfs-csi]# kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                   STORAGECLASS          REASON   AGE
pvc-9fcb0460-6547-4e9f-8efe-6e2266bc4aab   1Gi        RWX            Delete           Bound    default/cephfs-sc-pvc   cephfs-storageclass            69s

4.4.创建Pod资源挂载PVC存储卷

PVC已经准备就绪了,下面创建一个Pod资源,将PVC挂载到Pod资源中,持久化Pod资源的数据。

1)编写资源编排文件

[root@k8s-master cephfs-csi]# vim cephfs-sc-pvc-pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: cephfs-sc-pvc-pod
spec:
  containers:
    - image: nginx:1.15
      name: nginx
      ports:
      - name: web
        containerPort: 80
        protocol: TCP
      volumeMounts:
      - name: data
        mountPath: /var/www/html
  volumes:
    - name: data
      persistentVolumeClaim: 
        claimName: cephfs-sc-pvc

2)创建资源并观察资源的状态

[root@k8s-master cephfs-csi]# kubectl apply -f cephfs-sc-pvc-pod.yaml
pod/cephfs-sc-pvc-pod created

[root@k8s-master cephfs-csi]# kubectl get pod
NAME                READY   STATUS    RESTARTS   AGE
cephfs-sc-pvc-pod   1/1     Running   0          42s

4.5.进入Pod资源进行数据持久化操作

进入的Pod容器的PVC挂载路径,写入一些数据文件。

[root@k8s-master cephfs-csi]# kubectl exec -it cephfs-sc-pvc-pod bash
root@cephfs-sc-pvc-pod:/# cd /var/www/html/
root@cephfs-sc-pvc-pod:/var/www/html# touch web{1..5}.index
root@cephfs-sc-pvc-pod:/var/www/html# mkdir code login admin
root@cephfs-sc-pvc-pod:/var/www/html# ls
admin  code  login  web1.index	web2.index  web3.index	web4.index  web5.index

4.6.查看由StorageClass分配的PV与Cephfs文件存储中子目录的对应关系

由StorageClass动态创建的PV,生成的名称都是随机的,没有什么含义,盲目的在Cephfs文件系统中找不一定能找的对。

可以通过kubectl describe pv {pv_name}目录看到PV持久化的数据存储在Cephfs文件系统的哪个路径中,

image-20220419215743773

主要看这一行:

subvolumePath=/volumes/k8s-storageclass-volumes/csi-vol-2f7d25c6-bfe8-11ec-8b4e-d65c041d72e2/50b7e45b-a48d-4d0f-be36-86812c8367e8

/volumes目录:是CSI客户端从代码部分就指定好的,无法变更。

/volumes/k8s-storageclass-volumes目录:k8s-storageclass-volumes目录对应的就是在Cephfs文件系统中创建的子卷名称

/volumes/k8s-storageclass-volumes/csi-vol-2f7d25c6-bfe8-11ec-8b4e-d65c041d72e2目录:第三级si-vol-2f7d25c6-bfe8-11ec-8b4e-d65c041d72e2目录是由CSI创建的子卷,PV会保存在这一级目录中,也是一个目录。

/volumes/k8s-storageclass-volumes/csi-vol-2f7d25c6-bfe8-11ec-8b4e-d65c041d72e2/50b7e45b-a48d-4d0f-be36-86812c8367e8:第四级50b7e45b-a48d-4d0f-be36-86812c8367e8目录就是PV的目录,也是Pod数据持久化落盘的位置。

每当StorageClass分配一个PV,都会在文件系统中/volumes/目录下生产一个元数据文件,并且在创建的子卷目录下为每一个PV创建一个csi的子卷,最后在创建一个目录来存放PV的数据。

我们可以再创建一个PVC,由Storageclass为其分配PV,查看目录结构,如下图所示。

image-20220419220743029

千万不要删除volumes这个目录,一旦这个目录删除,使用Cephfs的StorageCLass再次分配PV时就会产生问题,此时只需要将CSI客户端重新部署即可解决问题。

4.7.观察Cephfs文件系统中是否有Pod产生的数据

Pod产生的数据都会存储在/volumes/{子卷}/{CSI子卷}/{PV目录}这个路径下。

[root@ceph-node-1 ~]# tree /kubernetes_cephfs/
/kubernetes_cephfs/
└── volumes
    ├── _deleting
    ├── k8s-storageclass-volumes
    │   └── csi-vol-2f7d25c6-bfe8-11ec-8b4e-d65c041d72e2
    │       └── 50b7e45b-a48d-4d0f-be36-86812c8367e8
    │           ├── admin
    │           ├── login
    │           ├── web
    │           ├── web1.txt
    │           ├── web2.txt
    │           ├── web3.txt
    │           ├── web4.txt
    │           └── web5.txt
    └── _k8s-storageclass-volumes:csi-vol-2f7d25c6-bfe8-11ec-8b4e-d65c041d72e2.meta

8 directories, 6 files

5.Statefulset控制器结合Storageclass为每个Pod分配独立存储

现在StorageClass已经对接好了Ceph集群的Cephfs文件系统,下面在Statefulset控制器使用StorageClass为每个Pod分配独立的存储源。

每个Pod都会通过StorageClass创建出一个PVC和PV,每个PVC都会对应一个PV,每个PV都会在文件系统中创建一组目录。

5.1.编写Statefulset控制器资源编排文件

[root@k8s-master cephfs-csi]# vim cephfs-statefulset.yaml 
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  serviceName: "nginx"
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.15
        volumeMounts:
        - name: web-data
          mountPath: /var/www/html
  volumeClaimTemplates:
  - metadata:
      name: web-data
    spec:
      storageClassName: "cephfs-storageclass"
      accessModes:
      - ReadWriteMany
      resources:
        requests:
          storage: 1Gi

5.2.创建资源控制器并观察PV和PVC的状态

1.创建statefulset控制器
[root@k8s-master cephfs-csi]# kubectl apply -f cephfs-statefulset.yaml 
statefulset.apps/nginx created

2.查看创建的资源
[root@k8s-master cephfs-csi]# kubectl get pod
NAME                READY   STATUS    RESTARTS   AGE
cephfs-sc-pvc-pod   1/1     Running   0          80m
nginx-0             1/1     Running   0          8m35s
nginx-1             1/1     Running   0          8m24s
nginx-2             1/1     Running   0          8m15s

3.查看PV和PVC
[root@k8s-master cephfs-csi]# kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                      STORAGECLASS          REASON   AGE
pvc-0350926b-1933-411b-8eb4-ba583e272c08   1Gi        RWX            Delete           Bound    default/web-data-nginx-1   cephfs-storageclass            9m4s
pvc-49747cef-46b0-4f83-976d-039020b679c4   1Gi        RWX            Delete           Bound    default/web-data-nginx-0   cephfs-storageclass            9m15s
pvc-93fcf7bf-b593-4b7c-8a04-717d49685c93   1Gi        RWX            Delete           Bound    default/web-data-nginx-2   cephfs-storageclass            8m55s
pvc-9fcb0460-6547-4e9f-8efe-6e2266bc4aab   1Gi        RWX            Delete           Bound    default/cephfs-sc-pvc      cephfs-storageclass            81m

[root@k8s-master cephfs-csi]# kubectl get pvc
NAME               STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS          AGE
cephfs-sc-pvc      Bound    pvc-9fcb0460-6547-4e9f-8efe-6e2266bc4aab   1Gi        RWX            cephfs-storageclass   81m
web-data-nginx-0   Bound    pvc-49747cef-46b0-4f83-976d-039020b679c4   1Gi        RWX            cephfs-storageclass   9m36s
web-data-nginx-1   Bound    pvc-0350926b-1933-411b-8eb4-ba583e272c08   1Gi        RWX            cephfs-storageclass   9m25s
web-data-nginx-2   Bound    pvc-93fcf7bf-b593-4b7c-8a04-717d49685c93   1Gi        RWX            cephfs-storageclass   9m16s

5.3.查看PV对应在Cephfs文件系统中的目录结构

每一个PV都对应一个子目录和数据文件。

image-20220419232042628

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

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

相关文章

计算机网络——网络层(概念及IP地址)

网络层概念 网络层向上层提供的两种服务 在计算机网络领域,网络层应该向运输层提供怎样的服务(“面向连接”还是“无连接”)曾引起了长期的争论。 争论焦点的实质就是:在计算机通信中,可靠交付应当由谁来负责?是网络还是端系统&#xff1f…

rfid资产管理系统解决方案 rfid固定资产管理系统建设方案

在现代化的仓库储备中,仅仅完成对货物进出的简单批次处理已经不再足够,对库内货品的种类、数量、生产属性、垛位等信息的清晰记录变得至关重要。然而,传统的资产管理方式如条形码在长期使用中逐渐暴露出不耐脏、数据存储量小、读取间隔短、不…

js吸顶导航

吸顶导航 当我们浏览页面篇幅较大,浏览过半的时候想回到导航位置,只能通过往回滚动或通过”回到顶部”重新滚动到导航位置,这样的操作显得繁琐与不便。于是便有了吸顶式导航的交互方式,吸顶条导航最大的好处是将最常用或者设计者最…

WAIC | 穿越千年!华院计算AIGC技术实现刘徽、祖冲之和毕达哥拉斯跨时空对话

祖冲之利用刘徽的割圆术,将圆周率π的近似计算精确到小数点后七位,这不仅是数学史上的一项重要突破,也是对无理数逼近问题的早期探索。在现代人工智能中同样能观察到数值逼近的思想,例如模型的训练通常依赖随机优化算法等数值方法…

2.贪心算法.基础

2.贪心算法.基础 基础知识题目1.分发饼干2.摆动序列3.最大子序和4.买股票的最佳时机24.2.买股票的最佳时机5.跳跃游戏5.1.跳跃游戏26.K次取反后最大化的数组和7.加油站8.分发糖果 基础知识 什么是贪心? 贪心的本质是选择每一阶段的局部最优,从而达到全局最优。 贪…

Studying-代码随想录训练营day33| 动态规划理论基础、509.斐波那契函数、70.爬楼梯、746.使用最小花费爬楼梯

第33天,动态规划开始,新的算法💪(ง •_•)ง,编程语言:C 目录 动态规划理论基础 动态规划的解题步骤 动态规划包含的问题 动态规划如何debug 509.斐波那契函数 70.爬楼梯 746.使用最小花费爬楼梯 总结 动态…

MSPM0G3507——时钟配置(与32关系)

先将32端时钟配置分为1,2,3如图 1是PSC左边未经分频的时钟源(HZ) 2是经过PSC分频的时钟信号(HZ) 3是最终的输出信号(HZ) 3输出的是一个定时器周期的HZ,可以转换成时间 …

哨兵系统:一套实时灵活可配置化的业务指标监控系统

简介: 在KOO分期的线下业务中,需要对很多关键业务指标进行实时监控,并需要根据一定的数据格式,通过企微机器人发往对应的企微群,因此KOO分期技术团队在KOO业务指标库之上,搭建了一套KOO分期业务指标监控系统&#xff…

ppt接单渠道大公开‼️

PPT 接单主要分两种:PPT 模板投稿和PPT 定制接单,我们先从简单的 PPT 模板投稿说起。 PPT 模板投稿 利用业余时间,做一些 PPT 模板上传到平台,只要有人下载你的模板,你就有收入。如果模板质量高,简直就是一…

Hadoop-19 Flume Agent批量采集数据到HDFS集群 监听Hive的日志 操作则把记录写入到HDFS 方便后续分析

章节内容 上一节我们完成了内容: Flume 启动测试Flume Conf编写Flume 测试发送和接收数据 背景介绍 这里是三台公网云服务器,每台 2C4G,搭建一个Hadoop的学习环境,供我学习。 之前已经在 VM 虚拟机上搭建过一次,但…

高德API接入安卓相关问题说明

高德API接入安卓相关问题说明 我们都在怀念过去,失去后我们才懂得珍惜,有些人或事早已经远去,可是还是会想起曾经拥有的岁月,会是一种喜悦,会是一种遗憾…… 目前Android开发已经普遍使用Android Studio,开…

优思学院|当今的丰田精益生产模式落伍了吗?

丰田曾经是全球销量最大的汽车制造商,不过现在却被挖苦为可能会成为下一个汽车界的“诺基亚”。 丰田的前CEO丰田章男对于电动汽车的前景持极度怀疑态度,今年4月他下台,由年轻14岁的佐藤恒治接任。这一变动反映了丰田对电动汽车态度的180度大…

streamlit table转置显示

streamlit table转置显示,并且原始的表头放在最左侧 原始表格 代码 import streamlit as st import pandas as pd# 创建一个示例 DataFrame data {Column1: [1, 2, 3],Column2: [4, 5, 6],Column3: [7, 8, 9] } df pd.DataFrame(data)# 转置 DataFrame transposed_df df.T…

进程,进程的调度,进程的调度算法(详解)ฅ( ̳• · • ̳ฅ)

目录 😇进程的概念: 😚进程的组成: 🥰进程的调度: 一.进程调度的概念: 二.进程调度的方式: 三.进程调度的时机: 🤪进程的调度算法: 一.先…

如何通过运动改善老年人的腿部肌肉力量?

老年人腿部肌肉力量的重要性 随着年龄的增长,肌肉自然会逐渐萎缩,特别是腿部肌肉。腿部肌肉的强弱直接影响到老年人的行走能力、平衡能力和日常生活的自理能力。因此,通过适当的运动来改善和增强腿部肌肉力量对于老年人来说至关重要。 适合老…

1Panel安装教程:使用Linux服务器安装1Panel面板全流程

使用阿里云服务器安装1Panel面板全流程,云服务器操作系统为CentOS 7.9,安装1Panel非常简单,先执行1Panel安装命令,然后在云服务器安全组中开通1Panel默认端口号、安全入口、用户名和密码等操作,阿里云百科整理详细安装…

前端八股文 跨域

前端跨域和常见解决方案 一、什么是跨域 同源策略是一个重要的安全策略,它用于限制一个origin的文档或者它加载的脚本如何能与另一个源的 资源进行交互。它能帮助阻隔恶意文档,减少可能被攻击的媒介。 有一点必须要注意:跨域并不是请求发不…

Unity插件 Unitask学习日志

Unity插件 Unitask学习日志 下载地址 https://github.com/Cysharp/UniTask点击这里可以查阅中文文档 在Unity 2020,2021 中使用UPM下载会找不到,可以使用2022版本的unity可以在upm中找到。 安装方式: 下载zip之后解压, 复制Plugins 到Uni…

化工厂定位系统有哪些功能?

有伙伴了解化工厂定位系统吗?相信很多小伙伴都没有听说过,感觉离我们的生活比较远,事实上化工厂定位系统也是默默的在保护我们的安全。今天新锐科创就给大家介绍一下这个系统,让大家简单的了解一下。 大家都知道化工厂一直是一个比…

【LLM大模型】如何在LlamaIndex中使用RAG?

如何在LlamaIndex中使用RAG 什么是 Llama-Index LlamaIndex 是一个数据框架,用于帮助基于 LLM 的应用程序摄取、构建结构和访问私有或特定领域的数据。 如何使用 Llama-Index ? 基本用法是一个五步流程,将我们从原始、非结构化数据导向基于该数据生成…