【Kubernetes】kubeadm安装k8s1.25.0高可用集群

k8s集群搭建(v1.25.0)

  • 一、初始化实验环境
  • 二、安装containerd服务
  • 2.1、安装containerd
  • 2.2、安装docker
  • 2.3、配置镜像加速器
  • 三、安装初始化k8s需要的软件包
  • 四、kubeadm初始化k8s集群
    • 4.1、设置容器运行时
    • 4.2、生成并修改配置文件
    • 4.2、初始化安装
    • 4.3、修改config文件,对kubectl进行授权
  • 五、扩容k8s集群-添加工作节点
    • 5.1、 kubeadm join
    • 5.2、节点打标签
    • 5.3、工作节点执行kubectl
  • 六、安装kubernetes网络组件-Calico
    • 6.1、组件安装
    • 6.2、Calico架构图
    • 6.3、 calico网络插件配置文件说明
    • 6.4、calico的IPIP模式和BGP模式对比分析
    • 6.5、测试k8s网络和dns是否正常
    • 6.6、ctr和crictl区别

一、初始化实验环境

详情请参考 :
【Kubernetes】kubeadm安装k8s稳定版(1.23.1)高可用集群
这里不再赘述

二、安装containerd服务

2.1、安装containerd

master、node节点都需要操作

# 1、安装
yum install  containerd.io-1.6.6 -y
# 2、生成containerd配置文件
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
# 3、修改配置文件 
vim /etc/containerd/config.toml
# 把SystemdCgroup = false修改成
SystemdCgroup = true
# 把sandbox_image = "k8s.gcr.io/pause:3.6"修改成
sandbox_image="registry.aliyuncs.com/google_containers/pause:3.7"

# 4、配置 containerd 开机启动,并启动 containerd
systemctl enable containerd  --now
# 5、修改/etc/crictl.yaml文件
cat > /etc/crictl.yaml <<EOF
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF
# 6、重启contaiinerd
systemctl restart  containerd

2.2、安装docker

docker也要安装,docker跟containerd不冲突,安装docker是为了能基于dockerfile构建镜像。

master、node节点都需要操作

yum install  docker-ce  -y
systemctl enable docker --now

2.3、配置镜像加速器

# 1、配置containerd镜像加速器,k8s所有节点均按照以下配置:
# 编辑vim /etc/containerd/config.toml文件
# 找到config_path = "",修改成如下目录:
config_path = "/etc/containerd/certs.d"

# 2、添加/etc/containerd/certs.d/docker.io/hosts.toml文件
mkdir /etc/containerd/certs.d/docker.io/ -p
vim /etc/containerd/certs.d/docker.io/hosts.toml
#写入如下内容:
[host."https://vh3bm52y.mirror.aliyuncs.com",host."https://registry.docker-cn.com"]
  capabilities = ["pull"]

# 3、重启containerd:
systemctl restart containerd

# 4、配置docker镜像加速器,k8s所有节点均按照以下配置
vim /etc/docker/daemon.json
# 写入如下内容:
{
 "registry-mirrors":["https://vh3bm52y.mirror.aliyuncs.com","https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn","https://dockerhub.azk8s.cn","http://hub-mirror.c.163.com"]
} 

# 5、重启docker:
systemctl restart docker

三、安装初始化k8s需要的软件包

3台机器都要安装

yum install -y kubelet-1.25.0 kubeadm-1.25.0 kubectl-1.25.0
systemctl enable kubelet

注:每个软件包的作用

  • Kubeadm: kubeadm是一个工具,用来初始化k8s集群的
  • kubelet: 安装在集群所有节点上,用于启动Pod的,kubeadm安装k8s,k8s控制节点和工作节点的组件,都是基于pod运行的,只要pod启动,就需要kubelet
  • kubectl: 通过kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件

四、kubeadm初始化k8s集群

4.1、设置容器运行时

[root@master ~]# crictl config runtime-endpoint /run/containerd/containerd.sock
[root@node01 ~]# crictl config runtime-endpoint /run/containerd/containerd.sock
[root@node02 ~]# crictl config runtime-endpoint /run/containerd/containerd.sock

4.2、生成并修改配置文件

kubeadm config print init-defaults > kubeadm.yaml

