实战:Kind部署k8s集群-2022.12.6(成功测试)

news2024/11/24 7:56:51

写在前面

原文阅读效果更佳:实战:Kind部署k8s集群-2022.12.6(成功测试) · 语雀 《实战:Kind部署k8s集群-2022.12.6(成功测试)》

Kind

Kind 是 Kubernetes in Docker 的简写,是一个使用 Docker 容器作为 Node 节点,在本地创建和运行Kubernetes 集群的工具。适用于在本机创建 Kubernetes 集群环境进行开发和测试。使用 Kind 搭建的集群无法在生产中使用,但是如果你只是想在本地简单的玩玩 K8s,不想占用太多的资源,那么使用 Kind 是你不错的选择。

Kind 内部也是使用 Kubeadm 创建和启动集群节点,并使用 Containerd 作为容器运行时,所以弃用 dockershim对 Kind 没有什么影响。

Kind 的架构图如下所示,它将 Docker 容器作为 Kubernetes 的 Node 节点,并在该 Node 中安装 Kubernetes组件,包括一个或者多个 Control Plane 和一个或者多个 Work Nodes。这就解决了在本机运行多个 Node 的问题,而不需要虚拟化

官方网站

kind

封面

1、安装

💘 实战:kind安装k8s集群-2022.12.6(成功测试)

实验环境

docker v20.10.21
kind v0.17.0

实验软件

链接:百度网盘 请输入提取码

提取码:we3l

--来自百度网盘超级会员V7的分享

2022.12.6-kind-software

1、安装docker

要使用 Kind 的前提是提供一个 Docker 环境,可以使用下面的命令快速安装。

sudo sh -c "$(curl -fsSL https://get.docker.com)"

当然也可以使用桌面版,比如我本地是 Mac m1 环境,安装了 Docker Desktop 版本。

具体安装docker过程,请看如下文档:

实战:centos在线安装docker(成功测试)-2022.8.4 · 语雀 《1、实战:centos在线安装docker(成功测试)-2022.8.4》

Docker 安装过后接下来可以安装一个 kubectl 工具,Kind 本身不需要 kubectl,安装 kubectl 可以在本机直接管理 Kubernetes 集群。

2、安装kubectl

Linux 系统

[root@docker ~]#curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   138  100   138    0     0    253      0 --:--:-- --:--:-- --:--:--   252
100 42.9M  100 42.9M    0     0  10.6M      0  0:00:04  0:00:04 --:--:-- 15.9M

[root@docker ~]#sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl

#验证版本
[root@docker ~]# kubectl version  --client
WARNING: This version information is deprecated and will be replaced with the output from kubectl version --short.  Use --output=yaml|json to get the full version.
Client Version: version.Info{Major:"1", Minor:"25", GitVersion:"v1.25.4", GitCommit:"872a965c6c6526caa949f0c6ac028ef7aff3fb78", GitTreeState:"clean", BuildDate:"2022-11-09T13:36:36Z", GoVersion:"go1.19.3", Compiler:"gc", Platform:"linux/amd64"}
Kustomize Version: v4.5.7

MacOS 系统

brew install kubectl

#验证版本
kubectl version client

3、安装Kind

接下来就可以安装 Kind 了,最简单的方式是在 Github Release 页面 直接下载对应的安装包即可,比如我们这里安装最新的 v0.17.0 版本:

[root@docker ~]# wget https://github.com/kubernetes-sigs/kind/releases/download/v0.17.0/kind-linux-amd64

# 可以使用下面的命令加速
# wget https://ghps.cc/https://github.com/kubernetes-sigs/kind/releases/download/v0.17.0/kind-darwin-amd64

[root@docker ~]#chmod +x kind-linux-amd64
[root@docker ~]#sudo mv kind-linux-amd64 /usr/local/bin/kind

# 验证版本
[root@docker ~]#kind version
kind v0.17.0 go1.19.2 linux/amd64

安装成功。😘

对于 Mac 系统也可以使用 brew install kind 进行一键安装。

2、操作

