当前位置: 首页 > news >正文

kubeadm_k8s_v1.31高可用部署教程

kubeadm_k8s_v1.31高可用部署教程

  • 实验环境
  • 部署拓扑图
    • **部署署架构**
    • **Load Balance**
    • **Control plane node**
    • **Worker node**
    • **资源分配(8台虚拟机)**
    • 集群列表
  • 前置准备
      • 关闭swap
      • 开启ipv4转发
      • 更多设置
    • 1、Verify the MAC address and product_uuid are unique for every node2、Check network adapters3、Check required ports4、Swap configuration
      • 【matser】节点必备镜像
      • 第1个控制面板
      • 镜像列表
      • POD列表
      • 容器列表
      • 其他控制面板
      • 镜像列表
      • POD列表
      • 容器列表
      • 【worker】节点必备镜像
      • 镜像列表
      • POD列表
      • 容器列表
      • 【etcd】节点必备镜像、POD、容器
      • 镜像列表
      • POD列表
      • 容器列表
      • 【containerd】下载安装
      • 【最终全部镜像】
  • 开始部署
    • keepalive、haproxy
    • 部署ETC集群
      • 部署方式
      • 准备机器
      • 部署教程
    • init第1个matser
      • 准备ETCD证书
      • 准备init config文件
      • 执行kubeadm init
      • kubeadm init成功后操作
    • join其他master节点
    • join其他worker节点
    • 部署网络插件
    • Before you begin
    • 集群状态预览
  • 集群用例冒烟
    • 部署nginx
      • **使用 YAML 文件定义 Deployment**
      • **验证 Deployment 是否成功创建**
      • **创建 Nginx Service**
      • **应用 Nginx Service**
      • **验证 Nginx 服务状态**
  • 部署ArgoCD
      • **方法 1: 使用官方安装 YAML**
      • **方法 2: 使用 Helm Chart 安装**
      • **选项 1: 使用 NodePort**
      • **选项 2: 使用 Ingress**
      • **获取初始管理员密码**
      • **登录 Web 界面**
      • **登录 ArgoCD CLI**

注意:开始之前需要明确部署服务器的架构(x86或者arm64),因为这个会关系到下面对应下载的镜像、软件版本,本文以ubuntu(arm64)为操作环境。查看当前操作系统架构输入命令:uname -a

实验环境

  1. ubuntu 20.04.5 LTS (aarch64)
  2. kubeadm:v1.31
  3. kubectl:v1.31
  4. kubelet:v1.31
  5. containerd:1.7.22
  6. etcd:3.5.15-0
  7. 集群架构规划:2个master节点高可用、3个worker节点、3个etcd节点集群、2组keepalive+haproxy高可用

注意:

  • 查看操作系统版本、架构:uname -a
  • kubeadm、kubectl、kubelet三者的版本尽量都一致,但是0.01版本差之内应该问题不大。具体版本对照可以参考官网点击查看
  • containerd版本下载安装点击查看
  • etcd的版本下载安装点击查看
  • 官方集群部署教程参考点击查看

部署拓扑图

在这里插入图片描述

部署署架构

  1. Stacked etcd topology(内置自动部署ETCD集群)
  2. External etcd topology(外部独立部署ETCD集群)(推荐方案,本文采用方案)

参考官网

Load Balance

如上图黄色区域所示:关于多master的高可用方案本文采用keepalive+haproxy来实现。

Control plane node

这个表示k8s里面的master节点,如图有3个但是本文因为虚拟机有限就拿2个来演示。用来管理操控整个集群的节点,一般kubectl命令会在此类节点操作。

Worker node

表示非master节点,一般用来实际被调度到需要部署POD的节点。

资源分配(8台虚拟机)

hostnameiprole必装基础软件操作系统系统架构备注
ubuntu0192.168.17.247master1containerd:V1.7.22kubeadm:V1.31kubectl:V1.31kubelet:V1.31Ubuntu 20.04.5 LTSaarch64
ubuntu1192.168.17.68master2containerd:V1.7.22kubeadm:V1.31kubectl:V1.31kubelet:V1.31Ubuntu 20.04.5 LTSaarch64
ubuntu2192.168.17.40worker1containerd:V1.7.22kubeadm:V1.31kubectl:V1.31kubelet:V1.31Ubuntu 20.04.5 LTSaarch64
ubuntu3192.168.17.54worker2containerd:V1.7.22kubeadm:V1.31kubectl:V1.31kubelet:V1.31Ubuntu 20.04.5 LTSaarch64
ubuntu4192.168.17.83worker3containerd:V1.7.22kubeadm:V1.31kubectl:V1.31kubelet:V1.31Ubuntu 20.04.5 LTSaarch64
ubuntu5192.168.17.219etcd1(兼keepalive+haproxy)containerd:V1.7.22kubeadm:V1.31kubectl:V1.31Ubuntu 20.04.5 LTSaarch64虚拟机有限,在该ETCD节点也部署了keepalive+haproxy
ubuntu6192.168.17.203etcd1(兼keepalive+haproxy)containerd:V1.7.22kubeadm:V1.31kubectl:V1.31kubelet:V1.31Ubuntu 20.04.5 LTSaarch64虚拟机有限,在该ETCD节点也部署了keepalive+haproxy
ubuntu7192.168.17.79etcd1containerd:V1.7.22kubeadm:V1.31kubectl:V1.31kubelet:V1.31Ubuntu 20.04.5 LTSaarch64

1、上面的containerd:V1.7.22、kubeadm:V1.31、kubectl:V1.31的软件安装细节会在下文详细描述。

2、ubuntu5和ubuntu6上由于虚拟机资源有限就同时用来部署etcd和keepalive+haproxy。

集群列表

root@ubuntu1:~/kubernetes/argocd# kubectl get nodes -o wide
NAME      STATUS   ROLES           AGE    VERSION   INTERNAL-IP      EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
ubuntu0   Ready    control-plane   2d2h   v1.31.1   192.168.17.247   <none>        Ubuntu 24.04.1 LTS   6.8.0-49-generic    containerd://1.7.22
ubuntu1   Ready    control-plane   2d2h   v1.31.1   192.168.17.68    <none>        Ubuntu 20.04.5 LTS   5.4.0-200-generic   containerd://1.7.22
ubuntu2   Ready    <none>          2d     v1.31.1   192.168.17.40    <none>        Ubuntu 20.04.6 LTS   5.4.0-200-generic   containerd://1.7.22
ubuntu3   Ready    <none>          2d     v1.31.1   192.168.17.54    <none>        Ubuntu 20.04.6 LTS   5.4.0-200-generic   containerd://1.7.22
ubuntu4   Ready    <none>          2d     v1.31.3   192.168.17.83    <none>        Ubuntu 24.04.1 LTS   6.8.0-49-generic    containerd://1.7.22

前置准备

  1. 系统设置

以下所有操作需要在所有(master|worker|etcd)角色节点服务器上执行相同的操作。

关闭swap

# 永久设置
sudo sed -i '/swap/s/^\([^#]\)/#\1/' /etc/fstab
# 重启
sudo reboot
# 验证 swap 已被禁用(如果没有输出,则表示 swap 已被成功禁用)
swapon --show