kubeadm.yaml一定要自己通过kubeadm config print init-defaults命令生成,根据我们自己的需求修改配置,比如修改 imageRepository 的值,kube-proxy 的模式为 ipvs,需要注意的是由于我们使用的containerd作为运行时,所以在初始化节点的时候需要指定cgroupDriver为systemd

vim kubeadm.yaml

apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 10.32.1.147 # 控制节点的ip
  bindPort: 6443
nodeRegistration:
  criSocket: unix:///run/containerd/containerd.sock # 指定containerd容器运行时
  imagePullPolicy: IfNotPresent
  name: master  # 控制节点主机名
  taints: null
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers # 指定阿里云镜像仓库地址
kind: ClusterConfiguration
kubernetesVersion: 1.25.0 # k8s版本
networking:
  dnsDomain: cluster.local
  podSubnet: 10.244.0.0/16 # 指定pod网段, 需要新增加这个
  serviceSubnet: 10.96.0.0/12
scheduler: {}
# 最后追加插入以下这8行
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs  # 生成防火请规则存入ipvs,否则就存入iptables里面了
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd # kubelet驱动

4.2、初始化安装

kubeadm init --config=kubeadm.yaml --ignore-preflight-errors=SystemVerification

显示如下,说明安装完成:
在这里插入图片描述

特别提醒:

–image-repository registry.aliyuncs.com/google_containers为保证拉取镜像不到国外站点拉取,手动指定仓库地址为registry.aliyuncs.com/google_containers。kubeadm默认从k8s.gcr.io拉取镜像。
mode: ipvs 表示kube-proxy代理模式是ipvs,如果不指定ipvs,会默认使用iptables,但是iptables效率低,所以我们生产环境建议开启ipvs,阿里云和华为云托管的K8s,也提供ipvs模式,如下:

在这里插入图片描述
在这里插入图片描述

4.3、修改config文件,对kubectl进行授权

[root@master ~]#  mkdir -p $HOME/.kube
[root@master ~]#  mkdir -p $HOME/.kube
[root@master ~]#  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
[root@master ~]# kubectl get nodes
NAME     STATUS     ROLES           AGE   VERSION
master   NotReady   control-plane   11m   v1.25.0
# 备注:NotReady表示没装网络插件
[root@master ~]# kubectl get pods -n kube-system -o wide
NAME                             READY   STATUS    RESTARTS   AGE   IP            NODE     NOMINATED NODE   READINESS GATES
coredns-7f8cbcb969-hfscf         0/1     Pending   0          12m   <none>        <none>   <none>           <none>
coredns-7f8cbcb969-lvd69         0/1     Pending   0          12m   <none>        <none>   <none>           <none>
etcd-master                      1/1     Running   0          12m   10.32.1.147   master   <none>           <none>
kube-apiserver-master            1/1     Running   0          12m   10.32.1.147   master   <none>           <none>
kube-controller-manager-master   1/1     Running   0          12m   10.32.1.147   master   <none>           <none>
kube-proxy-zr9fq                 1/1     Running   0          12m   10.32.1.147   master   <none>           <none>
kube-scheduler-master            1/1     Running   0          12m   10.32.1.147   master   <none>           <none>
# 注意:上面coredns是pending状态,没装网络插件,正常,等装完网络插件,就变成running

五、扩容k8s集群-添加工作节点

5.1、 kubeadm join

node01、node02上面都要操作

[root@master ~]# kubeadm token create --print-join-command
kubeadm join 10.32.1.147:6443 --token mjtwr8.0q4kj2lyccm0ldnw --discovery-token-ca-cert-hash sha256:d0e45daeda533addf757b5e89d0d2dbe1c00375cacab40bcaf07b1fb55b81148
[root@node01 ~]# kubeadm join 10.32.1.147:6443 --token mjtwr8.0q4kj2lyccm0ldnw --discovery-token-ca-cert-hash sha256:d0e45daeda533addf757b5e89d0d2dbe1c00375cacab40bcaf07b1fb55b81148
[root@node02 ~]# kubeadm join 10.32.1.147:6443 --token mjtwr8.0q4kj2lyccm0ldnw --discovery-token-ca-cert-hash sha256:d0e45daeda533addf757b5e89d0d2dbe1c00375cacab40bcaf07b1fb55b81148

出现以下结果代表加入成功:
在这里插入图片描述

5.2、节点打标签

