k8s集群搭建(ubuntu 20.04 + k8s 1.28.3 + calico + containerd1.7.8)

环境&需求

服务器:

10.235.165.21 k8s-master
10.235.165.22 k8s-slave1
10.235.165.23 k8s-slave2

OS版本:

root@vms131:~# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:  Ubuntu 20.04.5 LTS
Release:    20.04
Codename:    focal

需求

​ 在 Ubuntu 20.04上搭建k8s1.28.3,并使用containerd作为容器运行时,使用calico作为cni插件。

安装步骤

特别注意

以下操作,除特别标注外,都是在所有节点上执行

环境准备

  • 服务器:linux发行版,最低配置2C2G

  • 各节点网络互通

  • 节点之中不可以有重复的主机名、MAC 地址

    • 你可以使用命令 ip linkifconfig -a 来获取网络接口的 MAC 地址
    • 可以使用 sudo cat /sys/class/dmi/id/product_uuid 命令对 product_uuid 校验
  • 开放必要的端口(cni插件的端口要求以cni插件文档说明为准)
    在这里插入图片描述
    在这里插入图片描述

  • 配置节点主机名

    hostnamectl set-hostname k8s-master
    hostnamectl set-hostname k8s-slave1
    hostnamectl set-hostname k8s-slave2
  • 配置hostname解析

    cat>>/etc/hosts<<-eof
    10.235.165.21 k8s-master
    10.235.165.22 k8s-slave1
    10.235.165.23 k8s-slave2
    eof
    
  • 关闭selinux

    echo "SELINUX=disabled" >> /etc/selinux/config
    
  • 关闭swap

    swapoff -a && sed -i '/swap/ s/^\(.*\)$/#\1/' /etc/fstab
    
  • 关闭防火墙并禁止开机自启

    ufw disable
    
  • 转发 IPv4 并让 iptables 看到桥接流量

    cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
    overlay
    br_netfilter
    EOFsudo 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
    

安装容器运行时(containerd)

安装containerd

1)安装containerd 1.7.8

# 下载二进制文件
root@k8s-master:~# wget https://github.com/containerd/containerd/releases/download/v1.7.8/containerd-1.7.8-linux-amd64.tar.gz# 解压
root@k8s-master:/zpdata/packages# tar Cxzvf /usr/local containerd-1.7.8-linux-amd64.tar.gz
bin/
bin/containerd-shim-runc-v1
bin/containerd-stress
bin/containerd-shim-runc-v2
bin/containerd
bin/containerd-shim
bin/ctr

FAQ: For Kubernetes, do I need to download cri-containerd-(cni-)<VERSION>-<OS-<ARCH>.tar.gz too?

Answer: No.

As the Kubernetes CRI feature has been already included in containerd-<VERSION>-<OS>-<ARCH>.tar.gz, you do not need to download the cri-containerd-.... archives to use CRI.

2)【可选】将containerd配置成systemd服务,方便使用systemctl命令管理

root@k8s-master:/zpdata/packages# mkdir -p /usr/local/lib/systemd/system/ ; cd /usr/local/lib/systemd/system/
root@k8s-master:/usr/local/lib/systemd/system# curl -s -o containerd.service http://raw.githubusercontent.com/containerd/containerd/main/containerd.service# 加载配置文件
systemctl daemon-reload
# 设置开启自启并立即启动
systemctl enable --now containerd

配置containerd的config.toml

containerd的一些默认参数可能不兼容,需要针对性的调整

root@k8s-master:/zpdata/packages# mkdir /etc/containerd
root@k8s-master:/zpdata/packages# containerd config default > /etc/containerd/config.toml

做如下修改

  1. 修改“sandbox_image”
[plugins."io.containerd.grpc.v1.cri"]
……
sandbox_image = "registry.k8s.io/pause:3.8"  #修改为   sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.8"
  1. 修改"SystemdCgroup"【重要,需要与kubelet的cGroupDriver匹配】
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
……
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
……
SystemdCgroup = false    # 改为  SystemdCgroup = true

然后重启containerd

