Kubernetes集群搭建 kubernetes集群安装

news2024/11/16 3:22:31

Kubeadm

kubeadm 是 Kubernetes 社区提供的集群构建工具,它能够以最佳实践的方式部署一个最小化的可用 Kubernetes 集群。

但是 kubeadm 在设计上并未安装网络解决方案,所以需要用户自行安装第三方符合 CNI 的网络解决方案,如 flanal,calico,canal 等。

常见的 Kubernetes 集群的运行模式有三种:

  1. 独立组件模式:各组件直接以守护进程方式运行,如二进制部署。
  2. 静态 Pod 模式:各组件以静态 Pod 运行在 Master 节点,kubelet 和容器运行时以守护进程运行所有节点,kube-proxy 以 DaemonSet 形式托管在集群。
  3. 自托管(self-hosted)模式:和第二种类似,但各组件都运行为 Pod 对象(非静态),且这些 Pod 对象都以 DaemonSet 形式托管在集群。

kubeadm 能够部署第二种和第三种运行方式。一般用于测试环境部署使用,生产环境更推荐二进制安装,更容易排查问题。

安装 Kubeadm(YUM 源安装方式)

在安装之前,所有节点需要新增 kubeadm 的 yum 源。

执行机器:所有 master 和 worker 节点

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

此时查看支持的 kubeadm 版本:

yum list kubeadm.x86_64 --showduplicates

在写本文的时候最新版本支持到了 1.26.1-0

所有节点安装 kubeadm:

yum -y install kubeadm-1.26.0-0 kubelet-1.26.0-0 kubectl-1.26.0-0

但是可能会因为网络问题,下载可能会很慢,可以使用第二种方式。

安装 Kubeadm(rpm 包安装方式)

通过下载过程可以看到一共需要 6 个 rpm 包,可以直接去阿里云仓库里面下载:

 http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/Packages

也可以通过下面的链接进行下载:

包名

版本

下载地址

kubeadm

1.26.0-0

 点击下载

kubectl

1.26.0-0

 点击下载

kubelet

1.26.0-0

 点击下载

cri-tools(依赖)

1.26.0-0

 点击下载

kubernetes-cni(依赖)

1.2.0-0

 点击下载

将下载好的安装包改名之后,上传到 /opt/package 目录,执行安装。

执行机器:所有 master 和 worker 节点

cd /opt/package
yum -y localinstall kube* cri*

配置 Kubelet

由于本文使用 Containerd 作为容器运行时,所以需要对 kubelet 进行配置,如果不是则不需要执行。

执行机器:所有 master 和 worker 节点

cat >/etc/sysconfig/kubelet<<EOF
KUBELET_KUBEADM_ARGS="--container-runtime=remote --runtime-request-timeout=15m --container-runtime-endpoint=unix:///run/containerd/containerd.sock"
EOF

设置 Kubelet 开机启动:

systemctl daemon-reload
systemctl enable --now kubelet
systemctl status kubelet

集群还未初始化,此时 Kunelet 还没有配置文件,是无法启动的,暂时不用管它。

集群初始化

创建初始化配置文件目录,该目录下面的文件只有在集群初始化的时候有用。

执行机器:所有 master 节点

mkdir -p /opt/service/kubeadm
cd /opt/service/kubeadm

集群初始化后续的操作只需要在任意一个 Master 节点上执行即可,后面通过同步到其他节点完成配置,这里选择 master-01 执行。

master-01 新增配置文件:

cat > kubeadm-config-old.yaml << EOF
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  # 加入集群的 Token
  token: 7t2weq.bjbawausm0jaxury
  # 加入集群的 Token 有效期
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  # 本机地址,这里只支持 IP
  advertiseAddress: 192.168.2.21
  # API Server 监听端口
  bindPort: 6443