# 查看集群节点状况
[root@master ~]# kubectl get node
NAME     STATUS     ROLES           AGE    VERSION
master   NotReady   control-plane   38m    v1.25.0
node01   NotReady   <none>          3m     v1.25.0
node02   NotReady   <none>          108s   v1.25.0
# 对node节点打标签,显示work
[root@master ~]# kubectl label nodes node01 node-role.kubernetes.io/work=work
node/node01 labeled
[root@master ~]# kubectl label nodes node02 node-role.kubernetes.io/work=work
node/node02 labeled
[root@master ~]# kubectl get nodes
NAME     STATUS     ROLES           AGE     VERSION
master   NotReady   control-plane   45m     v1.25.0
node01   NotReady   work            10m     v1.25.0
node02   NotReady   work            9m34s   v1.25.0

5.3、工作节点执行kubectl

目前工作节点是不能执行kubectl的,因为工作节点上没有$HOME/.kube/config文件。

[root@node01 ~]# kubectl get nodes
The connection to the server localhost:8080 was refused - did you specify the right host or port?
You have new mail in /var/spool/mail/root

[root@node01 ~]#  mkdir $HOME/.kube/
You have new mail in /var/spool/mail/root
[root@node02 ~]#  mkdir $HOME/.kube/
You have new mail in /var/spool/mail/root

# 将config文件copy到节点的对应位置
[root@master ~]# scp /root/.kube/config node01:/root/.kube/
config                                                                                                                   100% 5635   396.5KB/s   00:00
[root@master ~]# scp /root/.kube/config node02:/root/.kube/
config                                                                                                                   100% 5635     2.5MB/s   00:00

# 这样就可以使用kubectl 命令了
[root@node01 ~]# kubectl get nodes
NAME     STATUS     ROLES           AGE   VERSION
master   NotReady   control-plane   52m   v1.25.0
node01   NotReady   work            16m   v1.25.0
node02   NotReady   work            15m   v1.25.0
You have new mail in /var/spool/mail/root
[root@node02 ~]# kubectl get nodes
NAME     STATUS     ROLES           AGE   VERSION
master   NotReady   control-plane   52m   v1.25.0
node01   NotReady   work            16m   v1.25.0
node02   NotReady   work            15m   v1.25.0
You have new mail in /var/spool/mail/root

六、安装kubernetes网络组件-Calico

6.1、组件安装

上传calico.yaml到master上,使用yaml文件安装calico 网络插件 。
注:在线下载配置文件地址是: https://docs.projectcalico.org/manifests/calico.yaml

[root@master ~]# kubectl apply -f calico.yaml
[root@master ~]# kubectl get node
NAME     STATUS   ROLES           AGE   VERSION
master   Ready    control-plane   62m   v1.25.0
node01   Ready    work            26m   v1.25.0
node02   Ready    work            25m   v1.25.0

6.2、Calico架构图

在这里插入图片描述
Calico网络模型主要工作组件:
1.Felix:运行在每一台 Host 的 agent 进程,主要负责网络接口管理和监听、路由、ARP 管理、ACL 管理和同步、状态上报等。保证跨主机容器网络互通。
2.etcd:分布式键值存储,相当于k8s集群中的数据库,存储着Calico网络模型中IP地址等相关信息。主要负责网络元数据一致性,确保 Calico 网络状态的准确性;
3.BGP Client(BIRD):Calico 为每一台 Host 部署一个 BGP Client,即每台host上部署一个BIRD。 主要负责把 Felix 写入 Kernel 的路由信息分发到当前 Calico 网络,确保 Workload 间的通信的有效性;
4.BGP Route Reflector:在大型网络规模中,如果仅仅使用 BGP client 形成 mesh 全网互联的方案就会导致规模限制,因为所有节点之间俩俩互联,需要 N^2 个连接,为了解决这个规模问题,可以采用 BGP 的 Router Reflector 的方法,通过一个或者多个 BGP Route Reflector 来完成集中式的路由分发。

6.3、 calico网络插件配置文件说明

calico.yam文件中

……
containers:
        # Runs calico-node container on each Kubernetes node. This
        # container programs network policy and routes on each
        # host.
        - name: calico-node
          image: docker.io/calico/node:v3.18.0