sudo systemctl restart containerd

安装runc

root@k8s-master:/zpdata/packages# wget http://github.com/opencontainers/runc/releases/download/v1.1.10/runc.amd64
root@k8s-master:/zpdata/packages# install -m 755 runc.amd64 /usr/local/sbin/runc

安装cni

root@k8s-slave1:/zpdata/packages# wget http://github.com/containernetworking/plugins/releases/download/v1.3.0/cni-plugins-linux-amd64-v1.3.0.tgz 
root@k8s-master:/zpdata/packages# mkdir -p /opt/cni/bin
root@k8s-master:/zpdata/packages# tar Cxzvf /opt/cni/bin/ cni-plugins-linux-amd64-v1.3.0.tgz 

安装容器操作的客户端工具(crictl,nerdctl)

crictl --For debugging only

VERSION="v1.28.0" # check latest version in https://github.com/kubernetes-sigs/cri-tools/releases page
wget https://github.com/kubernetes-sigs/cri-tools/releases/download/$VERSION/crictl-$VERSION-linux-amd64.tar.gz
sudo tar zxvf crictl-$VERSION-linux-amd64.tar.gz -C /usr/local/bin# 检查
root@k8s-master:/zpdata/packages# crictl -v
crictl version v1.28.0

nerdctl– General-purpose

root@k8s-master:/zpdata/packages# wget https://github.com/containerd/nerdctl/releases/download/v1.7.0/nerdctl-1.7.0-linux-amd64.tar.gz
root@k8s-master:/zpdata/packages# tar Cxzvvf /usr/local/bin nerdctl-1.7.0-linux-amd64.tar.gz
# 检查
root@k8s-master:/usr/local/bin# nerdctl -v
nerdctl version 1.7.0

安装 kubeadm、kubelet 和 kubectl

执行安装脚本install_kubeadm_kubelet_kubectl.sh:

#!/usr/bin/sh
# 1.更新 apt 包索引并安装使用 Kubernetes apt 仓库所需要的包
echo "###step1#####
apt-get update
mkdir -p -m 755  /etc/apt/keyrings# 2.下载用于 Kubernetes 软件包仓库的公共签名密钥
echo "###step2#####
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg# 3. 添加 Kubernetes apt 仓库。 请注意,此仓库仅包含适用于 Kubernetes 1.28 的软件包; 对于其他 Kubernetes 次要版本,则需要更改 URL 中的 Kubernetes 次要版本以匹配你所需的次要版本 (你还应该检查正在阅读的安装文档是否为你计划安装的 Kubernetes 版本的文档)。
echo "###step3#####
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list# 4. 更新 apt 包索引,安装 kubelet、kubeadm 和 kubectl,并锁定其版本
echo "###step4#####
apt-get update
apt-get install -y kubelet kubeadm kubectl
#”apt-mark hold“用于避免执行apt upgrade命令时,将未锁定的包误更新。
apt-mark hold kubelet kubeadm kubectl

kubelet 配置 cgroup 驱动程序

警告

需要确保容器运行时和 kubelet 所使用的是相同的 cgroup 驱动,否则 kubelet 进程会失败。

前述步骤中containerd使用的systemd 作为cgroup驱动,所以kubelet也需要使用systemd作为cgroup驱动。

相关细节可参见配置 cgroup 驱动。

kubeadm 支持在执行 kubeadm init 时,传递一个 KubeletConfiguration 结构体,形如kubeadm init --config kubeadm-config.yamlKubeletConfiguration 包含 cgroupDriver 字段,可用于控制 kubelet 的 cgroup 驱动。

如下是KubeletConfiguration的最小样例:

# kubeadm-config.yaml
kind: ClusterConfiguration
apiVersion: kubeadm.k8s.io/v1beta3
kubernetesVersion: v1.21.0
---
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
cgroupDriver: systemd

注意:

在版本 1.22 及更高版本中,如果用户没有在 KubeletConfiguration 中设置 cgroupDriver 字段, kubeadm 会将它设置为默认值 systemd

