k8s1.19使用ceph14

一、静态 pv (rbd)方式

1、所有k8s节点安装依赖组件

注意:安装ceph-common软件包推荐使用软件包源与Ceph集群源相同,软件版本一致。

cat > /etc/yum.repos.d/ceph.repo << EOF
[ceph]
name=ceph
baseurl=http://mirrors.aliyun.com/ceph/rpm-nautilus/el7/x86_64/
enabled=1
gpgcheck=0
priority=1[ceph-noarch]
name=cephnoarch
baseurl=http://mirrors.aliyun.com/ceph/rpm-nautilus/el7/noarch/
enabled=1
gpgcheck=0
priority=1[ceph-source]
name=Ceph source packages
baseurl=http://mirrors.aliyun.com/ceph/rpm-nautilus/el7/SRPMS
enabled=1
gpgcheck=0
priority=1
EOFyum install ceph-common -y

2、同步配置文件

[root@ceph1 ~]# ssh-copy-id master
[root@ceph1 ~]# ssh-copy-id node1
[root@ceph1 ~]# ssh-copy-id node2[root@ceph1 /etc/ceph]# ceph-deploy --overwrite-conf admin ceph1 ceph2 ceph3 master node1 node2

3、创建存储池并开启rbd功能

创建kube池给k8s

ceph osd pool create kube 128 128

4、创建ceph用户,提供给k8s使用

#查看ceph集群中的认证用户及相关的key
# ceph auth list删除集群中的一个认证用户
ceph auth del osd.0 #(这里只是给个删除用户命令,请勿执行啊!!)#创建用户
ceph auth get-or-create client.kube mon 'allow r' osd 'allow class-read object_prefix rbd_children,allow rwx pool=kube'

5、创建secret资源

ceph auth get-key client.admin | base64ceph auth get-key client.kube | base64
#base64 单向加密一下,k8s不以明文方式存储账号密码

mkdir jtpv && cd jtpv

cat > ceph-admin-secret.yaml << EOF
apiVersion: v1
kind: Secret
metadata:name: ceph-admin-secretnamespace: default
data:key:  #( admin 的key)
type:kubernetes.io/rbd
EOF
cat > ceph-kube-secret.yaml << EOF
apiVersion: v1
kind: Secret
metadata:name: ceph-kube-secretnamespace: default
data:key:  #( kube 的key)
type:kubernetes.io/rbd
EOF
cat > pv.yaml << EOF
apiVersion: v1
kind: PersistentVolume
metadata:name: ceph-pv-test
spec:capacity:storage: 5GiaccessModes:- ReadWriteOncerbd:monitors:- 10.100.100.115:6789- 10.100.100.116:6789- 10.100.100.117:6789pool: kubeimage: ceph-imageuser: adminsecretRef:name: ceph-admin-secretfsType: ext4readOnly: falsepersistentVolumeReclaimPolicy: Retain
EOF

6、创建镜像(说白了就是划出一块空间给它用的意思)

#创建镜像
rbd create -p kube -s 5G ceph-image# rbd ls -p kube
ceph-image
# rbd info ceph-image -p kube

7、k8s创建pv

cat > pvc.yaml << EOF
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: ceph-test-claim
spec:accessModes:- ReadWriteOncevolumeName: ceph-pv-testresources:requests:storage: 5Gi
EOF
cat > pod.yaml << EOF
apiVersion: v1
kind: Pod
metadata:name: ceph-pod
spec:containers:- name: test-podimage: busybox:1.24command: ["sleep", "60000"]volumeMounts:- name: pvcmountPath: /usr/share/busyboxreadOnly: falsevolumes:- name: pvcpersistentVolumeClaim:claimName: ceph-test-claim
EOF
[root@ceph1 ceph]# rbd ls -p kube
ceph-image
[root@ceph1 ceph]# rbd info ceph-image -p kube#发现是由于k8s集群和ceph集群 kernel版本不一样,k8s集群的kernel版本较低,rdb块存储的一些feature 低版本kernel不支持,需要disable。通过如下命令disable
[root@ceph1 ceph]# rbd feature disable kube/ceph-image object-map fast-diff deep-flatten