nodeRegistration:
  # Containerd socket 文件地址
  criSocket: unix:///var/run/containerd/containerd.sock
  # 本机名称,需要能够解析通信
  name: master-01
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/control-plane
---
apiServer:
  certSANs:
  # VIP 地址,如果只有一个节点就写 IP 地址即可
  - 192.168.2.100
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
# 证书存放目录
certificatesDir: /etc/kubernetes/pki
# 集群名称
clusterName: kubernetes
# 配置高可用集群,使用可 Nginx SLB 代理了 API Server 端口
controlPlaneEndpoint: 192.168.2.100:6443
controllerManager: {}
dns:
  type: CoreDNS
etcd:
  local:
    dataDir: /var/lib/etcd
# 指定国内的镜像仓库
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
kind: ClusterConfiguration
# 该版本需要和 kubeadm 一致
kubernetesVersion: v1.26.0
networking:
  dnsDomain: cluster.local
  # Pod 网段(可用IP个数 65534,172.16.0.1 - 172.16.255.254)
  podSubnet: 172.16.0.0/16
  # Service 网段,注意不能和自己的网络冲突(可用IP个数 65534,10.10.0.1 - 10.10.255.254)
  serviceSubnet: 10.10.0.0/16
scheduler: {}
EOF

注意上面有注释的配置需要根据自己实际情况进行修改。如果 Pod 网段和 Service 网段不知道怎么划分,可以使用 IP 计算器:

 http://tools.jb51.net/aideddesign/ip_net_calc/

更新配置文件:

kubeadm config migrate --old-config kubeadm-config-old.yaml --new-config kubeadm-config-new.yaml

此时配置文件就会生成新版本,将新版本的配置文件传输给其他 Master 节点。

scp kubeadm-config-new.yaml root@192.168.2.22:/opt/service/kubeadm/

通过刚生成的配置文件拉取镜像,这样的好处在于之后集群初始化的时候更快。

执行机器:所有 master 节点

kubeadm config images pull --config /opt/service/kubeadm/kubeadm-config-new.yaml

该命令会自动从阿里云镜像仓库中下载以下镜像:

  • registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.26.0
  • registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.26.0
  • registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.26.0
  • registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.26.0
  • registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9
  • registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.6-0
  • registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.9.3

拉取完成之后可以通过 nerdctl 命令查看拉取的镜像,但是需要指定名称空间:

nerdctl -n k8s.io image ls

初始化集群,此时可以先注释掉 Nginx 中反向代理配置的除 master-01 之外的其它节点,等到集群 Master 节点都添加完成再将它们放开。

执行机器:master-01

kubeadm init --config /opt/service/kubeadm/kubeadm-config-new.yaml --upload-certs

初始化完成之后会生成一系列的指令,需要将提示的内容记录下来,后面会用到:

Kubernetes集群搭建 kubernetes集群安装_Kubernetes集群搭建

此时会涉及到几个重要的目录:

  • Kubelet 配置文件目录:/var/lib/kubelet
  • Kubernetes 配置文件目录:/etc/kubernetes
  • Kubernetes master 组件配置文件目录:/etc/kubernetes/manifests
  • Kubernetes 证书目录:/etc/kubernetes/pki

如果初始化失败,可以通过本机的 /var/log/messages 排错。

比如出现错误:

failed to get sandbox image "registry.k8s.io/pause:3.6":

这可能是在安装配置 Containerd 的时候没有修改它默认配置里面的 pause 镜像地址,导致一致访问 k8s.io 这个国内无法访问的域名导致。

找到错误之后可以执行下面命令进行清理初始化内容,清理完成后修复错误重新初始化:

kubeadm reset -f
ipvsadm --clear
rm -rf ~/.kube

添加完成后后续操作:

cat >> /etc/profile << EOF
# Kubeadm 配置
export KUBECONFIG=/etc/kubernetes/admin.conf
EOF

source /etc/profile

查看当前 Kubernetes 集群的状态:

# 查看节点信息
kubectl get nodes

# 查看 pod 信息
kubectl get pods -n kube-system

