【云原生】Kubeadm部署k8s

目录

一、部署步骤

二、部署kubernetes

2.1、所有节点关闭防火墙 核心防护 iptables规则 swap交换

2.2、修改主机名并添加主机映射

2.3、调整内核参数

三、安装Docker

3.1、所有节点安装docker

3.2、所有接点添加镜像加速器

3.3、开启docker、并设置开机自启、查看状态

四、安装kubeadm,kubelet和kubectl

4.1、定义kubernetes源

4.2、安装kubeadm,kubelet和kubectl

4.3、开机自启kubelet

五、部署K8S集群

5.1、查看初始化需要的镜像

5.2、初始化kubeadm

5.3、设定kubectl

5.4、所有节点部署网络插件

5.5、在 node 节点上执行 kubeadm join 命令加入群集并查看状态

5.6、测试pod创建资源

5.7、暴露端口提供服务

5.8、测试访问

5.9、扩展3个副本

六、部署 Dashboard

6.1、上传 相关yaml 文件到 /opt/k8s 目录中

6.2、创建service account并绑定默认cluster-admin管理员集群角色

七、安装Harbor私有仓库

7.1、修改主机名,添加主机名和ip的映射

7.2、安装Docker20版本

7.2.1 添加镜像加速器

7.2.2 开启docker并设为开机自启

7.3、安装harbor

7.3.1 准备docker-compose安装包

7.3.2 准备harbor私有仓库的安装包

7.3.3 生成证书、私钥

7.3.4 启动Harbor

7.3.5 浏览器访问

7.3.6 在一个node节点上登录harbor

7.3.7 登录Harbar上传镜像

7.4、安装ipvsadm

7.4.1 修改调度策略,再去访问

7.5、浏览器访问

7.6、内核参数优化方案


一、部署步骤

  1. 在所有节点上安装Docker和kubeadm
  2. 部署Kubernetes Master
  3. 部署容器网络插件
  4. 部署 Kubernetes Node,将节点加入Kubernetes集群中
  5. 部署 Dashboard Web 页面,可视化查看Kubernetes资源
  6. 部署 Harbor 私有仓库,存放镜像资源

二、部署kubernetes

实验环境

服务器IP地址主要组件
master192.168.10.100docker / kubeadm / kubelet / kubectl / flannel
node01192.168.10.101docker/kubeadm/kubelet/kubectl/flannel
node02192.168.10.102docker/kubeadm/kubelet/kubectl/flanne
harbor192.168.10.103docker、docker-compose、harbor-offline-v1.2.2

2.1、所有节点关闭防火墙 核心防护 iptables规则 swap交换

以下图片只展示一个,过程都一样

systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/enforcing/disabled/' /etc/selinux/config
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
swapoff -a      ##交换分区必须要关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab      ##永久关闭swap分区,&符号在sed命令中代表上次匹配的结果
for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");do echo $i; /sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i;done   ##加载模块

2.2、修改主机名并添加主机映射

hostnamectl set-hostname master01
bash
hostnamectl set-hostname node01
bash
hostnamectl set-hostname node02
bashecho "192.168.10.100 master01" >> /etc/hosts
echo "192.168.10.101 node01" >> /etc/hosts
echo "192.168.10.102 node02" >> /etc/hosts
echo "192.168.10.103 hub.hg.com" >> /etc/hosts
cat /etc/hosts

2.3、调整内核参数

cat > /etc/sysctl.d/kubernetes.conf << EOF
#开启网桥模式,可将网桥的流量传递给iptables链
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
#关闭ipv6协议
net.ipv6.conf.all.disable_ipv6=1
net.ipv4.ip_forward=1
EOF//生效参数
sysctl --system 

三、安装Docker

3.1、所有节点安装docker

[root@master01 ~]#yum install -y yum-utils device-mapper-persistent-data lvm2 
[root@master01 ~]#yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 
[root@master01 ~]#yum install -y docker-ce docker-ce-cli containerd.io
[root@master01 ~]#mkdir /etc/docker/
[root@master01 ~]#cat > /etc/docker/daemon.json <<EOF{"registry-mirrors": ["https://6ijb8ubo.mirror.aliyuncs.com"],"exec-opts": ["native.cgroupdriver=systemd"],"log-driver": "json-file","log-opts": {"max-size": "100m"}}
EOF
[root@master01 ~]#systemctl daemon-reload 
[root@master01 ~]#systemctl restart docker.service 
[root@master01 ~]#systemctl enable docker.service 