要了解 Kind 的操作,最简单的方式就是直接执行一条 kind 命令,或者 kind -h,这也是我们了解任何 CLI 工具最基础的方法:

[root@docker ~]#kind -h
kind creates and manages local Kubernetes clusters using Docker container 'nodes'

Usage:
  kind [command]

Available Commands:
  build       Build one of [node-image]
  completion  Output shell completion code for the specified shell (bash, zsh or fish)
  create      Creates one of [cluster]
  delete      Deletes one of [cluster]
  export      Exports one of [kubeconfig, logs]
  get         Gets one of [clusters, nodes, kubeconfig]
  help        Help about any command
  load        Loads images into nodes
  version     Prints the kind CLI version

Flags:
  -h, --help              help for kind
      --loglevel string   DEPRECATED: see -v instead
  -q, --quiet             silence all stderr output
  -v, --verbosity int32   info log verbosity, higher value produces more output
      --version           version for kind

Use "kind [command] --help" for more information about a command.

从上面的命令可以看出 kind 工具包含很多可用的命令,比如 build 、create、 delete、load 等等。

其中最重要的应该属于 create 命令了,该命令可以用来创建一个集群,用同样的方式我们可以继续查看 kind create 命令的使用方法:

[root@docker ~]#kind create -h
Creates one of local Kubernetes cluster (cluster)

Usage:
  kind create [flags]
  kind create [command]

Available Commands:
  cluster     Creates a local Kubernetes cluster

Flags:
  -h, --help   help for create

Global Flags:
      --loglevel string   DEPRECATED: see -v instead
  -q, --quiet             silence all stderr output
  -v, --verbosity int32   info log verbosity, higher value produces more output

Use "kind create [command] --help" for more information about a command.

可以看出只有一个 cluster 子命令可用,但是该子命令后面如何操作呢?

[root@docker ~]#kind create cluster -h
Creates a local Kubernetes cluster using Docker container 'nodes'

Usage:
  kind create cluster [flags]

Flags:
      --config string       path to a kind config file
  -h, --help                help for cluster
      --image string        node docker image to use for booting the cluster
      --kubeconfig string   sets kubeconfig path instead of $KUBECONFIG or $HOME/.kube/config
  -n, --name string         cluster name, overrides KIND_CLUSTER_NAME, config (default kind)
      --retain              retain nodes for debugging when cluster creation fails
      --wait duration       wait for control plane node to be ready (default 0s)

Global Flags:
      --loglevel string   DEPRECATED: see -v instead
  -q, --quiet             silence all stderr output
  -v, --verbosity int32   info log verbosity, higher value produces more output

可以看到 create cluster 后面没有可用的子命令了,但是有一些 Flags 标志可以传递,但其实不传递任何的参数也可以创建一个 K8s 集群,这属于最简单创建 K8s 的方式,只需要执行如下所示的命令即可创建一个默认的集群(目前最新版本只支持到 K8s v1.25.3 版本):

[root@docker ~]#kind create cluster
Creating cluster "kind" ...
 ✓ Ensuring node image (kindest/node:v1.25.3) 🖼 
 ✓ Preparing nodes 📦  
 ✓ Writing configuration 📜 
 ✓ Starting control-plane 🕹️ 
 ✓ Installing CNI 🔌 
 ✓ Installing StorageClass 💾 
Set kubectl context to "kind-kind"
You can now use your cluster with:

kubectl cluster-info --context kind-kind

Not sure what to do next? 😅  Check out https://kind.sigs.k8s.io/docs/user/quick-start/

创建完成后就可以直接使用 kubectl 命令管理该 K8s 集群了:

