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

安装容器运行时(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 serviceSubnet
      serviceSubnet: 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/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

如上,k8s 1.28.3 集群搭建完成

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

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

相关文章

Java自学第11课:电商项目(4)重新建立项目

经过前几节的学习&#xff0c;我们已经找到之前碰到的问题的原因了。那么下面接着做项目学习。 1 新建dynamic web project 建立时把web.xml也生成下&#xff0c;省的右面再添加。 会询问是否改为java ee环境&#xff1f;no就行&#xff0c;其实改过来也是可以的。这个不重要。…

css3 初步了解

1、css3的含义及简介 简而言之&#xff0c;css3 就是 css的最新标准&#xff0c;使用css3都要遵循这个标准&#xff0c;CSS3 已完全向后兼容&#xff0c;所以你就不必改变现有的设计&#xff0c; 2、一些比较重要的css3 模块 选择器 1、标签选择器&#xff0c;也称为元素选择…

滚珠螺杆在注塑机械手中起什么作用?

注塑机械手的配件中滚珠螺杆是重要的一环&#xff0c;在注塑机械手中起着重要的作用。注塑机械手是一种自动化设备&#xff0c;可以在注塑生产中实现自动化操作&#xff0c;而滚珠螺杆则是实现这一操作的关键部件之一。 滚珠螺杆是一种将旋转运动转化为直线运动的精密传动部件&…

在Linux系统下微调Llama2(MetaAI)大模型教程—Qlora

Llama2是Meta最新开源的语言大模型&#xff0c;训练数据集2万亿token&#xff0c;上下文长度是由Llama的2048扩展到4096&#xff0c;可以理解和生成更长的文本&#xff0c;包括7B、13B和70B三个模型&#xff0c;在各种基准集的测试上表现突出&#xff0c;最重要的是&#xff0c…

【Linux网络】本地DNS服务器搭建

目录 一、什么是DNS&#xff0c;相关介绍 1、dns是什么&#xff1a; 2、域名的分类&#xff1a; 3、服务器的类型 二、DNS解析的过程 三、DNS的相关配置文件学习 1、本地主机有关的DNS文件学习 2、本地的DNS缓存服务器的文件 3、bind软件的相关配置文件&#xff1a; 4…

Jmeter执行接口自动化测试-如何初始化清空旧数据

需求分析&#xff1a; 每次执行完自动化测试&#xff0c;我们不会执行删除接口把数据删除&#xff0c;而需要留着手工测试&#xff0c;此时会导致下次执行测试有旧数据我们手工可能也会新增数据&#xff0c;导致下次执行自动化测试有旧数据 下面介绍两种清空数据的方法 一、通…

nginx代理docker容器服务

场景描述 避免暴力服务端口&#xff0c;使用nginx代理 一个前端&#xff0c;一个后端&#xff0c;docker方式部署到服务器&#xff0c;使用docker创建的nginx代理端口请求到前端端口 过程 1 docker 安装nginx 1.1 安装一个指定版本的nginx docker pull nginx#启动一个ngi…

vuejs - - - - - 移动端设备兼容(pxtorem)

pxtorem的使用 1. 依赖安装2. vue.config.js配置3. 动态设置html的font-size大小4. 效果如图&#xff1a; 1. 依赖安装 yarn add postcss-pxtorem -D 2. vue.config.js配置 module.exports {...css: {loaderOptions: {postcss: {plugins: [require("postcss-pxtorem&quo…

22.能被7整除,并且求和。

#include<stdio.h>int main(){int i ,sum0;printf("1-1000能被7整除的数字有&#xff1a;\n");for(i1;i<1000;i){if(i%70){printf("%d ",i);sumsumi;} }printf("\n");printf("能被7整除的数字的和是&#xff1a;%d ",sum);re…

这样书写Python代码的方式,实在是太优雅了~

文章目录 前言一、在Python中配合pipe灵活使用链式写法二 、pipe中常用的管道操作函数1.使用traverse()展平嵌套数组2.使用dedup()进行顺序去重3.使用filter()进行值过滤4.使用groupby()进行分组运算5.使用select()对上一步结果进行自定义遍历运算6.使用sort()进行排序 总结关于…

线性表->栈

文章目录 前言概述栈的初始化销毁压栈出栈判断栈为不为空栈的有效个数 前言 栈相对于链表&#xff0c;稍微简单一点&#xff0c;但是栈的难点在于通过栈去理解递归算法。 概述 **栈&#xff1a;**一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。…

Redis解决缓存问题

目录 一、引言二、缓存三、Redis缓存四、缓存一致性1.缓存更新策略2.主动更新 五、缓存穿透六、缓存雪崩七、缓存击穿1.基于互斥锁解决具体业务2.基于逻辑过期解决具体业务 一、引言 在一些大型的网站中会有十分庞大的用户访问流量&#xff0c;而过多的用户访问对我们的MySQL数…

初学UE5 C++①

游戏类 1.创建所需项的类 2.创建游戏模式类&#xff0c;在该类上实现所需项&#xff0c;引入头文件和构造函数时实例化 三种时间函数类型函数和提示类型 FName、FString、FText类型相互转化 FName用FName FString用ToString&#xff08;&#xff09; FText用FText&#xff1a;…

零代码搭建:无需编程基础,轻松搭建数据自己的能源监测管理平台

零代码搭建能源管理平台&#xff0c;其核心是通过使用图形用户界面和可视化建模工具&#xff0c;来减少编写代码的工作量以及技能要求。平台拥有丰富的预定义组件&#xff0c;可以帮助管理人员快速构建应用程序。并可自定义区域框架&#xff0c;在搭建自己区域时&#xff0c;能…

说说对React Hooks的理解?解决了什么问题?

一、是什么 Hook 是 React 16.8 的新增特性。它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性 至于为什么引入hook,官方给出的动机是解决长时间使用和维护react过程中常遇到的问题,例如: 难以重用和共享组件中的与状态相关的逻辑逻辑复杂的组件难以开…

Juniper PPPOE双线路冗余RPM配置

------------------ 浮动静态路由 set routing-options static route 0.0.0.0/0 next-hop pp0.0 qualified-next-hop pp0.1 preference 10 ----------------- RPM测试的内容,包括从哪个接口发起测试,测试ping等等 #指定探针类型用ICMP请求 #探测的目标地址 #探测间隔 #探测阈…

编译原理-语法分析-自上而下分析

文章目录 语法分析器的功能自上而下分析面临的问题LL&#xff08;1&#xff09;分析法左递归的消除直接左递归非直接左递归 消除左递归的算法消除回溯、提左因子FIRST提左因子FOLLOW集 LL(1)的分析条件LL(1)文法构造FIRST和FOLLOW集合构造每个文法符号的FIRST集合构造FOLLOW集合…

windows安装nginx

一、下载安装Nginx 1、官网下载地址&#xff1a;nginx: download 2、下载教程&#xff1a;选择最新的Stable version&#xff08;稳定版本&#xff09;下载到本地 3、下载完成后&#xff0c;解压放入本地非中文的文件夹中&#xff1a; 4、启动nginx&#xff1a;切勿直接双击n…

Django路由层

路由层&#xff08;urls&#xff09; Django的路由层是负责将用户请求映射到相应的视图函数的一层。在Django的MVT架构中&#xff0c;路由层负责处理用户的请求&#xff0c;然后将请求交给相应的视图函数进行处理&#xff0c;最后将处理结果返回给用户。 在Django中&#xff0c…

Redhat7设置国内可用yum源

问题&#xff1a; 因为最近安装了redhat7&#xff0c;在使用的时候提示系统未注册订阅&#xff0c;无法使用官方的yum源进行安装软件。为此&#xff0c;我使用centos7国内的yum源替换redhat的官方的yum源实现软件安装。 “This system is not registered with an entitlement …
最新文章