3.2、所有接点添加镜像加速器

cat > /etc/docker/daemon.json <<EOF
{"registry-mirrors": ["https://6ijb8ubo.mirror.aliyuncs.com"],"exec-opts": ["native.cgroupdriver=systemd"],"log-driver": "json-file","log-opts": {"max-size": "100m"}
}
EOF
#使用Systemd管理的Cgroup来进行资源控制与管理,因为相对Cgroupfs而言,Systemd限制CPU、内存等资源更加简单和成熟稳定。
#日志使用json-file格式类型存储,大小为100M,保存在/var/log/containers目录下,方便ELK等日志系统收集和管理日志。

3.3、开启docker、并设置开机自启、查看状态

systemctl daemon-reload
systemctl restart docker.service
systemctl enable docker.service
systemctl status docker.servicedocker info | grep "Cgroup Driver"
Cgroup Driver: systemd    ##结果

四、安装kubeadm,kubelet和kubectl

所有节点安装

4.1、定义kubernetes源

cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

4.2、安装kubeadm,kubelet和kubectl

yum install -y kubelet-1.20.11 kubeadm-1.20.11 kubectl-1.20.11

4.3、开机自启kubelet

systemctl enable kubelet.service

五、部署K8S集群

5.1、查看初始化需要的镜像

[root@master01 ~]#kubeadm config images list
[root@master01 opt]#unzip v1.20.11.zip -d /opt/k8s/
[root@master01 opt]#cd /opt/k8s/v1.20.11/
[root@master01 v1.20.11]#for i in $(ls *.tar); do docker load -i $i; done
#复制镜像和脚本到 node 节点,并在 node 节点上执行脚本加载镜像文件
[root@master01 v1.20.11]#scp -r /opt/k8s/ root@192.168.10.132:/opt/
[root@master01 v1.20.11]#scp -r /opt/k8s/ root@192.168.10.133:/opt/
[root@node01 v1.20.11]# for i in $(ls *.tar); do docker load -i $i; done
[root@node02 v1.20.11]# for i in $(ls *.tar); do docker load -i $i; done

5.2、初始化kubeadm

kubeadm config print init-defaults > /opt/kubeadm-config.yamlvim kubeadm-config.yamladvertiseAddress: 192.168.10.100               ## 12行
kubernetesVersion: v1.20.11                    ## 34行
podSubnet: 10.244.0.0/16                       ## 37行
serviceSubnet: 10.96.0.0/16                    ## 38行
---                                            ## 40行
apiVersion: kubeproxy.config.k8s.io/v1alpha1   ## 41行
kind: KubeProxyConfiguration                   ## 42行
mode: ipvs                                     ## 43行kubeadm init --config=kubeadm-config.yaml --upload-certs | tee kubeadm-init.log
#--experimental-upload-certs 参数可以在后续执行加入节点时自动分发证书文件,K8S V1.16版本开始替换为 --upload-certs
#tee kubeadm-init.log 用以输出日志  
//查看 kubeadm-init 日志
less kubeadm-init.log//kubernetes配置文件目录
ls /etc/kubernetes///存放ca等证书和密码的目录
ls /etc/kubernetes/pki

5.3、设定kubectl

kubectl需经由API server认证及授权后方能执行相应的管理操作,kubeadm 部署的集群为其生成了一个具有管理员权限的认证配置文件 /etc/kubernetes/admin.conf,它可由 kubectl 通过默认的 “$HOME/.kube/config” 的路径进行加载。

[root@master01 opt]#mkdir -p $HOME/.kube
[root@master01 opt]#cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master01 opt]#chown $(id -u):$(id -g) $HOME/.kube/config
[root@master01 opt]#kubectl get node
[root@master01 opt]#kubectl get cs
#如果 kubectl get cs 发现集群不健康,更改以下两个文件
[root@master01 opt]#vim /etc/kubernetes/manifests/kube-scheduler.yaml 
[root@master01 opt]#vim /etc/kubernetes/manifests/kube-controller-manager.yaml 
把httpGet:字段下的hosts由127.0.0.1变成192.168.10.100(有两处)
#- --port=0					# 搜索port=0,把这一行注释掉
host: 192.168.10.100        ##修改地址
[root@master01 opt]#systemctl restart kubelet.service 
[root@master01 opt]#kubectl get cs
[root@master01 opt]#kubectl get node

