前言

因宿主机内核版本限制和垂直伸缩特性的需要,安装的k8s版本为1.25,runtime为containerd,cni为calico。

containerd、kubeadm、kubelet也可以用包管理器来安装,因为不想配repo,也不想校验repo版有哪些区别,所以这几个都是用原生二进制方式安装的。

环境信息

IP Hostname OS Version Kernel Version Comment
192.168.0.11 node1 centos 7.9 3.10 control panel
192.168.0.12 node2 centos 7.9 3.10 worker node
192.168.0.13 node3 centos 7.9 3.10 worker node

用到的组件版本信息

  • containerd: 1.7.21
  • k8s: 1.25.16

系统初始化

系统初始化步骤要求每个节点都要操作,一些主机名等信息需要根据实际修改。

  1. 修改hostname,k8s要求每个节点的hostname不一样
hostnamectl set-hostname node1
hostnamectl set-hostname node2
hostnamectl set-hostname node3
  1. (可选)如果没有dns可以让hostname之间直接访问,需要配置/etc/hosts
192.168.0.11 node1
192.168.0.12 node2
192.168.0.13 node3
  1. (可选)如果要长时间使用,最好配置一下时间同步。
  2. 关闭swap。默认情况下,k8s检测到swap就会异常退出,导致node上的k8s启动失败。
# 临时关闭。永久关闭需要修改 /etc/fstab
swapoff -a
  1. 装载内核模块。如果不装载br_netfilter,下一步配置系统参数会报错。
# 添加配置
cat << EOF > /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF # 立即装载
modprobe overlay
modprobe br_netfilter # 检查装载。如果没有输出结果说明没有装载。
lsmod | grep br_netfilter
  1. 配置系统参数。编辑/etc/sysctl.conf文件或/etc/sysctl.d/目录下的文件,添加或修改以下配置。编辑完成后执行sysctl -p使配置生效。(如果修改的是/etc/sysctl.d目录下的文件,sysctl -p需要指定文件名才能生效)
net.ipv4.ip_forward=1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
vm.swappiness = 0
  1. (可选)内核版本若高于4.1,可考虑使用ipvs来增强网络通信性能
  2. 安装依赖,否则安装containerd时,runc组件会有问题
# conntrack-tools的版本为1.4.4-4.el7,如果低了可能会导致runc异常
# 如果安装提示缺少依赖,而依赖在centos 7的repo源里没有,可从高版本centos、alma等发行版下载rpm包再安装
yum install -y conntrack-tools

安装containerd

  1. https://github.com/containerd/containerd/releases下载二进制包
  2. 解压压缩包到根目录。压缩包里面的文件路径都已经按照根目录组织好了,所以直接解压到根路径就行了。
tar xf cri-containerd-cni-1.7.21-linux-amd64.tar.gz -C /
  1. 生成containerd的配置文件
mkdir /etc/containerd
containerd config default > /etc/containerd/config.toml
  1. 编辑containerd的配置文件/etc/containerd/config.toml,主要修改container的数据目录,并启用systemd的cgroup
# 修改数据存储目录
root = "/home/apps/containerd" # 对于使用systemd作为init system的linux发行版,官方建议用systemd作为容器cgroup driver
# false改成true
SystemdCgroup = true
  1. 重加载systemd配置,启动containerd
systemctl daemon-reload
systemctl start containerd
systemctl enable containerd
  1. 简单验证下containerd是否正常
# 查看systemd status
systemctl status containerd
# 查看image,正常情况下还没有image
crictl images
# 验证runc是否正常,如果输出有报错,可以参考"系统初始化"的第8步"安装依赖"
runc --version

安装kubelet和kubeadm

本节步骤在所有k8s node都要操作。k8s的二进制文件安装包可以从github下载:https://github.com/kubernetes/kubernetes/releases

在changelog中找到二进制包的下载链接,下载server binary即可,里面包含了master和node的二进制文件。

  1. 解压下载好的压缩包,并将其中的二进制文件放到环境变量PATH目录下