如图所示:

Kubernetes集群搭建 kubernetes集群安装_容器运行时_02

此时的 NotReady 和 CoreDNS 的状态都属于正常现象,因为缺少网络插件。

加入 Master 节点

其他 Master 节点加入集群,只需要将 master-01 初始化的时候生成的加入命令在对应的节点上面执行即可。

执行机器:master-02

kubeadm join 192.168.2.100:6443 --token 7t2weq.bjbawausm0jaxury --discovery-token-ca-cert-hash sha256:319420f3881d1d7349b135741300745e08bb481713426c20851abc19b53eef04 --control-plane --certificate-key 5892ed1f7d73ea5866bee87d970de822c30b131db7851000051b17cf28514378

注意,拷贝命令的时候需要删除换行符 \,否则会报错:

accepts at most 1 arg(s), received 3
To see the stack trace of this error execute with --v=5 or higher

Master 节点加入集群之后,也会让执行相关的命令:

Kubernetes集群搭建 kubernetes集群安装_容器运行时_03

可以继续执行 master-01 的那个后续配置:

cat >> /etc/profile << EOF
# Kubeadm 配置
export KUBECONFIG=/etc/kubernetes/admin.conf
EOF

source /etc/profile

再度查看集群信息:

# 查看节点信息
kubectl get nodes

# 查看 pod 信息
kubectl get pods -n kube-system

如图所示:

Kubernetes集群搭建 kubernetes集群安装_容器_04

Master 节点都添加完成之后就可以去 SLB 的 Nginx 里面将之前注释掉的节点都放开了。

加入 Worker 节点

和加入 Master 节点类似,执行初始化时候生成的命令即可。

执行机器:所有 Worker 节点

kubeadm join 192.168.2.100:6443 --token 7t2weq.bjbawausm0jaxury --discovery-token-ca-cert-hash sha256:319420f3881d1d7349b135741300745e08bb481713426c20851abc19b53eef04

再度查看集群信息:

# 查看节点信息
kubectl get nodes

# 查看 pod 信息
kubectl get pods -n kube-system -o wide

如图所示:

Kubernetes集群搭建 kubernetes集群安装_kubernetes_05

此时在 Worker 节点都启动了 kube-proxy。

安装 Calico

在介绍 kubeadm 的时候说过,kubeadm 需要用户自己安装网络插件,比如 flanal,calico,canal 等。目前业内比较推荐 calico。

Calico 是一个纯三层的数据中心网络方案(不需要 Overlay),并且与 OpenStack、Kubernetes、AWS、GCE 等 IaaS 和容器平台都有良好的集成。

Calico 通过在每一个计算节点利用 Linux Kernel 实现了一个高效的 vRouter 来负责数据转发,每个 vRouter 再通过 BGP 协议负责把自己上运行的 workload 的路由信息向整个 Calico 网络内传播。小规模部署可以直接互联,大规模下可通过指定的 BGP route reflector 来完成。这样的做法保证了最终所有的 workload 之间的数据流量都是通过 IP 路由的方式完成互联的。

Calico 节点组网可以直接利用数据中心的网络结构(无论是 L2 或者 L3),不需要额外的 NAT,隧道或者 Overlay Network。

此外,Calico 基于 iptables 还提供了丰富而灵活的网络 Policy,保证通过各个节点上的 ACLs 来提供 Workload 的多租户隔离、安全组以及其他可达性限制等功能。

 https://projectcalico.docs.tigera.io/about/about-calico

本文编写的时候目前 Calico 最新版本为 3.25,通过官方文档可以看到其对 Kubernetes 版本的支持情况,如果版本不对可能会出现问题:

 https://projectcalico.docs.tigera.io/getting-started/kubernetes/requirements

官方文档有这样的说明:

由于 Kubernetes API 的变化,Calico v3.25 将无法在 Kubernetes v1.15 或更低版本上运行。v1.16-v1.18 可能有效,但不再进行测试。较新的版本也可能有效,但我们建议升级到针对较新的 Kubernetes 版本测试过的 Calico 版本。