[root@master01 opt]#vim /etc/kubernetes/manifests/kube-scheduler.yaml- --bind-address=192.168.10.100     ## 第16行
#    - --port=0                      ## 第19行
host: 192.168.10.100                 ## 第25行
host: 192.168.10.100                 ## 第39行

[root@master01 opt]#vim /etc/kubernetes/manifests/kube-scheduler.yaml- --bind-address=192.168.10.100     ## 第17行
#    - --port=0                      ## 第26行
host: 192.168.10.100                 ## 第37行
host: 192.168.10.100                 ## 第51行

5.4、所有节点部署网络插件

cd /opt
unzip kuadmin.zip     ##上传所需要的压缩包
解压
unzip kuadmin.zip
scp flannel-cni-v1.2.0.tar flannel-v0.22.2.tar node01:/opt/   ##拷贝到node01
scp flannel-cni-v1.2.0.tar flannel-v0.22.2.tar node01:/opt/   ##拷贝到node02

[root@master01 opt]#docker load -i flannel-cni-v1.2.0.tar
[root@master01 opt]#docker load -i flannel-v0.22.2.tar
[root@master01 opt]#docker images

[root@master01 opt]#kubectl apply -f kube-flannel.yml
[root@master01 opt]#kubectl get node

5.5、在 node 节点上执行 kubeadm join 命令加入群集并查看状态

将node节点加进来,

[root@master01 opt]#ls
[root@master01 opt]#cat kubeadm-init.log##node01和node02上面添加
kubeadm join 192.168.10.100:6443 --token abcdef.0123456789abcdef \--discovery-token-ca-cert-hash sha256:3800375b6db6fe668a7812e883ff1dc7ecc405c5ead58d289a6f015b594d1205##master01查看
[root@master01 opt]#kubectl get node
[root@master01 opt]#kubectl get cs
[root@master01 opt]#kubectl get pods -n kube-system
[root@master01 opt]#kubectl get pod -n kube-flannel
[root@master01 opt]#kubectl get pod -n kube-flannel -owide

由于机器的原因,换了三台,和之前位置相似 

5.6、测试pod创建资源

kubectl create deployment nginx --image=nginx   ##拉取nginx
[root@master01 opt]#kubectl get pod             ##看是否拉取到
[root@master01 opt]#kubectl get pod -owide      ##查看详细信息[root@master01 opt]#curl 10.244.2.2             ##只能对内访问,不能访问

5.7、暴露端口提供服务

[root@master01 opt]#kubectl expose deployment nginx --port=80 --type=NodePort
[root@master01 opt]#kubectl get svc

5.8、测试访问

192.168.10.103:31606
192.168.10.104:31606

5.9、扩展3个副本

[root@master01 opt]#kubectl scale deployment nginx --replicas=3
[root@master01 opt]#kubectl get pods -o wide

六、部署 Dashboard

6.1、上传 相关yaml 文件到 /opt/k8s 目录中

在 master01 节点上操作

在 master01 节点上操作
#上传 recommended.yaml 文件到 /opt/k8s 目录中
cd /opt/k8s
vim recommended.yaml
#默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部:
kind: Service
apiVersion: v1
metadata:labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboardnamespace: kubernetes-dashboard
spec:ports:- port: 443targetPort: 8443nodePort: 30001     #添加type: NodePort          #添加selector:k8s-app: kubernetes-dashboard##上传dashboard.tar metrics-scraper.tar到/opt目录下##远程从master拷贝到node节点的/opt下
[root@master01 opt]#scp dashboard.tar metrics-scraper.tar node01:/opt/##master节点执行下面语句
kubectl apply -f recommended.yaml#使用输出的token登录Dashboard
https://NodeIP:30001

6.2、创建service account并绑定默认cluster-admin管理员集群角色