解释:

  • /swap/:匹配包含 swap 的行。
  • s/^\([^#]\)/#\1/:将行首没有 # 的字符替换为 #,即注释掉该行。

开启ipv4转发

要永久启用 IPv4 转发,需要修改系统配置文件。

  1. 打开配置文件:
sudo vim /etc/sysctl.conf
  1. 找到或添加以下行:
net.ipv4.ip_forward=1
  1. 保存并退出编辑器。
  2. 使修改生效:
sudo sysctl -p
或者
sudo sysctl --system
  1. 运行以下命令确认设置是否生效:
cat /proc/sys/net/ipv4/ip_forward

如果输出为 1,表示 IPv4 转发已启用。

以上是将所有的节点服务器的swap关闭和ipv4转发开启,其实官网说明还有其他需要关注的点但是这些基本可以不用关注对于自己本地虚拟机环境,除非公司生产级别机房网络防火墙环境可以关注。

更多设置

点击查看官网

1、Verify the MAC address and product_uuid are unique for every node2、Check network adapters3、Check required ports4、Swap configuration

  1. 软件安装

以下所有操作需要在所有(master|worker|etcd)角色节点服务器上执行相同的操作。

下面的内容本文会以当前环境ubuntu为例,说明kubeadm、kubectl、kubelet的安装过程。

具体更多可以参考官网:官网教程

安装 kubeadm、kubelet 和 kubectl

你需要在每台机器上安装以下的软件包:

kubeadm:用来初始化集群的指令。

kubelet:在集群中的每个节点上用来启动 Pod 和容器等。

kubectl:用来与集群通信的命令行工具。

kubeadm 不能帮你安装或者管理 kubelet 或 kubectl, 所以你需要确保它们与通过 kubeadm 安装的控制平面的版本相匹配。 如果不这样做,则存在发生版本偏差的风险,可能会导致一些预料之外的错误和问题。 然而,控制平面与 kubelet 之间可以存在一个次要版本的偏差,但 kubelet 的版本不可以超过 API 服务器的版本。 例如,1.7.0 版本的 kubelet 可以完全兼容 1.8.0 版本的 API 服务器,反之则不可以。

以下指令适用于 Kubernetes 1.31.

  1. 更新 apt 包索引并安装使用 Kubernetes apt 仓库所需要的包:
sudo apt-get update
# apt-transport-https 可能是一个虚拟包(dummy package);如果是的话,你可以跳过安装这个包
sudo apt-get install -y apt-transport-https ca-certificates curl gpg
  1. 下载用于 Kubernetes 软件包仓库的公共签名密钥。所有仓库都使用相同的签名密钥,因此你可以忽略URL中的版本:
# 如果 `/etc/apt/keyrings` 目录不存在,则应在 curl 命令之前创建它,请阅读下面的注释。# sudo mkdir -p -m 755 /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.31/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
  1. 添加 Kubernetes apt 仓库。 请注意,此仓库仅包含适用于 Kubernetes 1.31 的软件包; 对于其他 Kubernetes 次要版本,则需要更改 URL 中的 Kubernetes 次要版本以匹配你所需的次要版本 (你还应该检查正在阅读的安装文档是否为你计划安装的 Kubernetes 版本的文档)。
# 此操作会覆盖 /etc/apt/sources.list.d/kubernetes.list 中现存的所有配置。
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.31/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
  1. 更新 apt 包索引,安装 kubelet、kubeadm 和 kubectl,并锁定其版本:
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

kubelet 现在每隔几秒就会重启,因为它陷入了一个等待 kubeadm 指令的死循环。

官方软件对照表

Kubernetes 为每个组件提供二进制文件以及一组标准的客户端应用来引导集群或与集群交互。 像 API 服务器这样的组件能够在集群内的容器镜像中运行。 这些组件作为官方发布过程的一部分,也以容器镜像的形式提供。 所有二进制文件和容器镜像都可用于多种操作系统和硬件架构。

点击去下载kubernetes

  1. 镜像下载

【matser】节点必备镜像

以下所有操作需要在所有(master)角色节点服务器上执行相同的操作。

第1个控制面板

镜像列表

docker.io/calico/cni                        v3.26.0     54cd67220700c       85.5MB
docker.io/calico/kube-controllers           v3.26.0     aebf438b736fc       29.2MB
docker.io/calico/node                       v3.26.0     0259a80e0f442       84.6MB
registry.k8s.io/kube-apiserver              v1.31.0     cd0f0ae0ec9e0       25.6MB
registry.k8s.io/kube-controller-manager     v1.31.0     fcb0683e6bdbd       23.9MB
registry.k8s.io/kube-proxy                  v1.31.0     71d55d66fd4ee       26.8MB
registry.k8s.io/kube-scheduler              v1.31.0     fbbbd428abb4d       18.4MB
registry.k8s.io/pause                       3.10        afb61768ce381       266kB

以下是第1个控制面板最终部署成功之后的POD以及容器的状态。

POD列表

root@ubuntu1:~/kubernetes/deploy# kubectl get pods -A
NAMESPACE     NAME                                       READY   STATUS    RESTARTS        AGE
kube-system   calico-kube-controllers-7f764f4f68-zdppk   1/1     Running   2 (123m ago)    4d
kube-system   calico-node-fbljp                          1/1     Running   2 (123m ago)    4d
kube-system   calico-node-jcm24                          1/1     Running   2 (122m ago)    4d
kube-system   calico-node-n6ljm                          1/1     Running   2 (123m ago)    4d
kube-system   calico-node-w9jzw                          1/1     Running   2 (122m ago)    4d
kube-system   calico-node-wwxdt                          1/1     Running   2 (122m ago)    4d
kube-system   coredns-7c65d6cfc9-lwmwq                   1/1     Running   3 (123m ago)    4d2h
kube-system   coredns-7c65d6cfc9-tjwxq                   1/1     Running   3 (123m ago)    4d2h
kube-system   kube-apiserver-ubuntu0                     1/1     Running   4 (123m ago)    4d1h
kube-system   kube-apiserver-ubuntu1                     1/1     Running   4 (123m ago)    4d2h
kube-system   kube-controller-manager-ubuntu0            1/1     Running   4 (123m ago)    4d1h
kube-system   kube-controller-manager-ubuntu1            1/1     Running   12 (123m ago)   4d2h
kube-system   kube-proxy-5cmpq                           1/1     Running   3 (123m ago)    4d1h
kube-system   kube-proxy-9dl6q                           1/1     Running   2 (122m ago)    4d
kube-system   kube-proxy-lklxl                           1/1     Running   2 (122m ago)    4d
kube-system   kube-proxy-v8xbj                           1/1     Running   3 (123m ago)    4d2h
kube-system   kube-proxy-zwqvf                           1/1     Running   2 (122m ago)    4d
kube-system   kube-scheduler-ubuntu0                     1/1     Running   4 (123m ago)    4d1h
kube-system   kube-scheduler-ubuntu1                     1/1     Running   12 (123m ago)   4d2h

容器列表

root@ubuntu1:~/kubernetes/deploy# crictl ps
CONTAINER           IMAGE               CREATED             STATE               NAME                      ATTEMPT             POD ID              POD
c62f0512e1008       aebf438b736fc       2 hours ago         Running             calico-kube-controllers   2                   37f46550b1ab8       calico-kube-controllers-7f764f4f68-zdppk
b9ec1ab460b4a       0259a80e0f442       2 hours ago         Running             calico-node               2                   ec6bba06380ae       calico-node-fbljp
2c1805e953d0e       71d55d66fd4ee       2 hours ago         Running             kube-proxy                3                   a929c6564380d       kube-proxy-v8xbj
80cc0d9ca2347       fbbbd428abb4d       2 hours ago         Running             kube-scheduler            12                  af41be53a5af8       kube-scheduler-ubuntu1
8852dbb8a1b2a       cd0f0ae0ec9e0       2 hours ago         Running             kube-apiserver            4                   0574d74be139b       kube-apiserver-ubuntu1
2f7570ebf94d7       fcb0683e6bdbd       2 hours ago         Running             kube-controller-manager   12                  0d6d06a832dae       kube-controller-manager-ubuntu1

其他控制面板

镜像列表

docker.io/calico/cni                         v3.26.0    54cd67220700c    85.5MB
docker.io/calico/node                        v3.26.0    0259a80e0f442    84.6MB
registry.k8s.io/coredns/coredns              v1.11.3    2f6c962e7b831    16.9MB
registry.k8s.io/kube-apiserver               v1.31.0    cd0f0ae0ec9e0    25.6MB
registry.k8s.io/kube-controller-manager      v1.31.0    fcb0683e6bdbd    23.9MB
registry.k8s.io/kube-proxy                   v1.31.0    71d55d66fd4ee    26.8MB
registry.k8s.io/kube-scheduler               v1.31.0    fbbbd428abb4d    18.4MB
registry.k8s.io/pause                        3.10        afb61768ce381       266kB

以下是其他控制面板最终部署成功之后的POD以及容器的状态。

POD列表

root@ubuntu1:~/kubernetes/deploy# kubectl get pods -A
NAMESPACE     NAME                                       READY   STATUS    RESTARTS        AGE
kube-system   calico-kube-controllers-7f764f4f68-zdppk   1/1     Running   2 (123m ago)    4d
kube-system   calico-node-fbljp                          1/1     Running   2 (123m ago)    4d
kube-system   calico-node-jcm24                          1/1     Running   2 (122m ago)    4d
kube-system   calico-node-n6ljm                          1/1     Running   2 (123m ago)    4d
kube-system   calico-node-w9jzw                          1/1     Running   2 (122m ago)    4d
kube-system   calico-node-wwxdt                          1/1     Running   2 (122m ago)    4d
kube-system   coredns-7c65d6cfc9-lwmwq                   1/1     Running   3 (123m ago)    4d2h
kube-system   coredns-7c65d6cfc9-tjwxq                   1/1     Running   3 (123m ago)    4d2h
kube-system   kube-apiserver-ubuntu0                     1/1     Running   4 (123m ago)    4d1h
kube-system   kube-apiserver-ubuntu1                     1/1     Running   4 (123m ago)    4d2h
kube-system   kube-controller-manager-ubuntu0            1/1     Running   4 (123m ago)    4d1h
kube-system   kube-controller-manager-ubuntu1            1/1     Running   12 (123m ago)   4d2h
kube-system   kube-proxy-5cmpq                           1/1     Running   3 (123m ago)    4d1h
kube-system   kube-proxy-9dl6q                           1/1     Running   2 (122m ago)    4d
kube-system   kube-proxy-lklxl                           1/1     Running   2 (122m ago)    4d
kube-system   kube-proxy-v8xbj                           1/1     Running   3 (123m ago)    4d2h
kube-system   kube-proxy-zwqvf                           1/1     Running   2 (122m ago)    4d
kube-system   kube-scheduler-ubuntu0                     1/1     Running   4 (123m ago)    4d1h
kube-system   kube-scheduler-ubuntu1                     1/1     Running   12 (123m ago)   4d2h

容器列表

root@ubuntu0:~/kubernetes/deploy# crictl ps
CONTAINER           IMAGE               CREATED             STATE               NAME                      ATTEMPT             POD ID              POD
6c43c1474aa4d       2f6c962e7b831       2 hours ago         Running             coredns                   3                   ba5d080b5f862       coredns-7c65d6cfc9-lwmwq
0bc8ae67cf4d4       2f6c962e7b831       2 hours ago         Running             coredns                   3                   0dea1fe6c129e       coredns-7c65d6cfc9-tjwxq
a7f14982bd6d6       0259a80e0f442       2 hours ago         Running             calico-node               2                   aacda9063012b       calico-node-n6ljm
8b7b203682f7b       71d55d66fd4ee       2 hours ago         Running             kube-proxy                3                   74d686edd3de4       kube-proxy-5cmpq
c539180dae2e0       fbbbd428abb4d       2 hours ago         Running             kube-scheduler            4                   b614e15187a44       kube-scheduler-ubuntu0
d873f0d9b675b       fcb0683e6bdbd       2 hours ago         Running             kube-controller-manager   4                   e1a43a0d72b4b       kube-controller-manager-ubuntu0
08bebcabd7398       cd0f0ae0ec9e0       2 hours ago         Running             kube-apiserver            4                   7adebc9f57e18       kube-apiserver-ubuntu0

【worker】节点必备镜像

以下所有操作需要在所有(worker)角色节点服务器上执行相同的操作。

镜像列表

docker.io/calico/cni             v3.26.0             54cd67220700c       85.5MB
docker.io/calico/node            v3.26.0             0259a80e0f442       84.6MB
registry.k8s.io/kube-proxy       v1.31.0             71d55d66fd4ee       26.8MB
registry.k8s.io/pause            3.10                afb61768ce381       266kB

以下是所有worker工作节点最终部署成功之后的POD以及容器的状态。

POD列表

root@ubuntu1:~/kubernetes/deploy# kubectl get pods -A -o wide | grep 17.54
kube-system   calico-node-wwxdt      1/1     Running   2 (136m ago)    4d     192.168.17.54    ubuntu3   <none>           <none>
kube-system   kube-proxy-lklxl       1/1     Running   2 (136m ago)    4d     192.168.17.54    ubuntu3   <none>           <none>

容器列表

root@ubuntu3:~/kubernetes/deploy# crictl ps
CONTAINER           IMAGE               CREATED             STATE               NAME                ATTEMPT             POD ID              POD
07cb28b40db37       0259a80e0f442       2 hours ago         Running             calico-node         2                   3d057133a4c1b       calico-node-wwxdt
309338ec147ef       71d55d66fd4ee       2 hours ago         Running             kube-proxy          2                   0930d4cab2756       kube-proxy-lklxl

【etcd】节点必备镜像、POD、容器

以下所有操作需要在所有(etcd)角色节点服务器上执行相同的操作。

镜像列表

registry.k8s.io/etcd   3.5.15-0    27e3830e14027       66.4MB

以下是所有ETCD最终部署成功之后的POD以及容器的状态。

POD列表

root@ubuntu5:~# crictl ps
CONTAINER           IMAGE               CREATED             STATE               NAME                ATTEMPT             POD ID              POD
eab9acc34da36       27e3830e14027       2 hours ago         Running             etcd                5                   67442b056bbcf       etcd-ubuntu5

容器列表

root@ubuntu5:~# crictl ps
CONTAINER           IMAGE               CREATED             STATE               NAME                ATTEMPT             POD ID              POD
eab9acc34da36       27e3830e14027       2 hours ago         Running             etcd                5                   67442b056bbcf       etcd-ubuntu5

【containerd】下载安装

以下操作需要在所有的集群节点(master|worker|etcd)执行。

  • 下载安装
https://github.com/containerd/containerd/blob/main/docs/getting-started.md

大家按照上面文章Option1的step1→step2→step3操作,但是要注意大家下面下载的软件需要结合自己的操作系统架构来选择。我这边是ubuntu aarch64所以选择想相关的aarch64软件就好了。

https://r7qll1fhgt.feishu.cn/space/api/box/stream/download/asynccode/?code=ZjY2YmM2MzdjYzQzN2I4OWQ2MGUyMjgzMjA3ZWFiNWJfSzh2N0o5UGVKYVNWRlQ1MzNuZVVabEozU1V1a29XN0xfVG9rZW46T2NZN2JwcldDb3Fkc2F4WjlkN2NId0l0bkNjXzE3MzQ0MDM2MTE6MTczNDQwNzIxMV9WNA

  • 配置containerd

如果本地没有可以创建:/etc/containerd/config.toml,把下面的内容复制到自己的机器上对应的文件/etc/containerd/config.toml中**。**

disabled_plugins = []
imports = []
oom_score = 0
plugin_dir = ""
required_plugins = []
root = "/var/lib/containerd"
state = "/run/containerd"
temp = ""
version = 2[cgroup]path = ""[debug]address = ""format = ""gid = 0level = ""uid = 0[grpc]address = "/run/containerd/containerd.sock"gid = 0max_recv_message_size = 16777216max_send_message_size = 16777216tcp_address = ""tcp_tls_ca = ""tcp_tls_cert = ""tcp_tls_key = ""uid = 0[metrics]address = ""grpc_histogram = false[plugins][plugins."io.containerd.gc.v1.scheduler"]deletion_threshold = 0mutation_threshold = 100pause_threshold = 0.02schedule_delay = "0s"startup_delay = "100ms"[plugins."io.containerd.grpc.v1.cri"]cdi_spec_dirs = ["/etc/cdi", "/var/run/cdi"]device_ownership_from_security_context = falsedisable_apparmor = falsedisable_cgroup = falsedisable_hugetlb_controller = truedisable_proc_mount = falsedisable_tcp_service = truedrain_exec_sync_io_timeout = "0s"enable_cdi = falseenable_selinux = falseenable_tls_streaming = falseenable_unprivileged_icmp = falseenable_unprivileged_ports = falseignore_deprecation_warnings = []ignore_image_defined_volumes = falseimage_pull_progress_timeout = "5m0s"image_pull_with_sync_fs = falsemax_concurrent_downloads = 3max_container_log_line_size = 16384netns_mounts_under_state_dir = falserestrict_oom_score_adj = false# 注意这里需要根据pause实际版本记得调整sandbox_image = "registry.k8s.io/pause:3.10"selinux_category_range = 1024stats_collect_period = 10stream_idle_timeout = "4h0m0s"stream_server_address = "127.0.0.1"stream_server_port = "0"systemd_cgroup = falsetolerate_missing_hugetlb_controller = trueunset_seccomp_profile = ""[plugins."io.containerd.grpc.v1.cri".cni]bin_dir = "/opt/cni/bin"conf_dir = "/etc/cni/net.d"conf_template = ""ip_pref = ""max_conf_num = 1setup_serially = false[plugins."io.containerd.grpc.v1.cri".containerd]default_runtime_name = "runc"disable_snapshot_annotations = truediscard_unpacked_layers = falseignore_blockio_not_enabled_errors = falseignore_rdt_not_enabled_errors = falseno_pivot = falsesnapshotter = "overlayfs"[plugins."io.containerd.grpc.v1.cri".containerd.default_runtime]base_runtime_spec = ""cni_conf_dir = ""cni_max_conf_num = 0container_annotations = []pod_annotations = []privileged_without_host_devices = falseprivileged_without_host_devices_all_devices_allowed = falseruntime_engine = ""runtime_path = ""runtime_root = ""runtime_type = ""sandbox_mode = ""snapshotter = ""[plugins."io.containerd.grpc.v1.cri".containerd.default_runtime.options][plugins."io.containerd.grpc.v1.cri".containerd.runtimes][plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]base_runtime_spec = ""cni_conf_dir = ""cni_max_conf_num = 0container_annotations = []pod_annotations = []privileged_without_host_devices = falseprivileged_without_host_devices_all_devices_allowed = falseruntime_engine = ""runtime_path = ""runtime_root = ""runtime_type = "io.containerd.runc.v2"sandbox_mode = "podsandbox"snapshotter = ""[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]BinaryName = ""CriuImagePath = ""CriuPath = ""CriuWorkPath = ""IoGid = 0IoUid = 0NoNewKeyring = falseNoPivotRoot = falseRoot = ""ShimCgroup = ""# 这个地方需要注意,要保持kubelet一致的cgroup方式。本文采用cgroups所以设置为true,如果不是需要改成true。# 具体可以看下这里解释:https://kubernetes.io/zh-cn/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#installing-runtime:~:text=%E7%B3%BB%E7%BB%9F%E9%85%8D%E7%BD%AE%E6%96%B9%E5%BC%8F%E3%80%82-,%E5%AE%89%E8%A3%85%E5%AE%B9%E5%99%A8%E8%BF%90%E8%A1%8C%E6%97%B6,-%E4%B8%BA%E4%BA%86%E5%9C%A8%20Pod**SystemdCgroup = true[plugins."io.containerd.grpc.v1.cri".containerd.untrusted_workload_runtime]base_runtime_spec = ""cni_conf_dir = ""cni_max_conf_num = 0container_annotations = []pod_annotations = []privileged_without_host_devices = falseprivileged_without_host_devices_all_devices_allowed = falseruntime_engine = ""runtime_path = ""runtime_root = ""runtime_type = ""sandbox_mode = ""snapshotter = ""[plugins."io.containerd.grpc.v1.cri".containerd.untrusted_workload_runtime.options][plugins."io.containerd.grpc.v1.cri".image_decryption]key_model = "node"[plugins."io.containerd.grpc.v1.cri".registry]config_path = ""[plugins."io.containerd.grpc.v1.cri".registry.auths][plugins."io.containerd.grpc.v1.cri".registry.configs][plugins."io.containerd.grpc.v1.cri".registry.headers][plugins."io.containerd.grpc.v1.cri".registry.mirrors][plugins."io.containerd.grpc.v1.cri".x509_key_pair_streaming]tls_cert_file = ""tls_key_file = ""[plugins."io.containerd.internal.v1.opt"]path = "/opt/containerd"[plugins."io.containerd.internal.v1.restart"]interval = "10s"[plugins."io.containerd.internal.v1.tracing"][plugins."io.containerd.metadata.v1.bolt"]content_sharing_policy = "shared"[plugins."io.containerd.monitor.v1.cgroups"]no_prometheus = false[plugins."io.containerd.nri.v1.nri"]disable = truedisable_connections = falseplugin_config_path = "/etc/nri/conf.d"plugin_path = "/opt/nri/plugins"plugin_registration_timeout = "5s"plugin_request_timeout = "2s"socket_path = "/var/run/nri/nri.sock"[plugins."io.containerd.runtime.v1.linux"]no_shim = falseruntime = "runc"runtime_root = ""shim = "containerd-shim"shim_debug = false[plugins."io.containerd.runtime.v2.task"]platforms = ["linux/arm64/v8"]sched_core = false[plugins."io.containerd.service.v1.diff-service"]default = ["walking"][plugins."io.containerd.service.v1.tasks-service"]blockio_config_file = ""rdt_config_file = ""[plugins."io.containerd.snapshotter.v1.aufs"]root_path = ""[plugins."io.containerd.snapshotter.v1.blockfile"]fs_type = ""mount_options = []root_path = ""scratch_file = ""[plugins."io.containerd.snapshotter.v1.btrfs"]root_path = ""[plugins."io.containerd.snapshotter.v1.devmapper"]async_remove = falsebase_image_size = ""discard_blocks = falsefs_options = ""fs_type = ""pool_name = ""root_path = ""[plugins."io.containerd.snapshotter.v1.native"]root_path = ""[plugins."io.containerd.snapshotter.v1.overlayfs"]mount_options = []root_path = ""sync_remove = falseupperdir_label = false[plugins."io.containerd.snapshotter.v1.zfs"]root_path = ""[plugins."io.containerd.tracing.processor.v1.otlp"][plugins."io.containerd.transfer.v1.local"]config_path = ""max_concurrent_downloads = 3max_concurrent_uploaded_layers = 3[[plugins."io.containerd.transfer.v1.local".unpack_config]]differ = ""platform = "linux/arm64/v8"snapshotter = "overlayfs"[proxy_plugins][stream_processors][stream_processors."io.containerd.ocicrypt.decoder.v1.tar"]accepts = ["application/vnd.oci.image.layer.v1.tar+encrypted"]args = ["--decryption-keys-path", "/etc/containerd/ocicrypt/keys"]env = ["OCICRYPT_KEYPROVIDER_CONFIG=/etc/containerd/ocicrypt/ocicrypt_keyprovider.conf"]path = "ctd-decoder"returns = "application/vnd.oci.image.layer.v1.tar"[stream_processors."io.containerd.ocicrypt.decoder.v1.tar.gzip"]accepts = ["application/vnd.oci.image.layer.v1.tar+gzip+encrypted"]args = ["--decryption-keys-path", "/etc/containerd/ocicrypt/keys"]env = ["OCICRYPT_KEYPROVIDER_CONFIG=/etc/containerd/ocicrypt/ocicrypt_keyprovider.conf"]path = "ctd-decoder"returns = "application/vnd.oci.image.layer.v1.tar+gzip"[timeouts]"io.containerd.timeout.bolt.open" = "0s""io.containerd.timeout.metrics.shimstats" = "2s""io.containerd.timeout.shim.cleanup" = "5s""io.containerd.timeout.shim.load" = "5s""io.containerd.timeout.shim.shutdown" = "3s""io.containerd.timeout.task.state" = "2s"[ttrpc]address = ""gid = 0uid = 0

也可以执行:containerd config default > config.toml,这样内容就可以直接复制到/etc/containerd/config.toml文件中不要手动复制了。但是文件上面2处改动点记得调整然后重启containerd。

  • 查看containerd是否启动成功
# 重启
systemctl restart containerd.service# 查看状态
systemctl status containerd.service
# 或者执行
journalctl -u containerd -f

https://r7qll1fhgt.feishu.cn/space/api/box/stream/download/asynccode/?code=MjAyN2U5ZTYwOGUzOTRmNmY3Y2YzOTNmNDVhMzI4NjRfb0R2T2w1UzlIUlUyRmFJSDFTdkFiV0luV3l3d2x3dzVfVG9rZW46Ums1RGJFQ2pKb1VCVFp4S1Zia2M1azRJblBlXzE3MzQ0MDM2MTE6MTczNDQwNzIxMV9WNA

注意需要保证所有机器上的containerd都要启动成哦。


【最终全部镜像】

以下拉取镜像按各自节点角色所需拉取对应的镜像就可以。

通过上面的各个节点的镜像列表可以看出,在部署集群之前需要全部准备的镜像列表有如下11个镜像。然后开始部署之前务必保证以下镜像出现在各自角色(master|worker|etcd)的节点上。

# master节点需要准备的镜像
crictl pull docker.io/calico/cni:v3.26.0
crictl pull docker.io/calico/kube-controllers:v3.26.0
crictl pull docker.io/calico/node:v3.26.0
crictl pull registry.k8s.io/kube-apiserver:v1.31.0
crictl pull registry.k8s.io/kube-controller-manager:v1.31.0
crictl pull registry.k8s.io/kube-proxy:v1.31.0
crictl pull registry.k8s.io/kube-scheduler:v1.31.0
crictl pull registry.k8s.io/pause:3.10# worker节点需要准备的镜像
crictl pull crictl pull docker.io/calico/cni:v3.26.0
crictl pull docker.io/calico/node:v3.26.0
crictl pull registry.k8s.io/kube-proxy:v1.31.0
crictl pull registry.k8s.io/pause:3.10# etcd节点需要准备的镜像
crictl pull registry.k8s.io/etcd:3.5.15-0

注意:以上镜像的拉取基本都需要科学上网,所以大家需要在有网络的环境提前将这些镜像下载好然后上传到自己的私有HUB或者某某云HUB仓库。在pull到对应的集群节点,否则集群启动大部分组件POD因为拉取不到镜像启动失败从而导致集群无法运行成功。

镜像转换参考如下:注意下面的镜像都是arm64架构的镜像,根据自己的环境下载不同架构镜像。本文中会用到containerd弃用docker,所以会出现crictl和ctr命令,不清楚的大家可以课后花时间去了解。

# crictl 拉取镜像 10个
crictl pull registry.cn-hangzhou.aliyuncs.com/shouzhi/kube-apiserver:v1.31.0
crictl pull registry.cn-hangzhou.aliyuncs.com/shouzhi/kube-controller-manager:v1.31.0
crictl pull registry.cn-hangzhou.aliyuncs.com/shouzhi/kube-scheduler:v1.31.0
crictl pull registry.cn-hangzhou.aliyuncs.com/shouzhi/kube-proxy:v1.31.0
crictl pull registry.cn-hangzhou.aliyuncs.com/shouzhi/coredns:v1.11.3
crictl pull registry.cn-hangzhou.aliyuncs.com/shouzhi/pause:3.10
crictl pull registry.cn-hangzhou.aliyuncs.com/shouzhi/etcd:3.5.15-0
crictl pull registry.cn-hangzhou.aliyuncs.com/shouzhi/calico_cni:v3.26.0
crictl pull registry.cn-hangzhou.aliyuncs.com/shouzhi/calico_node:v3.26.0
crictl pull registry.cn-hangzhou.aliyuncs.com/shouzhi/calico_kube-controllers:v3.26.0
crictl pull registry.cn-hangzhou.aliyuncs.com/shouzhi/etcd:3.5.15-0# 修改镜像名 10个
ctr --namespace k8s.io image tag  registry.cn-hangzhou.aliyuncs.com/shouzhi/kube-apiserver:v1.31.0 registry.k8s.io/kube-apiserver:v1.31.0
ctr --namespace k8s.io image tag  registry.cn-hangzhou.aliyuncs.com/shouzhi/kube-controller-manager:v1.31.0 registry.k8s.io/kube-controller-manager:v1.31.0
ctr --namespace k8s.io image tag  registry.cn-hangzhou.aliyuncs.com/shouzhi/kube-scheduler:v1.31.0 registry.k8s.io/kube-scheduler:v1.31.0
ctr --namespace k8s.io image tag  registry.cn-hangzhou.aliyuncs.com/shouzhi/kube-proxy:v1.31.0 registry.k8s.io/kube-proxy:v1.31.0
ctr --namespace k8s.io image tag  registry.cn-hangzhou.aliyuncs.com/shouzhi/coredns:v1.11.3 registry.k8s.io/coredns/coredns:v1.11.3
ctr --namespace k8s.io image tag  registry.cn-hangzhou.aliyuncs.com/shouzhi/pause:3.10 registry.k8s.io/pause:3.10
ctr --namespace k8s.io image tag  registry.cn-hangzhou.aliyuncs.com/shouzhi/etcd:3.5.15-0 registry.k8s.io/etcd:3.5.15-0
ctr --namespace k8s.io image tag  registry.cn-hangzhou.aliyuncs.com/shouzhi/calico_cni:v3.26.0 docker.io/calico/cni:v3.26.0
ctr --namespace k8s.io image tag  registry.cn-hangzhou.aliyuncs.com/shouzhi/calico_node:v3.26.0 docker.io/calico/node:v3.26.0
ctr --namespace k8s.io image tag  registry.cn-hangzhou.aliyuncs.com/shouzhi/calico_kube-controllers:v3.26.0 docker.io/calico/kube-controllers:v3.26.0
ctr --namespace k8s.io image tag  registry.cn-hangzhou.aliyuncs.com/shouzhi/etcd:3.5.15-0 registry.k8s.io/etcd:3.5.15-0

开始部署

keepalive、haproxy

以下所有操作需要在所有(keepalive|haproxy)角色节点服务器上执行相同的操作。

参考:keepalive+haproxy安装

部署ETC集群

以下操作会在etcd集群中选择其中1个服务器来作为总操作节点,用于生成以及分发其他etcd所需要的配置文件以及相关证书。

部署方式

使用 kubeadm 创建一个高可用 etcd 集群

默认情况下,kubeadm 在每个控制平面节点上运行一个本地 etcd 实例。也可以使用外部的 etcd 集群,并在不同的主机上提供 etcd 实例。 这两种方法的区别在高可用拓扑的选项页面中阐述。

这个任务将指导你创建一个由三个成员组成的高可用外部 etcd 集群,该集群在创建过程中可被 kubeadm 使用。

准备开始

三个可以通过 2379 和 2380 端口相互通信的主机。本文档使用这些作为默认端口。 不过,它们可以通过 kubeadm 的配置文件进行自定义。

每个主机必须安装 systemd 和 bash 兼容的 shell。

每台主机必须安装有容器运行时、kubelet 和 kubeadm。

每个主机都应该能够访问 Kubernetes 容器镜像仓库 (registry.k8s.io), 或者使用 kubeadm config images list/pull 列出/拉取所需的 etcd 镜像。 本指南将把 etcd 实例设置为由 kubelet 管理的静态 Pod。

一些可以用来在主机间复制文件的基础设施。例如 ssh 和 scp 就可以满足此需求。

准备机器

在这里插入图片描述

  • 以上是3节点etcd集群的机器分配,其中192.168.17.219、192.168.17.203由于资源有限所以同时也会作为部署keepalive+haproxy的机器。
  • 192.168.17.219也会作为部署etcd的总的部署操作机器,用于制作所有节点etcd集群证书和相关的配置文件以及分发相关证书和相关的证书到其他节点192.168.17.203、192.168.17.79机器上。我们把192.168.17.219称作etcd部署的操作节点。
  • 将192.168.17.219都设置成可免密登陆其他etcd节点(192.168.17.203、192.168.17.79),如果免密登设置陆不了解可以自行度娘了解,很简单这里就不在文中讲解。

部署教程

# 打开官方地址写的很清晰,这里就不再赘述了。
https://kubernetes.io/zh-cn/docs/setup/production-environment/tools/kubeadm/setup-ha-etcd-with-kubeadm/

确保证书文件都在

如下所示:(除非自己有自定义文件路径)

$HOST0 所需文件的完整列表如下

/tmp/${HOST0}
└── kubeadmcfg.yaml
---
/etc/kubernetes/pki
├── apiserver-etcd-client.crt
├── apiserver-etcd-client.key
└── etcd├── ca.crt├── ca.key├── healthcheck-client.crt├── healthcheck-client.key├── peer.crt├── peer.key├── server.crt└── server.key

$HOST1 上:

$HOME
└── kubeadmcfg.yaml
---
/etc/kubernetes/pki
├── apiserver-etcd-client.crt
├── apiserver-etcd-client.key
└── etcd├── ca.crt├── healthcheck-client.crt├── healthcheck-client.key├── peer.crt├── peer.key├── server.crt└── server.key

$HOST2 上:

$HOME
└── kubeadmcfg.yaml
---
/etc/kubernetes/pki
├── apiserver-etcd-client.crt
├── apiserver-etcd-client.key
└── etcd├── ca.crt├── healthcheck-client.crt├── healthcheck-client.key├── peer.crt├── peer.key├── server.crt└── server.key

以上任意节点的3个红色文件是后面要给k8s集群用到的。

  • apiserver-etcd-client.crt
  • apiserver-etcd-client.key
  • ca.crt

部署成功你会看到每个节点都有

root@ubuntu5:~# crictl ps
CONTAINER           IMAGE               CREATED             STATE               NAME                ATTEMPT             POD ID              POD
eab9acc34da36       27e3830e14027       2 days ago          Running             etcd                5                   67442b056bbcf       etcd-ubuntu5

检查集群运行状况

  • 执行
# 如果没有etcdctl终端命令执行下载就好了(apt或者yum)
ETCDCTL_API=3 etcdctl \
--cert /etc/kubernetes/pki/etcd/peer.crt \
--key /etc/kubernetes/pki/etcd/peer.key \
--cacert /etc/kubernetes/pki/etcd/ca.crt \
--endpoints https://192.168.17.219:2379,https://192.168.17.203:2379,https://192.168.17.79:2379 endpoint health
  • 输出
输出以下表示集群成功启动
https://192.168.17.203:2379 is healthy: successfully committed proposal: took = 16.715546ms
https://192.168.17.219:2379 is healthy: successfully committed proposal: took = 18.348496ms
https://192.168.17.79:2379 is healthy: successfully committed proposal: took = 18.501066ms

init第1个matser

重要!重要!重要!确保这个matser节点上的以下内容一定是前置准备好的。

  • 当前节点必备的镜像一定要都提前pull到本机了,请做好检查
  • 当前节点containerd启动成功,请做好检查
  • swap是关闭的
  • ipv4转发是开启的
  • 内存至少2G
  • CPU至少2核

准备ETCD证书

# 这个操作需要在你的任意一个etcd的节点上操作都可以
export CONTROL_PLANE="root@192.168.17.247"scp /etc/kubernetes/pki/etcd/ca.crt "${CONTROL_PLANE}":
scp /etc/kubernetes/pki/apiserver-etcd-client.crt "${CONTROL_PLANE}":
scp /etc/kubernetes/pki/apiserver-etcd-client.key "${CONTROL_PLANE}":
  1. root@192.168.17.247:这个是你的第1个master控制面板的用户和IP。
  2. ca.crt**、apiserver-etcd-client.crt、apiserver-etcd-client.key这3个文件会传到你第1个master的root用户的目录下。**
# 这个操作在第1个matser上操作
root@ubuntu1:~# pwd
/root
root@ubuntu1:~# ls -l
-rw-r--r-- 1 root root 1123 Dec  9 14:16  apiserver-etcd-client.crt
-rw------- 1 root root 1675 Dec  9 14:16  apiserver-etcd-client.key
-rw-r--r-- 1 root root 1094 Dec  9 14:16  ca.crt
  1. 把文件放到第1个master对应的目录中
# 这个操作在第1个matser上操作
mkdir -p /etc/kubernetes/pki/etcd/
scp ca.crt  /etc/kubernetes/pki/etcd/ca.crt
scp apiserver-etcd-client.key   /etc/kubernetes/pki/apiserver-etcd-client.key
scp apiserver-etcd-client.crt  /etc/kubernetes/pki/apiserver-etcd-client.crt

准备init config文件

以下红色内容需要注意调整

apiVersion: kubeadm.k8s.io/v1beta4
bootstrapTokens:
- groups:- system:bootstrappers:kubeadm:default-node-tokentoken: abcdef.0123456789abcdefttl: 24h0m0susages:- signing- authentication
kind: InitConfiguration
localAPIEndpoint:# 你的第1个master的IP.advertiseAddress: 192.168.17.68# 你的第1个master暴露ApiServer的端口,一般建议不要改除非端口环境有冲突否则就写6443.bindPort: 6443
nodeRegistration:# 你的第1个master上安装的containerd对应的containerd.sock文件目录。如有自定义记得调整.# 如果不知道在哪里可以执行:cat /etc/containerd/config.toml | grep socketcriSocket: unix:///var/run/containerd/containerd.sockimagePullPolicy: IfNotPresentimagePullSerial: true# 你的第1个master节点的hostname,一定要按实际调整.name: ubuntu1taints: null
timeouts:controlPlaneComponentHealthCheck: 4m0sdiscovery: 5m0setcdAPICall: 2m0skubeletHealthCheck: 4m0skubernetesAPICall: 1m0stlsBootstrap: 5m0supgradeManifests: 5m0s
---
apiServer: {}
apiVersion: kubeadm.k8s.io/v1beta4
caCertificateValidityPeriod: 87600h0m0s
certificateValidityPeriod: 8760h0m0s
# 证书目录,一般都是这个目录,除非你有自定义
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
encryptionAlgorithm: RSA-2048
#etcd:
#  local:
#    dataDir: /var/lib/etcd
# 配置外部ETCD信息,这个记得以实际为准一定要调整
etcd:external:endpoints:- https://192.168.17.219:2379 # 适当地更改 ETCD_0_IP- https://192.168.17.203:2379 # 适当地更改 ETCD_1_IP- https://192.168.17.79:2379 # 适当地更改 ETCD_2_IPcaFile: /etc/kubernetes/pki/etcd/ca.crtcertFile: /etc/kubernetes/pki/apiserver-etcd-client.crtkeyFile: /etc/kubernetes/pki/apiserver-etcd-client.key
# 设置k8s的仓库地址,这个如果你把上文所有的镜像都上传到自己的私有HUB,你可以改成自己的HUB服务地址
# 记得把私有HUB设置成公开拉取方便快速部署,不要强制登陆才能pull
imageRepository: registry.k8s.io
kind: ClusterConfiguration
# 设置k8s版本,根据自己实际部署的版本调整
kubernetesVersion: 1.31.0
networking:dnsDomain: cluster.local# 集群中service的网段,可不修改,采用默认serviceSubnet: 10.96.0.0/12
proxy: {}
scheduler: {}
# 这个192.168.17.100是你部署keepalive的虚拟IP,一定要根据实际调整
# 注意配置之前确保keepalive+haproxy已正常启动
controlPlaneEndpoint: "192.168.17.100:6443"
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
# 设置kubelet驱动,这个需要和containerd部署的配置文件保持一致
# containerd的配置文件/etc/containerd/config.toml中SystemdCgroup属性匹配,如果为true那么这里就得写cgroupDriver: systemd,否则写其他。更多了解请查看下面的地址
# https://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/#:~:text=net.ipv4.ip_forward-,cgroup%20%E9%A9%B1%E5%8A%A8,-%E5%9C%A8%20Linux%20%E4%B8%8A
cgroupDriver: systemd

编辑好以上内容保存到kubeadm-config.yaml文件中,然后在你的第1个master节点上创建一个目录存放kubeadm-config.yaml文件。

例如:

root@ubuntu1:~/kubernetes/deploy# pwd
/root/kubernetes/deploy
root@ubuntu1:~/kubernetes/deploy# ll
drwxr-xr-x 2 root root     4096 Oct  8 14:44 calico/
-rw-r--r-- 1 root root     1717 Dec  9 17:11 kubeadm-config.yaml

执行kubeadm init

kubeadm init --config kubeadm-config.yaml --upload-certs
  1. kubeadm-config.yaml上面创建的文件
  2. -upload-certs表示在join的时候自动同步证书不需要手动。如果你喜欢折腾可以参考官网手动分发证书。地址如下:
# 手动分发证书说明
https://kubernetes.io/zh-cn/docs/setup/production-environment/tools/kubeadm/high-availability/#:~:text=hash%20sha256%3A7c2e69131a36ae2a042a339b33381c6d0d43887e2de83720eff5359e26aec866-,%E6%89%8B%E5%8A%A8%E8%AF%81%E4%B9%A6%E5%88%86%E5%8F%91,-%E5%A6%82%E6%9E%9C%E4%BD%A0%E9%80%89%E6%8B%A9
  1. 证书同步目录(每个master和worker)
# 一般都会同步到各个节点/etc/kubernetes/目录下
root@ubuntu0:~/kubernetes/deploy# tree /etc/kubernetes/
/etc/kubernetes/
├── admin.conf
├── controller-manager.conf
├── kubelet.conf
├── manifests
│   ├── kube-apiserver.yaml
│   ├── kube-controller-manager.yaml
│   └── kube-scheduler.yaml
├── pki
│   ├── apiserver.crt
│   ├── apiserver-etcd-client.crt
│   ├── apiserver-etcd-client.key
│   ├── apiserver.key
│   ├── apiserver-kubelet-client.crt
│   ├── apiserver-kubelet-client.key
│   ├── ca.crt
│   ├── ca.key
│   ├── etcd
│   │   └── ca.crt
│   ├── front-proxy-ca.crt
│   ├── front-proxy-ca.key
│   ├── front-proxy-client.crt
│   ├── front-proxy-client.key
│   ├── sa.key
│   └── sa.pub
└── scheduler.conf

kubeadm init成功后操作

如果init成功,会出现如下内容:

Your Kubernetes control-plane has initialized successfully!To start using your cluster, you need to run the following as a regular user:# 设置kubectl的配置文件用户级别目录mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/configAlternatively, if you are the root user, you can run:export KUBECONFIG=/etc/kubernetes/admin.confYou 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/You can now join any number of the control-plane node running the following command on each as root:# 用于其他控制面板节点加入集群的命令kubeadm join 192.168.17.100:6443 --token abcdef.0123456789abcdef \--discovery-token-ca-cert-hash sha256:c80dbc23372171f22ffd2308433234e310ae28b868e6a606dd2a48a46f497596 \--control-plane --certificate-key 58659e557942e749d1dd30788a3ca18d6f0420f018bf7566471749a49498105fPlease note that the certificate-key gives access to cluster sensitive data, keep it secret!
As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use
"kubeadm init phase upload-certs --upload-certs" to reload certs afterward.Then you can join any number of worker nodes by running the following on each as root:# 用于其他worker节点加入集群的命令
kubeadm join 192.168.17.100:6443 --token abcdef.0123456789abcdef \--discovery-token-ca-cert-hash sha256:c80dbc23372171f22ffd2308433234e310ae28b868e6a606dd2a48a46f497596

这些内容最好复制下来在记事本中保存下来,供后续使用。

会生成相关证书

root@ubuntu1:~# tree /etc/kubernetes/
/etc/kubernetes/
├── admin.conf
├── controller-manager.conf
├── kubelet.conf
├── manifests
│   ├── kube-apiserver.yaml
│   ├── kube-controller-manager.yaml
│   └── kube-scheduler.yaml
├── pki
│   ├── apiserver.crt
│   ├── apiserver-etcd-client.crt
│   ├── apiserver-etcd-client.key
│   ├── apiserver.key
│   ├── apiserver-kubelet-client.crt
│   ├── apiserver-kubelet-client.key
│   ├── ca.crt
│   ├── ca.key
│   ├── etcd
│   │   └── ca.crt
│   ├── front-proxy-ca.crt
│   ├── front-proxy-ca.key
│   ├── front-proxy-client.crt
│   ├── front-proxy-client.key
│   ├── sa.key
│   └── sa.pub
├── scheduler.conf
└── super-admin.conf

执行kubectl配置文件目录设置

# 在你的第1个master上执行如下操作:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf

join其他master节点

重要!重要!重要!确保这个matser节点上的以下内容一定是前置准备好的。

  • 当前节点必备的镜像一定要都提前pull到本机了,请做好检查
  • 当前节点containerd启动成功,请做好检查
  • swap是关闭的
  • ipv4转发是开启的
  • 内存至少2G
  • CPU至少2核

执行join

  # 在其他的master上执行,记得以实际命令执行,不要盲目复制。kubeadm join 192.168.17.100:6443 --token abcdef.0123456789abcdef \--discovery-token-ca-cert-hash sha256:c80dbc23372171f22ffd2308433234e310ae28b868e6a606dd2a48a46f497596 \--control-plane --certificate-key 58659e557942e749d1dd30788a3ca18d6f0420f018bf7566471749a49498105f

会出现相关证书

root@ubuntu0:~# tree /etc/kubernetes/
/etc/kubernetes/
├── admin.conf
├── controller-manager.conf
├── kubelet.conf
├── manifests
│   ├── kube-apiserver.yaml
│   ├── kube-controller-manager.yaml
│   └── kube-scheduler.yaml
├── pki
│   ├── apiserver.crt
│   ├── apiserver-etcd-client.crt
│   ├── apiserver-etcd-client.key
│   ├── apiserver.key
│   ├── apiserver-kubelet-client.crt
│   ├── apiserver-kubelet-client.key
│   ├── ca.crt
│   ├── ca.key
│   ├── etcd
│   │   └── ca.crt
│   ├── front-proxy-ca.crt
│   ├── front-proxy-ca.key
│   ├── front-proxy-client.crt
│   ├── front-proxy-client.key
│   ├── sa.key
│   └── sa.pub
└── scheduler.conf

join其他worker节点

重要!重要!重要!确保这个matser节点上的以下内容一定是前置准备好的。

  • 当前节点必备的镜像一定要都提前pull到本机了,请做好检查
  • 当前节点containerd启动成功,请做好检查
  • swap是关闭的
  • ipv4转发是开启的
  • 内存至少2G
  • CPU至少2核

执行join

# 在其他的worker上执行,记得以实际命令执行,不要盲目复制。
kubeadm join 192.168.17.100:6443 --token abcdef.0123456789abcdef \--discovery-token-ca-cert-hash sha256:c80dbc23372171f22ffd2308433234e310ae28b868e6a606dd2a48a46f497596

部署网络插件

更多网络插件参考以下地址:

https://kubernetes.io/zh-cn/docs/concepts/cluster-administration/addons/#networking-and-network-policy:~:text=%E8%AF%A6%E5%B0%BD%E6%97%A0%E9%81%97%E3%80%82-,%E8%81%94%E7%BD%91%E5%92%8C%E7%BD%91%E7%BB%9C%E7%AD%96%E7%95%A5,-ACI%20%E9%80%9A%E8%BF%87%20Cisco

本文采用Calico作为网络部署说明。

部署calico

  1. 官方教程
 https://docs.tigera.io/calico/latest/getting-started/kubernetes/quickstart
  1. 前置条件

Before you begin

Required

  • A Linux host that meets the following requirements:
    • x86-64, arm64, ppc64le, or s390x processor
    • 2CPU
    • 2GB RAM
    • 10GB free disk space
    • RedHat Enterprise Linux 7.x+, CentOS 7.x+, Ubuntu 18.04+, or Debian 9.x+
  • Calico can manage cali and tunl interfaces on the host
  • If NetworkManager is present on the host, see Configure NetworkManager.
  1. Install Callico
  • 获取calico.yaml部署文件
# 在你的第1个master上执行,其实其他的master也行,位了方便管理部署最好都在一个master上去操作
wget https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml

如果上面的calico.yaml文件下载慢,可以先在自己电脑上下载好然后上传到第1个master节点上去。

  • 启动calico
kubectl apply -f calico.yaml
  1. 查看状态
root@ubuntu1:~/kubernetes/deploy/calico# kubectl get pods -A | grep calico
kube-system   calico-kube-controllers-7f764f4f68-zdppk            1/1     Running   2 (3d2h ago)    7d
kube-system   calico-node-fbljp                                   1/1     Running   2 (3d2h ago)    7d
kube-system   calico-node-jcm24                                   1/1     Running   2 (3d2h ago)    7d
kube-system   calico-node-n6ljm                                   1/1     Running   2 (3d2h ago)    7d
kube-system   calico-node-w9jzw                                   1/1     Running   2 (3d2h ago)    7d
kube-system   calico-node-wwxdt                                   1/1     Running   2 (3d2h ago)    7d
kube-system   coredns-7c65d6cfc9-lwmwq                            1/1     Running   3 (3d2h ago)    7d2h
kube-system   coredns-7c65d6cfc9-tjwxq                            1/1     Running   3 (3d2h ago)    7d2h

集群状态预览

  • 集群列表
# 在其中任意一个master上执行
root@ubuntu1:~# kubectl get nodes -o wide
NAME      STATUS   ROLES           AGE    VERSION   INTERNAL-IP      EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
ubuntu0   Ready    control-plane   7d1h   v1.31.1   192.168.17.247   <none>        Ubuntu 24.04.1 LTS   6.8.0-49-generic    containerd://1.7.22
ubuntu1   Ready    control-plane   7d2h   v1.31.1   192.168.17.68    <none>        Ubuntu 20.04.5 LTS   5.4.0-200-generic   containerd://1.7.22
ubuntu2   Ready    <none>          7d     v1.31.1   192.168.17.40    <none>        Ubuntu 20.04.6 LTS   5.4.0-202-generic   containerd://1.7.22
ubuntu3   Ready    <none>          7d     v1.31.1   192.168.17.54    <none>        Ubuntu 20.04.6 LTS   5.4.0-200-generic   containerd://1.7.22
ubuntu4   Ready    <none>          7d     v1.31.3   192.168.17.83    <none>        Ubuntu 24.04.1 LTS   6.8.0-50-generic    containerd://1.7.22
  • 基础POD列表
root@ubuntu1:~/kubernetes/deploy/calico# kubectl get pods -A
NAMESPACE     NAME                                                READY   STATUS    RESTARTS        AGE
kube-system   calico-kube-controllers-7f764f4f68-zdppk            1/1     Running   2 (3d2h ago)    7d
kube-system   calico-node-fbljp                                   1/1     Running   2 (3d2h ago)    7d
kube-system   calico-node-jcm24                                   1/1     Running   2 (3d2h ago)    7d
kube-system   calico-node-n6ljm                                   1/1     Running   2 (3d2h ago)    7d
kube-system   calico-node-w9jzw                                   1/1     Running   2 (3d2h ago)    7d
kube-system   calico-node-wwxdt                                   1/1     Running   2 (3d2h ago)    7d
kube-system   coredns-7c65d6cfc9-lwmwq                            1/1     Running   3 (3d2h ago)    7d2h
kube-system   coredns-7c65d6cfc9-tjwxq                            1/1     Running   3 (3d2h ago)    7d2h
kube-system   kube-apiserver-ubuntu0                              1/1     Running   4 (3d2h ago)    7d2h
kube-system   kube-apiserver-ubuntu1                              1/1     Running   4 (3d2h ago)    7d2h
kube-system   kube-controller-manager-ubuntu0                     1/1     Running   4 (3d2h ago)    7d2h
kube-system   kube-controller-manager-ubuntu1                     1/1     Running   12 (3d2h ago)   7d2h
kube-system   kube-proxy-5cmpq                                    1/1     Running   3 (3d2h ago)    7d2h
kube-system   kube-proxy-9dl6q                                    1/1     Running   2 (3d2h ago)    7d
kube-system   kube-proxy-lklxl                                    1/1     Running   2 (3d2h ago)    7d
kube-system   kube-proxy-v8xbj                                    1/1     Running   3 (3d2h ago)    7d2h
kube-system   kube-proxy-zwqvf                                    1/1     Running   2 (3d2h ago)    7d
kube-system   kube-scheduler-ubuntu0                              1/1     Running   4 (3d2h ago)    7d2h
kube-system   kube-scheduler-ubuntu1                              1/1     Running   12 (3d2h ago)   7d2h

出现以上的内容表示整个集群已部署成功,接下来你就可以去用它部署你想部署的所有容器。

集群用例冒烟

至此我们的k8s集群2master+3worker+3etcd集群部署成功,为了验证集群的可用性。我们准备部署一个nginx看看什么效果。

部署nginx

在 Kubernetes 集群中部署 Nginx 主要通过创建 DeploymentService 完成,以下是完整的步骤:


  1. 创建 Nginx Deployment

使用 YAML 文件定义 Deployment

创建一个 nginx-deployment.yaml 文件:

apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploymentlabels:app: nginx
spec:replicas: 3  # 副本数量,部署3个 Nginx 实例selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: registry.cn-hangzhou.aliyuncs.com/shouzhi/nginx:latest  # 使用 Nginx 官方镜像ports:- containerPort: 80  # 暴露容器的 80 端口

  1. 应用 Nginx Deployment

使用 kubectl 命令创建 Nginx Deployment:

kubectl apply -f nginx-deployment.yaml

验证 Deployment 是否成功创建

kubectl get deployments
kubectl get pods

输出示例:

NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           2m

  1. 暴露 Nginx 服务

为了让外部访问 Nginx,可以通过 Kubernetes Service 将 Deployment 暴露出来。

创建 Nginx Service

编辑 nginx-service.yaml 文件:

apiVersion: v1
kind: Service
metadata:name: nginx-service
spec:type: NodePort  # 使用 NodePort 类型,让外部访问selector:app: nginx  # 选择匹配标签为 app: nginx 的 Podports:- protocol: TCPport: 80       # Service 端口targetPort: 80 # Pod 中 Nginx 容器暴露的端口nodePort: 30080  # 外部访问的端口(30000-32767之间)

应用 Nginx Service

kubectl apply -f nginx-service.yaml

验证 Nginx 服务状态

kubectl get services

输出示例:

NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
nginx-service   NodePort    10.96.12.34     <none>        80:30080/TCP   2m

  1. 访问 Nginx 服务
  2. 获取节点 IP 地址 运行以下命令查看节点的 IP 地址:
kubectl get nodes -o wide
  1. 示例输出:
NAME           STATUS   ROLES           AGE   VERSION   INTERNAL-IP     EXTERNAL-IP
worker-node1   Ready    <none>          10m   v1.31.0   192.168.1.10    <none>
  1. 访问 Nginx 服务 使用浏览器或 curl 访问节点 IP 和 NodePort:
http://<NodeIP>:30080
  1. 示例:
http://192.168.1.10:30080

  1. 验证 Nginx 页面

访问成功后,你将看到 Nginx 默认欢迎页面


  1. 清理资源

如果你不再需要 Nginx,可以删除 Deployment 和 Service:

kubectl delete -f nginx-deployment.yaml
kubectl delete -f nginx-service.yaml

部署ArgoCD

ArgoCD 提供了一个强大的 GitOps 工具,可以高效地管理 Kubernetes 应用状态。你可以通过 Web 界面或 CLI 工具完成持续部署和监控。

以下是部署 ArgoCD 到 Kubernetes 集群的完整步骤:


  1. 环境准备
  2. Kubernetes 集群
    1. Kubernetes 版本 >= 1.21。
    2. 确保可以通过 kubectl 连接到集群。
  3. 命令行工具
    1. 已安装 kubectl
    2. 可选:安装 argocd CLI(后续步骤会说明)。
  4. 命名空间准备
    1. ArgoCD 会运行在单独的 argocd 命名空间。

  1. 安装 ArgoCD

方法 1: 使用官方安装 YAML

  1. 创建 argocd 命名空间
kubectl create namespace argocd
  1. 应用 ArgoCD 安装 YAML 文件
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
  1. 验证安装是否成功: 查看 argocd 命名空间中的 Pod 状态:
kubectl get pods -n argocd
  1. 正常情况下,所有 Pod 的状态应该为 Running

方法 2: 使用 Helm Chart 安装

  1. 添加 ArgoCD Helm 仓库
helm repo add argo https://argoproj.github.io/argo-helm
helm repo update
  1. 安装 ArgoCD
helm install argocd argo/argo-cd -n argocd --create-namespace
  1. 验证安装
kubectl get pods -n argocd

  1. 暴露 ArgoCD Server

ArgoCD Server 提供一个 Web 界面,用于管理应用。你可以选择多种方式暴露服务。

选项 1: 使用 NodePort

  1. 修改 argocd-server 服务类型为 NodePort:
kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "NodePort"}}'
  1. 获取服务的 NodePort:
kubectl get svc argocd-server -n argocd
  1. 示例输出:
NAME            TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
argocd-server   NodePort   10.96.236.55     <none>        80:31390/TCP,443:31443/TCP   10m
  1. 通过以下方式访问 Web 界面:
https://<NodeIP>:<NodePort>

选项 2: 使用 Ingress

如果集群已经安装了 Ingress Controller,可以通过 Ingress 暴露 ArgoCD。

  1. 创建 Ingress 配置: 创建一个名为 argocd-ingress.yaml 的文件:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: argocd-server-ingressnamespace: argocdannotations:nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:rules:- host: argocd.example.comhttp:paths:- path: /pathType: Prefixbackend:service:name: argocd-serverport:number: 443
  1. 应用 Ingress 配置
kubectl apply -f argocd-ingress.yaml

确保 argocd.example.com 能解析到 Ingress 控制器的 IP 地址。


  1. 登录 ArgoCD

获取初始管理员密码

默认管理员用户名是 admin。初始密码存储在 Kubernetes Secret 中。

kubectl get secret argocd-initial-admin-secret -n argocd -o jsonpath="{.data.password}" | base64 -d

示例输出:

my-secret-password

登录 Web 界面

  1. 打开 Web 界面(根据暴露方式访问):
    1. NodePort 示例:https://<NodeIP>:<NodePort>
    2. Ingress 示例:https://argocd.example.com
  2. 输入用户名 admin 和上一步获取的密码。