Calico 的安装只需要在任意 Master 节点执行即可,这里选择在 master-01 上面执行。

执行机器:master-01

cd /opt/service/kubeadm/
wget https://projectcalico.docs.tigera.io/archive/v3.25/manifests/calico.yaml
kubectl apply -f calico.yaml

由于网络问题,这个过程会很慢,集群也可能变卡,过程中 Master 节点的组件还可能会被重启,等待安装完成即可。

Kubernetes集群搭建 kubernetes集群安装_容器_06

安装完成后可以查看集群节点状态:

kubectl get nodes

如图所示:

Kubernetes集群搭建 kubernetes集群安装_kubernetes_07

开启自动生成 Token

从 v1.24.0 开始,ServiceAccount 不再自动生成 Secret。如果你还想要自动生成 Secret,那么可以给 kube-controller-manager 配置特性 LegacyServiceAccountTokenNoAutoGeneration=false。

 https://kubernetes.feisky.xyz/concepts/objects/serviceaccount

修改所有 Master 节点的 kube-controller-manager 资源清单:

vim /etc/kubernetes/manifests/kube-controller-manager.yaml

在 command 下面新增配置:--feature-gates=LegacyServiceAccountTokenNoAutoGeneration=false

- command:
    - kube-controller-manager
    - --feature-gates=LegacyServiceAccountTokenNoAutoGeneration=false

修改完成后 K8S 集群会自动滚动更新 kube-controller-manager,不需要重启。

修改 Kube-proxy 模式

通过命令查看 kube-proxy 的模式:

curl 127.0.0.1:10249/proxyMode

可以看到其模式为:iptables,需要将其改为 ipvs。

执行机器:master-01

kubectl edit cm kube-proxy -n kube-system

找到 mode 配置,修改:

mode: ipvs

更新配置:

kubectl patch daemonset kube-proxy -p "{\"spec\":{\"template\":{\"metadata\":{\"annotations\":{\"date\":\"`date +'%s'`\"}}}}}" -n kube-system

再次使用 curl 命令查看就能发现 mode 已经变成 ipvs 了。

到此,Kubeadm 集群安装完成!

证书有效期

通过 kubeadm 安装的 Kubernetes 集群的证书有效期为 1 年,可以使用相关命令查看证书的有效期:

kubeadm certs check-expiration

如图所示:

Kubernetes集群搭建 kubernetes集群安装_Containerd_08

可以看到除了 ca 证书,其他证书的有效期都是一年。如果证书到期,则整个集群都会挂掉。

解决这个问题的办法一般有两种:

  1. 如果还没有安装集群,可以通过修改源码设置证书有效期。
  2. 如果集群已经运行,可以通过重新签发有效期更长的证书。

证书更新(直接更新)

为了更新的安全性,更新之前可以将所有 Master 节点的配置目录做一个备份:

cp -r /etc/kubernetes /etc/kubernetes_$(date +%F)
cp -r /var/lib/etcd /var/lib/etcd_$(date +%F)

通过执行证书更新命令查看:

kubeadm certs renew --help

可以看到证书更新是支持更新指定服务的证书,也可以更新单个服务的证书,但都是集群服务的证书。

# 所有 Master 节点更新所有证书
kubeadm certs renew all
systemctl restart kubelet

如图所示:

Kubernetes集群搭建 kubernetes集群安装_容器运行时_09

可以看到提示让重启 kube-apiserver, kube-controller-manager, kube-scheduler 和 etcd 服务证书才能生效。

# 重启组件
for i in $(kubectl get pods -A | grep -E "etcd|kube-apiserver|kube-controller-manager|kube-scheduler" | awk '{print $2}');do
    kubectl delete pod $i -n kube-system
    sleep 3
done

再度查看证书有效期,如图所示:

Kubernetes集群搭建 kubernetes集群安装_容器运行时_10