#创建service account并绑定默认cluster-admin管理员集群角色
kubectl create serviceaccount dashboard-admin -n kube-system
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')

6.3、登录Dashboard

#使用输出的token登录Dashboard
https://NodeIP:30001

无论哪个node的IP地址、因为服务都是运行在node上的

https://192.168.10.104:30001

 

七、安装Harbor私有仓库

7.1、修改主机名,添加主机名和ip的映射

#修改主机名
hostnamectl set-hostname hub.hg.com#所有节点加上主机名映射
echo "192.168.10.103 master01" >> /etc/hosts
echo "192.168.10.104 node01" >> /etc/hosts
echo "192.168.10.105 node02" >> /etc/hosts
echo "192.168.10.106 hub.hg.com" >> /etc/hosts
cat /etc/hosts

7.2、安装Docker20版本

yum install -y yum-utils device-mapper-persistent-data lvm2 
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 
yum install -y docker-ce-20.10.18 docker-ce-cli-20.10.18 containerd.iomkdir /etc/docker
cat > /etc/docker/daemon.json <<EOF
{"registry-mirrors": ["https://6ijb8ubo.mirror.aliyuncs.com"],"exec-opts": ["native.cgroupdriver=systemd"],"log-driver": "json-file","log-opts": {"max-size": "100m"},"insecure-registries": ["https://hub.hg.com"]
}
EOFsystemctl start docker
systemctl enable docker

7.2.1 添加镜像加速器

所有节点都需要修改

vim /etc/docker/daemon.json{"registry-mirrors": ["https://6ijb8ubo.mirror.aliyuncs.com"],"exec-opts": ["native.cgroupdriver=systemd"],"log-driver": "json-file","log-opts": {"max-size": "100m"},"insecure-registries": ["https://hub.hg.com"]
}

7.2.2 开启docker并设为开机自启

##首先加载一下,因为前面把每个节点都配置了镜像加速器
systemctl daemon-reload
systemctl restart docker.service
systemctl enable docker.service
systemctl status docker.service
##此处就显示一个界面,其他节点的不展示了

7.3、安装harbor

7.3.1 准备docker-compose安装包

[root@hub ~]#cd /usr/local/bin/       
##上传docker-compose         ##直接将docker-compose上传到/usr/local/bin/ 
docker-compose
[root@hub bin]#chmod +x docker-compose     ##添加执行权限

7.3.2 准备harbor私有仓库的安装包

官网下载地址:http://harbor.orientsoft.cn/harbor-1.2.2/harbor-offline-installer-v1.2.2.tgz
##首先进入/opt,然后将下载好的harbor压缩包上传到/opt
##进行解压
[root@hub opt]#tar xf harbor-offline-installer-v1.2.2.tgz
##将harbor配置文件进行备份
[root@hub harbor]#cp harbor.cfg{,.bak}
##对harbor.cfg配置文件进行修改
[root@hub harbor]#vim harbor.cfg
hostname = reg.hg.com                  ##第5行
ui_url_protocol = https                ##第9行
db_password = root123                  ##第12行
ssl_cert_key = /data/cert/server.key   ##第25行
harbor_admin_password = Harbor12345    ##第59行

7.3.3 生成证书、私钥

生成证书

make -p /data/cert
cd /data/cert

#生成私钥

openssl genrsa -des3 -out server.key 2048
##密码:123456
-------------------------------------------------------------------------------------------
openssl          #这是一个强大的加密库和工具集,用于处理SSL/TLS协议和相关的加密操作。
genrsa           #openssl的子命令,用于生成 RSA 私钥。
-des3           #openssl 使用 DES3算法来加密生成的私钥。
-out server.key  #这个选项指定了输出文件的名称,即生成的私钥将被保存在名为server.key的文件中。
2048             #这个数字指定了RSA密钥的长度(以位为单位)。

#生成证书签名请求文件