登录 ArgoCD CLI

安装 ArgoCD CLI 并通过命令行登录:

  1. 安装 CLI
curl -sSL -o /usr/local/bin/argocd https://github.com/argoproj/argo-cd/releases/latest/download/argocd-linux-amd64
chmod +x /usr/local/bin/argocd
  1. 登录 CLI
argocd login <ArgoCD-Server-IP>:<Port> --username admin --password <password>

  1. 部署一个示例应用
  2. 创建一个示例应用: 使用 argocd CLI 创建一个示例应用:
argocd app create guestbook \--repo https://github.com/argoproj/argocd-example-apps.git \--path guestbook \--dest-server https://kubernetes.default.svc \--dest-namespace default
  1. 同步应用: 将应用从 Git 仓库同步到 Kubernetes:
argocd app sync guestbook
  1. 检查应用状态
argocd app get guestbook
  1. 验证部署: 使用 kubectl 查看 guestbook 应用的资源:
kubectl get all -n default

  1. 升级和管理应用
  • 更新应用:当 Git 仓库中的配置发生变化时,ArgoCD 可以自动或手动同步。
  • 查看同步状态
argocd app list
  • 手动触发同步
argocd app sync <app-name>

相关文章:

kubeadm_k8s_v1.31高可用部署教程

kubeadm_k8s_v1.31高可用部署教程 实验环境部署拓扑图**部署署架构****Load Balance****Control plane node****Worker node****资源分配&#xff08;8台虚拟机&#xff09;**集群列表 前置准备关闭swap开启ipv4转发更多设置 1、Verify the MAC address and product_uuid are u…...

