【云原生】手把手带你从零开始搭建kubernetes最新版本实战
文章目录
- 前言
- 一. 实验环境
- 二. k8s 的介绍
- 三 . k8s的安装
- 3.1 搭建实验环境
- 3.1.1 硬件层面的要求
- 3.1.2 软件层面环境配置
- 3.2 docker的安装
- 3.2.1 搭建docker
- 3.2.2 部署 cri-dockerd
- 3.3 部署k8s
- 3.3.1 配置添加阿里云的yum源
- 3.3.2 安装kubeadm kubelet kubectl
- 3.3.3 k8s-master节点初始化
- 3.3.4 执行成功后,会有加入节点的代码,然后复制到其他节点进行加入。
- 四. 在已经安全完的k8s上进行测试
- 4.1 安装配置网络
- 4.2 安装配置nginx测试
- 总结
前言
大家好,又见面了,我是沐风晓月,本文是专栏【云原生实战】专栏的第5篇文章,主要讲解如何从零开始安装kubernetes。
专栏地址:【云原生实战】 , 此专栏是沐风晓月对云原生学习的汇总,希望能够加深自己的印象,以及帮助到其他的小伙伴😉😉。
原本我是写一篇文章叫 prometheus监控kubernetes实战,结果发现kubernetes就写了半天近一万字,所以把从零开始搭建kubernetes实战单独拿出来作为一篇文章吧。
如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。
🏠个人主页:我是沐风晓月
🧑个人简介:大家好,我是沐风晓月,双一流院校计算机专业😉😉
💕 座右铭: 先努力成长自己,再帮助更多的人 ,一起加油进步🍺🍺🍺
💕欢迎大家:这里是CSDN,我总结知识的地方,喜欢的话请三连,有问题请私信😘
在这里插入图片描述
一. 实验环境
本次的实验环境见下表:
操作系统 | 服务器IP | hostname |
---|---|---|
centos7.6 | 192.168.1.41 | k8s-master |
centos7.6 | 192.168.1.42 | k8s-node42 |
如何查看相应的参数:
- 查看操作系统:
[root@mufenggrow ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
- 查看hostname
## 修改hostname
[root@mufenggrow ~]# hostnamectl set-hostname mufenggrow41
[root@mufenggrow ~]# bash
# 查看hostname
[root@mufenggrow41 ~]# hostname
mufenggrow41
- 查看ip
[root@mufenggrow41 ~]# ifconfig |grep inet |awk 'NR==1{print $2}'
192.168.1.41
二. k8s 的介绍
Kubernetes 也称为 K8s,是Google开发的用于自动部署、扩缩和管理容器化应用程序的开源容器编排器技术。
k8s官网地址:https://kubernetes.io
在大流量,高并发的场景,如何实现应用的快速部署。 比如批量启动20台nginx,又如何在流量结束之后,关闭这些nginx服务。
一个容器宕机了,如何快速发现并立即启动一台新的容器去填补, 这些容器的管理问题,就是容器编排。
能做容器编排的工具有好几个,但k8s肯定是占主导地位的。
搭建k8s的方式,我们再这里选择了kubeadm的方式来部署。kubeadm 是官方社区推出的一个用于快速部署kubernetes 集群的工具,这个工具能通过两条指令完成一个kubernetes 集群的部署:
- 创建一个Master 节点kubeadm init
- 将Node 节点加入到当前集群中$ kubeadm join <Master 节点的IP 和端口>
三 . k8s的安装
3.1 搭建实验环境
搭建实验环境,包含软件层面和硬件层面:
3.1.1 硬件层面的要求
- 两台centos7的操作系统
- k8s-master cpu核心数为2
- 两台主机可以ping通且能ping通外网
- 硬盘设置为30G以上
查看cpu的核心数:
[root@mufenggrow ~]# lscpu |grep "CPU(s)"
CPU(s): 2
On-line CPU(s) list: 0,1
也可以用:
[root@mufenggrow ~]# cat /proc/cpuinfo |grep "cpu cores"
cpu cores : 2
cpu cores : 2
3.1.2 软件层面环境配置
这里需要主要的是,用几台服务器操作,我们就需要设置几台服务器的环境:
1) 设置主机名见名知意
让192.168.1.41为k8s-master,设置主机名
[root@mufenggrow ~]# hostnamectl set-hostname k8s-master
[root@mufenggrow ~]# bash
[root@k8s-master ~]# hostname
k8s-master
192.168.1.42 为k8s-node 设置主机名
[root@mufeng ~]# hostnamectl set-hostname k8s-node42
[root@mufeng ~]# bash
[root@k8s-node42 ~]# hostname
k8s-node42
2) 设置/etc/hosts 一对一的映射关系
[root@k8s-master ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
[root@k8s-master ~]# cat >>/etc/hosts<< EOF
192.168.1.41 k8s-master192.168.1.42 k8s-node42
EOF
[root@k8s-master ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.41 k8s-master
192.168.1.42 k8s-node42
3) 设置时间同步
我这里只截取了一台服务器执行的代码,因为两台要同步做,所以另一台执行的是一样的,需要两台同步执行一样的操作:
[root@k8s-master ~]# systemctl start chronyd
[root@k8s-master ~]# systemctl enable chronyd
[root@k8s-master ~]# date
2023年 02月 15日 星期三 10:46:09 CST
[root@k8s-master ~]#
4) 关闭防火墙和selinux
[root@k8s-master ~]# systemctl stop firewalld
[root@k8s-master ~]# setenforce 0
这里要注意: setenforce 0 只是临时关闭,如果要永久关闭需要到配置文件中设置
配置文件路径: /etc/selinux/config
- 禁用swap空间
kubernetes要求每个节点都要禁用swap设备
临时关闭:
[root@k8s-master ~]# swapoff -a
永久关闭:
vim /etc/fstab
注释掉 /dev/mapper/centos-swap swap
#/dev/mapper/centos-swap swap
永久关闭需要重启系统。
6) 修改内核参数
# 修改linux的内核采纳数,添加网桥过滤和地址转发功能
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
重新加载配置
# sysctl --system
3.2 docker的安装
因为k8s最终的管理是容器,所以我们需要再这里先安装docker,每台机器都需要安装。
3.2.1 搭建docker
1) 设置 repo
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
若没有yum-config-manager 需要先安装
[root@k8s-node42 ~]# yum install yum-utils
2) 设置国内镜像并重启daemon
# mkdir /etc/docker
cat > /etc/docker/daemon.json << EOF
{"registry-mirrors": ["https://ywrd8tun.mirror.aliyuncs.com"]
}
EOF
- 下载docker的repo包,并安装
[root@k8s-node42 ~]# yum install wget
[root@k8s-master ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
3) 开始安装:
[root@k8s-node42 ~]# yum install -y docker-ce
[root@k8s-master ~]# systemctl start docker
[root@k8s-master ~]# systemctl enable docker
[root@k8s-master ~]# docker --version
Docker version 23.0.1, build a5ee5b1
3.2.2 部署 cri-dockerd
从kubernetes 1.24开始,dockershim已经从kubelet中移除,但因为历史问题docker不支持kubernetes主推的CRI(容器运行时接口)标准,所以docker不能再作为kubernetes的容器运行时了,即从kubernetesv1.24开始不再使用docker了。
但是如果想继续使用docker的话,可以在kubelet和docker之间加上一个中间层cri-docker。cri-docker是一个支持CRI标准的shim(垫片)。一头通过CRI跟kubelet交互,另一头跟docker api交互,从而间接的实现了kubernetes以docker作为容器运行时。
技术的发展得益于人,受限于人。
开源地址 https://github.com/Mirantis/cri-dockerd
下载地址 https://github.com/Mirantis/cri-dockerd/releases
下载并上传进行解压
#使用rz命令上传
# rz
[root@k8s-node42 ~]# ls
anaconda-ks.cfg cri-dockerd-0.3.1.amd64.tgz
[root@k8s-node42 ~]# tar xf cri-dockerd-0.3.1.amd64.tgz
[root@k8s-node42 ~]# cp cri-dockerd/cri-dockerd /usr/bin/
[root@k8s-node42 ~]# chmod +x /usr/bin/cri-dockerd
[root@k8s-node42 ~]#
配置启动文件,如下:
cat <<"EOF" > /usr/lib/systemd/system/cri-docker.service
[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
Requires=cri-docker.socket
[Service]
Type=notify
ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
[Install]
WantedBy=multi-user.target
EOF
⽣成 socket ⽂件,执行如下命令
cat <<"EOF" > /usr/lib/systemd/system/cri-docker.socket
[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-docker.service
[Socket]
ListenStream=%t/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker
[Install]
WantedBy=sockets.target
EOF
启动 cri-docker 并设置开机⾃动启动
[root@k8s-node42 ~]# systemctl daemon-reload
[root@k8s-node42 ~]# systemctl enable cri-docker --now
Created symlink from /etc/systemd/system/multi-user.target.wants/cri-docker.service to /usr/lib/systemd/system/cri-docker.service.
[root@k8s-node42 ~]# systemctl is-active cri-docker
active
[root@k8s-node42 ~]#
3.3 部署k8s
3.3.1 配置添加阿里云的yum源
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
3.3.2 安装kubeadm kubelet kubectl
yum install -y kubelet-1.25.0 kubeadm-1.25.0 kubectl-1.25.0
查看版本并设置开机自启动
[root@k8s-master ~]# kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"25", GitVersion:"v1.25.0", GitCommit:"a866cbe2e5bbaa01cfd5e969aa3e033f3282a8a2", GitTreeState:"clean", BuildDate:"2022-08-23T17:43:25Z", GoVersion:"go1.19", Compiler:"gc", Platform:"linux/amd64"}
[root@k8s-master ~]# systemctl enable kubelet
Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /usr/lib/systemd/system/kubelet.service.
[root@k8s-master ~]#
到目前位置,所有的操作都是在全部节点上操作的。接下来我们开始初始化k8s-master的节点,此操作只在k8s-master上执行:
3.3.3 k8s-master节点初始化
kubeadm 使用 eth0 的默认网络接口(通常是内网IP)做为 Master 节点的 advertise address .所以这里的IP地址要设置为你自己的IP地址:
kubeadm init \
--apiserver-advertise-address=192.168.1.41 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.25.0 \
--service-cidr=10.10.0.0/12 \
--pod-network-cidr=172.17.0.0/16 \
--cri-socket /var/run/cri-dockerd.sock \
--ignore-preflight-errors=all
注释:
--apiserver-advertise-address=192.168.1.41
这个参数就是master主机的IP地址--image-repository=registry.aliyuncs.com/google_containers
这个是镜像地址,由于国外地址无法访问,故使用的阿里云仓库地址:registry.aliyuncs.com/google_containers--kubernetes-version=v1.25.0
这个参数是下载的k8s软件版本号--service-cidr=10.10.0.0/12
无需更改--pod-network-cidr=172.17.0.0/16
Specify range of IP addresses for the pod network. If set, the control plane will automatically allocate CIDRs for every node.
该参数指明了 Pod 网络的 CIDR,以用于 Node 相关配置
若执行中出现问题,想要重新执行,可以先运行:
[root@k8s-master ~]# kubeadm reset -f
3.3.4 执行成功后,会有加入节点的代码,然后复制到其他节点进行加入。
按照下图提示,在k8s-master上创建必要的文件,然后在用最后的join把别的加点加入
mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/config
尤其注意最后一条,cri-socket ,这条容易漏掉。
kubeadm join 192.168.1.41:6443 --token 9rmt8j.2pqoh7drm68ns249 \--discovery-token-ca-cert-hash sha256:ff558174c47aba532fef2920f80e1f48976d4712a970eba1a7fac0428c8373ab--cri-socket /var/run/cri-dockerd.sock
[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master NotReady control-plane 5m5s v1.25.0
k8s-node42 NotReady <none> 75s v1.25.0
[root@k8s-master ~]#
接下来需要配置网络:
四. 在已经安全完的k8s上进行测试
4.1 安装配置网络
上传需要的网络包
在每个节点上都要上传
每个节点手动通过docker离线加载镜像:
37 docker load -i calico~cni~v3.24.3.tar.gz 38 docker load -i calico~kube~controllers~v3.24.3.tar.gz 39 docker load -i calico~node~v3.24.3.tar.gz
在master安装 网络插件:
[root@k8s-master ~]# kubectl apply -f calico.yaml
poddisruptionbudget.policy/calico-kube-controllers created
serviceaccount/calico-kube-controllers created
再次执行,这里显示的就是ready
4.2 安装配置nginx测试
创建nginx服务
[root@k8s-master ~]# kubectl create deployment nginx --image=nginx
deployment.apps/nginx created
暴露端口:
[root@k8s-master ~]# kubectl expose deployment nginx --port=80 --type=NodePort
service/nginx exposed
[root@k8s-master ~]# kubectl get pod,svc
NAME READY STATUS RESTARTS AGE
pod/nginx-76d6c9b8c-hw6bz 1/1 Running 0 16sNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 17m
service/nginx NodePort 10.15.105.20 <none> 80:32587/TCP 7s
测试:
[root@k8s-master ~]# curl 127.0.0.1:32587
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p><p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p><p><em>Thank you for using nginx.</em></p>
</body>
</html>
总结
以上就是无坑版本最新的k8s实战的全部过程了,耗时4个小时,终于完成。看到这里的小伙伴给点个三连呀。
每日鸡汤: 人活到极致,一定要素与简
✨原创不易,还希望各位大佬支持一下\textcolor{blue}{原创不易,还希望各位大佬支持一下}原创不易,还希望各位大佬支持一下
👍 点赞,你的认可是我创作的动力!\textcolor{green}{点赞,你的认可是我创作的动力!}点赞,你的认可是我创作的动力!
⭐️ 收藏,你的青睐是我努力的方向!\textcolor{green}{收藏,你的青睐是我努力的方向!}收藏,你的青睐是我努力的方向!
✏️ 评论,你的意见是我进步的财富!\textcolor{green}{评论,你的意见是我进步的财富!}评论,你的意见是我进步的财富!
相关文章:

【云原生】手把手带你从零开始搭建kubernetes最新版本实战
文章目录前言一. 实验环境二. k8s 的介绍三 . k8s的安装3.1 搭建实验环境3.1.1 硬件层面的要求3.1.2 软件层面环境配置3.2 docker的安装3.2.1 搭建docker3.2.2 部署 cri-dockerd3.3 部署k8s3.3.1 配置添加阿里云的yum源3.3.2 安装kubeadm kubelet kubectl3.3.3 k8s-master节点初…...
trivy os软件包扫描原理分析
具体可以基于之前的博客来做 基于trivy获取基础镜像 参数修改一下: cliOpt.ListAllPkgs true 结果中会带有如下格式的结果: "Results":[{"Target":"192.168.1.94:443/test22/centos:7 (centos 7.9.2009)","Clas…...

算法训练营 day48 动态规划 完全背包 零钱兑换 II 组合总和 Ⅳ
算法训练营 day48 动态规划 完全背包 零钱兑换 II 组合总和 Ⅳ 完全背包 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物…...
Java 基础(1)—泛型简单使用
一、泛型定义及作用 泛型是一种编程机制,允许在编写代码时使用参数化类型,以在编译时实现类型安全。 以下是泛型作用: 增强代码可读性和可维护性:通过在代码中使用泛型参数,可以使代码更清晰、更具有可读性和可维护性…...
内存卡损坏了怎么恢复?
内存卡损坏了怎么恢复?现在我们身边有不少电子设备都是用存储卡来存储数据的。一旦需要方便我们直接导出使用。但这存储的数据也不是一定安全的,当我们将内存卡连接到电脑时,难免会碰到病毒、格式化等提示,在这些情况下,可能会导…...

Mysql使用规范(纯技术和实战建议)
1、事务隔级别: (强制):Repeatable-Read(重复读),且不能在会话操作时临时开启隔离级别。 注: Repeatable-Read(重复读)隔离级别解决不了幻读。 可用 show variables l…...

Netty源码解读-EventLoop(二)
一、简介 NioEventLoop的重要组成:Selector、线程、任务队列,他既会处理io事件,也会处理普通任务和定时任务. 1.下面是Selector,注意有两个哦后面会讲 2.下面的爷爷类提供的Thread变量,其实下面发excutor用的就是这个…...

OSI模型详解
今天,我们详解OSI(Open System Inter-connection Reference Model)模型,来看看工业物联网的网络互联和数据互通。 OSI模型 1984年,国际标准化组织(International Organization for Standardization&#…...

Share Creators完成500万美元融资,以工具化手段帮助企业从数字资产管理中解放
近日,总部位于旧金山湾区的初创公司Share Creators宣布完成了新一轮500万美元的融资,投资方为五源资本和福昕PDF。本轮融资主要用于扩大客户基础,并加速在美国、欧洲和亚洲的业务发展。近几年,企业内容及数字资产管理全球市场正在…...

几个Base64编码工具,也有蹊跷
起因 需求:对一段内容进行base64加密,然后通过url的get请求进行发送到后台,由于加密的内容比较少,base64串也不是很长,我认为此方案可行。 于是找了三个base64编码的在线工具,分别是: 平台1&…...
Python|每日一练|排序|递归|字符串|数组|动态规划|单选记录:以特殊格式处理连续增加的数字|正则表达式匹配|地下城游戏
1、以特殊格式处理连续增加的数字(排序) 贡献者:EricLao 给出一串数字, 程序要把数字按照这样的格式输出,把连续增加的数字用 [x-y] 的形式表示,只显示这一组顺序数字的首位两个数字,不连续增…...

Spring Cloud微服务网关Gateway组件
目录 网关简介 什么是Spring Cloud Gateway Spring Cloud Gateway 功能特征 核心概念 工作原理 Spring Cloud Gateway快速开始 环境搭建 集成Nacos 路由断言工厂(Route Predicate Factories)配置 自定义路由断言工厂 过滤器工厂( …...
cluster nodes(集群节点)
CLUSTER NODES 复制 自3.0.0起可用。 时间复杂度: O(N)其中N是 Cluster 节点的总数 Redis 集群中的每个节点都有其当前集群配置的视图,由已知节点的集合给出,我们与这些节点的连接状态,它们的标志&…...

【Android学习】下载jar慢和gradle慢的情况
目录 问题出现的原因 解决方法 解决Gradle下载问题:手动安装 解决jar包下载慢问题:更改下载源 问题出现的原因 国内访问谷歌被墙导致访问速度慢或者干脆无法下载 解决方法 解决Gradle下载问题:手动安装 访问官网Gradle | Release Candi…...

下一个排列-力扣31-java
一、题目描述整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。例如,arr [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正式地&…...
前端面试题
1.HTTP request报文结构是怎样的 1.首行是Request-Line包括:请求方法,请求URI,协议版本,CRLF(换行符) 2.首行之后是若干行请求头,包括general-header,request-header或者entity-hea…...

jsp游戏门户网站系统Myeclipse开发mysql数据库web结构java编程计算机网页项目
一、源码特点 jsp 游戏门户网站系统 是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql,使…...

Git与IDEA强强联合(HTTPS协议连接)
最近在写项目的时候,在台式机和笔记本之间频繁切换,竟然还是用qq传压缩包,我自己都感觉无语,有git这样强大的版本管理工具,我竟然没想起来。然后也没有相关的博文就想来更新一篇。 那么如何使idea和git强强联合呢&…...
leetcode 第二题:两数相加-C语言实现
题目地址 备注: 不要忘记最后一个进位的可能。可以使用typedef,来简化struct的书写 代码实现: #include<stdio.h> #include<stdlib.h>struct listNode {int val;struct listNode* next; };// 使用typedef typedef struct lis…...
【人工智能】PTP网络时钟服务器在智能驾驶里的重要性
【人工智能】PTP网络时钟服务器在智能驾驶里的重要性 【人工智能】PTP网络时钟服务器在智能驾驶里的重要性 一辆宣称具备L4/L5自动驾驶功能的车辆,如果多个激光雷达之间的时间同步不够精确?如果传感器感知数据通过以太网传输到智驾域控制器的延迟不可控…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...

深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...

【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...

蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...