……
          env:
            # Use Kubernetes API as the backing datastore.
            - name: DATASTORE_TYPE
              value: "kubernetes"
            # Cluster type to identify the deployment type
            - name: CLUSTER_TYPE
              value: "k8s,bgp"
            # Auto-detect the BGP IP address.
            - name: IP
              value: "autodetect"
         #pod网段
         - name: CALICO_IPV4POOL_CIDR 
value: "10.244.0.0/16"
            # Enable IPIP
            - name: CALICO_IPV4POOL_IPIP
              value: "Always"

calico-node服务的主要参数如下:
CALICO_IPV4POOL_IPIP:是否启用IPIP模式。启用IPIP模式时,Calico将在Node上创建一个名为tunl0的虚拟隧道。IP Pool可以使用两种模式:BGP或IPIP。使用IPIP模式时,设置CALICO_IPV4POOL_IPIP=“Always”,不使用IPIP模式时,设置CALICO_IPV4POOL_IPIP=“Off”,此时将使用BGP模式。

IP_AUTODETECTION_METHOD:获取Node IP地址的方式,默认使用第1个网络接口的IP地址,对于安装了多块网卡的Node,可以使用正则表达式选择正确的网卡,例如"interface=eth.*"表示选择名称以eth开头的网卡的IP地址。

-  name: IP_AUTODETECTION_METHOD
  value: "interface=ens33"

6.4、calico的IPIP模式和BGP模式对比分析

1)IPIP
把一个IP数据包又套在一个IP包里,即把IP层封装到IP层的一个 tunnel,它的作用其实基本上就相当于一个基于IP层的网桥,一般来说,普通的网桥是基于mac层的,根本不需要IP,而这个ipip则是通过两端的路由做一个tunnel,把两个本来不通的网络通过点对点连接起来;

calico以ipip模式部署完毕后,node上会有一个tunl0的网卡设备,这是ipip做隧道封装用的,也是一种overlay模式的网络。当我们把节点下线,calico容器都停止后,这个设备依然还在,执行 rmmodipip命令可以将它删除。

2)BGP
BGP模式直接使用物理机作为虚拟路由路(vRouter),不再创建额外的tunnel

边界网关协议(BorderGateway Protocol, BGP)是互联网上一个核心的去中心化的自治路由协议。它通过维护IP路由表或‘前缀’表来实现自治系统(AS)之间的可达性,属于矢量路由协议。BGP不使用传统的内部网关协议(IGP)的指标,而是基于路径、网络策略或规则集来决定路由。因此,它更适合被称为矢量性协议,而不是路由协议,通俗的说就是将接入到机房的多条线路(如电信、联通、移动等)融合为一体,实现多线单IP;

BGP 机房的优点:服务器只需要设置一个IP地址,最佳访问路由是由网络上的骨干路由器根据路由跳数与其它技术指标来确定的,不会占用服务器的任何系统;

官方提供的calico.yaml模板里,默认打开了ip-ip功能,该功能会在node上创建一个设备tunl0,容器的网络数据会经过该设备被封装一个ip头再转发。这里,calico.yaml中通过修改calico-node的环境变量:CALICO_IPV4POOL_IPIP来实现ipip功能的开关:默认是Always,表示开启;Off表示关闭ipip。

6.5、测试k8s网络和dns是否正常


[root@master ~]#  kubectl run busybox --image docker.io/library/busybox:1.28  --image-pull-policy=IfNotPresent --restart=Never --rm -it busybox -- sh
If you don't see a command prompt, try pressing enter.
/ # ping www.baidu.com
PING www.baidu.com (110.242.68.3): 56 data bytes
64 bytes from 110.242.68.3: seq=0 ttl=48 time=32.680 ms
64 bytes from 110.242.68.3: seq=1 ttl=48 time=32.587 ms
^C
--- www.baidu.com ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 32.587/32.633/32.680 ms

通过上面可以看到能访问网络,说明calico网络插件已经被正常安装了。

/ #  nslookup kubernetes.default.svc.cluster.local
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

Name:      kubernetes.default.svc.cluster.local
Address 1: 10.96.0.1 kubernetes.default.svc.cluster.local

10.96.0.10 就是我们coreDNS的clusterIP,说明coreDNS配置好了。

解析内部Service的名称,是通过coreDNS去解析的。
注意:busybox要用指定的1.28版本,不能用最新版本,最新版本,nslookup会解析不到dns和ip