[root@docker ~]#kubectl get node
NAME                 STATUS   ROLES           AGE   VERSION
kind-control-plane   Ready    control-plane   56s   v1.25.3
[root@docker ~]#kubectl get po -A
NAMESPACE            NAME                                         READY   STATUS    RESTARTS   AGE
kube-system          coredns-565d847f94-k2db5                     1/1     Running   0          42s
kube-system          coredns-565d847f94-v4vhc                     1/1     Running   0          42s
kube-system          etcd-kind-control-plane                      1/1     Running   0          56s
kube-system          kindnet-6599x                                1/1     Running   0          42s
kube-system          kube-apiserver-kind-control-plane            1/1     Running   0          56s
kube-system          kube-controller-manager-kind-control-plane   1/1     Running   0          56s
kube-system          kube-proxy-gpf4b                             1/1     Running   0          42s
kube-system          kube-scheduler-kind-control-plane            1/1     Running   0          56s
local-path-storage   local-path-provisioner-684f458cdd-wjlwr      1/1     Running   0          42s

#kind create cluster,kind创建集群的时候从,他会自动去配置kubeconfig文件,所以可直接使用kubectl管理kind创建的集群。
#kindnet是kind安装k8s集群是已经默认配置好的cni插件;

默认的集群名称为 kind,在创建的时候我们可以使用参数 --name 指定创建的集群名称,可以创建多个群集:

[root@docker ~]#kind create cluster --name kind-2
Creating cluster "kind-2" ...
 ✓ Ensuring node image (kindest/node:v1.25.3) 🖼
 ✓ Preparing nodes 📦  
 ✓ Writing configuration 📜 
 ✓ Starting control-plane 🕹️ 
 ✓ Installing CNI 🔌 
 ✓ Installing StorageClass 💾 
Set kubectl context to "kind-kind-2"
You can now use your cluster with:

kubectl cluster-info --context kind-kind-2

Not sure what to do next? 😅  Check out https://kind.sigs.k8s.io/docs/user/quick-start/

此外还可以指定启动集群的 Node 镜像:

[root@docker ~]#kind create cluster --name kind-3 --image kindest/node:v1.23.4
Creating cluster "kind-3" ...
 ✓ Ensuring node image (kindest/node:v1.23.4) 🖼 
 ✓ Preparing nodes 📦  
 ✓ Writing configuration 📜 
 ✓ Starting control-plane 🕹️ 
 ✓ Installing CNI 🔌 
 ✓ Installing StorageClass 💾 
Set kubectl context to "kind-kind-3"
You can now use your cluster with:

kubectl cluster-info --context kind-kind-3

Thanks for using kind! 😊

[root@docker ~]#kubectl get node
NAME                   STATUS   ROLES                  AGE     VERSION
kind-3-control-plane   Ready    control-plane,master   4m49s   v1.23.4

然后可以使用 kind get clusters 命令来获取集群列表:

[root@docker ~]#kind get clusters
kind
kind-2

当有多个集群的时候,我们可以使用 kubectl 来切换要管理的集群:

# 切换到集群 `kind`
[root@docker ~]#kubectl config use-context kind-kind
Switched to context "kind-kind".

# 切换到集群 `kind-2`
[root@docker ~]#kubectl config use-context kind-kind-2
Switched to context "kind-kind-2".

要删除集群也非常简单,比如要删除 kind-2 集群:

[root@docker ~]#kind delete cluster --name kind-2
Deleting cluster "kind-2" ...

Kind 集群中的 Docker 镜像可以从互联网直接拉取,有时候可能比较缓慢,我们可以将本机镜像导入到 Kind 集群中去,比如使用如下命令可以将镜像导入到 kind-control-plane 节点去:

[root@docker ~]# kind load docker-image --nodes kind-control-plane nginx:mainline-alpine
Image: "" with ID "sha256:cc44224bfe208a46fbc45471e8f9416f66b75d6307573e29634e7f42e27a9268" not yet present on node "kind-control-plane", loading...