使用 kubeadm init 创建集群

默认情况下,kubeadm 会从 registry.k8s.io 仓库拉取镜像,在没有互联网连接的情况下运行 kubeadm,

kubeadm config images list  #查看kubeadm init需要的镜像
kubeadm config images pull  # 提前拉取这些镜像#查看kubeadm init的默认值
kubeadm config print init-defaults
#查看kubeadm join的默认值
kubeadm config print join-defaults

【master节点】

kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version=v1.28.3

出现这个提示说明init成功

Your Kubernetes control-plane has initialized successfully!

注意到kubectl get no发现状态为NotReady,是因为没有网络插件

root@k8s-master:/etc/apt/sources.list.d# kubectl get no
NAME         STATUS     ROLES           AGE     VERSION
k8s-master   NotReady   control-plane   2m32s   v1.28.3

安装网络插件(Calico)

k8s中网络插件有很中,比如:Calico,Flannel等,calico作为k8s的中的一种资源,只需要在master上执行即可。

以下以安装Calico为例

# 1)下载calico.yaml文件
wget https://github.com/projectcalico/calico/raw/2f38bd7adc4771a1de28bd2545e28d888c017a00/manifests/calico.yaml# 2)做如下修改 calico.yaml.default为修改前,calico.yaml为修改后
root@k8s-master:/zpdata/packages# diff calico.yaml.default  calico.yaml
4931,4932c4931,4932
<             # - name: CALICO_IPV4POOL_CIDR
<             #   value: "192.168.0.0/16"
---
>             - name: CALICO_IPV4POOL_CIDR
>               value: "10.96.0.0/12"# 10.96.0.0/12  值来源于kubeadm init时指定的 --pod-network-cidr 参数,默认是:10.96.0.0/12
root@k8s-master:/zpdata/packages# kubectl get cm -n kube-system kubeadm-config -o yaml | grep serviceSubnetserviceSubnet: 10.96.0.0/12

使用kubeadm join将node加入k8s集群

【slave1,slave2节点执行】

kubeadm join 10.235.165.21:6443 --token aziikp.bm2cdaqa19jh3o74 \--discovery-token-ca-cert-hash sha256:c93e7c0eb331a663783f5526322a1ceb231338f06c61647adb082395e3a5c1f7

ps:

若令牌过期,或丢失上述指令可在控制平面节点使用如下指令重新获取:kubeadm token create --print-join-command

验证

【master节点执行】

root@k8s-master:/zpdata/packages# kubectl get no -o wide
NAME         STATUS   ROLES           AGE   VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
k8s-master   Ready    control-plane   55m   v1.28.3   10.235.165.21   <none>        Ubuntu 20.04.5 LTS   5.4.0-137-generic   containerd://1.7.8
k8s-slave1   Ready    <none>          28m   v1.28.3   10.235.165.22   <none>        Ubuntu 20.04.5 LTS   5.4.0-137-generic   containerd://1.7.8
k8s-slave2   Ready    <none>          28m   v1.28.3   10.235.165.23   <none>        Ubuntu 20.04.5 LTS   5.4.0-137-generic   containerd://1.7.8
root@k8s-master:/zpdata/packages# kubectl cluster-info
Kubernetes control plane is running at https://10.235.165.21:6443
CoreDNS is running at https://10.235.165.21:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxyTo further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

如上,k8s 1.28.3 集群搭建完成

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue中一个页面引入多个相同组件重复请求的问题?

⚠️&#xff01;&#xff01;&#xff01;此内容需要了解一下内容&#xff01;&#xff01;&#xff01; 1、会使用promise&#xff1f;&#xff1f;&#xff1f; 2、 promise跟 async 的区别&#xff1f;&#xff1f;&#xff1f; async 会终止后面的执行&#xff0c;后续…

vue中通过.style.animationDuration属性,根据数据长度动态设定元素的纵向滚动时长的demo

