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

后知后觉 暂无评论

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

更新记录

2022-07

2020-07

关于 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 竞争,但不幸在这场竞争中失利,且 Kubernetes 一直想剥离对于 Docker 引擎的依赖,于是 Docker 公司将 Docker 的核心组件剥离出来并开源为 containerd 捐赠给了 CNCF(Cloud Native Computing Foundation,云原生计算基金会)

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

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

IPv4 转发

安装 CRI 前需要配置 iptables 接管 kubernetes 流量

检查 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

部署 Docker

Debian

基于 Debian 及其衍生发行版的安装方法请参考 基于 Debian 系列发行版部署 Docker CE

CentOS

系统要求

安装 Docker 需要使用 CentOS 7,CentOS 8 (stream),CentOS 9 (stream) 的主线版本,对于已存档的版本不被支持。

必须启用 centos-extras 仓库,这个仓库默认是启用的,但是如果被禁用,需要在安装前启动此仓库

推荐上使用 overlay2 存储驱动。

注意:目前 Docker 官方构建仓库仅支持 CentOS 7 ,最新的 CentOS 8 暂时不支持,可以通过某神奇方法安装,但是不保证其稳定性,切勿用于生产环境。

卸载旧版本

旧版本的 Docker 包名为 dockerdocker-engine,如果已经安装,则需要卸载它们和相关的依赖。

sudo yum remove docker \
                docker-client \
                docker-client-latest \
                docker-common \
                docker-latest \
                docker-latest-logrotate \
                docker-logrotate \
                docker-engine

如果提示没有找到这些软件包,那么也没关系,直接进行下面的步骤即可。

目录 /var/lib/docker/(存放镜像、容器、数据卷、网络配置等)会被默认保留,Docker Engine 包现在已经改名为 docker-ce

安装方式

有多种方式可以安装 Docker Engine ,根据需要进行选择即可。

使用仓库安装
配置仓库

需要使用 yum-utils 才能使用 yum-config-manager 仓库配置工具

sudo yum install -y yum-utils

非中国大陆地区请使用官方地址进行安装

sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

中国大陆推荐使用国内镜像站

安装
  1. 安装最新版本的 Docker Engine,containerd 和 Docker Compose

    sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin

    如果提示接受 GPG 密钥,请确认是否为 060A 61C5 1B55 8A7F 742B 77AA C52F EB6B 621E 9F35,如果匹配则可以接受。

    这个命令仅安装 Docker ,并不会启动。并且会自动创建 docker 用户组,在默认情况下请不要将任何用户添加只此用户组中。

  2. 如果需要安装指定版本的 Docker Engine,请列出所有可用版本,然后进行选择和安装:

    a. 检索所有在仓库中可用的版本,可以使用命令进行检索并按版本从高到低进行排序:

    yum list docker-ce --showduplicates | sort -r

    返回的版本字符串中会包含系统版本,比如 .el7.el8 等。

    b. 安装指定版本需要使用完整的包含版本号的包名进行安装,比如 docker-ce-18.09.1

    sudo yum install docker-ce-<版本号> docker-ce-cli-<版本号> containerd.io docker-compose-plugin

    需要注意的是 docker-cedocker-ce-cli 必须版本匹配,其他组件可以使用新版本。

  3. 启动 Docker

    sudo systemctl start docker
  4. 可以通过运行 hello-world 镜像来验证是否成功安装

    sudo docker run hello-world

    这个命令会下载镜像并在容器中运行,运行后会打印一个消息后退出。

配置优化

非 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.2.5-3.el8.x86_64.rpm
# Debian 11
sudo dpkg -i cri-dockerd_0.2.5.3-0.debian-bullseye_amd64.deb

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


附录

相关链接

参考链接

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