#测试过程:
1、宿主机拉取测试镜像
[root@docker ~]#docker images
REPOSITORY     TAG       IMAGE ID       CREATED        SIZE
kindest/node   <none>    d8644f660df0   5 weeks ago    898MB
kindest/node   v1.23.4   6b76f7b7813a   9 months ago   1.47GB
[root@docker ~]#docker pull  nginx:mainline-alpine
mainline-alpine: Pulling from library/nginx
59bf1c3509f3: Pull complete 
f3322597df46: Pull complete 
d09cf91cabdc: Pull complete 
3a97535ac2ef: Pull complete 
919ade35f869: Pull complete 
40e5d2fe5bcd: Pull complete 
Digest: sha256:eb05700fe7baa6890b74278e39b66b2ed1326831f9ec3ed4bdc6361a4ac2f333
Status: Downloaded newer image for nginx:mainline-alpine
docker.io/library/nginx:mainline-alpine
[root@docker ~]#docker images
REPOSITORY     TAG               IMAGE ID       CREATED         SIZE
kindest/node   <none>            d8644f660df0   5 weeks ago     898MB
kindest/node   v1.23.4           6b76f7b7813a   9 months ago    1.47GB
nginx          mainline-alpine   cc44224bfe20   11 months ago   23.5MB

2、进入到kind节点(容器)
[root@docker ~]#kubectl get node
NAME                 STATUS   ROLES           AGE   VERSION
kind-control-plane   Ready    control-plane   26m   v1.25.3
[root@docker ~]#docker ps
CONTAINER ID   IMAGE                  COMMAND                  CREATED          STATUS          PORTS                       NAMES
24c2e3b39d3b   kindest/node:v1.25.3   "/usr/local/bin/entr…"   27 minutes ago   Up 26 minutes   127.0.0.1:46202->6443/tcp   kind-control-plane
[root@docker ~]#docker exec -it kind-control-plane /bin/sh
# ctr -n k8s.io i ls -q
docker.io/kindest/kindnetd:v20221004-44d545d1
docker.io/kindest/local-path-helper:v20220607-9a4d8d2a
docker.io/kindest/local-path-provisioner:v0.0.22-kind.0
import-2022-10-25@sha256:0dae4b69c2aa90e6c24691ebbe2e860e2a1ae68463a622c627fb58110153d950
import-2022-10-25@sha256:1c35781a4b6011d5c27bedbba7ca130db72c4aaf74d108c60bc77ae49130e5e4
import-2022-10-25@sha256:4002c19dafb94b1995fc598fae590f70cac10135f61ca2551bd97aae37ed9c4a
import-2022-10-25@sha256:409b0e81d9aecf59df96df445a3171f43e2ae834ef6c9e77b1492c4d19bfd78d
registry.k8s.io/coredns/coredns:v1.9.3
registry.k8s.io/etcd:3.5.4-0
registry.k8s.io/kube-apiserver:v1.25.3
registry.k8s.io/kube-controller-manager:v1.25.3
registry.k8s.io/kube-proxy:v1.25.3
registry.k8s.io/kube-scheduler:v1.25.3
registry.k8s.io/pause:3.7
sha256:221177c6082a88ea4f6240ab2450d540955ac6f4d5454f0e15751b653ebda165
sha256:4bc1b1e750e34e3fbb542febefe990232575c949ccc07836125e23f3b1881a56
sha256:4c1e997385b8fb4ad4d1d3c7e5af7ff3f882e94d07cf5b78de9e889bc60830e6
sha256:5185b96f0becf59032b8e3646e99f84d9655dff3ac9e2605e0dc77f9c441ae4a
sha256:5225724a11400a83db6efe486e37aeaec871f0e15b19e82c9160b7c3de880875
sha256:580dca99efc3bb79350e610acca6242f13442633087f3187f7264adbddfbda07
sha256:86063cd68dfc91a931a6e095a0f796643990ce18d7edf0bbc3385c85bc95c1ab
sha256:a8a176a5d5d698f9409dc246f81fa69d37d4a2f4132ba5e62e72a78476b27f66
sha256:d2f902e939cc38784e56ec30c102ef01a019e13a3b31d4c23332ffdd0244a632
sha256:d6e3e26021b60c625f0ef5b2dd3f9e22d2d398e05bccc4fdd7d59fbbb6a04d3f
# ctr -n k8s.io i ls -q|grep nginx
#

3、导入镜像
[root@docker ~]# kind load docker-image --nodes kind-control-plane nginx:mainline-alpine
Image: "" with ID "sha256:cc44224bfe208a46fbc45471e8f9416f66b75d6307573e29634e7f42e27a9268" not yet present on node "kind-control-plane", loading...