tar xf kubernetes-server-linux-amd64.tar.gz
cd kubernetes/server/bin/
find . -type f -perm /u+x -exec cp {} /usr/local/bin/ \;
  1. 新建或编辑kubelet的service文件 /usr/lib/systemd/system/kubelet.service
[Unit]
Description=kubelet: The Kubernetes Node Agent
Documentation=https://kubernetes.io/docs/
Wants=network-online.target
After=network-online.target [Service]
ExecStart=/usr/local/bin/kubelet
Restart=always
StartLimitInterval=0
RestartSec=10 [Install]
WantedBy=multi-user.target
  1. 创建目录
mkdir -p  /usr/lib/systemd/system/kubelet.service.d/
  1. 新建或编辑文件/usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
# Note: This dropin only works with kubeadm and kubelet v1.11+
[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
# This is a file that "kubeadm init" and "kubeadm join" generates at runtime, populating the KUBELET_KUBEADM_ARGS variable dynamically
EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
# This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use
# the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file.
EnvironmentFile=-/etc/sysconfig/kubelet
ExecStart=
ExecStart=/usr/local/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS
  1. 启动kubelet
systemctl enable --now kubelet

创建集群

创建集群的步骤在control panel节点操作即可。

  1. 初始化集群,这里主要指定k8s版本,可根据需求,参考kubeadm init --help提示配置初始化参数,比如pause镜像地址,pod ip范围等。
kubeadm init --kubernetes-version v1.25.16

如果init报错失败,可以查下containerdkubelet的日志。失败后可以重置下kubeadm reset

systemctl status containerd
journalctl -xeu containerd systemctl status kubelet
journalctl -xeu kubelet

如果init成功,控制台会输出worker node加入cluster的命令,将这个命令粘贴到worker node执行即可,比如:

kubeadm join 192.168.0.11:6443 --token 123456 \
--discovery-token-ca-cert-hash sha256:123456

init成功后,输出还会提示创建kubeconfig,根据提示操作即可

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
  1. 配置网络插件。k8s需要cni插件才能让pod之间正常通信,这里用的是calico插件
# 下载配置文件。下载后可根据需求修改其中的image地址
wget https://docs.projectcalico.org/manifests/calico.yaml # 部署calico
kubectl apply -f calico.yaml
  1. 检查网络插件部署效果。只有全部ready都为1/1才算成功
kubectl get nodes
kubectl get pod -n kube-system

测试集群

部署完成后,可以起个pod试下能否正常调度

# 创建一个pod。nginx需要提前docker pull
kubectl create deployment nginx --image=nginx
# 暴露端口
kubectl expose deployment nginx --port=80 --type=NodePort
# 查看状态
kubectl get pods,svc

[kubernetes]使用kubeadm和containerd部署kubernetes的更多相关文章

  1. Kubernetes v1.24 基于containerd部署

      k8s每个节点安装containerd.   containerd安装参考<containerd安装博文>:https://www.cnblogs.com/punchlinux/p/1 ...

  2. kubeadm部署Kubernetes集群

    Preface 通过kubeadm管理工具部署Kubernetes集群,相对离线包的二进制部署集群方式而言,更为简单与便捷.以下为个人学习总结: 两者区别在于前者部署方式使得大部分集群组件(Kube- ...

  3. [原]使用kubeadm部署kubernetes(一)

    #######################    以下为声明  ##################### 在公众号  木子李的菜田 输入关键词:   k8s 有系列安装文档 此文档是之前做笔记在 ...

  4. [原]部署kubernetes dashboard(二)

    #######################    以下为声明  ##################### 此文档是之前做笔记在两台机上进行的实践,kubernetes处于不断开发阶段 不能保证每 ...

  5. 还在因为部署 Kubernetes 时,无法拉取 k8s.gcr.io/*** 镜像而头疼吗

    拉取外网 Kubernetes 镜像 还在因为部署 Kubernetes 时,无法拉取 k8s.gcr.io/*** 镜像而头疼吗? 传送门 https://github.com/liamhao/pu ...

  6. 使用 Kubeadm+Containerd 部署一个 Kubernetes 集群

    本文独立博客阅读地址:https://ryan4yin.space/posts/kubernetes-deployemnt-using-kubeadm/ 本文由个人笔记 ryan4yin/knowle ...

  7. Centos 7.9 部署Kubernetes集群 (基于containerd 运行时)

    前言 当Kubernetes社区宣布1.20版本之后会逐步弃用 dockershim ,当时也有很多自媒体在宣 传Kubernetes弃用Docker.其实,我觉得这是一种误导,也许仅仅是为了蹭热度. ...

  8. ubuntu 20.04 基于kubeadm部署kubernetes 1.22.4集群及部署集群管理工具

    一.环境准备: 集群版本:kubernetes 1.22.4 服务器系统 节点IP 节点类型 服务器-内存/CUP hostname Ubuntu 20.04 192.168.1.101 主节点 2G ...

  9. Kubeadm 安装部署 Kubernetes 集群

    阅读目录: 准备工作 部署 Master 管理节点 部署 Minion 工作节点 部署 Hello World 应用 安装 Dashboard 插件 安装 Heapster 插件 后记 相关文章:Ku ...

  10. centos7使用kubeadm安装部署kubernetes 1.14

    应用背景: 截止目前为止,高热度的kubernetes版本已经发布至1.14,在此记录一下安装部署步骤和过程中的问题排查. 部署k8s一般两种方式:kubeadm(官方称目前已经GA,可以在生产环境使 ...

随机推荐

  1. Redis 注册成windows 服务并开机自启动

    进入安装目录 输入命令redis-server --service-install redis.windows.conf   输入启动命令即可 redis-server --service-start ...

  2. 数据结构—包(Bag)

    数据结构中的包,其实是对现实中的包的一种抽象. 想像一下现实中的包,比如书包,它能做什么?有哪些功能?首先它用来装东西,里面的东西可以随便放,没有规律,没有顺序,当然,可以放多个相同的东西.其次,东西 ...

  3. 虚拟 DOM 实现原理?

    虚拟 DOM 的实现原理主要包括以下 3 部分: 用 JavaScript 对象模拟真实 DOM 树,对真实 DOM 进行抽象: diff 算法 - 比较两棵虚拟 DOM 树的差异: pach 算法 ...

  4. yb课堂 前端项目通用底部选项卡 CommonsFooter 《三十六》

    学会看cube-UI文档,并掌握cube-tab-bar开发 前端需求分析 底部导航 首页Banner 首页视频列表 视频详情模块 注册模块 登陆模块 个人信息模块 下单模块 订单列表模块 文档地址: ...

  5. 透视开源生态,OSGraph——GitHub全域数据图谱的智能洞察工具

    "透视开源生态,OSGraph--GitHub全域数据图谱的智能洞察工具 OSGraph (Open Source Graph) 是一个开源图谱关系洞察工具,基于GitHub开源数据全域图谱 ...

  6. yolov5 筛选正样本流程 代码多图详解

    yolov5正样本筛选原理 正样本全称是anchor正样本,正样本所指的对象是anchor box,即先验框. 先验框:从YOLO v2开始吸收了Faster RCNN的优点,设置了一定数量的预选框, ...

  7. javaweb使用gson工具使浏览器返回json数据

    1.什么是序列化和反序列化 (1)Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过程: (2)序列化:对象序列化的最主要的用处就是在传递和保 ...

  8. Apache基于IP和端口

    Apache基于IP 步骤1:添加并配置虚拟网卡 添加虚拟网卡:通常在虚拟机环境中,可以通过虚拟机软件(如VMware或VirtualBox)的网络设置来添加额外的网络适配器. 配置IP地址:编辑/e ...

  9. OI-Wiki 学习笔记

    算法基础 \(\text{Update: 2024 - 07 - 22}\) 复杂度 定义 衡量一个算法的快慢,一定要考虑数据规模的大小. 一般来说,数据规模越大,算法的用时就越长. 而在算法竞赛中, ...

  10. 深度学习 玩游戏 Q-LEARNING

    游戏里面非玩家的角色行为,即 AI. 腾讯的 Ai 游戏框架:TencentOpen. 介绍: Agent,behavior tree, 大概意思就是 通过自己的框架来确定 ai 行为,然后通过 ag ...