openssl req -new -key server.key -out server.csr
=========================================================================================
req #用于处理与证书签名请求(CSR)和私钥相关的任务。
-new #这个选项指示OpenSSL创建一个新的证书签名请求。
-key server.key #指定用于生成CSR的私钥文件的路径
-out server.csr #指定生成的CSR文件的输出路径。
=========================================================================================
-----------------------------------------------------------------------------------------
输入私钥密码:123456
输入国家名:CN
输入省名:BJ
输入市名:BJ
输入组织名:HG
输入机构名:HG
输入域名:hub.hg.com
输入管理员邮箱:admin@hg.com
其它全部直接回车
-----------------------------------------------------------------------------------------
#备份私钥
cp server.key server.key.org#清除私钥密码
openssl rsa -in server.key.org -out server.key
输入私钥密码:123456#签名证书
openssl x509 -req -days 1000 -in server.csr -signkey server.key -out server.crtchmod +x /data/cert/*cd /opt/harbor/
./install.sh

备份私钥

cp server.key server.key.org

清除私钥密码

openssl rsa -in server.key.org -out server.key

签名证书

openssl x509 -req -days 1000 -in server.csr -signkey server.key -out server.crt
===========================================================================================
openssl x509          #这是OpenSSL的一个子命令,用于处理X.509证书。
-req                  #指示OpenSSL从一个CSR文件中读取请求信息。
-days 1000            #设置证书的有效期为1000天。这意味着证书将在 1000 天后过期。
-in server.csr        #指定CSR文件的输入路径
-signkey server.key   #使用指定的私钥(server.key)对CSR进行签名,生成证书。
-out server.crt       #指定输出的证书文件路径。在这个例子中,证书文件将被保存为server.crt
===========================================================================================chmod +x /data/cert/*

7.3.4 启动Harbor

[root@hub cert]#cd  /opt/harbor/
[root@hub harbor]#./install.sh 
#执行命令 ./install.sh 以 pull 镜像并启动容器#运行./install.sh时,这个脚本会执行一系列的步骤来配置和启动Harbor服务。这些步骤可能包括:
#检查和准备安装环境(如检查必要的依赖项、配置文件等)。
#生成或验证 Harbor 的配置文件(通常是 harbor.yml)。
#创建必要的数据目录和文件。
#初始化数据库(如果使用了数据库存储)。
#启动 Harbor 的各个组件(如 core、registry、portal、jobservice 等)

7.3.5 浏览器访问

添加主机映射
在本地使用火狐浏览器访问:https://hub.hg.com
点击高级--->添加例外---->确认安全例外用户密码登录,默认为:用户名:admin
密码:Harbor12345

7.3.6 在一个node节点上登录harbor

docker login -u admin -p Harbor12345 https://hub.hg.com

7.3.7 登录Harbar上传镜像

在node01节点操作

​##上传镜像
docker tag nginx:latest hub.hg.com/library/nginx:v1
docker push hub.hg.com/library/nginx:v1

在master节点上删除之前创建的nginx资源

kubectl delete deployment nginx
kubectl create deployment nginx-deployment --image=hub.hg.com/library/nginx:v1 --port=80 --replicas=3
kubectl expose deployment nginx-deployment --port=30000 --target-port=80
kubectl get svc,pods
kubectl get svc,pods -owide

访问验证

curl 10.244.1.7

7.4、安装ipvsadm

[root@master01 k8s]#yum -y install ipvsadm.x86_64
[root@master01 k8s]#ipvsadm -Ln
[root@master01 k8s]#curl 10.96.30.170:30000

7.4.1 修改调度策略,再去访问

kubectl edit svc nginx-deployment
25   type: NodePort                        #把调度策略改成NodePort[root@master01 k8s]#kubectl get svc
NAME               TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)           AGE
kubernetes         ClusterIP   10.96.0.1       <none>        443/TCP           2d3h
nginx              NodePort    10.96.169.156   <none>        80:31606/TCP      2d3h
nginx-deployment   NodePort    10.96.30.170    <none>        30000:31973/TCP   10h
[root@master01 k8s]#

7.5、浏览器访问

浏览器访问:http://192.168.10.103:31973/
http://192.168.10.104:31973/
http://192.168.10.105:31973/

#将cluster-admin角色权限授予用户system:anonymous
kubectl create clusterrolebinding cluster-system-anonymous --clusterrole=cluster-admin --user=system:anonymous

7.6、内核参数优化方案

cat > /etc/sysctl.d/kubernetes.conf <<EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
vm.swappiness=0									#禁止使用 swap 空间,只有当系统内存不足(OOM)时才允许使用它
vm.overcommit_memory=1							#不检查物理内存是否够用
vm.panic_on_oom=0								#开启 OOM
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963							#指定最大文件句柄数
fs.nr_open=52706963								#仅4.4以上版本支持
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF

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

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

相关文章

ESP32学习笔记:WS2812B驱动

WS2812B是一款贴片RGB灯。由于采用了单总线通讯&#xff0c;所以需要特别关注下它的通讯时序。 调试细节&#xff1a; 本来以为会是一个比较简单的调试&#xff0c;结果还是花了很长时间才调试完成。 首先是关于ESP32的纳秒级延时确定&#xff0c;当时按照空指令始终调试不出来…

Linux中的计划任务(crontab)详解

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Linux &#xff1a;从菜鸟到飞鸟的逆袭》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、前言 1、Linux的起源与发展 2、什么是计划任务&#xf…

超详细的前后端实战项目(Spring系列加上vue3)(一步步实现+源码)前端篇(一)

最近想着一步步搭建一个前后端项目&#xff0c;将每一步详细的做出来。&#xff08;如果有不足或者建议&#xff0c;也希望大佬们指出哦&#xff09; 前端初始化 1.根据vue脚手架创建vue项目 这里可以用很多方法创建vue项目&#xff0c;大家看着创建吧&#xff0c;只要能创建…

机器学习面试问题总结 | 贝叶斯网络

本文给大家带来的百面算法工程师是机器学习中贝叶斯网路面试总结&#xff0c;文章内总结了常见的提问问题&#xff0c;旨在为广大学子模拟出更贴合实际的面试问答场景。在这篇文章中&#xff0c;我们还将介绍一些常见的面试问题&#xff0c;并提供参考的回答及其理论基础&#…

FreeRTOS_事件组_学习笔记

事件组 原文链接 事件组是一个整数&#xff0c;其中的高8位留给内核&#xff0c;只能用其他位来表示时间 每一位代表一个事件&#xff0c;且每个时间的含义由程序员决定 1为发生&#xff0c;0为未发生 一个/多个任务或ISR都能读写这些位 可以等待某一位&#xff0c;也可以等待…

如何理解合约中的引用类型(3)——Mapping

映射&#xff08;mapping&#xff09; 声明形式&#xff1a;mapping(key type > value type)keytype可以是除枚举外的几乎任何基本类型&#xff0c;包括bytes和string&#xff0c;不包括用户自定义的复杂类型-合约&#xff0c;枚举&#xff0c;结构&#xff0c;映射value t…

简单美观易上手的 Docker Compose 可视化管理器 Dockge

本文首发于只抄博客&#xff0c;欢迎点击原文链接了解更多内容。 前言 Dockge 是 Uptime Kuma 作者的新作品&#xff0c;因此 UI 风格与 Uptime Kuma 基本一致&#xff0c;如果你正在使用 Uptime Kuma 的话&#xff0c;那么 Dockge 的 UI 设计应该也不会让你失望。Dockge 主打…

智慧校园为高校带来哪些价值

在21世纪的教育图景中&#xff0c;"智慧"不再仅仅是一个科技名词&#xff0c;它已成为衡量教育现代化水平的重要标志。智慧校园&#xff0c;这一融合了物联网、大数据、云计算等先进技术的教育新形态&#xff0c;正逐步成为高校转型升级的关键驱动力。本文将从多个维…

BUUCTF靶场 [reverse]easyre、reverse1、reverse2

工具&#xff1a; DIE&#xff1a;下载&#xff1a;https://download.csdn.net/download/m0_73981089/89334360 IDA&#xff1a;下载&#xff1a;https://hex-rays.com/ida-free/ 新手小白勇闯逆向区&#xff01;&#xff01;&#xff01; [reverse]easyre 首先查壳&#xf…

【oracle003】图片转为字节、base64编码等形式批量插入oracle数据库并查询

1.熟悉、梳理、总结下Oracle相关知识体系 2.欢迎批评指正&#xff0c;跪谢一键三连&#xff01; 资源下载&#xff1a; oci.dll、oraocci11.dll、oraociei11.dll3个资源文件资源下载&#xff1a; Instant Client Setup.exe资源下载&#xff1a; oci.dll、oraocci11.dll、oraoc…

ubuntu手动替换源后,更新源时提示“仓库.... jammy Release“ 没有Release文件

问题如图所示&#xff0c;由于问题不好定位&#xff0c;我就从替换源&#xff0c;以及解决错误提示这两个步骤&#xff0c;来解决其中可能存在的问题。 1、替换源 这一步骤&#xff0c;网上的资料可以搜到很多&#xff0c;我跟着做了之后&#xff0c;总会冒出来各种各样的小问…

皮影戏艺术品3D沉浸式展馆提供非同一般的趣味体验

引领艺术展示的未来&#xff0c;深圳华锐视点融合多年的web3d项目制作经验&#xff0c;倾力打造3D虚拟艺术品展馆在线编辑平台&#xff0c;为您提供一个超越时空限制的线上艺术展示平台。 一、极致视觉盛宴 我们拥有领先的美术团队&#xff0c;运用先进的web3D开发技术&#xf…

可能是最适合PS的AI插件,设计师大救星!StartAI初体验!不是恰饭

这款软件虽然有一些功能需要完善&#xff0c;比如&#xff1a; 1&#xff1a;生成图片产品海报&#xff0c;会出现图随意出现&#xff0c;跟设计图起冲突&#xff0c;需要PS才可以正常使用它。 2&#xff1a;即使开会员也需要排队生成。 3: 还有&#xff0c;会员没有更加好用的…

vue3结合element-plus之如何优雅的使用表单组件

背景 在日常开发中,我们会经常使用 element-ui 或者是 antdesign 或者是 element-plus 等组件库实现搜索功能 这里就需要用到相关表单组件 下面就以 element-plus 为例,我们实现一个搜索功能的组件,并且随着屏幕尺寸的变化,其布局也会跟随变化 最终大致效果如下: 这里…

C++:set和map的底层封装模拟实现

目录 底层对比&#xff1a; 底层红黑树结构和set、map&#xff1a; 底层模拟&#xff1a; 传值调用&#xff1a; 迭代器&#xff1a; operator &#xff08;&#xff09; find函数 operator&#xff08;&#xff09; 、仿函数 set和map的仿函数 &#xff1a; 图解&a…

地平线-旭日X3派(RDK X3)上手基本操作

0. 环境 - win10笔记本 - RDK X3 1.0&#xff08;地平线旭日X3派&#xff0c;后来改名为代号RDK X3&#xff09; 1. 下载资料 https://developer.horizon.ai/resource 主要下载镜像 http://sunrise.horizon.cc/downloads/os_images/2.1.0/release/ 下载得到了 ubuntu-prei…

vs无法打开或包括文件”QTxxx“

vs创建项目时默认引入core、gui、和widgets等模块&#xff0c;在需要网络通讯或者图表等开发时需要添加相应模块。 点击扩展 -> QT VS Tools -> QT Project Setting->Qt Modules&#xff0c;添加相应模块即可

奇瑞控股携手契约锁推动客户、供应商及内部业务全程数字化

奇瑞控股集团是安徽省排名第一的制造业企业&#xff0c;同时入选中国企业家协会发布的中国500强、《财富》中国500强&#xff0c;连续21年位居中国品牌乘用车出口第一。 面对汽车行业“新四化”主题及“数字化”时代变革&#xff0c;奇瑞控股持续创新求变&#xff0c;率先引入电…

Java18的新特性介绍

一、概况 Java 18是Java编程语言的最新版本&#xff0c;它于2022年9月发布。Java 18引入了许多新特性和改进&#xff0c;以下是其中一些重要的新特性。 元编程功能&#xff1a;Java 18引入了元注释和元类型声明的功能&#xff0c;使开发人员能够在编译时对注解进行元处理。这为…

【C++】位图/布隆过滤器+海量数据处理

目录 一、位图 1.1 位图的概念 1.2 位图的实现 1.3 位图的应用&#xff08;面试题&#xff09; 二、布隆过滤器 2.1 布隆过滤器的引入 2.2 布隆过滤器概念 2.3 布隆过滤器的插入和查找 2.4 布隆过滤器的实现 2.5 布隆过滤器的优点和缺陷 2.6 布隆过滤器的应用&#…