#验证

kubectl exec -it ceph-pod  -- df -h |grep /dev/rbd0

二、使用cephfs官方的ceph-csi插件

1、ceph 操作部分

在 ceph1 部署节点上同步配置文件,并创建至少一个 mds 服务

使用 cephfs 必须保证至少有一个节点提供 mds 服务

[root@ceph1 /etc/ceph]# ceph-deploy --overwrite-conf admin ceph1 ceph2 ceph3#这里做三个mds
[root@ceph1 /etc/ceph]# ceph-deploy mds create ceph1 ceph2 ceph3[root@ceph1 /etc/ceph]# ceph -s

2、创建存储池 、文件系统

1、创建 cephfs 存储池 :fs_metadata 、fs_data
2、创建 cephfs 文件系统:命名为 cephfs

3、一个 ceph 文件系统需要至少两个 RADOS 存储池,一个用于数据,一个用于元数据。

[root@ceph1 /etc/ceph]# ceph osd pool create cephfs_pool 64
pool 'cephfs_pool' created
[root@ceph1 /etc/ceph]# ceph osd pool create cephfs_metadata 64
pool 'cephfs_metadata' created
[root@ceph1 /etc/ceph]# ceph fs new cephfs cephfs_metadata cephfs_pool[root@ceph1 /etc/ceph]# ceph fs ls

获取集群信息和查看 admin 用户 key(秘钥)

# ceph mon dump# ceph auth get client.admin

注意:这里不需要 base64 加密

3、k8s 操作部分

0.0、所有 k8s节点安装依赖组件

cat > /etc/yum.repos.d/ceph.repo << EOF
[ceph]
name=ceph
baseurl=http://mirrors.aliyun.com/ceph/rpm-nautilus/el7/x86_64/
enabled=1
gpgcheck=0
priority=1[ceph-noarch]
name=cephnoarch
baseurl=http://mirrors.aliyun.com/ceph/rpm-nautilus/el7/noarch/
enabled=1
gpgcheck=0
priority=1[ceph-source]
name=Ceph source packages
baseurl=http://mirrors.aliyun.com/ceph/rpm-nautilus/el7/SRPMS
enabled=1
gpgcheck=0
priority=1
EOF
yum install ceph-common -y

0.1、需要把 ceph 集群的 /etc/ceph/{ceph.conf,ceph.client.admin.keyring} 文件同步到 k8s 所有节点上

[root@ceph1 ~]# ssh-copy-id k8s-master01
[root@ceph1 ~]# ssh-copy-id k8s-master02
[root@ceph1 ~]# ssh-copy-id k8s-master03[root@ceph1 /etc/ceph]# ceph-deploy --overwrite-conf admin ceph1 ceph2 ceph3 k8s-master01 k8s-master02 k8s-master03

4、部署cephfs csi

https://github.com/ceph/ceph-csi

#k8s版本v1.19.16,使用ceph版本14,csi插件版本ceph-csi-3.2.0
#git clone https://github.com/ceph/ceph-csi.git
git clone --branch=v3.2.0 https://github.com/ceph/ceph-csi.gitcd ceph-csi/deploy/cephfs/kubernetes

修改 csi-config-map.yaml 文件,配置连接 ceph 集群的信息

