从零开始的 Kubernetes 学习笔记(一)

后知后觉 暂无评论

使用 Kubernetes 对容器进行编排成为微服务时代的技术风向标。

更新记录

2022-07

2020-07

环境检查

要求

确认节点唯一

确保 MAC 地址和设备识别码在集群内唯一

部分虚拟机可能具有相同的值,Kubernetes 使用这些值进行唯一识别,如果这些值相同可能导致服务无法正常工作。

检查所需端口

全新机器可以跳过本步骤,主要是为了防止端口冲突导致。

禁用交换分区

Kubernetes 的 kubelet 使用需要禁用 Swap 交换分区,否则可能产生无法预料的错误。

sudo swapoff -a
小贴士:推荐在服务器安装时手动配置分区表,将 swap 分区删除,否则可能导致开机后自动挂载 swap 分区,也需要记得注释掉 fstab 中的 swap 分区,防止机器重启后自动挂载。

一键删除交换分区

grep swap /etc/fstab && sudo sed -i.bak '/swap/d' /etc/fstab

关于 CR 和 CRI

Kubernetes 作为一个容器编排工具,管理的只是“容器”,至于容器由什么服务提供,这不重要,实际上 Kubernetes 管控的是 CRI(Container Runtime Interface,容器运行时接口),CRI 可以对接多种 CR(Container Runtime,容器运行时),CR 有多种,比如 DockercontainerdCRI-O 等。

逻辑关系:

Kubernetes ==> CRI ==> CR
containerd 和 Docker 之前的渊源:实际上 containerd 是 Docker 内的一个组件,谷歌想削弱 Docker 公司在容器方面的影响,于是开源了 Kubernetes,然后 Docker 开发了 Docker Swarm 与之竞争,但不幸在这场竞争中失利。而 Kubernetes 一直想剥离对于 Docker 引擎的依赖,于是 Docker 公司将 Docker 的核心组件剥离出来并开源为 containerd 捐赠给了 CNCF(Cloud Native Computing Foundation,云原生计算基金会),想以此继续占据 Kubernetes 核心组件的位置。

特别注意的是,从 Kubernetes 1.24 版本开始,不再内置 docker 的 CRI 组件 docker-shim ,因此直接安装后是无法直接管控 Docker 容器的,需要额外安装 CRI 组件,并且从旧版本升级到 1.24 及其之后版本需要提前修改容器环境。

因此后续将分为两个部分:Kubernetes 1.24 之前的版本、Kubernetes 1.24 及其之后的版本。

流量转发

安装 CRI 前需要配置接管 Kubernetes 流量,在默认情况下 Kubernetes 会使用 iptables 进行流量转发。

iptables Mode

检查 br_netfilter 模块是否加载。

lsmod | grep br_netfilter

执行以下命令加载内核模块并配置系统参数

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

验证 br_netfilteroverlay 模块是否已经正常加载。

lsmod | grep br_netfilter
lsmod | grep overlay

IPVS Mode

如果想使用 ipvs 模式,则还需要额外进行配置。

先安装所需的模块和配置工具

sudo apt install -y ipset ipvsadm

需要加载的内核模块可参考其官方博客内容。

小贴士:需要注意的是,在 Kernel 4.18+ 中,模块 nf_conntrack_ipv4 更名为 nf_conntrack
cat <<EOF | sudo tee /etc/modules-load.d/ipvs.conf
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
EOF

# 手动加载下模块
sudo modprobe ip_vs
sudo modprobe ip_vs_rr
sudo modprobe ip_vs_wrr
sudo modprobe ip_vs_sh
sudo modprobe nf_conntrack

没有报错即表示加载成功。

安装 Container Runtime

常见的 CRI 接口地址

RuntimeUnix 套接字默认地址
containerdunix:///var/run/containerd/containerd.sock
CRI-Ounix:///var/run/crio/crio.sock
Docker Engine (using cri-dockerd)unix:///var/run/cri-dockerd.sock

使用 Docker 作为 CR

从 Kubernetes 1.24 版本开始已经移除了 Docker 的官方支持,但通过 dockerd cri 插件依旧可以使用,但并不推荐。

原因是实际上 Docker CE 从 19.x 版本后也拆分为了 containerd + docker,所以如果在 kubernetes 中使用 docker,实际控制逻辑为:

kubernetes -> dockerd(cri) -> docker(ce) -> containerd

在使用 containerd 作为 CR 时,控制逻辑为:

kubernetes -> containerd(cri) -> containerd

可以看到实际上这个可以省略,并且引入的东西越多,产生问题的可能性就越大。

安装 Docker

安装方法可以参考官网文档,或者参考基于 Debian 系列发行版部署 Docker CE

CentOS

配置优化

非 root 用户管理 docker

Docker 守护程序绑定在 Unix 套接字,而非 TCP 端口。默认情况下 Unix 套接字只被 root 用户管理,其他用户使用需要添加 sudo,Docker 守护进程必须运行在 root 用户下。

如果希望不使用 sudo 即可对其进行管理,可以将用户添加至 docker 组中即可不使用 sudo 进行管理操作。

sudo usermod -aG docker $USER

然后需要重新登陆终端才能生效。

cgroup 驱动切换

在使用基于 SystemD 的机器上部署 Kubernetes 和 Docker 时,为了让更好的工作

注意:在 Kubernetes v1.22 及之后版本中,如果用户没有在 KubeletConfiguration 下设置 cgroupDriver 字段,kubeadm 将默认使用 systemd,无需进行下面的操作。

Hub 镜像仓库加速

上述配置文件使用的是网易的镜像仓库,也可以使用 DaoCloud 镜像。

curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io

其他详细方式请详见其官网链接。

部署 CRI (dockerd)

如果依旧选择使用 Docker 作为后端,则需要手动安装 cri-dockerd,才能让 Kubernetes 对接 Docker Engine。根据系统直接安装 deb 或者 rpm 包即可。

其他的 CRI 引擎在 kubernetes 中已经自带,无需手动进行安装部署。到项目 Release 中下载安装包并进行安装。

# CentOS 8
sudo rpm -ivh cri-dockerd-0.x.x-0.el8.x86_64.rpm
# Debian 11
sudo dpkg -i cri-dockerd_0.x.x-0.debian-bullseye_amd64.deb

如果所使用的发行版未提供安装包,可以手动下载二进制包 cri-dockerd-0.x.x.amd64.tgz,解压后移动至相应目录即可。

tar xf cri-dockerd-0.x.x.amd64.tgz
mv cri-dockerd/cri-dockerd /usr/bin/

安装完毕后,Kubernetes 即可使用 docker 作为后端。


附录

相关链接

参考链接

本文撰写于一年前,如出现图片失效或有任何问题,请在下方留言。博主看到后将及时修正,谢谢!
禁用 / 当前已拒绝评论,仅可查看「历史评论」。