6.6、ctr和crictl区别

背景:在部署k8s的过程中,经常要对镜像进行操作(拉取、删除、查看等)

问题:使用过程中会发现ctr和crictl有很多相同功能,也有些不同,那区别到底在哪里?

说明
1.ctr是containerd自带的CLI命令行工具,crictl是k8s中CRI(容器运行时接口)的客户端,k8s使用该客户端和containerd进行交互;

2.ctr和crictl命令具体区别如下,也可以–help查看。crictl缺少对具体镜像的管理能力,可能是k8s层面镜像管理可以由用户自行控制,能配置pod里面容器的统一镜像仓库,镜像的管理可以有habor等插件进行处理。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言之数组(精讲)

目录 数组 数组的声明&#xff08;使用数组前的准备&#xff09; 访问数组&#xff08;数组的使用方法&#xff09; 数组的遍历 数组初始化 1.在声明变量时&#xff0c;除了必要的情况下&#xff0c;都需要对变量进行初始化。 2.我们还可以像下面在声明数组时不指定元素…

win10与 vm虚拟机win7共享文件夹创建

1:在win10&#xff08;主机&#xff09;电脑先随意共享一个文件夹 2&#xff1a;在win10&#xff08;主机&#xff09;上创建一个网络映射 右键此电脑选择映射网络驱动器 成功后会多出这个网络位置 3&#xff1a;win7虚拟机设置 在虚拟机中点击计算机右键添加一个网络位置

云HIS:新一代云架构医院信息管理系统源码(java语言)

云HIS信息管理云平台&#xff0c;提供全方位的临床系统应用&#xff0c;是国内领先的以云计算为基础&#xff0c;以云计算赋能医疗机构&#xff0c;是颠覆传统医疗信息化业态的技术与模式创新&#xff0c;以SaaS方式&#xff0c;为医疗机构提供信息系统服务&#xff0c;满足从医…

Scrapy爬虫数据存储为JSON文件的解决方案

什么是JSON文件 JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;易于人们阅读和编写&#xff0c;同时也易于机器解析和生成。它基于JavaScript Spark语言的一个子集&#xff0c;但独立于Smashing语言&#xff0c;因此在许多中…

【面试经典150 | 二叉树】翻转二叉树

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;递归方法二&#xff1a;迭代 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题…

Linux 编译过程分析

文章目录 一、源码foo.hhello.cfoo1.cfoo2.c GCC 指令预处理命令hello.i 编译&#xff08;Compile only&#xff09;命令foo2.s 汇编命令readelfreadelf -hreadelf -Sreadelf -rreadelf -sstrip 链接 本文基于《深度探索Linux操作系统&#xff1a;系统构建和原理解析》 一、源…

2022年南美地区医疗机器人市场及全球概况报告

今天分享的是机器人系列深度研究报告&#xff1a;《2022年南美地区医疗机器人市场及全球概况报告》。 &#xff08;报告出品方&#xff1a;Apollo Reports&#xff09; 报告共计&#xff1a;172页 研究方法论 2.1通过桌面研究和内部存储库的假设 a)最初&#xff0c;各个类别…

深度学习实战64-黑白照片着色的模型应用,快速部署实现黑白图片快速上色的功能

大家好,我是微学AI,今天给大家介绍一下深度学习实战64-黑白照片着色的模型应用,快速部署实现黑白图片快速上色的功能。图片上色是一个具有多模态不确定性和高度不适定性的挑战性问题。直接训练深度神经网络通常会导致错误的语义颜色和低色彩丰富度。虽然基于Transformer的方…

从零开始学习 JS APL(六):完整指南和实例解析

学习目标&#xff1a; 1. 能够利用正则表达式校验输入信息的合法性 2. 具备利用正则表达式验证小兔鲜注册页面表单的能力 学习内容&#xff1a; 正则表达式 综合案例 阶段案例 学习时间&#xff1a; 周一至周五晚上 7 点—晚上9点周六上午 9 点-上午 11 点周日下午 3 点-下…

力扣11.盛最多水的容器

题目描述 思路 用双指针法。 每次向内移动较短的那个板&#xff0c;能带来更大的效益。 代码 class Solution {public int maxArea(int[] height) {int res 0;int i 0,j height.length - 1;while(i < j){res height[i] < height[j] ? Math.max((j - i) * height…

