【一】ubuntu20.04上搭建containerd版( 1.2.4 以上)k8s及kuboard V3

k8s 部署全程在超级用户下进行

sudo su

本文请根据大纲顺序阅读!

一、配置基础环境(在全部节点执行)

1、安装docker 使用apt安装containerd

新版k8s已经弃用docker转为containerd,如果要将docker改为containerd详见:将节点上的容器运行时从 Docker Engine 改为 containerd))

官网文档 : Install Docker Engine on Ubuntu | Docker Documentation

  • 卸载旧版本docker安装包
for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done
  • 更新apt包索引并安装包以允许apt通过 HTTPS 使用存储库:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
  • 添加Docker官方GPG密钥:
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
  • 使用以下命令设置存储库(清华源):
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  • 更新apt包索引:
sudo apt-get update
  • 安装 Docker 引擎、containerd 和 Docker Compose。

旧版 k8s:

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

新版k8s:只需要安装containerd即可,到这一步就可以结束了

sudo apt-get install containerd.io
  • 通过运行镜像来验证Docker Engine安装是否成功 hello-world
sudo docker run hello-world
  • 配置docker 阿里云镜像

加速器地址在阿里云控制台申请:

sudo mkdir -p /etc/docker 

sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://i848vj4w.mirror.aliyuncs.com"] } EOF 

sudo systemctl daemon-reload 
sudo systemctl restart docker

#查看是否配置成功
docker info

1、安装容器运行时

  • 安装containerd

如果你已经执行了上面的教程安装了最新版的docker,实际上containerd也已经被安装,无需重新安装。如果你想单独安装containerd,而不安装docker,请按1、安装docker 使用apt安装containerd 步骤执行并在apt-get install时只执行containerd.io即可,或使用二进制安装

  • 配置 containerd
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
  • 配置阿里云镜像
	[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
		[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]      
          endpoint = ["https://bqr1dr1n.mirror.aliyuncs.com"]      
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."registry.aliyuncs.com/google_containers"]      
          endpoint = ["https://registry.aliyuncs.com/k8sxio"] 

  • 重启 containerd
sudo systemctl restart containerd

2、配置 systemd cgroup驱动

  • 结合 runc 使用 systemd cgroup 驱动,在 /etc/containerd/config.toml 中设置:
sudo vim config.toml
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
  ...
  [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
    SystemdCgroup = true
  • 重启containerd:
sudo systemctl restart containerd

3、禁用Swap分区: Kubernetes不建议在节点上启用Swap分区,因此需要禁用它。可以使用以下命令禁用Swap分区:

swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab

4、在各节点添加hosts配置

vim /etc/hosts

192.168.16.200 k8s-master
192.168.16.201 k8s-node1
192.168.16.202 k8s-node2

5、转发 IPv4 并让 iptables 看到桥接流量

执行下述指令:

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# 设置所需的 sysctl 参数,参数在重新启动后保持不变
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF
# 应用 sysctl 参数而不重新启动
sudo sysctl --system

通过运行以下指令确认 br_netfilteroverlay 模块被加载:

lsmod | grep br_netfilter
lsmod | grep overlay

通过运行以下指令确认 net.bridge.bridge-nf-call-iptablesnet.bridge.bridge-nf-call-ip6tablesnet.ipv4.ip_forward 系统变量在你的 sysctl 配置中被设置为 1:

sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward

6、关闭SELinux(ubuntu默认没有安装)

sudo setenforce 0
vim /etc/selinux/config
SELINUX=disabled

7、安装 kubeadm、kubelet 和 kubectl

  • 更新 apt 包索引并安装使用 Kubernetes apt 仓库所需要的包:
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
  • 下载 Google Cloud 公开签名秘钥(阿里云镜像)
curl -fsSL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-archive-keyring.gpg
  • 添加 Kubernetes apt 仓库(阿里云镜像):
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
  • 更新 apt 包索引,安装 kubelet、kubeadm 和 kubectl,并锁定其版本:
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
#锁定版本
sudo apt-mark hold kubelet kubeadm kubectl

8、时间同步

# 安装 NTP 
sudo apt update 
sudo apt install -y ntp 
# 配置 NTP 服务器 
sudo vim /etc/ntp.conf
#添加ntp服务器 中国开源免费NTP服务器
server cn.pool.ntp.org
#重新启动 NTP 服务:
sudo systemctl restart ntp
#验证时间同步状态:
#查看 NTP 服务器状态 
ntpq -p 
#查看系统时间 
date

9、关闭防火墙

不建议直接关闭防火墙,而是放行要用的端口(但不关闭防火墙容易遇到很多问题)

ufw disable
systemctl disable firewalld #如果是已经启动的pod被防火墙拦截了,有时候需要重启服务器才生效

二、使用kubeadm部署工具安装kubernetes

  • k8s架构示意图

请添加图片描述

1、初始化平面控制器 (control-plane node)

  • docker提前拉取初始化需要的镜像(新版已不使用docker,请跳过… )
#查看镜像版本
kubeadm config images list
命令返回值如下:

registry.k8s.io/kube-apiserver:v1.27.4
registry.k8s.io/kube-controller-manager:v1.27.4
registry.k8s.io/kube-scheduler:v1.27.4
registry.k8s.io/kube-proxy:v1.27.4
registry.k8s.io/pause:3.9
registry.k8s.io/etcd:3.5.7-0
registry.k8s.io/coredns/coredns:v1.10.1

这些镜像是 Kubernetes 集群的核心组件,每个组件都扮演着不同的角色,负责集群的不同功能。以下是这些镜像的作用简介:

  1. registry.k8s.io/kube-apiserver:v1.27.4
    Kube API Server 是 Kubernetes 控制平面的核心组件之一,它提供了 Kubernetes API 的接入点,用于管理集群的操作和资源。它是集群中的主要入口,负责接收 API 请求、身份验证和授权,以及将请求转发到其他控制平面组件。

  2. registry.k8s.io/kube-controller-manager:v1.27.4
    Kube Controller Manager 是 Kubernetes 控制平面的组件之一,它负责管理控制循环,处理不同的控制器任务,例如 ReplicaSet、Deployment、NodeController 等。它持续监控集群状态,并确保期望状态与实际状态一致。

  3. registry.k8s.io/kube-scheduler:v1.27.4
    Kube Scheduler 负责将新创建的 Pod 调度到集群中的节点上。它基于资源需求、亲和性、反亲和性等策略,选择适合的节点来运行 Pod。

  4. registry.k8s.io/kube-proxy:v1.27.4
    Kube Proxy 是 Kubernetes 集群中的网络代理,负责维护节点上的网络规则,以便正确路由到相应的 Pod。它支持负载均衡和服务发现功能。

  5. registry.k8s.io/pause:3.9
    Pause 镜像是一个微型容器,每个 Pod 都会运行一个 Pause 容器作为网络命名空间的初始化进程。它充当了所有容器的父进程,帮助容器共享网络命名空间和存储卷。

  6. registry.k8s.io/etcd:3.5.7-0
    Etcd 是 Kubernetes 集群的分布式键值存储,用于存储集群状态和配置信息。它支持高可用性和一致性,是集群的重要组成部分。

  7. registry.k8s.io/coredns/coredns:v1.10.1
    CoreDNS 是 Kubernetes 集群的默认 DNS 服务,用于处理 Pod 和服务名称解析。它支持插件机制,可以扩展到不同的 DNS 后端和功能。

这些组件一起协同工作,构成了 Kubernetes 集群的核心基础架构,支持容器编排和管理。

  • 由于国内有墙,这里应该是拉不到的,得修改k8s.gcr.io/为国内的镜像registry.aliyuncs.com/google_containers/

  • 编写拉取镜像的脚本

vim kube-init-image-pull.sh
#!/bin/bash

# Get the image list with versions from kubeadm
image_list=$(kubeadm config images list)

# Loop through the images, pull them, rename them, and delete aliased images
for oldimage in $image_list; do

  echo "old image: $oldimage"

  #替换为国内镜像名称
  image=$(echo "$oldimage" | sed 's|registry.k8s.io/|registry.aliyuncs.com/google_containers/|')

  echo "Pulling image: $image"
  
  docker pull $image
  
  #拉取后要修改回原来的名称
  docker tag $image $oldimage

  docker rmi $image
done

chmod 777 kube-init-image-pull.sh
./kube-init-image-pull.sh

coredns如果拉不到 可能是因为名称命名规则不太一样
docker pull registry.aliyuncs.com/google_containers/coredns/coredns:v1.10.1 改为
docker pull registry.aliyuncs.com/google_containers/coredns:v1.10.1
手动拉一下并tag修改名称

1)、使用配置文件初始化master

  • 生成初始化配置文件到kube的目录