MyBatis写法汇总

Mybatis写法汇总 1. 批量操作 1.1 批量插入 <insert id"batchInsert" parameterType"java.util.List">INSERT INTO user (username, password, create_time) VALUES<foreach collection"list" item"item" separator"…...

【C++】优先级队列以及仿函数

本篇我们来介绍一下优先级队列 priority_queue 。优先级队列的底层是数据结构中的堆&#xff0c;在C中它是一个容器适配器&#xff0c;这个容器适配器比之前的栈和队列更复杂。 1.priority_queue的介绍 1.1 优先级队列的底层 因为优先级队列就是堆&#xff0c;堆的底层是数组…...

【VUE】13、安装nrm管理多个npm源

nrm&#xff08;npm registry manager&#xff09;是一个 npm 源管理器&#xff0c;它允许用户快速地在不同的 npm 源之间进行切换&#xff0c;以提高包管理的速度和效率。以下是对 nrm 使用的详细介绍&#xff1a; 1、安装nrm 在使用 nrm 之前&#xff0c;需要先确保已经安装…...

selenium工作原理

原文链接&#xff1a;https://blog.csdn.net/weixin_67603503/article/details/143226557 启动浏览器和绑定端口 当你创建一个 WebDriver 实例&#xff08;如 webdriver.Chrome()&#xff09;时&#xff0c;Selenium 会启动一个新的浏览器实例&#xff0c;并为其分配一个特定的…...