4、验证
# ctr -n k8s.io i ls -q|grep nginx
docker.io/library/nginx:mainline-alpine

3、配置集群

上面我们介绍的是 kind 命令的一些常用操作,此外我们还可以通过一个文件来配置要创建的 K8s 集群,比如定义一个如下所示的 config.yaml 文件:

[root@docker ~]#vim config.yaml

# config.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
name: demo
nodes:
 - role: control-plane
 - role: worker
 - role: worker

该配置文件表示我们一共要创建 3 个节点,一个控制节点,两个工作节点,在创建集群的时候只需要通过 --config 参数指定该文件即可:

[root@docker ~]#kind create cluster --config config.yaml
Creating cluster "demo" ...
 ✓ Ensuring node image (kindest/node:v1.25.3) 🖼
 ✓ Preparing nodes 📦 📦 📦  
 ✓ Writing configuration 📜 
 ✓ Starting control-plane 🕹️ 
 ✓ Installing CNI 🔌 
 ✓ Installing StorageClass 💾 
 ✓ Joining worker nodes 🚜 
Set kubectl context to "kind-demo"
You can now use your cluster with:

kubectl cluster-info --context kind-demo

Not sure what to do next? 😅  Check out https://kind.sigs.k8s.io/docs/user/quick-start/

创建后的集群名称为 demo ,一共包括 3 个节点:

[root@docker ~]#kubectl get node
NAME                 STATUS   ROLES           AGE   VERSION
demo-control-plane   Ready    control-plane   74s   v1.25.3
demo-worker          Ready    <none>          34s   v1.25.3
demo-worker2         Ready    <none>          34s   v1.25.3
[root@docker ~]#kubectl get  po -A
NAMESPACE            NAME                                         READY   STATUS    RESTARTS   AGE
kube-system          coredns-565d847f94-8snf4                     1/1     Running   0          62s
kube-system          coredns-565d847f94-dwdn6                     1/1     Running   0          62s
kube-system          etcd-demo-control-plane                      1/1     Running   0          76s
kube-system          kindnet-jjj7l                                1/1     Running   0          63s
kube-system          kindnet-l69rg                                1/1     Running   0          37s
kube-system          kindnet-sljw7                                1/1     Running   0          34s
kube-system          kube-apiserver-demo-control-plane            1/1     Running   0          74s
kube-system          kube-controller-manager-demo-control-plane   1/1     Running   0          77s
kube-system          kube-proxy-2rlsr                             1/1     Running   0          63s
kube-system          kube-proxy-s8cmz                             1/1     Running   0          34s
kube-system          kube-proxy-sdskq                             1/1     Running   0          37s
kube-system          kube-scheduler-demo-control-plane            1/1     Running   0          74s
local-path-storage   local-path-provisioner-684f458cdd-x97z8      1/1     Running   0          62s

创建一个 HA 模式的控制平面的k8s集群

如果想创建一个 HA 模式的控制平面,那么我们可以定义如下所示的配置文件,只需要指定 3 个(奇数个) control-plane 角色的节点即可:

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
 - role: control-plane
 - role: control-plane
 - role: control-plane
 - role: worker
 - role: worker
 - role: worker
 
# 注意:这里是的HA是用ha-proxy来实现的。 

此外我们还可以将 Node 的端口映射到宿主机,通过配置文件中的 extraPortMappings 属性可以实现该功能,如下所示配置可以将 control-plane 节点 80 端口映射到宿主机的 80 端口上:

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
 - role: control-plane
   extraPortMappings:
     - containerPort: 80
       hostPort: 80
       listenAddress: "0.0.0.0" # Optional, defaults to "0.0.0.0"
       protocol: udp # Optional, defaults to tcp

如果要将端口映射与 NodePort 一起使用,kind 节点的 containerPort 和 Service 的 nodePort 需要相等。

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
 - role: control-plane
 extraPortMappings:
 - containerPort: 30950
 hostPort: 80

然后将 nodePort 设置为 30950。