kubeadm config print init-defaults > /home/kube/master/init-default.yaml

想了解更多配置 请参阅:kubeadm 配置 (v1beta3) | Kubernetes (p2hp.com)

sudo vim init-default.yaml
  • 需要关注或修改的配置:

kubernetesVersion: 1.27.4

kubeadm version 命令查看控制面的目标版本。

advertiseAddress: 192.168.16.200
bindPort: 6443

表示控制面的稳定ip和端口,填当前节点的ip,端口可以默认6443,这两个值可以使 controlPlaneEndpoint 代替。

imageRepository :registry.aliyuncs.com/google_containers (上面使用脚本提前拉镜像的跳过,因为已经重命名过镜像了,所以这里不需要改!!!改了反而报错。)

设置用来拉取镜像的容器仓库。如果此字段为空,默认使用registry.k8s.io。 当 Kubernetes 用来执行 CI 构造时(Kubernetes 版本以 ci/ 开头), 将默认使用gcr.io/k8s-staging-ci-images 来拉取控制面组件镜像,而使用registry.k8s.io来拉取所有其他镜像。
这里修改为阿里云的源,上面脚本的作用是跟这个配置修改的作用是一样的。	

imagePullPolicy:IfNotPresent

设定 "kubeadm init" 和 "kubeadm join" 操作期间的镜像拉取策略。此字段的取值可以是 "Always"、"IfNotPresent" 或 "Never" 之一。 若此字段未设置,则 kubeadm 使用 "IfNotPresent" 作为其默认值,换言之, 当镜像在主机上不存在时才执行拉取操作。

podSubnet:10.244.0.0/16

podSubnet 为 Pod 所使用的子网。 默认配置没有该选项,在Network选项下给其增加该配置

配置驱动为systemd:

--- 
apiVersion: kubelet.config.k8s.io/v1beta1 
kind: KubeletConfiguration 
cgroupDriver: systemd

参考配置如下:

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: 192.168.16.200
  bindPort: 6443
nodeRegistration:
  criSocket: unix:///var/run/containerd/containerd.sock
  imagePullPolicy: IfNotPresent
  name: node
  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.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: 1.27.4
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
  podSubnet: 10.244.0.0/16
scheduler: {}
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
  • 初始化master
sudo kubeadm init --config=init-default.yaml --ignore-preflight-errors=all
可能会遇到此错误:

错误1:CRI插件被关闭

ERROR CRI]: container runtime is not running: output: time="2023-08-09T21:57:06+08:00" level=fatal msg="validate service connection: CRI v1 runtime API is not implemented for endpoint \"unix:///var/run/containerd/containerd.sock\": rpc error: code = Unimplemented desc = unknown service runtime.v1.RuntimeService"
, error: exit status 1

官网上的解释是:配置 systemd cgroup 驱动
说明:
如果你从软件包(例如,RPM 或者 .deb)中安装 containerd,你可能会发现其中默认禁止了 CRI 集成插件。
你需要启用 CRI 支持才能在 Kubernetes 集群中使用 containerd。 要确保 cri 没有出现在 /etc/containerd/config.toml 文件中 disabled_plugins 列表内。如果你更改了这个文件,也请记得要重启 containerd
如果你在初次安装集群后或安装 CNI 后遇到容器崩溃循环,则随软件包提供的 containerd 配置可能包含不兼容的配置参数。考虑按照 getting-started.md 中指定的 containerd config default > /etc/containerd/config.toml 重置 containerd 配置,然后相应地设置上述配置参数。

vim /etc/containerd/config.toml
#修改这行为[]
#disabled_plugins = ["cri"]
disabled_plugins = []
#重新启动
sudo systemctl restart containerd
#重新初始化master
sudo kubeadm reset
sudo kubeadm init --config=init-default.yaml --ignore-preflight-errors=all