根据数据长度动态设定元素的animation 先看看效果&#xff0c;是一个纯原生div标签加上css实现的表格纵向滚动动画&#xff1a; 目录 根据数据长度动态设定元素的animationHTMLjs逻辑1、判断是数据长度是否达到滚动要求2、根据数据长度设置滚动速度 Demo完整代码 HTML 1、确…

Qt 线程串口

文章目录 ui设置创建线程函数初始串口run函数接收发送数据读取数据处理读取的数据写入数据写入启动的命令 主线程 ui设置 创建线程函数 #include <QObject> #include <QThread> #include <QSerialPort> #include <QSerialPortInfo>class SerialPort :…

2023年10月国产数据库大事记-墨天轮

本文为墨天轮社区整理的2023年10月国产数据库大事件和重要产品发布消息。 目录 10月国产数据库大事记 TOP1010月国产数据库大事记&#xff08;时间线&#xff09;产品/版本发布兼容认证代表厂商大事记厂商活动排行榜新增数据库相关资料 10月国产数据库大事记 TOP10 10月国产…

分享一个在线免费制作和视频合成gif的网站

一、打开网站 在线制作高清gif动图-视频转gif表情工具-图片合成软件-gif.cn_GIF中文网 如图 二、可以选择gif合成&#xff0c;也就是把多张图片合成gif 效果图&#xff0c;我用了三张图片。 三、可以选择视频转gif。 效果图 四、完

公益SRC实战|SQL注入漏洞攻略

目录 一、信息收集 二、实战演示 三、使用sqlmap进行验证 四、总结 一、信息收集 1.查找带有ID传参的网站&#xff08;可以查找sql注入漏洞&#xff09; inurl:asp idxx 2.查找网站后台&#xff08;多数有登陆框&#xff0c;可以查找弱口令&#xff0c;暴力破解等漏洞&…

足底筋膜炎怎么治疗治愈

足底筋膜炎又称为跖筋膜炎&#xff0c;跖筋膜主要在足弓下方&#xff0c;它维持足弓稳定性&#xff0c;对于喜欢长期长跑、跳远&#xff0c;或者越野运动&#xff0c;或者部队中的士兵进行拉练&#xff0c;还有需要久坐或者久站的人群中&#xff0c;容易发生跖筋膜炎。治疗方法…

如何准备2024年的系统设计面试?

1 前言 如果你正在准备软件工程师或软件开发人员的面试,那么你可能知道由于其开放性质和广泛性,准备系统设计是多么困难,但同时你也不能忽略它。在软件工程界,如果你正在申请高级工程师/主管/架构师或更高级别的角色,系统设计是最受追捧的技能,也是整个过程中最重要的环节之一…

学习c#的第五天

目录 C# 运算符 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 其他运算符 C# 中的运算符优先级 C# 运算符 算术运算符 下表显示了 C# 支持的所有算术运算符。假设变量 A 的值为 10&#xff0c;变量 B 的值为 20&#xff0c;则&#xff1a; 运算符描述实例…

一文搞懂CAN总线协议

1.基础概念 CAN 是 Controller Area Network 的缩写&#xff08;以下称为 CAN&#xff09;&#xff0c;是 ISO 国际标准化的串行通信协议。在北美和西欧&#xff0c;CAN 总线协议已经成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线&#xff0c;并且拥有以 CAN 为底层…

【广州华锐互动】AR技术为气象站远程监控及在线指导维修提供极大便利

随着科技的不断发展&#xff0c;人类对于自然环境的理解和掌控能力也在不断提升。其中&#xff0c;AR&#xff08;增强现实&#xff09;技术的应用&#xff0c;为气象监控带来了革命性的变化。AR远程气象监测&#xff0c;就是将AR技术与气象监控相结合&#xff0c;通过虚拟与现…

企业传统纸质设备维修方式的痛点以及解决方案

传统的纸质设备维修方式有很多痛点&#xff1a; 数据更新和访问的低效率&#xff1a;传统的纸质记录方法在更新和检索数据时效率极低。这种方式无法实时更新设备的维修状态&#xff0c;导致管理层和维修人员无法及时获取最新信息&#xff0c;影响决策的速度和质量。 记录的易…