可以看到证书有效期已经更新。,也可以通过命令查看:

echo | openssl s_client -showcerts -connect 127.0.0.1:6443 -servername api 2>/dev/null | openssl x509 -noout -enddate

同时,由于在初始化 Master 集群的时候采用的是设置环境变量 export KUBECONFIG=/etc/kubernetes/admin.conf 的方法,不需要再更新该文件。

如果不是该方法,还需要使用新的 admin.conf 替换掉复制的 /root/.kube/config 配置文件。

证书更新(修改源码)

上面的方法更新的证书有效期还是 1 年,生产还不是太建议。可以通过修改源码调整 kubeadm 的证书时间。

执行机器:ops

下载源码,切换到安装版本的分支:

# 下载 Kubernetes 源码
yum install git
cd /opt
git clone https://github.com/kubernetes/kubernetes.git
cd kubernetes

# 查看所有分支
git branch -a

# 切换分支
git checkout -b remotes/origin/release-1.26

# 查看当前分支
git branch

修改文件:staging/src/k8s.io/client-go/util/cert/cert.go

vim staging/src/k8s.io/client-go/util/cert/cert.go

搜索关键字 NewSelfSignedCACert 找到方法,里面有定义 now.Add(duration365d * 10).UTC(), 10 年,改成 100 年:

# 改成 100 年
NotAfter:              now.Add(duration365d * 100).UTC(),

修改文件:cmd/kubeadm/app/constants/constants.go

vim cmd/kubeadm/app/constants/constants.go

搜索关键字 CertificateValidity,可以找到定义的常量 CertificateValidity = time.Hour * 24 * 365 1 年,改为 100 年。

CertificateValidity = time.Hour * 24 * 365 * 100

安装 Go 环境:

# 查看所需要的 go 版本
cat build/build-image/cross/VERSION

# 下载 go
wget https://golang.google.cn/dl/go1.20.1.linux-amd64.tar.gz
mv go1.20.1.linux-amd64.tar.gz /opt/package
cd /opt/package
tar -zxf go1.20.1.linux-amd64.tar.gz
mv go /opt/
mkdir /opt/gopath

# 配置环境变量
cat >> /etc/profile << EOF
# go 配置
export GOROOT=/opt/go
export GOPATH=/opt/gopath
export PATH=\$PATH:\$GOROOT/bin
EOF

#生效
source /etc/profile

# 查看安装结果
go version

编译 Kubeadm:

cd /opt/kubernetes/

# 指定只编译 Kubeadm
make all WHAT=cmd/kubeadm GOFLAGS=-v

编译完成后会在 _output/local/bin/linux/amd64/kubeadm 目录下生成 kubeadm 的二进制文件。将该二进制文件替换掉 Master 节点的二进制文件即可。

替换 Kubeadm 文件。

执行服务器:所有 Master 节点

mv /usr/bin/kubeadm /usr/bin/kubeadm_$(date +%F)

执行服务器:ops

cd _output/local/bin/linux/amd64/

# 发送文件
scp kubeadm root@192.168.2.21:/usr/bin/

# 发送文件
scp kubeadm root@192.168.2.22:/usr/bin/

执行服务器:所有 Master 节点

# 修改权限
chmod 755 /usr/bin/kubeadm

通过上面更新证书的方式再次更新证书,结果如图所示:

Kubernetes集群搭建 kubernetes集群安装_容器_11

可以看到除了 CA 证书以外,其它证书都是 100 年有效期了。

如果想要更新 CA 证书,则需要重新初始化集群。但是没必要,10 年完全够了。

删除节点

有些时候某些机器出现问题可能需要将其下掉,或者在初始化节点的时候信息初始化的有问题需要重新加入,这时候就涉及到删除节点的问题。

具体删除办法如下,Master 节点和 Worker 节点都一样。

# 先将节点标记为不可调度的维护模式
kubectl drain master-02 --delete-local-data --ignore-daemonsets --force