Reactor 响应式编程(第三篇:R2DBC)

系列文章目录 Reactor 响应式编程&#xff08;第一篇&#xff1a;Reactor核心&#xff09; Reactor 响应式编程&#xff08;第二篇&#xff1a;Spring Webflux&#xff09; Reactor 响应式编程&#xff08;第三篇&#xff1a;R2DBC&#xff09; Reactor 响应式编程&#xff08…...

从零开始掌握 React 前端框架:入门指南与实战案例

&#x1f680; 从零开始掌握 React 前端框架&#xff1a;入门指南与实战案例 &#x1f4d6; 前言 React 是由 Facebook 推出的前端框架&#xff0c;用于构建高效、可复用的用户界面&#xff08;UI&#xff09;。本文将手把手教你如何从零开始掌握 React&#xff0c;内容覆盖 …...

【日常笔记】Spring boot:编写 Content type = ‘text/plain‘ 接口

一、项目场景&#xff1a; 接口&#xff1a;Context-Type&#xff1a;text/plain 方式&#xff1a;POST 项目场景&#xff1a;硬件回调接口 二、实战 PostMapping(value "/xx/xxx", consumes "text/plain" ) 2.1、接口 /*** return String* time 202…...

探索 Seaborn Palette 的奥秘:为数据可视化增色添彩