kind: Pod
apiVersion: v1
metadata:
 name: foo
 labels:
 app: foo
 
 spec:
 containers:
 - name: foo
 image: hashicorp/http-echo:0.2.3
 args:
 - "-text=foo"
 ports:
 - containerPort: 5678
""+
apiVersion: v1
kind: Service
metadata:
 name: foo
spec:
 type: NodePort
 ports:
 - name: http
 nodePort: 30950
 port: 5678
 selector:
 app: foo

同样我们也可以在配置文件中指定 Node 的容器镜像版本运行指定版本的 Kubernetes 群集。可以在官方 release 页面中中查找需要镜像 tag,带上 sha256 shasum(非必须),例如:

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
 - role: control-plane
 image:
kindest/node:v1.18.15@sha256:5c1b980c4d0e0e8e7eb9f36f7df525d079a96169c8a8f20d8bd108c0d08
89cc4
 - role: worker
 image:
kindest/node:v1.18.15@sha256:5c1b980c4d0e0e8e7eb9f36f7df525d079a96169c8a8f20d8bd108c0d08
89cc4

此外还有一些其他定制操作,比如 Kind 创建的集群默认自带一个轻量级的 CNI 插件 kindnetd ,我们也可以禁用默认设置来安装其他 CNI,比如 Calico。

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
networking:
# the default CNI will not be installed
 disableDefaultCNI: true

还可以在 iptables 和 ipvs 之间配置将要使用的 kube-proxy 模式,默认情况下使用 iptables :

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
networking:
 kubeProxyMode: "ipvs"

另外我们可以讲宿主机的路径挂载到某个节点上用于数据持久化等。

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
 - role: control-plane
# add a mount from /path/to/my/files on the host to /files on the node
 extraMounts:
 - hostPath: /path/to/my/files
 containerPath: /files

我们还可以给节点定制不同的标签,这对于节点筛选非常有用,只需要在节点中添加 labels 配置即可。

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
 - role: control-plane
 - role: worker
 extraPortMappings:
 - containerPort: 30950
 hostPort: 80
 labels:
 tier: frontend
 - role: worker
 labels:
 tier: backend

Kind 使用 Kubeadm 来配置的集群节点,他会在第一个控制平面节点上运行 kubeadm init 命令,我们可以使用kubeadm InitConfiguration 来进行一些定制。

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
 - role: control-plane
 kubeadmConfigPatches:
 - |
 kind: InitConfiguration
 nodeRegistration:
 kubeletExtraArgs:
 node-labels: "my-label=true"

如果你想进行更多的定制,那么在 kubeadm init 期间有四种配置类型可用: InitConfiguration 、ClusterConfiguration 、 KubeProxyConfiguration、 KubeletConfiguration。例如,我们可以使用kubeadm ClusterConfiguration 来覆盖 apiserver 标志:

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
 - role: control-plane
 kubeadmConfigPatches:
 - |
 kind: ClusterConfiguration
 apiServer:
 extraArgs:
 enable-admission-plugins:
NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook

在 Kind 集群中的 worker 或控制平面(在 HA 模式下)节点上,Kind 会执行 kubeadm join 命令,我们也可以使用JoinConfiguration (spec) 来进行定制:

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
 - role: control-plane
 - role: worker
 - role: worker
 kubeadmConfigPatches:
 - |
 kind: JoinConfiguration
 nodeRegistration:
 kubeletExtraArgs:
 node-labels: "my-label2=true"
 - role: control-plane
 kubeadmConfigPatches:
 - |
 kind: JoinConfiguration
 nodeRegistration:
 kubeletExtraArgs:
 node-labels: "my-label3=true"

此外 Kind 还有很多其他的实践方式,在后续课程中我们也会慢慢接触到。

关于我

我的博客主旨:

  • 排版美观,语言精炼;
  • 文档即手册,步骤明细,拒绝埋坑,提供源码;
  • 本人实战文档都是亲测成功的,各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人帮您解决问题,让我们一起进步!

🍀 微信二维码

x2675263825 (舍得), qq:2675263825。

🍀 微信公众号

《云原生架构师实战》

🍀 语雀