查看标记效果:

Kubernetes集群搭建 kubernetes集群安装_kubernetes_12

可以看到 master-02 节点已经属于不可调度状态。

如果标记标记节点写错了可以恢复调度:

kubectl uncordon master-02

从集群中删除标记节点:

# 删除节点
kubectl delete nodes master-02

在被删除的节点上清空数据:

# 重置节点
kubeadm reset -f

# 清除数据
ipvsadm --clear
rm -rf ~/.kube
rm -rf /var/lib/etcd
rm -rf /etc/kubernetes

# 关闭 kubelet
systemctl stop kubelet

加集群 Token 过期 / 忘记

在集群初始化的时候有生成加入集群的命令,但是这个命令是有有效期的。如果过期或者忘记就需要重新生成。

查看现有的 Token:

kubeadm token list

如果列出的 Token 都过期了,就需要重新生成 Token:

kubeadm token create

此时查看 Token:

Kubernetes集群搭建 kubernetes集群安装_容器_13

这样创建的 Token 有效期为 24 小时。

有了 Token 还不够,Worker 节点加入命令中还需要 --discovery-token-ca-cert-hash CA 证书 Hash 值:

openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

此时就可以生成 Woker 节点加入集群的命令:

kubeadm join 192.168.2.100:6443 --token Token地址 --discovery-token-ca-cert-hash sha256:生成的Hash值

当然这样分两次生成比较麻烦,可以在创建 Token 的时候就直接生成整个 Worker 加入集群命令:

kubeadm token create --print-join-command

如图所示:

Kubernetes集群搭建 kubernetes集群安装_kubernetes_14

对于 Master 节点加入集群,除了 Worker 节点加入集群的参数,还需要 --certificate-key 新生成的证书 Key:

kubeadm init --config /opt/service/kubeadm/kubeadm-config-new.yaml phase upload-certs --upload-certs

此时还会用到初始化集群时候的配置文件,如图所示:

Kubernetes集群搭建 kubernetes集群安装_Kubernetes集群搭建_15

将命令进行拼接:

kubeadm join 192.168.2.100:6443 --token Token地址 --discovery-token-ca-cert-hash sha256:生成的Hash值 --control-plane --certificate-key 生成的Key

对于全新的 Master 节点,使用上面命令加入集群是没问题的,但是如果那个节点是前面踢掉的,就会有问题。

踢掉的 Master 节点加入集群

踢掉的 Master 节点加入集群会出现报错:

[control-plane] Creating static Pod manifest for "kube-scheduler"
[check-etcd] Checking that the etcd cluster is healthy
error execution phase check-etcd: etcd cluster is not healthy: failed to dial endpoint  https://192.168.2.21:2379 with maintenance client: context deadline exceeded
To see the stack trace of this error execute with --v=5 or higher

原因在于集群的 ETCD 中还有存储它的相关信息,需要先清理掉。

# 登录集群的任意 ETCD Pod
kubectl exec -it etcd-master-01 sh -n kube-system

# Pod 中设置登录 ETCD 的命令
export ETCDCTL_API=3
alias etcdctl='etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key'

# 查看集群节点列表
etcdctl member list

# 删除节点
etcdctl member remove 50d272e8d4c41a8e

此时再次清空新的 Master 节点数据,然后加入 Mater 节点则没问题了。

kubeadm reset -f

# 清除数据
ipvsadm --clear
rm -rf ~/.kube
rm -rf /var/lib/etcd
rm -rf /etc/kubernetes

# 关闭 kubelet
systemctl stop kubelet

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

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

相关文章

【消息队列开发】 实现Router类——交换机的转发规则

文章目录 &#x1f343;前言&#x1f340;判断routingKey是否合法&#x1f384;判断bindingKey是否合法&#x1f334;判断bindingKey 与 routingKey 是否匹配&#x1f332;测试匹配方法⭕总结 &#x1f343;前言 本次开发任务 实现Router类&#xff0c; 使用这个类, 来实现交…