一、引言 在数据科学的世界里&#xff0c;视觉传达是不可或缺的一环。一个好的数据可视化不仅能传递信息&#xff0c;还能引发共鸣。Seaborn 是 Python 中一款广受欢迎的可视化库&#xff0c;而它的调色板&#xff08;palette&#xff09;功能&#xff0c;则为我们提供了调配绚…...

多智能体/多机器人网络中的图论法

一、引言 1、网络科学至今受到广泛关注的原因&#xff1a; &#xff08;1&#xff09;大量的学科&#xff08;尤其生物及材料科学&#xff09;需要对元素间相互作用在多层级系统中所扮演的角色有更深层次的理解&#xff1b; &#xff08;2&#xff09;科技的发展促进了综合网…...

【中标麒麟服务器操作系统实例分享】java应用DNS解析异常分析及处理

了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer.kylinos.cn 文档中心&#xff1a;https://documentkylinos.cn 情况描述 中标麒麟服务器操作系统V7运行在 ARM虚…...

设计模式12:状态模式

系列总链接&#xff1a;《大话设计模式》学习记录_net 大话设计-CSDN博客 参考&#xff1a;设计模式之状态模式 (C 实现)_设计模式的状态模式实现-CSDN博客 1.概述 状态模式允许一个对象在其内部状态改变时改变其行为。对象看起来像是改变了其类。使用状态模式可以将状态的相…...

AI @国际象棋世界冠军赛: 从棋盘到科研创新之路

点击屏末 | 阅读原文 | 在小红书和 Google 谷歌回顾 WCC...

LeetCode刷题day29——动态规划(完全背包)

LeetCode刷题day29——动态规划&#xff08;完全背包&#xff09; 377. 组合总和 Ⅳ分析&#xff1a; 57. 爬楼梯&#xff08;第八期模拟笔试&#xff09;题目描述输入描述输出描述输入示例输出示例提示信息 分析&#xff1a; 322. 零钱兑换分析&#xff1a; 279. 完全平方数分…...

C++对象数组对象指针对象指针数组

一、对象数组 对象数组中的每一个元素都是同类的对象&#xff1b; 例1 对象数组成员的初始化 #include<iostream> using namespace std;class Student { public:Student( ){ };Student(int n,string nam,char s):num(n),name(nam),sex(s){};void display(){cout<&l…...

主曲率为常数时曲面分类

主曲率为常数 ⇔ K , H \Leftrightarrow K,H ⇔K,H 为常数&#xff0c;曲面分类&#xff1a; 1.若 k 1 k 2 0 k_1k_20 k1​k2​0,则 S S S为全脐点曲面——平面的一部分&#xff1b; 2.若 k 1 k 2 ≠ 0 k_1k_2\neq0 k1​k2​0,则 S S S为全脐点曲面——球面的一部分&…...

单片机:实现HC-SR04超声波测距(附带源码)

使用单片机实现 HC-SR04 超声波测距模块 的功能&#xff0c;通常用于测量物体与超声波传感器之间的距离。HC-SR04 模块通过发射超声波信号并测量其返回时间来计算距离。单片机&#xff08;如 STM32、51 系列、Arduino 等&#xff09;可用来控制该模块的工作&#xff0c;并处理返…...

分布式全文检索引擎ElasticSearch-数据的写入存储底层原理

一、数据写入的核心流程 当向 ES 索引写入数据时&#xff0c;整体流程如下&#xff1a; 1、客户端发送写入请求 客户端向 ES 集群的任意节点&#xff08;称为协调节点&#xff0c;Coordinating Node&#xff09;发送一个写入请求&#xff0c;比如 index&#xff08;插入或更…...

mfc140u.dll是什么文件?如何解决mfc140u.dll丢失的相关问题

遇到“mfc140u.dll文件丢失”的错误通常影响应用程序的运行&#xff0c;这个问题主要出现在使用Microsoft Visual C环境开发的软件中。mfc140u.dll是一个重要的系统文件&#xff0c;如果它丢失或损坏&#xff0c;会导致相关程序无法启动。本文将简要介绍几种快速有效的方法来恢…...

ChatGPT生成接口测试用例(一)

用ChatGPT做软件测试 接口测试在软件开发生命周期中扮演着至关重要的角色&#xff0c;有助于验证不同模块之间的交互是否正确。若协议消息被恶意修改&#xff0c;系统是否能够恰当处理&#xff0c;以确保系统的功能正常运行&#xff0c;不会出现宕机或者安全问题。 5.1 ChatGP…...

Jenkins 中 写 shell 命令执行失败,检测失败问题

由于项目的 依赖复杂&#xff0c;随着版本的增多&#xff0c;人工操作&#xff0c;手误几率太大&#xff0c;我们选取kenins 来自动化发布、更新。 这里主要解决&#xff0c;发布 的 每个阶段&#xff0c;确保每个阶段执行成功。 比如&#xff1a; js 运行&#xff0c;…...

Dot Foods EDI 需求分析及对接流程

Dot Foods 是一家美国领先的食品和非食品产品的中间批发分销商&#xff0c;主要为食品服务、零售和分销行业的客户提供服务&#xff0c;是北美大型食品中间分销商之一。Dot Foods &#xff08;以下简称 Dot&#xff09;的业务模式是通过整合多个供应商的产品&#xff0c;为客户…...

数据特性库 前言

文章目录 一、num-traits库简介二、核心功能三、更新功能四、使用方式五、应用示例六、结论 一、num-traits库简介 num-traits是Rust编程语言中的一个开源库&#xff0c;专注于为数值类型提供一系列的数学运算特性和接口。它支持泛型数学计算&#xff0c;允许开发者在不指定具…...

项目授权无法正常操作的解决方法