cat > csi-config-map.yaml << EOF
---
apiVersion: v1
kind: ConfigMap
data:config.json: |-[{"clusterID": "ba8c6ea3-30b5-4483-9fa0-26636c64a142", # ceph集群的ID,此内容可以使用ceph mon dump来查看,clusterID对应fsid"monitors": ["10.100.100.115:6789,10.100.100.116:6789,10.100.100.117:6789"]}] 
metadata:name: ceph-csi-config
EOF

5、导入镜像

cd ceph-csi/deploy/cephfs/kubernetes
grep image csi-cephfsplugin-provisioner.yaml #查看所需镜像#k8s版本v1.19.16,使用ceph版本14,csi插件版本ceph-csi-3.2.0
docker pull dyrnq/csi-node-driver-registrar:v2.0.1
docker tag dyrnq/csi-node-driver-registrar:v2.0.1 k8s.gcr.io/sig-storage/csi-node-driver-registrar:v2.0.1
docker rmi dyrnq/csi-node-driver-registrar:v2.0.1docker pull dyrnq/csi-snapshotter:v3.0.2
docker tag dyrnq/csi-snapshotter:v3.0.2 k8s.gcr.io/sig-storage/csi-snapshotter:v3.0.2
docker rmi dyrnq/csi-snapshotter:v3.0.2docker pull dyrnq/csi-provisioner:v2.0.4
docker tag dyrnq/csi-provisioner:v2.0.4 k8s.gcr.io/sig-storage/csi-provisioner:v2.0.4
docker rmi dyrnq/csi-provisioner:v2.0.4docker pull dyrnq/csi-resizer:v1.0.1
docker tag dyrnq/csi-resizer:v1.0.1 k8s.gcr.io/sig-storage/csi-resizer:v1.0.1
docker rmi dyrnq/csi-resizer:v1.0.1docker pull dyrnq/csi-attacher:v3.0.2
docker tag dyrnq/csi-attacher:v3.0.2 k8s.gcr.io/sig-storage/csi-attacher:v3.0.2
docker rmi dyrnq/csi-attacher:v3.0.2

因为这里k8s集群只有三台,所以必须配置k8s的k8s-master01运行pod

#查看k8s-master01表示不运行pod
[root@k8s-master01 ~]# kubectl describe node k8s-master01 |grep Taints
Taints: node-role.kubernetes.io/k8s-master01:NoSchedule
#查看k8s-master01表示运行pod
[root@k8s-master01 ~]# kubectl describe node k8s-master01 |grep Taints
Taints: <none>
#让k8s-master01节点参与pod负载的命令为
kubectl taint nodes k8s-master01 node-role.kubernetes.io/k8s-master01-
#让k8s-master01节点恢复不参与pod负载的命令为 
kubectl taint nodes k8s-master01 node-role.kubernetes.io/k8s-master01=:NoSchedule
cd ceph-csi/deploy/cephfs/kubernetes
sed -i 's/namespace: default/namespace: cephfs/g' *.yamlkubectl create ns cephfskubectl -n cephfs apply -f csi-config-map.yaml
kubectl -n cephfs create -f csi-provisioner-rbac.yaml
kubectl -n cephfs create -f csi-nodeplugin-rbac.yaml
kubectl -n cephfs create -f csi-cephfsplugin-provisioner.yaml
kubectl -n cephfs create -f csi-cephfsplugin.yaml

6、验证

1、k8s 上创建连接 ceph 集群的秘钥(创建 secret.yaml)

cd ~/ceph-csi/examples/cephfs #(官方secret.yaml文件模板位置)cat > ~/my-ceph-csi/examples/cephfs/secret.yaml << EOF
---
apiVersion: v1
kind: Secret
metadata:name: csi-cephfs-secretnamespace: cephfs
stringData:# 通过ceph auth get client.admin查看,这里不需要base64加密# Required for statically provisioned volumesuserID: adminuserKey: AQD59Q9lckU/LxAAXq25s+RS7gEPOlfr1Ry3kQ==# Required for dynamically provisioned volumesadminID: adminadminKey: AQD59Q9lckU/LxAAXq25s+RS7gEPOlfr1Ry3kQ==
EOFkubectl apply -f ~/my-ceph-csi/examples/cephfs/secret.yamlkubectl get secret csi-cephfs-secret -n cephfs

2、创建存储类(创建 storageclass.yaml)

修改字段1(clusterID:)、改成自己ceph集群的ID,ceph mon dump
修改字段2(fsName:)、填写上面创建名为cephfs的文件系统
修改字段3(pool:)、去掉注释,填写数据pool,不是元数据的pool

cd ~/ceph-csi/examples/cephfs #(官方storageclass.yaml文件模板位置)cat > ~/my-ceph-csi/examples/cephfs/storageclass.yaml <<EOF
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: csi-cephfs-sc
provisioner: cephfs.csi.ceph.com
parameters:clusterID: ba8c6ea3-30b5-4483-9fa0-26636c64a142 #此处需要修改fsName: cephfs #此处需要修改pool: cephfs_pool #此处需要修改csi.storage.k8s.io/provisioner-secret-name: csi-cephfs-secretcsi.storage.k8s.io/provisioner-secret-namespace: cephfscsi.storage.k8s.io/controller-expand-secret-name: csi-cephfs-secretcsi.storage.k8s.io/controller-expand-secret-namespace: cephfscsi.storage.k8s.io/node-stage-secret-name: csi-cephfs-secretcsi.storage.k8s.io/node-stage-secret-namespace: cephfs
reclaimPolicy: Delete
allowVolumeExpansion: true
mountOptions:- debug
EOFkubectl apply -f ~/my-ceph-csi/examples/cephfs/storageclass.yamlkubectl get sc csi-cephfs-sc -n cephfs

3、基于 sc 创建 pvc

cd ~/ceph-csi/examples/cephfs #(官方pvc.yaml文件模板位置)cat > ~/my-ceph-csi/examples/cephfs/pvc.yaml << EOF
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: csi-cephfs-pvc
spec:accessModes:- ReadWriteManyresources:requests:storage: 1GistorageClassName: csi-cephfs-sc
EOFkubectl apply -f ~/my-ceph-csi/examples/cephfs/pvc.yaml
kubectl get pvc#k8s ceph csi创建pvc报错 failed to get connection: connecting failed: rados: ret=13, Permission denied
[root@ceph1 ~]# ceph config set mon auth_allow_insecure_global_id_reclaim true

4、创建 pod 应用 pvc

cat > ~/my-ceph-csi/examples/cephfs/pod.yaml << EOF
---
apiVersion: v1
kind: Pod
metadata:name: csi-cephfs-demo-pod
spec:containers:- name: web-serverimage: nginx:alpinevolumeMounts:- name: mypvcmountPath: /var/lib/wwwvolumes:- name: mypvcpersistentVolumeClaim:claimName: csi-cephfs-pvcreadOnly: false
EOFkubectl apply -f ~/my-ceph-csi/examples/cephfs/pod.yamlkubectl get pod csi-cephfs-demo-pod -n default
  • 查看数据存放目录
kubectl exec -it csi-cephfs-demo-pod -- df -Th

三、动态ceph-rdb方式

1.创建pool

#创建存储池,指定pg和pgp的数量, pgp是对存在于pg的数据进行组合存储,pgp通常等于pg的值
# 创建存储池
ceph osd pool create kubernetes 64 64#对存储池启用 RBD 功能
ceph osd pool application enable kubernetes rbd#通过 RBD 命令对存储池初始化
rbd pool init -p kubernetes #查看pool
ceph osd pool ls#查看adim秘钥
ceph auth get client.admin 2>&1 |grep "key = " |awk '{print  $3'}#在Ceph上创建用户
ceph auth add client.kubernetes mon 'allow r' osd 'allow rwx pool=kubernetes'#获取Ceph信息
ceph mon dump#######################################################################
fsid ba8c6ea3-30b5-4483-9fa0-26636c64a142min_mon_release 15 (octopus)0: [v2:192.168.100.201:3300/0,v1:192.168.100.201:6789/0] mon.vm-201
1: [v2:192.168.100.202:3300/0,v1:192.168.100.202:6789/0] mon.vm-202
2: [v2:192.168.100.203:3300/0,v1:192.168.100.203:6789/0] mon.vm-203#检查创建的用户
ceph auth get client.kubernetes
#######################################################################
[client.kubernetes]key = AQBkIhBlIxMbMRAAqNw6Gab2wxNXScSsb7zS/w==caps mon = "allow r"caps osd = "allow rwx pool=kubernetes"
exported keyring for client.kubernetes#######################################################################

2.插件编辑配置文件

cd /root/ceph-csi-3.2.0/deploy/rbd/kubernetes
# 删除csi-rbdplugin-provisioner.yaml和csi-rbdplugin.yaml中
# ceph-csi-encryption-kms-config配置文件映射sed -i 's/namespace: default/namespace: ceph/g' *.yamlkubectl create ns ceph#执行文件
kubectl -n ceph apply -f .kubectl get pod -n ceph

3、csi-config-map.yaml配置

mkdir -p /root/ceph-csi-v3.2.0 && cd /root/ceph-csi-v3.2.0#创建表空间
kubectl create ns ceph-csicat > 1-csi-config-map.yaml << 'EOF'
---
apiVersion: v1
kind: ConfigMap
data:config.json: |-[{"clusterID": "ba8c6ea3-30b5-4483-9fa0-26636c64a142","monitors": ["10.100.100.115:6789","10.100.100.116:6789","10.100.100.117:6789"]}]
metadata:name: ceph-csi-confignamespace: default
EOF

4、配置csi-rbd-secret.yaml

cd /root/ceph-csi-v3.2.0cat > 2-csi-rbd-secret.yaml << 'EOF'
---
apiVersion: v1
kind: Secret
metadata:name: csi-rbd-secretnamespace: default
stringData:userID: kubernetesuserKey: AQBkIhBlIxMbMRAAqNw6Gab2wxNXScSsb7zS/w==
EOF

5、配置csi-rbd-sc

cd /root/ceph-csi-v3.2.0cat > 3-csi-rbd-sc.yaml << 'EOF'
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: csi-rbd-scannotations:storageclass.beta.kubernetes.io/is-default-class: "true"
provisioner: rbd.csi.ceph.com
parameters:clusterID: ba8c6ea3-30b5-4483-9fa0-26636c64a142pool: kubernetesimageFeatures: layeringcsi.storage.k8s.io/provisioner-secret-name: csi-rbd-secretcsi.storage.k8s.io/provisioner-secret-namespace: defaultcsi.storage.k8s.io/controller-expand-secret-name: csi-rbd-secretcsi.storage.k8s.io/controller-expand-secret-namespace: defaultcsi.storage.k8s.io/node-stage-secret-name: csi-rbd-secretcsi.storage.k8s.io/node-stage-secret-namespace: defaultcsi.storage.k8s.io/fstype: xfs
reclaimPolicy: Delete
allowVolumeExpansion: true
mountOptions:- discard
EOFsed -i 's/namespace: default/namespace: ceph/g' *.yaml#执行文件
kubectl -n ceph apply -f 1-csi-config-map.yaml
kubectl -n ceph apply -f 2-csi-rbd-secret.yaml
kubectl -n ceph apply -f 3-csi-rbd-sc.yaml
kubectl -n ceph get sc -o wide

四、rbd测试动态pvc

1. 验证 - volumeMode Block

#针对 PV 持久卷,Kubernetes 支持两种卷模式(volumeModes):Filesystem(文件系统) 和 Block(块)。 
#volumeMode 是一个可选的 API 参数。
#如果该参数被省略,默认的卷模式是 Filesystem。
#volumeMode 属性设置为 Filesystem 的卷会被 Pod 挂载(Mount) 到某个目录。
#如果卷的存储来自某块设备而该设备目前为空,Kuberneretes 会在第一次挂载卷之前 在设备上创建文件系统。
kubectl create ns testcd /root/ceph-csi-v3.2.0cat > 8-test-rbd-pvc.yaml << 'EOF' 
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: raw-block-pvcnamespace: test
spec:accessModes:- ReadWriteOncevolumeMode: Blockresources:requests:storage: 1GistorageClassName: csi-rbd-scEOFkubectl apply -f 8-test-rbd-pvc.yamlkubectl get pvc -o wide
#NAME            STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE   VOLUMEMODE
#raw-block-pvc   Bound    pvc-beb3a8c6-b659-44c6-bc5c-5fbd3ead1706   1Gi        RWO            csi-rbd-sc     10s   Blockcat  > 9-test-rbd-pod.yaml << 'EOF'
---
apiVersion: v1
kind: Pod
metadata:name: csi-rbd-demo-block-podnamespace: test
spec:containers:- name: centos-podimage: nginx:1.21imagePullPolicy: "IfNotPresent"command: ["/bin/sh", "-c"]args: ["tail -f /dev/null"]volumeDevices:- name: datadevicePath: /dev/xvdavolumes:- name: datapersistentVolumeClaim:claimName: raw-block-pvcEOFkubectl apply -f 9-test-rbd-pod.yaml
kubectl get po -n test

2. 验证 - volumeMode Filesystem

#针对 PV 持久卷,Kubernetes 支持两种卷模式(volumeModes):Filesystem(文件系统) 和 Block(块)。 
#volumeMode 是一个可选的 API 参数。
#如果该参数被省略,默认的卷模式是 Filesystem。
#volumeMode 属性设置为 Filesystem 的卷会被 Pod 挂载(Mount) 到某个目录。
#如果卷的存储来自某块设备而该设备目前为空,Kuberneretes 会在第一次挂载卷之前 在设备上创建文件系统。
cd /root/ceph-csi-v3.2.0cat  > 10-pvc.yaml << 'EOF'
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: rbd-pvc
spec:accessModes:- ReadWriteOncevolumeMode: Filesystemresources:requests:storage: 1GistorageClassName: csi-rbd-sc
EOFkubectl apply -f 10-pvc.yamlkubectl get pvc -o wide
#NAME            STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE   VOLUMEMODE
#raw-block-pvc   Bound    pvc-beb3a8c6-b659-44c6-bc5c-5fbd3ead1706   1Gi        RWO            csi-rbd-sc     81m   Block
#rbd-pvc         Bound    pvc-3a57e9e7-31c1-4fe6-958e-df4a985654c5   1Gi        RWO            csi-rbd-sc     29m   Filesystemcat > 11-pod.yaml << 'EOF'
---
apiVersion: v1
kind: Pod
metadata:name: csi-rbd-file-pod
spec:containers:- name: webimage: nginx:1.21imagePullPolicy: "IfNotPresent"volumeMounts:- name: mypvcmountPath: /var/lib/www/htmlvolumes:- name: mypvcpersistentVolumeClaim:claimName: rbd-pvcreadOnly: false
EOFkubectl apply -f 11-pod.yaml# kubectl exec -it csi-rbd-file-pod -- df -h
#Filesystem      Size  Used Avail Use% Mounted on
#overlay          20G  4.8G   16G  24% /
#tmpfs            64M     0   64M   0% /dev
#tmpfs           1.9G     0  1.9G   0% /sys/fs/cgroup
#/dev/sda1        20G  4.8G   16G  24% /etc/hosts
#shm              64M     0   64M   0% /dev/shm
#/dev/rbd0       976M  2.6M  958M   1% /var/lib/www/html  <-- 存储空间已挂载
#tmpfs           1.9G   12K  1.9G   1% /run/secrets/kubernetes.io/serviceaccount
#tmpfs           1.9G     0  1.9G   0% /proc/acpi
#tmpfs           1.9G     0  1.9G   0% /proc/scsi
#tmpfs           1.9G     0  1.9G   0% /sys/firmware
kubectl get po

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

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

相关文章

【网络协议】TCP报文格式

1.源端口和目的端口 源端口字段占16比特&#xff0c;用来写入源端口号。源端口号用来标识发送该TCP报文段的应用进程。 目的端口字段占16比特&#xff0c;用来写入目的端口号。目的端口号用来标识接收该TCP报文段的应用进程。 2.序号 当序号增加到最后一个时&#xff0c;下…

封装JDBC,实现简单ORM框架

本文将封装JDBC的操作&#xff0c;实现简单的ORM框架&#xff0c;提供3种风格的api来给用户使用&#xff08;1.原生jdbcSqlBuilder&#xff1b;2.类似jpa和mp的&#xff1b;3.注解接口方法&#xff09; 代码仓库&#xff1a;malred/IFullORM 1. 原生JDBCsql构建器 第一步&…

26551-2011 畜牧机械 粗饲料切碎机

声明 本文是学习GB-T 26551-2011 畜牧机械 粗饲料切碎机. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了粗饲料切碎机的产品型号、技术要求、试验方法、检验规则、标志、包装、运输与贮存。 本标准适用于加工农作物秸秆等粗饲料…

Docker(一)、linux环境安装Docker

linux环境安装Docker 1、自动下载安装&#xff1a;2、指定yum的安装源3、安装docker社区版4、启动docker5、验证6、demo:从国外自动抽取下载hello-world镜像&#xff0c;并启动6、卸载docker7、安装的时候&#xff0c;会出现Error: Failed to download metadata for repo base:…

Python 3.10.9 Mac m1 无法安装grpc的解决办法

pip install airavata-mft-cli python3.10 -m venv venv source venv/bin/activate pip install grpcio1.47.0rc1 pip install grpcio-tools1.47.0rc1 然后就成了 python -m grpc_tools.protoc -I --python_out. --grpc_python_out. message.proto 参考文章&#xff1a; …

Mysql生产随笔

目录 1. Mysql批量Kill删除processlist 1.1查看进程、拼接、导出、执行 1.2常见错误解决方案 2.关于时区 3.内存占用优化 记录一下生产过程中的一些场景和命令使用方法&#xff0c;不定期进行更新 1. Mysql批量Kill删除processlist 1.1查看进程、拼接、导出、执行 sho…

【AIPOD案例操作教程】斜流风扇轮毂优化

AIPOD是由天洑软件自主研发的一款通用的智能优化设计软件&#xff0c;致力于解决能耗更少、成本更低、重量更轻、散热更好、速度更快等目标的工程设计寻优问题。针对工业设计领域的自动化程度低、数值模拟计算成本高等痛点&#xff0c;基于人工智能技术、自研先进的智能代理学习…

Tableau/Power BI 是什么

目录 1. Tableau 是什么?1.1. Tableau 组件1.2. Tableau 的优劣势 2. Power BI2.1. Power BI 的组成部分2.2. Power BI 概念2.2.1. 容量2.2.2. 工作区2.2.3. 数据集2.2.4. 共享数据集2.2.5. 报表2.2.6. 仪表板2.2.7. 模板应用 1. Tableau 是什么? Tableau 是 Tableau 公司推…

前端架构师之01_ES6_基础

1 初识ES6 简单来说&#xff0c;ECMAScript是JavaScript语言的国际标准&#xff0c;JavaScript是实现ECMAScript标准的脚本语言。 2011年&#xff0c;ECMA国际标准化组织在发布ECMAScript 5.1版本之后&#xff0c;就开始着手制定第6版规范。 存在的问题&#xff1a;这个版本…

linux部署页面内容

/bin&#xff1a;该目录包含了常用的二进制可执行文件&#xff0c;如ls、cp、mv、rm等等。 /boot&#xff1a;该目录包含了启动Linux系统所需的文件&#xff0c;如内核文件和引导加载程序。 /dev&#xff1a;该目录包含了所有设备文件&#xff0c;如硬盘、光驱、鼠标、键盘等等…

新手十分钟也能完成的Unity小游戏打砖块

由Siki学院打砖块游戏启发完成一个非常非常简单&#xff0c;纯新手也能十分钟做出来的小游戏——打砖块。 一.搭建场景 首先我们先在一个空白的3D项目中创建一个Plane平面&#xff0c;将其放置于世界中央位置&#xff0c;长宽设置为2&#xff0c;并为其添加一个材质Material&am…

二十,镜面IBL--打印BRDF积分贴图

比起以往&#xff0c;这节应该是最轻松的了&#xff0c; 运行结果如下 代码如下&#xff1a; #include <osg/TextureCubeMap> #include <osg/TexGen> #include <osg/TexEnvCombine> #include <osgUtil/ReflectionMapGenerator> #include <osgDB/Re…

挂件板死机刷固件

用ESP32-DevKitC_V4刷固件的工具flash_download_tool_3.9.5.exe 挂件板子端口接线依次为V&#xff08;接3V3&#xff09;、R&#xff08;接TXD&#xff09;、T&#xff08;接RXD&#xff09;、G&#xff08;接GND&#xff09;、L&#xff08;悬空&#xff09; 1.选择ESP8266&…

Redis hash 命令总结

redis hash命令总结 命令 描述 示例 注意 HSET HSET用于将散列表key中的field的值设置为value。 HSET key field value 返回值&#xff1a;如果散列表key中的field不存在并且设置成功&#xff0c;则返回1&#xff1b;如果散列表key中的field已经存在并且新值覆盖了旧值&…

关于TUM数据集

2、验证回环检测算法&#xff0c;需要有人工标记回环的数据集。然而人工标记回环是很不方便的&#xff0c;我们会考虑根据标准轨迹计算回环。即&#xff0c;如果轨迹中有两个帧的位姿非常相近&#xff0c;就认为它们是回环。请根据TUM数据集给出的标准轨迹&#xff0c;计算出一…

MySQL学习笔记19

MySQL日志文件&#xff1a;MySQL中我们需要了解哪些日志&#xff1f; 常见日志文件&#xff1a; 我们需要掌握错误日志、二进制日志、中继日志、慢查询日志。 错误日志&#xff1a; 作用&#xff1a;存放数据库的启动、停止和运行时的错误信息。 场景&#xff1a;用于数据库的…

BACnet/IP协议采集网关支持modbus RTU采集

楼宇自动化在现代建筑中扮演着重要的角色&#xff0c;它可以集成和控制各种设备和系统&#xff0c;提高建筑的能效和舒适性。然而&#xff0c;不同的设备和系统通常使用不同的通信协议&#xff0c;这给楼宇自动化的实施带来了一定的挑战。为了解决这个问题&#xff0c;BACnet和…

面试问到MySQL模块划分与架构体系怎么办

面试问到Mysql模块划分与架构体系怎么办 文章目录 1. 应用层连接管理器&#xff08;Connection Manager&#xff09;安全性和权限模块&#xff08;Security and Privilege Module&#xff09; 2. MySQL服务器层2.1. 服务支持和工具集2.2. SQL Interface2.3. 解析器举个解析器 …

vuepress+gitee免费搭建个人在线博客(无保留版)

文章目录 最终效果&#xff0c;一睹为快&#xff01;一、工具选型二、什么是VuePress三、准备工作3.1 node 安装3.2 Git安装3.3 Gitee账号注册 四、搭建步骤4.1 初始化VuePress4.2 安装VuePress4.3 初始化目录4.4 编写文章 五、部署到Gitee5.1 创建仓库5.2 个人空间地址设置4.3…

1.vue3脚手架在vscode下面建立

一、下载安装node.js Node.js (nodejs.org) 二、安装vue3脚手架 #添加项目脚手架 npm install -g vue/cli 三、建立项目 #项目建立 vue create {appname} 测试项目安装成功&#xff1a;运行npm run serve命令 npm run serve 证明脚手架、项目环境已配置好 四、添加配件&#x…