错误2:

[kubelet-check] Initial timeout of 40s passed.

Unfortunately, an error has occurred:
        timed out waiting for the condition

This error is likely caused by:
        - The kubelet is not running
        - The kubelet is unhealthy due to a misconfiguration of the node in some way (required cgroups disabled)

If you are on a systemd-powered system, you can try to troubleshoot the error with the following commands:
        - 'systemctl status kubelet'
        - 'journalctl -xeu kubelet'

Additionally, a control plane component may have crashed or exited when started by the container runtime.
To troubleshoot, list all containers using your preferred container runtimes CLI.
Here is one example how you may list all running Kubernetes containers by using crictl:
        - 'crictl --runtime-endpoint unix:///var/run/containerd/containerd.sock ps -a | grep kube | grep -v pause'
        Once you have found the failing container, you can inspect its logs with:
        - 'crictl --runtime-endpoint unix:///var/run/containerd/containerd.sock logs CONTAINERID'
error execution phase wait-control-plane: couldn't initialize a Kubernetes cluster
To see the stack trace of this error execute with --v=5 or higher
  • 查看详细报错
journalctl -xeu kubelet
  • 显示的错误 (failed to get sandbox image “registry.k8s.io/pause:3.6”) 跟 pause镜像版本对不上,我用的是3.9但是初始化的时候是3.6
#查看镜像版本
kubeadm config images list
#查看containerd拉取的镜像
crictl --runtime-endpoint unix:///var/run/containerd/containerd.sock images
  • 重载沙箱(pause)镜像

在你的 containerd 配置中, 你可以通过设置以下选项重载沙箱镜像:

[plugins."io.containerd.grpc.v1.cri"]
  sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"
systemctl restart containerd
  • master 初始化完成!

Your Kubernetes control-plane has initialized successfully!

初始化完成后 会输出这样一段话:

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.16.200:6443 --token abcdef.0123456789abcdef \
        --discovery-token-ca-cert-hash sha256:438c87675185beeb9a495fc0b51d0993fb810340b5d793aa2b6b915cade42776

最后两行记得拷贝记录一下,后面初始化node的时候会用到

如果是root用户,要运行

export KUBECONFIG=/etc/kubernetes/admin.conf

然后运行

 mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config
  • 部署网络插件
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

这段话提示我们需要部署一个pod network,在以下网址里面有很多种不同的插件,这里我们选择flannel

wget https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f kube-flannel.yml

使用以下命令查看镜像拉取状态,pending可能是还在下载镜像

kubectl get pods -n kube-system -o wide

等全部镜像变成RUNNING状态后,master状态也会变成Ready

kubectl get nodes

2)、使用配置文件初始化node

node的初始化和master的初始化步骤基本一致,除了初始化master的步骤(但要包括那错误例子中pause的配置)不需要做,其他的参考上面步骤重新做一遍即可,不同的是init命令换成了join命令

kubeadm join 192.168.16.200:6443 --token abcdef.0123456789abcdef \
        --discovery-token-ca-cert-hash sha256:438c87675185beeb9a495fc0b51d0993fb810340b5d793aa2b6b915cade42776

就是让你们拷贝的那段,如果忘记了,可以使用以下命令重新获取

kubeadm token create --print-join-command

查看nodes的状态

kubectl get nodes

如果报以下错误

couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp 127.0.0.1:8080: connect: connection refused

查看/etc/kubernetes/kubelet.conf文件是否存在

不存在就先执行

kubeadm reset 后重新 kubeadm join

然后添加到环境变量中

echo "export KUBECONFIG=/etc/kubernetes/kubelet.conf" >> /etc/profile
source /etc/profile

再执行就正常了

kubectl get nodes

看到node和master的状态都是Ready就没问题了!

三、 部署Kuboard控制台

1、搭建Kuboard

在正式安装 kuboard v3 之前,需做好一个简单的部署计划的设计,在本例中,各组件之间的连接方式,如下图所示:

  • 假设用户通过 http://外网IP:80 访问 Kuboard v3;
  • 安装在 Kubernetes 中的 Kuboard Agent 通过 内网IP 访问 Kuboard 的 Web 服务端口 80 和 Kuboard Agent Server 端口 10081。

  • 拉取Kuboard镜像