【No.12】蓝桥杯可撤销并查集|查找|合并|撤销(C++)

前置知识 蓝桥杯并查集|路径压缩|合并优化|按秩合并|合根植物(C)-CSDN博客 可撤销并查集 关键注意 可撤销并查集的撤销功能如何实现可撤销并查集能不能用路径压缩 可撤销并查集(Reversible Union-Find)是一种扩展了标准并查集(Union-Find)数据结构的数据结构&#xff0c;它允…

你要的个性化生信分析服务今天正式开启啦!定制你的专属解决方案!全程1v1答疑!

之前在 干货满满 | 给生信小白的入门小建议 | 掏心掏肺版 中有提到&#xff0c;如果小伙伴们真的想学好生信&#xff0c;那编程能力是必须要有的&#xff01;但是可能有些小伙伴们并没有那么多的时间从头开始学习编程&#xff0c;又或是希望有人指导或者协助完成生信分析工作&a…

数据库原理及应用期末+考研复试

文章目录 一、数据库系统概述二、数据模型2.1E-R数据模型2.2层次数据模型2.3网状数据模型2.4关系数据模型 三、数据库系统的体系结构3.1数据库系统体系结构3.2数据库系统3.3数据库管理系统 四、关系数据库结构化查询语言——SQL语言4.1基本表定义4.2查询结果显示4.3查询满足条件…

【JDBC编程】 Java程序操作数据库

目录 一、数据库编程的必备条件 二、什么是JDBC&#xff1f; 三、JDBC的使用 1. 准备工作 2. 建立数据库连接 2.1 加载驱动程序 2.2 数据库连接池技术 3. 正式操作 四、JDBC的局限性与MyBatis的优势 一、数据库编程的必备条件 编程语言&#xff0c;如Java&#xff0…

揭秘爆红AI图像增强神器:Magnific AI如何做到1亿像素放大?

最近有个很火的AI图像增强应用&#xff0c;叫Magnific AI。 你知道吗&#xff0c;它发布一个多月就有40万人注册了&#xff01; 这个应用确实非常实用&#xff0c;它不仅利用AI技术放大了图像&#xff0c;还能提升分辨率&#xff0c;从而使图片呈现得更加清晰。 值得一提的是…

观后感-华为中国合作伙伴大会2024

非常荣幸能够参加华为中国合作伙伴大会 2024。以往我参加的会议多数是由政府单独举办的&#xff0c;然而这次进入会场后&#xff0c;我第一感觉就是无比震撼。我从未想过一家企业竟能举办如此规模宏大的会议&#xff0c;当我签到的时候才发现&#xff0c;自己已经是两万多名参会…

环境变量配置

举一个小例子来演示一下环境变量配置。 在CMD中打开QQ界面&#xff0c;首先需要知道QQ.exe文件的完整路径。一旦有了这个路径&#xff0c;可以按照以下步骤操作&#xff1a; 打开CMD窗口。可以通过按下Windows键R&#xff0c;输入“cmd”并回车来打开它。在CMD窗口中&#xf…

2024年语言艺术、人文发展与教育国际会议(ICLAHDE2024)

2024年文学、历史与艺术设计国际会议(ICLHAD2024) 一、【会议简介】 2024年国际语言艺术、人文发展与教育会议&#xff08;ICLAHDE2024&#xff09;将在中国昆明举行&#xff0c;主题为“语言、人文与艺术”。ICLAHDE汇集了来自世界各地语言艺术、人类发展和教育领域的学者、工…

图书推荐|图解算法:C语言实现+视频教学版

零负担理解数据结构及其算法的设计&#xff0c;零基础也能快速上手编程。 本书内容 《图解算法&#xff1a;C语言实现视频教学版》是一本综合讲述数据结构及其算法的入门书&#xff0c;力求简洁、清晰、严谨、且易于学习和掌握。 《图解算法&#xff1a;C语言实现视频教学版》…