概述 在非saas环境的项目中&#xff0c;授权页面的接口不需要token&#xff0c;但是在某些时候会导致页面无法正常操作&#xff0c;暂时用该文档中的解决方法来处理&#xff0c;后续会修复该问题。 现象描述 登录时报未授权跳转至该页面&#xff0c;有时该页面会弹出登录超时对…...

python学opencv|读取图像(十七)认识alpha通道

【1】引言 前序学习进程中&#xff0c;我们已经掌握了RGB和HSV图像的通道拆分和合并&#xff0c;获得了很多意想不到的效果&#xff0c;相关链接包括且不限于&#xff1a; python学opencv|读取图像&#xff08;十二&#xff09;BGR图像转HSV图像-CSDN博客 python学opencv|读…...

WSL2安装到自定义盘教程(非先安装后打包)

step1&#xff1a;环境配置 按照官方教程从头到尾配置一遍&#xff0c;直到从微软商店下载好Ubuntu20.04为止 step2&#xff1a;拷贝下载内容 使用微软商店下载的应用安装包会默认保存在C:\Program Files\WindowsApps目录下 在该目录下找到以CanonicalGroupLimited开头的文…...

环境变量的知识

目录 1. 环境变量的概念 2. 命令行参数 2.1 2.2 创建 code.c 文件 2.3 对比 ./code 执行和直接 code 执行 2.4 怎么可以不带 ./ 2.4.1 把我们的二进制文件拷贝到 usr/bin 路径下&#xff0c;也不用带 ./ 了 2.4.2 把我们自己的路径添加到环境变量里 3. 认识PATH 3.…...

【python】OpenCV—Image Moments

文章目录 1、功能描述2、图像矩3、代码实现4、效果展示5、完整代码6、涉及到的库函数cv2.moments 7、参考 1、功能描述 计算图像的矩&#xff0c;以质心为例 2、图像矩 什么叫图像的矩&#xff0c;在数字图像处理中有什么作用&#xff1f; - 谢博琛的回答 - 知乎 https://ww…...

优化 HTTP 接口请求:缓存策略与实现方法

前言 在前端开发中&#xff0c;HTTP 请求的处理是至关重要的一环。Axios 作为一个流行的 HTTP 客户端&#xff0c;其简洁性和灵活性使得它广受开发者青睐。然而&#xff0c;为了优化应用性能和提升用户体验&#xff0c;合理地缓存请求结果显得尤为重要。本文将深入探讨如何在 …...

图形 3.3 曲面细分与几何着色器_大规模草渲染

细分后的顶点曲面细分与几何着色器 大规模草渲染 B站视频&#xff1a;图形 3.3 曲面细分与几何着色器 大规模草渲染 文章目录 细分后的顶点曲面细分与几何着色器 大规模草渲染着色器执行顺序曲面细分着色器概述曲线和曲面相关概念输入与输出总体流程Hull Shader常量外壳着色器…...

shell8

until循环(条件为假的时候一直循环和while相反) i0 until [ ! $i -lt 10 ] doecho $i((i)) done分析 初始化变量&#xff1a; i0&#xff1a;将变量i初始化为0。 条件判断 (until 循环)&#xff1a; until [ ! $i -lt 10 ]&#xff1a;这里的逻辑有些复杂。它使用了until循环…...

嵌入式驱动RK3566 HDMI eDP MIPI 背光 屏幕选型与调试提升篇-eDP屏

eDP是嵌入式显示端口&#xff0c;具有高数据传输速率&#xff0c;高带宽&#xff0c;高分辨率、高刷新率、低电压、简化接口数量等特点。现大多数笔记本电脑都是用的这种接口。整个eDP是很复杂的&#xff0c;这里我们不讲底层原理&#xff0c;我们先掌握如何用泰山派来驱动各种…...

2024年华为OD机试真题-字符串分割-C++-OD统一考试(E卷)

最新华为OD机试考点合集:华为OD机试2024年真题题库(E卷+D卷+C卷)_华为od机试题库-CSDN博客 每一题都含有详细的解题思路和代码注释,精编c++、JAVA、Python三种语言解法。帮助每一位考生轻松、高效刷题。订阅后永久可看,发现新题及时跟新。 题目描述: 给定非空字符串…...

图书馆管理系统(三)基于jquery、ajax

任务3.4 借书还书页面 任务描述 这部分主要是制作借书还书的界面&#xff0c;这里我分别制作了两个网页分别用来借书和还书。此页面&#xff0c;也是通过获取books.txt内容然后添加到表格中&#xff0c;但是借还的操作没有添加到后端中去&#xff0c;只是一个简单的前端操作。…...

【练习Day20】字符串变形

链接&#xff1a;字符串变形_牛客题霸_牛客网 方法一&#xff1a;双逆转&#xff08;推荐使用&#xff09; 思路&#xff1a; 将单词位置的反转&#xff0c;那肯定前后都是逆序&#xff0c;不如我们先将整个字符串反转&#xff0c;这样是不是单词的位置也就随之反转了。但是单…...

鸿蒙项目云捐助第二十讲云捐助项目物联网IOT的使用

鸿蒙项目云捐助第二十讲云捐助项目物联网IOT的使用 在鸿蒙技术完成云捐助项目中&#xff0c;物联网技术也是具有一定生命力的存在。这里也会在云捐助项目中使用物联网的技术。 一、华为云IoT物联网操作 这里以华为云的Iot物联网操作来介绍华为云I ot物联网技术。 这里从百度…...

Linux设置篇

查看主机名 hostname 修改主机名 hostnamectl set-hostname 主机名 配置ip映射 vi /etc/hosts 192.168.1.10 pure 限制SSH登录的IP a) 设置禁止所有ip连接服务器的SSH vi /etc/hosts.deny sshd:all:deny b) 设置允许指定ip连接服务器的SSH&#xff08;这边建议设置一个备…...

WatchAlert - 开源多数据源告警引擎

概述 在现代 IT 环境中&#xff0c;监控和告警是确保系统稳定性和可靠性的关键环节。然而&#xff0c;随着业务规模的扩大和数据源的多样化&#xff0c;传统的单一数据源告警系统已经无法满足复杂的需求。为了解决这一问题&#xff0c;我开发了一个开源的多数据源告警引擎——…...

百度面试手撕 go context channel部分学习

题目 手撕 对无序的切片查询指定数 使用context进行子协程的销毁 并且进行超时处理。 全局变量定义 var (startLoc int64(0) // --- 未处理切片数据起始位置endLoc int64(0) // --- 切片数据右边界 避免越界offset int64(0) // --- 根据切片和协程数量 在主线程 动态设…...

主流浏览器内核

1‌、Chromium内核‌ 由Google主导开发&#xff0c;最具代表性的是Google Chrome浏览器。Chromium内核的优点包括无广告、不易崩溃、速度快、安全性高。目前&#xff0c;许多浏览器都采用了Chromium内核&#xff0c;如360极速浏览器、UC浏览器、QQ浏览器等&#xff0c;windows自…...

Apache Tomcat 漏洞CVE-2024-50379条件竞争文件上传漏洞 servlet readonly spring boot 修复方式

1&#xff0c;关于漏洞 Apache Tomcat是一个流行的开源 Web 服务器和 Java Servlet 容器。 二、 漏洞描述 Apache Tomcat中修复了个 TOCTOU 竞争条件远程代码执行漏洞 (CVE-2024-50379)&#xff0c;该漏洞的 CVSS 评分为 9.8。Apache Tomcat 中 JSP 编译期间存在检查时间使用时…...

Java学习教程,从入门到精通,Java LinkedList(链表)语法知识点及案例代码(62)

Java LinkedList&#xff08;链表&#xff09;语法知识点及案例代码 一、LinkedList概述 LinkedList是Java集合框架中的一个类&#xff0c;位于java.util包中。它实现了List、Deque、Queue等接口&#xff0c;提供了链表数据结构的实现。链表是一种线性数据结构&#xff0c;其…...

3分钟读懂数据分析的流程是什么

数据分析是基于商业目的&#xff0c;有目的地进行收集、整理、加工和分析数据&#xff0c;提炼出有价值的 信息的一个过程。整个过程大致可分为五个阶段&#xff0c;具体如下图所示。 1.明确目的和思路 在开展数据分析之前&#xff0c;我们必须要搞清楚几个问题&#xff0c;比…...

【Leetcode 热题 100 - 扩展】303. 区域和检索 - 数组不可变

问题背景 给定一个整数数组 n u m s nums nums&#xff0c;处理以下类型的多个查询&#xff1a; 计算索引 l e f t left left 和 r i g h t right right&#xff08;包含 l e f t left left 和 r i g h t right right&#xff09;之间的 n u m s nums nums 元素的 和 &a…...

Leecode刷题C语言之同位字符串连接的最小长度

执行结果:通过 执行用时和内存消耗如下&#xff1a; bool check(char *s, int m) {int n strlen(s), count0[26] {0};for (int j 0; j < n; j m) {int count1[26] {0};for (int k j; k < j m; k) {count1[s[k] - a];}if (j > 0 && memcmp(count0, cou…...

API开发:Flask VS FastAPI

在当今的Web开发领域&#xff0c;选择合适的框架对于构建高效、稳定且易于维护的API至关重要。Flask和FastAPI是两个备受关注的Python Web框架&#xff0c;它们各自具有独特的特点和优势&#xff0c;适用于不同的开发场景。 文章目录 一、简介二、性能表现三、开发效率&#xf…...

fastAPI接口的请求与响应——基础

1. 后端接口 1.接口实现 pip install fastapi pip install uvicorn# api.py from pydantic import BaseModel from fastapi import FastAPI import uvicorn import os# 定义请求体模型 class Payload(BaseModel):key1: strkey2: str# 创建一个FastAPI应用程序实例 app Fast…...

[oeasy]python054_python有哪些关键字_keyword_list_列表_reserved_words

python有哪些关键字_keyword_list_列表_reserved_words 回忆上次内容 hello world 不是 从来就有的 来自于 c语言 print、小括号 和 双引号 也来自于 c语言 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; python 标识符 的 命名规则 依然 完全 学习…...

面试题整理2---Nginx 性能优化全方案

面试题整理2---Nginx 性能优化全方案 1. 调整工作进程数和线程数1.1 调整工作进程数1.2 调整进程的最大连接数 2. 配置Gzip压缩2.2 配置Gzip压缩 3. 配置缓存策略3.1 配置浏览器缓存时间3.2 配置代理服务器缓存时间 4. 优化文件访问方式4.1 使用sendfile()函数发送文件数据4.2 …...

15.3、陷阱技术 入侵容忍 隐私保护技术

目录 网络攻击陷阱技术与应用蜜罐主机技术陷阱网络技术三代陷阱网络网络攻击陷阱技术应用入侵容忍及系统生存技术入侵容忍及系统生存技术应用隐私保护技术网络安全的前沿技术发展动向 网络攻击陷阱技术与应用 攻击陷阱技术也叫诱骗技术&#xff0c;它是一种主动防御的方法&…...