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.rhkb.cn/news/192807.html

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

相关文章

从头开始的卷积神经网络

VGG-16 卷积神经网络。来源&#xff1a;LearnOpenCV 参考资料&#xff1a;这篇文章可以在 Kaggle Notebook &#x1f9e0; Convolutional Neural Network From Scratch上更好地阅读。路易斯费尔南多托雷斯 一、说明 本文详细介绍在tf2.0上&#xff0c;使用ceras实现基本的神经…

μC/OS-II---计时器管理1(os_tmr.c)

目录 创建一个计时器重新启动一个计时器停止一个计时器删除一个计时器 计时器是倒计时器&#xff0c;当计数器达到零时执行某个动作。用户通过回调函数提供这个动作。回调函数是用户声明的函数&#xff0c;在计时器到期时被调用。在回调函数中绝对不能进行阻塞调用&#xff08;…

springboot单体项目部署

配置类 检查跨域配置类 检查黑白名单是否有问题&#xff0c;是否需要更改 配置文件 检查端口 查看端口是否为需要搭建的端口 检查数据源 查看数据库是否为线上数据库 配置页面 注意&#xff1a;如果是单体项目的话&#xff0c;前端页面是和后端整合在一起的&#xff0…

第二篇 《随机点名答题系统》——题库管理详解(类抽奖系统、在线答题系统、线上答题系统、在线点名系统、线上点名系统、在线考试系统、线上考试系统)

目录 1.功能需求 2.数据库设计 3.流程设计 4.关键代码 4.1.题库维护 4.1.1数据请求示意图 4.1.2添加题库&#xff08;login.php&#xff09;数据请求代码 4.1.3删除题库&#xff08;login.php&#xff09;数据请求代码 4.1.4 业务处理Service&#xff08;tiKuService…

【React】Redux基本使用

什么情况使用 Redux &#xff1f; Redux 适用于多交互、多数据源的场景。简单理解就是复杂 从组件角度去考虑的话&#xff0c;当我们有以下的应用场景时&#xff0c;我们可以尝试采用 Redux 来实现 某个组件的状态需要共享时 一个组件需要改变其他组件的状态时 一个组件需要…

11-13 /11-14代理模式 AOP

调用者 代理对象 目标对象 代理对象除了可以完成核心任务&#xff0c;还可以增强其他任务,无感的增强 代理模式目的: 不改变目标对象的目标方法的前提,去增强目标方法 分为:静态代理,动态代理 静态代理 有对象->前提需要有一个类&#xff0c;那么我们可以事先写好一个类&a…

【Mycat2实战】三、Mycat实现读写分离

1. 无聊的理论知识 什么是读写分离 读写分离&#xff0c;基本的原理是让主数据库处理事务性增、改、删操作&#xff0c; 而从数据库处理查询操作。 为什么使用读写分离 从集中到分布&#xff0c;最基本的一个需求不是数据存储的瓶颈&#xff0c;而是在于计算的瓶颈&#xff…

汽配零件发FBA美国专线

随着电商的迅速发展&#xff0c;跨境电商平台如亚马逊的FBA(Fulfillment by Amazon)服务成为了许多商家选择的销售渠道。对于汽配零件行业来说&#xff0c;发FBA美国专线可以打开更广阔的市场&#xff0c;并且有望获得可观的发展前景。下面将从市场分析和前景两个方面来探讨汽配…

pyTorch Hub 系列#2:VGG 和 ResNet

一、说明 在上一篇教程中,我们了解了 Torch Hub 背后的本质及其概念。然后,我们使用 Torch Hub 的复杂性发布了我们的模型,并通过相同的方式访问它。但是,当我们的工作要求我们利用 Torch Hub 上提供的众多全能模型之一时,会发生什么? 在本教程中,我们将学习如何利用称为…