sudo docker pull eipwork/kuboard:v3
  • 启动kuboard容器
sudo docker run -d \
  --restart=unless-stopped \
  --name=kuboard \
  -p 8080:80/tcp \
  -p 10081:10081/tcp \
  -e KUBOARD_ENDPOINT="http://内网IP:80" \
  -e KUBOARD_AGENT_SERVER_TCP_PORT="10081" \
  -v ./kuboard-data:/data \
  eipwork/kuboard:v3
  # 也可以使用镜像 swr.cn-east-2.myhuaweicloud.com/kuboard/kuboard:v3 ,可以更快地完成镜像下载。
  # 请不要使用 127.0.0.1 或者 localhost 作为内网 IP \
  # Kuboard 不需要和 K8S 在同一个网段,Kuboard Agent 甚至可以通过代理访问 Kuboard Server \

参数解释

  • 建议将此命令保存为一个 shell 脚本,例如 start-kuboard.sh,后续升级 Kuboard 或恢复 Kuboard 时,需要通过此命令了解到最初安装 Kuboard 时所使用的参数;
  • 第 4 行,将 Kuboard Web 端口 80 映射到宿主机的 8080 端口(您可以根据自己的情况选择宿主机的其他端口);
  • 第 5 行,将 Kuboard Agent Server 的端口 10081/tcp 映射到宿主机的 10081 端口(您可以根据自己的情况选择宿主机的其他端口);
  • 第 6 行,指定 KUBOARD_ENDPOINT 为 http://内网IP,如果后续修改此参数,需要将已导入的 Kubernetes 集群从 Kuboard 中删除,再重新导入;
  • 第 7 行,指定 KUBOARD_AGENT_SERVER 的端口为 10081,此参数与第 5 行中的宿主机端口应保持一致,修改此参数不会改变容器内监听的端口 10081,例如,如果第 5 行为 -p 30081:10081/tcp 则第 7 行应该修改为 -e KUBOARD_AGENT_SERVER_TCP_PORT="30081"
  • 第 8 行,将持久化数据 /data 目录映射到脚本文件夹下的kuboard-data` 路径,请根据您自己的情况调整宿主机路径;

其他参数

  • 在启动命令行中增加环境变量 KUBOARD_ADMIN_DERAULT_PASSWORD,可以设置 admin 用户的初始默认密码。

2、 访问 Kuboard v3.x

在浏览器输入 http://your-host-ip:8080 即可访问 Kuboard v3.x 的界面,登录方式:

  • 用户名: admin
  • 密 码: Kuboard123

3、添加K8s集群到Kuboard

  • 选择以agent方式添加k8s集群

  • 选择第二个Agent镜像

  • 拷贝命令并在master上执行
    在这里插入图片描述

注意这里的80端口要更换成你映射到宿主机的端口,比如我设置的是8080

curl -k 'http://192.168.16.200:8080/kuboard-api/cluster/my-kubenetes/kind/KubernetesCluster/my-kubenetes/resource/installAgentToKubernetes?token=zNCekc0Os7YUpsceyJ1Fhcgt90ZmZ9J5' > kuboard-agent.yaml
  • yaml里面的80端口也改成8080
vim kuboard-agent.yaml
  • 启动pods
kubectl apply -f ./kuboard-agent.yaml
  • 查看日志,确保都是RUNNING状态
kubectl get pods -n kuboard -o wide -l "k8s.kuboard.cn/name in (kuboard-agent-25i3sy, kuboard-agent-25i3sy-2)"
  • 集群导入成功
  • 选择管理员角色登录
    在这里插入图片描述
  • 至此整个k8s环境就部署好啦
    ![[Pasted image 20230817200026.png]]

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

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

相关文章

【K8S源码之Pod漂移】整体概况分析 controller-manager 中的 nodelifecycle controller(Pod的驱逐)

参考 k8s 污点驱逐详解-源码分析 - 掘金 k8s驱逐篇(5)-kube-controller-manager驱逐 - 良凯尔 - 博客园 k8s驱逐篇(6)-kube-controller-manager驱逐-NodeLifecycleController源码分析 - 良凯尔 - 博客园 k8s驱逐篇(7)-kube-controller-manager驱逐-taintManager源码分析 - 良…

多维时序 | MATLAB实现PSO-CNN-BiLSTM多变量时间序列预测

多维时序 | MATLAB实现PSO-CNN-BiLSTM多变量时间序列预测 目录 多维时序 | MATLAB实现PSO-CNN-BiLSTM多变量时间序列预测基本介绍模型特点程序设计参考资料 基本介绍 本次运行测试环境MATLAB2021b&#xff0c;MATLAB实现PSO-CNN-BiLSTM多变量时间序列预测。代码说明&#xff1a…

Matplotlib数据可视化(五)

目录 1.绘制折线图 2.绘制散点图 3.绘制直方图 4.绘制饼图 5.绘制箱线图 1.绘制折线图 import matplotlib.pyplot as plt import numpy as np %matplotlib inline x np.arange(9) y np.sin(x) z np.cos(x) # marker数据点样式&#xff0c;linewidth线宽&#xff0c;li…

猿辅导Motiff亮相IXDC 2023国际体验设计大会,发布新功能获行业高度关注

近日&#xff0c;“IXDC 2023国际体验设计大会”在北京国家会议中心拉开序幕&#xff0c;3000设计师、1000企业、200全球商业领袖&#xff0c;共襄为期5天的用户体验创新盛会。据了解&#xff0c;此次大会是以“设计领导力”为主题&#xff0c;分享全球设计、科技、商业的前沿趋…

9.Sentinel哨兵

1.Sentinel Sentinel&#xff08;哨兵&#xff09;是由阿里开源的一款流量控制和熔断降级框架&#xff0c;用于保护分布式系统中的应用免受流量涌入、超载和故障的影响。它可以作为微服务架构中的一部分&#xff0c;用于保护服务不被异常流量冲垮&#xff0c;从而提高系统的稳定…

StreamingWarehouse的一些思考和未来趋势

300万字&#xff01;全网最全大数据学习面试社区等你来&#xff01; 一篇笔记。 以Hudi、Iceberg、Paimon这几个框架为例&#xff0c;它们支持高效的数据流/批读写、数据回溯以及数据更新。具备一些传统的实时和离线数仓不具备的特性&#xff0c;主要有几个方面&#xff1a; 这…

接口文档管理解决方案调研及Torna+Smart-doc的使用

文章目录 一、现状二、需求三、调研Swagger官方地址介绍 Knife4j官方地址介绍 Apifox官方地址介绍 Smart-doc Torna官方地址介绍 EasyYapi Yapi官方地址介绍 四、对比&#xff08;一&#xff09;Swagger1、部署方式2、优点3、缺点4、分享方式 &#xff08;二&#xff09;Knif…

VS+Qt 自定义Dialog

与QtCreator不同&#xff0c;刚用VS添加Qt Dialog界面有点懵&#xff0c;后整理了下&#xff1a; 1.右击项目&#xff0c;选择“添加-模块”&#xff0c;然后选择“Qt-Qt Widgets Class” 2.选择基类[1]QDialog,更改[2]ui文件名称&#xff0c;修改定义Dialog[3]对应类名&#…

学习Linux的注意事项(使用经验;目录作用;服务器注意事项)

本篇分享学习Linux过程中的一些经验 文章目录 1. Linux系统的使用经验2. Linux各目录的作用3. 服务器注意事项 1. Linux系统的使用经验 Linux严格区分大小写Linux中所有内容以文件形式保存&#xff0c;包括硬件&#xff0c;Linux是以管理文件的方式操作硬件 硬盘文件是/dev/s…

第4篇:vscode+platformio搭建esp32 arduino开发环境

第1篇:Arduino与ESP32开发板的安装方法 第2篇:ESP32 helloword第一个程序示范点亮板载LED 第3篇:vscode搭建esp32 arduino开发环境 1.配置默认安装路径&#xff0c;安装到D盘。 打开环境变量&#xff0c;点击新建 输入变量名PLATFORMIO_CORE_DIR与路径&#xff1a;D:\PLATF…

SpringBoot案例-配置文件-@ConfigurationProperties

问题分析 在往期的配置参数的文章中&#xff0c;对于阿里云OSS的参数时设置在yml配置文件中&#xff0c;然后使用Value&#xff08;”${}“&#xff09;对参数进行赋值&#xff0c;具体如下&#xff1a; 此种方法比较繁琐 问题解决 使用注解 Data 为变量自动生成get/set方…

游戏反外挂方案解析

近年来&#xff0c;游戏市场高速发展&#xff0c;随之而来的还有图谋利益的游戏黑产。在利益吸引下&#xff0c;游戏黑产扩张迅猛&#xff0c;已发展成具有庞大规模的产业链&#xff0c;市面上游戏受其侵扰的案例屡见不鲜。 据《FairGuard游戏安全2022年度报告》数据统计&…

IP协议报文结构

IP报文结构 4位版本号: 指定IP协议的版本, 对于IPv4来说, 就是4.4位头部长度: IP头部的长度是多少个32bit, 也就是 length * 4 的字节数. 4bit表示最大的数字是15, 因此IP头部最大长度是60字节.8位服务类型: 3位优先权字段(已经弃用) 4位TOS字段 1位保留字段(必须置为0). 4位…

C语言练习1(巩固提升)

C语言练习1 选择题 前言 “人生在勤&#xff0c;勤则不匮。”幸福不会从天降&#xff0c;美好生活靠劳动创造。全面建成小康社会的奋斗目标&#xff0c;为广大劳动群众指明了光明的未来&#xff1b;全面建成小康社会的历史任务&#xff0c;为广大劳动群众赋予了光荣的使命&…

缓存的设计方式

问题情况&#xff1a; 当有大量的请求到内部系统时&#xff0c;若每一个请求都需要我们操作数据库&#xff0c;例如查询操作&#xff0c;那么对于那种数据基本不怎么变动的数据来说&#xff0c;每一次都去数据库里面查询&#xff0c;是很消耗我们的性能 尤其是对于在海量数据…

和鲸 ModelWhale 与中科可控多款服务器完成适配认证,赋能中国云生态

当前世界正处于新一轮技术革命及传统产业数字化转型的关键期&#xff0c;云计算作为重要的技术底座&#xff0c;其产业发展与产业规模对我国数字经济的高质量运行有着不可取代的推动作用。而随着我国数字上云、企业上云加快进入常规化阶段&#xff0c;云计算承载的业务应用越来…

VBA技术资料MF44:VBA_把数据从剪贴板粘贴到Excel

【分享成果&#xff0c;随喜正能量】人皆知以食愈饥&#xff0c;莫知以学愈愚,生命中所有的不期而遇都是你努力的惊喜.人越纯粹&#xff0c;就越能感受到美。大江、大河、大海、大山、大自然&#xff0c;这些风景从来都不会受“属于谁”的污染&#xff0c;人人都感受到它们的美…

解密长短时记忆网络(LSTM):从理论到PyTorch实战演示

目录 1. LSTM的背景人工神经网络的进化循环神经网络&#xff08;RNN&#xff09;的局限性LSTM的提出背景 2. LSTM的基础理论2.1 LSTM的数学原理遗忘门&#xff08;Forget Gate&#xff09;输入门&#xff08;Input Gate&#xff09;记忆单元&#xff08;Cell State&#xff09;…

正则中常见的流派及其特性

目前正则表达式主要有两大流派&#xff08;Flavor&#xff09;&#xff1a;POSIX 流派与 PCRE 流派。 1、 POSIX 流派 POSIX 规范定义了正则表达式的两种标准&#xff1a; BRE 标准&#xff08;Basic Regular Expression 基本正则表达式&#xff09;&#xff1b;ERE 标准&am…

探索PDF校对:为何这是现代数字文档的关键步骤

在今日的数字化浪潮中&#xff0c;文档的创建与分享从未如此频繁。尤其是PDF&#xff0c;作为一个普遍接受的标准文件格式&#xff0c;其在企业、学术和日常生活中的应用已经无处不在。但随之而来的挑战是如何确保文档的准确性和专业性。让我们深入探索PDF校对的重要性以及它为…