【系统架构师】-第6章-数据库设计基础知识

1、三级模式-两级映像 外模式&#xff1a;视图、用户与数据库的接口 概念模式&#xff1a;表 内模式&#xff1a;存储方式&#xff0c;索引创建等 1&#xff09;外模式-模式映射&#xff1a; 视图与表的映射&#xff0c;表数据发生修改&#xff0c;只需要修改映射&#xf…

淘宝店铺如何从1688一键铺货?官方授权API接口,可满足多样化上货需求

那么新手卖家如何将1688的源头厂货一键铺货到淘宝店铺呢&#xff1f;下面我教大家几招&#xff1a; 1、通过淘宝复制一键复制上货 淘宝API接口采集 taobao.item_get 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretStr…

销售数据分析怎么做?用好这5个数据分析方法与模型就足够了。

企业经营其实简单来说就是做买卖&#xff0c;有了买卖自然就产生了销售数据&#xff0c;那怎么能让这些销售数据产生价值呢&#xff1f;答案就是数据分析。通过对销售数据的分析&#xff0c;可以帮助企业及时洞察市场动向&#xff0c;发现企业销售过程中的问题&#xff0c;调整…

用户行为分析是什么?为什么我们需要 bitmap?

本文非常好&#xff1a;https://blog.bcmeng.com/post/doris-bitmap.html meta搜也非常好&#xff1a;https://metaso.cn/ 用户行为分析是什么&#xff1f;简单说&#xff0c;就是围绕全体用户&#xff0c;做各种分析。用户就是一个个的 id。id 在不同方面有各种行为记录&…

c语言--字符转换函数(tolower、toupper.)

目录 一、前言二、使用举例 一、前言 C语⾔提供了2个字符转换函数&#xff1a; int tolower ( int c ); //将参数传进去的⼤写字⺟转⼩写 int toupper ( int c ); //将参数传进去的⼩写字⺟转⼤写二、使用举例 #include <ctype.h> #include<stdio.h> int main(…

母亲的奶牛(蓝桥杯,acwing每日一题)

题目描述&#xff1a; 农夫约翰有三个容量分别为 A,B,C升的挤奶桶。 最开始桶 A 和桶 B 都是空的&#xff0c;而桶 C 里装满了牛奶。 有时&#xff0c;约翰会将牛奶从一个桶倒到另一个桶中&#xff0c;直到被倒入牛奶的桶满了或者倒出牛奶的桶空了为止。 这一过程中间不能有…

LeetCode刷题记录:(12)全排列2

leetcode传送通道 class Solution {List<List<Integer>> result new ArrayList<>();List<Integer> path new ArrayList<>();boolean[] used;public List<List<Integer>> permuteUnique(int[] nums) {used new boolean[nums.lengt…

Java代码基础算法练习-求一个三位数的各位平方之和-2024.03.21

任务描述&#xff1a; 输入一个正整数n&#xff08;取值范围&#xff1a;100<n<1000&#xff09;&#xff0c;然后输出每位数字的平方和。 任务要求&#xff1a; 代码示例&#xff1a; package march0317_0331;import java.util.Scanner;public class m240321 {public …

OpenCV4.9.0开源计算机视觉库安装教程

返回&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 引言&#xff1a;OpenCV系列文章中的安装部分今天全部完成了&#xff0c;为了读者更方便阅读&#xff0c;大家可以按下列索引前往&#xff0c;成文较为仓促有错漏在所难免&#xff0c;欢迎大家指正…

CircuitBreaker熔断器

CircuitBreaker熔断器 1、Hystrix目前也进入维护模式 ​ Hystrix是一个用于处理分布式系统的延迟和容错的开源库&#xff0c;在分布式系统里&#xff0c;许多依赖不可避免的会调用失败&#xff0c;比如超时、异常等&#xff0c;Hystrix能够保证在一个依赖出问题的情况下&…