彦 · 语雀

语雀博客 · 语雀 《语雀博客》

🍀 博客

www.onlyyou520.com

🍀 csdn

一念一生~one的博客_CSDN博客-k8s,Linux,git领域博主

🍀 知乎

一个人 - 知乎

结尾

好了,关于本次就到这里了,感谢大家阅读,最后祝大家生活快乐,每天都过的有意义哦,我们下期见!

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

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

相关文章

通关算法题之 ⌈栈和队列⌋

栈和队列 155. 最小栈 设计一个支持 push &#xff0c;pop &#xff0c;top 操作&#xff0c;并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获取…

文件系统实现

文件系统实现&#x1f3de;️1. 整体组织&#x1f301;2. 文件组织&#xff1a;inode&#x1f320;3. 多级索引&#x1f4d6;3.1 间接指针&#x1f4d6;3.2 多重间接指针&#x1f4d6;3.3 基于范围的方法&#x1f30c;4. 目录组织⛺5. 空闲空间管理&#x1f33f;6. 读取和写入文…

Vue 官方文档2.x教程学习笔记 1 基础 1.7 条件渲染

Vue 官方文档2.x教程学习笔记 文章目录Vue 官方文档2.x教程学习笔记1 基础1.7 条件渲染1.7.1 v-if1.7.2 在\<template> 元素上使用 v-if条件渲染分组1.7.3 v-else1.7.4 v-else-if1.7.5 用 key 管理可复用的元素1.7.6 v-show1.7.7 v-if vs v-show1.7.8 v-if 与 v-for 一起…

小网SIM卡QMI拨号无法获取IPv6地址问题的分析

背景 客户反馈设备插小网卡驻网并加载qmi_wwan驱动后,使用多路拨号工具进行两路拨号,第一路无法获取IPv6地址,但是插现网卡测试是没有问题的。具体测试方法如下图: Check后只有第二路有PDN驻网请求,如下图,建议排查QMI拨号工具 分析流程 首先根据客户提供的方法对问…

day6_redis学习

文章目录关注和取关查看其他用户界面及共同关注关注推送关注和取关 因为关注用户的时候可能涉及到共同关注的对象&#xff0c;所以需要利用到交集&#xff0c;而在Redis中可以使用交集的&#xff0c;是Set以及ZSet数据结构&#xff0c;但是显然这里并不需要排序&#xff0c;所…

Java学习之多态二