BearPi Std 板从入门到放弃 - 引气入体篇(7)(DAC)

简介 基于前面的文章, 缩略STM32CubeMx创建项目的过程&#xff0c;直接添加DAC相关初始化; 开发板 &#xff1a; Bearpi Std(小熊派标准板) 主芯片: STM32L431RCT6 LED : PC13 \ 推挽输出即可 \ 高电平点亮 串口: Usart1 KEY1 : PB2 \ 上拉 \ 按下下降沿触发(一次)\ 用于增…

2024年MCM/ICM美国大学生数学建模竞赛备战指南

01 2024美赛基本要求 1.关于时间&#xff08;北京时间&#xff09; 比赛开始时间&#xff1a; 2024年2月2日6:00至 2024年2月6日9:00 提交截止时间&#xff1a;2024年2月6日10:00 结果发布时间&#xff1a;结果将于2024年5月31日或之前发布 2.关于规则 完整的解决方案现…

海上液化天然气 LNG 终端 ,数字孪生监控系统

液化天然气 (Liquefied Natural Gas&#xff0c;简称 LNG) 在能源转型过程中被广泛认可为相对较清洁的能源选择。 相对于传统的煤炭和石油燃料&#xff0c;LNG 的燃烧过程产生的二氧化碳 (CO2) 排放较低。LNG 的燃烧释放的二氧化碳排放较少&#xff0c;因此对应对气候变化和减…

ChatGPT哪些行业需要学习?

2023年随着OpenAI开发者大会的召开&#xff0c;最重磅更新当属GPTs&#xff0c;多模态API&#xff0c;未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义&#xff0c;不亚于互联网和个人电脑的问世。360创始人周鸿祎认为未来各行各业如果不能搭上这班车…

Modbus数据类型转换

前请提要: 从PLC读取的数值,不管是读正负整数还是正负浮点数,读取过来后都会变成UInt16,也就是Ushort类型 一、ushort(UInt16)转成 Int32 源代码方法: //ushort类型转Int32类型的方法private int ushortToInt32(ushort[] date, int start){//先进行判断,长度是否正确…

【算法题】一种字符串压缩表示的解压(js)

输入&#xff1a;2dff 输出 !error 两个d不需要压缩&#xff0c;故输入不合法 输入:4eA 输出:!error 全部由小写英文字母组成&#xff0c;压缩后不会出现&#xff0c;故输出不合法 function solution(str) {const error "!error";// 只能包含小写字母和数字 [^a-z0…

无需公网IP实现公网远程访问本地WebDAV服务

windows搭建WebDAV服务&#xff0c;并内网穿透公网访问【无公网IP】 文章目录 windows搭建WebDAV服务&#xff0c;并内网穿透公网访问【无公网IP】1. 安装IIS必要WebDav组件2. 客户端测试3. cpolar内网穿透3.1 打开Web-UI管理界面3.2 创建隧道3.3 查看在线隧道列表3.4 浏览器访…

踩坑记录:SpringBoot集成Dubbo和Nacos版本问题

一、概述 最近在整理依赖&#xff0c;原本用的springcloud提供的nacos&#xff0c;看到老早都不更新了&#xff0c;而且有些包冲突&#xff0c;就换了ali的&#xff0c;用的spring-boot版本是2.3.9.RELEASE&#xff0c;对应spring-cloud版本是Hoxton.SR12&#xff0c;dubbo用的…

[足式机器人]Part2 Dr. CAN学习笔记-数学基础Ch0-5Laplace Transform of Convolution卷积的拉普拉斯变换

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-数学基础Ch0-5Laplace Transform of Convolution卷积的拉普拉斯变换 Laplace Transform : X ( s ) L [ x ( t ) ] ∫ 0 ∞ x ( t ) e − s t d t X\left( s \right) \mathcal{L} \left[ x\lef…

现货黄金会面临哪些风险?

进行现货黄金投资&#xff0c;我们除了要了解怎么找到交易机会以外&#xff0c;也要知道我们交易会面临哪些风险&#xff0c;了解风险就是做到知己知彼&#xff0c;了解风险才能控制风险。控制住风险&#xff0c;才能为我们稳定盈利打好基础&#xff0c;那么下面我们就来看看在…