[NSSRound#7 Team]ShadowFlag

文章目录 前置知识/proc目录python的反弹shellpin码计算 解题步骤 前置知识 /proc目录 Linux系统上的/proc目录是一种文件系统&#xff0c;用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息&#xff0c;甚至可以通过更改其中某些文件来改变内核的运行状态。/pro…

漏电继电器 LLJ-250HT AC220V 50-500ma 面板安装

系列型号&#xff1a; LLJ-10H(S)漏电继电器LLJ-15H(S)漏电继电器LLJ-16H(S)漏电继电器 LLJ-25H(S)漏电继电器LLJ-30H(S)漏电继电器LLJ-32H(S)漏电继电器 LLJ-60H(S)漏电继电器LLJ-63H(S)漏电继电器LLJ-80H(S)漏电继电器 LLJ-100H(S)漏电继电器LLJ-120H(S)漏电继电器LLJ-125H(…

深度学习 机器视觉 人脸识别系统 - opencv python 计算机竞赛

文章目录 0 前言1 机器学习-人脸识别过程人脸检测人脸对其人脸特征向量化人脸识别 2 深度学习-人脸识别过程人脸检测人脸识别Metric Larning 3 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习 机器视觉 人脸识别系统 该项目…

等保到底在“保”什么?

在信息时代&#xff0c;等保评级成为衡量企业信息安全水平的重要标准。那么&#xff0c;什么是等保评级呢&#xff1f;等保合规到底保的是什么呢&#xff1f;一起来看看吧。 编辑搜图 请点击输入图片描述&#xff08;最多18字&#xff09; 等保评级&#xff0c;会从七个维度进…

03-CSS基础选择器

3.1 CSS基础认知&#x1f34e; 3.1.1 &#x1f441;️‍&#x1f5e8;️CSS概念 CSS&#xff1a;层叠样式表&#xff08;Cascading style sheets)&#xff0c;为网页标签增加样式表现的 语法格式&#xff1a; 选择器{<!-- 属性设置 -->属性名:属性值; <!--每一个…

从0到0.01入门React | 004.精选 React 面试题

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

《QT从基础到进阶·二十八》QProcess使用,从一个exe程序启动另一个exe程序

QString exePath QCoreApplication::applicationDirPath(); //获取要启动的另一个exe路径 exePath exePath “/OffLineProcess.exe”; //路径exe名称 QProcess* Process new QProcess; //创建新的进程 Process->start(exePath)…

Dart利用私有构造函数_()创建单例模式

文章目录 类的构造函数_()函数dart中构造函数定义 类的构造函数 类的构造函数有两种&#xff1a; 1&#xff09;默认构造函数&#xff1a; 当实例化对象的时候&#xff0c;会自动调用的函数&#xff0c;构造函数的名称和类的名称相同&#xff0c;在一个类中默认构造函数只能由…

Copliot:让你一秒变身网页达人的神奇助手

Copliot&#xff1a;一款能够帮助你快速理解网页内容的智能助手 你是否有过这样的经历&#xff0c;当你浏览网页时&#xff0c;遇到了一些你不太了解的内容&#xff0c;比如一些专业术语&#xff0c;一些复杂的概念&#xff0c;或者一些有趣的话题&#xff1f;你是否想要快速地…

代码随想录 Day44 动规12 LeetCode T300 最长递增子序列 T674 最长连续递增序列 T718 最长重复子数组

前言 本期我们来解决动规的经典题型------ 子数组问题 我们还是会使用动规五部曲来解决问题,下面我们仍然列出动规五部曲 1.明确dp数组含义 2.明确dp数组如何推导-递推公式 3.初始化dp数组 4.确定遍历顺序 5.打印dp数组排错 LeetCode T300 最长递增子序列 题目链接:300. 最长…

git分支管理以及不同git工作流对比

0、 单人开发场景 单人开发可能会出现的场景之一 如果多人协同开发我们则需要使用更加专业的工具Git&#xff08;分布式版本控制&#xff09; 1、多人协同工作使用git会出现什么问题? 代码冲突&#xff1a; 问题&#xff1a; 当多个开发者同时修改同一文件或同一行代码时…