目录 一、运用多态解决宠物喂食问题 原理分析 运行测试 运行结果 分析 增加宠物和食物种类 Pig类 Rice类 测试 运行结果 一、运用多态解决宠物喂食问题 改变Master类的feed方法的参数列表 package com.hspedu.poly_;public class Master {private String name;public…

基于机器学习之模型树短期负荷预测(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f4dd;目前更新&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;电力系统相关知识&#xff0c;期刊论文&…

Python 中的 Raincloud 图绘制

Python 中的 Raincloud 图 提示&#xff1a;一种强大的数据可视化方法&#xff0c;由小提琴图、散点图和箱线图的组合组成 提示&#xff1a;目录 Python 中的 Raincloud 图绘制Python 中的 Raincloud 图前言一、什么是 Raincloud 图&#xff1f;二、使用步骤1.加载数据集2.读入…

S7协议抓包分析(附pcap数据包)

一、S7协议概述 1、S7协议简介 S7comm&#xff08;S7 通信&#xff09;是西门子专有协议&#xff0c;可在西门子 S7-300/400 系列的可编程逻辑控制器 (PLC) 之间运行。它用于 PLC 编程、PLC 之间的数据交换、从 SCADA&#xff08;监控和数据采集&#xff09;系统访问 PLC 数据…

刷爆力扣之最长连续递增序列

刷爆力扣之最长连续递增序列 HELLO&#xff0c;各位看官大大好&#xff0c;我是阿呆 &#x1f648;&#x1f648;&#x1f648; 今天阿呆继续记录下力扣刷题过程&#xff0c;收录在专栏算法中 &#x1f61c;&#x1f61c;&#x1f61c; 该专栏按照不同类别标签进行刷题&#…

代码随想录算法训练营第五十五天|392. 判断子序列、115. 不同的子序列

LeetCode 392. 判断子序列 链接&#xff1a;392. 判断子序列 双指针&#xff1a; 思路&#xff1a; 本题较容易&#xff0c;如果不用动态规划而是用双指针的办法思路会更加简单。首先两个指针fast&#xff0c;slow分别代表t&#xff0c;s的下标&#xff0c;快指针用于遍历长…

来浅谈一下:GraalVM下载、安装、特点、概括

文章目录前言一、GraaIVM是什么&#xff1f;二、GraaIVM优点三、安装GraaIVM1.GraaIVM Community版本简略2.下载3.解压4.配置变量4.1、JAVA_HOME改成graalvm的位置4.2、编辑path5、查看总结前言 GraaIVM High-performance runtime with new compiler optimizations to accele…

unity计算着色器

序 计算着色器&#xff0c;是什么&#xff1f;好像是并行计算的一个东西。 并行计算&#xff0c;挖矿&#xff1f;显卡&#xff1f; 那看来得先了解显卡&#xff0c;再了解计算着色器了。 认识显卡 显卡&#xff0c;小白&#xff0c;不懂。 显卡的印象&#xff0c;只是停…

批量修改文件名,图文教学,2分钟简单学会

​文件名称是文件的重要组成部分&#xff0c;在我们日常生活中&#xff0c;对文件进行命名&#xff0c;是经常使用到的一种功能。可是有时候需要重命名的文件实在是太多了咋办呢&#xff1f;有没有什么方法可以批量修改文件名&#xff1f; 本文将以图文教学的方式&#xff0c;…

为什么不建议在MySQL中使用 utf8?

MySQL 字符编码集中有两套 UTF-8 编码实现&#xff1a;utf8 和 utf8mb4。 如果使用 utf8 的话&#xff0c;存储 emoji 符号和一些比较复杂的汉字、繁体字就会出错。 为什么会这样呢&#xff1f;这篇文章可以从源头给你解答。 何为字符集&#xff1f; 字符是各种文字和符号的…

LPA-star算法(Lifelong Planning)及相关思考

一、LPA-star算法&#xff08;Lifelong Planning&#xff09;简介 LPA * ( Lifelong Planning 终身规划 A * )是一种基于A * 的增量启发式搜索算法&#xff0c;被用来处理动态环境下从给定起始点到给定目标点的最短路径问题&#xff0c;即起始点和目标点是固定的。 &#xff08…

图数据库知识点1:图数据库与关系型数据库区别

文章目录 前言一、图数据库区别于其他数据库的核心是什么&#xff1f;二、图数据库能解决哪些问题&#xff1f; 1.图的优势2.目前的图的实现方式及优劣3.图的技术趋势及优势小结总结前言 《图数据库知识点》系列有20讲&#xff0c;每一讲中会重点分享一个图数据库知识点&#…

什么是JVM?JVM的机制与JVM自动内存管理机制,如何进行优化

1. 什么是JVM&#xff1f; JVM是Java Virtual Machine&#xff08;Java虚拟机&#xff09;的缩写&#xff0c;JVM是一种用于计算设备的规范&#xff0c;它是一个虚构出来的计算机&#xff0c;是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码…

彻底搞懂MySql的B+Tree

1.什么是索引 官方定义&#xff1a;一种能为mysql提高查询效率的数据结构&#xff0c;索引是为了加速对表中数据行的检索而创建的一种分散存储的数据结构。好比如&#xff0c;一本书&#xff0c;你想找到自己想看的章节内容&#xff0c;直接查询目录就行。这里的目录就类似索引…

华为路由器升级系统文件

欢迎关注微信公众号【厦门微思网络】。http://www.xmws.cn 组网图形 组网需求 RouterA的管理网口与用户侧主机HostA相连。要求通过BootROM菜单下载系统文件至RouterA完成系统升级。 操作步骤 1.在PC端启动FTP Server服务。 2.用串口线连接并通过Console口登录设备。 3.重启设…