你好! 我叫 Sergey,是 Surf 的 DevOps 人员。 Surf 的 DevOps 部门不仅旨在建立专家之间的互动和集成工作流程,而且还积极研究并在自己的基础设施和客户的基础设施中实施相关技术。
下面我就讲一下我们在研究发行版时遇到的容器技术栈的变化。 CentOS 8的 是什么 CRI-O 以及如何快速搭建可执行环境 Kubernetes.
为什么 CentOS 8 标准发行版中缺少 Docker
安装最新的主要版本后 RHEL 8 или CentOS 8的 不可忽视:这些发行版和官方存储库缺少应用程序 码头工人,它在思想和功能上取代了软件包 波德曼, 布达赫 (默认情况下存在于发行版中)和 CRI-O。 这是由于红帽作为开放容器计划 (OCI) 项目的一部分制定的标准的实际实施。
OCI 是 Linux 基金会的一部分,其目标是为容器格式和可执行环境创建开放的行业标准,以同时解决多个问题。 首先,它们与 Linux 的哲学并不矛盾(例如,每个程序必须执行某个操作,并且 码头工人 是一种一体化的组合)。 其次,我们可以消除软件中现有的所有缺陷 码头工人。 第三,它们将完全兼容领先商业平台针对部署、管理和维护容器化应用程序(例如红帽OpenShift)提出的业务需求。
限制 码头工人 新软件的优点已经在
重要的是要注意建议堆栈的组件具有哪些功能:
- 波德曼 - 通过runC进程直接与容器和镜像存储交互;
- 布达赫 - 组装并加载到图像注册表中;
- CRI-O - 容器编排系统的运行时环境(例如 Kubernetes)。
我认为为了理解堆栈组件之间交互的一般方案,建议在这里给出一个连接图 Kubernetes c 运行C 和低级库使用 CRI-O:
CRI-O и Kubernetes 遵循相同的版本和支持周期(兼容性矩阵非常简单:主要版本 Kubernetes и CRI-O 一致),考虑到开发人员对该堆栈工作的全面和全面测试的重点,使我们有权期望在任何使用场景中都能实现最大的工作稳定性(相对轻便在这里也是有益的)。 CRI-O 相比 码头工人 由于有意限制功能)。
当您安装 Kubernetes “正确的方式”方式(当然,根据 OCI)使用 CRI-O 上 CentOS 8的 我们遇到了一些小困难,但我们都成功地克服了。 我很乐意与您分享安装和配置说明,总共最多需要 10 分钟。
如何使用 CRI-O 环境在 CentOS 8 上部署 Kubernetes
先决条件:至少拥有一台主机(2 核、4 GB RAM、至少 15 GB 存储空间) CentOS 8的 (推荐安装配置文件“服务器”),以及本地 DNS 中的条目(在极端情况下,您可以使用 /etc/hosts 中的条目)。 并且不要忘记
我们代表root用户在主机上执行所有操作,请小心。
- 第一步,我们将设置操作系统,安装并配置 CRI-O 的初步依赖项。
- 更新操作系统:
dnf -y update
- 接下来,您需要配置防火墙和 SELinux。 在这里,一切都取决于我们的主机或主机的工作环境。 您可以按照中的建议设置防火墙
文件资料 ,或者如果您位于受信任的网络上或使用第三方防火墙,请将默认区域更改为受信任或关闭防火墙:firewall-cmd --set-default-zone trusted firewall-cmd --reload
要关闭防火墙,可以使用以下命令:
systemctl disable --now firewalld
SELinux 需要禁用或设置为“宽容”模式:
setenforce 0 sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
- 加载必要的内核模块和包,配置在系统启动时自动加载“br_netfilter”模块:
modprobe overlay modprobe br_netfilter echo "br_netfilter" >> /etc/modules-load.d/br_netfilter.conf dnf -y install iproute-tc
- 为了激活数据包转发并正确处理流量,我们将进行适当的设置:
cat > /etc/sysctl.d/99-kubernetes-cri.conf <<EOF net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 net.bridge.bridge-nf-call-ip6tables = 1 EOF
应用所做的设置:
sysctl --system
- 设置需要的版本 CRI-O (主要版本 CRI-O,正如已经提到的,与所需的版本相同 Kubernetes)自最新稳定版本以来 Kubernetes 目前1.18:
export REQUIRED_VERSION=1.18
添加必要的存储库:
dnf -y install 'dnf-command(copr)' dnf -y copr enable rhcontainerbot/container-selinux curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable.repo https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable/CentOS_8/devel:kubic:libcontainers:stable.repo curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable:cri-o:$REQUIRED_VERSION.repo https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable:cri-o:$REQUIRED_VERSION/CentOS_8/devel:kubic:libcontainers:stable:cri-o:$REQUIRED_VERSION.repo
- 现在我们可以安装 CRI-O:
dnf -y install cri-o
请注意我们在安装过程中遇到的第一个细微差别:您需要编辑配置 CRI-O 在启动服务之前,因为所需的通用组件的位置与指定的位置不同:
sed -i 's//usr/libexec/crio/conmon//usr/bin/conmon/' /etc/crio/crio.conf
现在您可以激活并启动守护进程 CRI-O:
systemctl enable --now crio
您可以检查守护进程的状态:
systemctl status crio
- 更新操作系统:
- 安装和激活 Kubernetes.
- 添加所需的存储库:
cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-$basearch enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg exclude=kubelet kubeadm kubectl EOF
现在我们可以安装了 Kubernetes (1.18版本,如上所述):
dnf install -y kubelet-1.18* kubeadm-1.18* kubectl-1.18* --disableexcludes=kubernetes
- 第二个重要的细微差别:因为我们不使用守护进程 码头工人,但使用守护进程 CRI-O,在启动和初始化之前 Kubernetes 创建必要的目录后,您需要在 /var/lib/kubelet/config.yaml 配置文件中进行适当的设置:
mkdir /var/lib/kubelet cat <<EOF > /var/lib/kubelet/config.yaml apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration cgroupDriver: systemd EOF
- 我们在安装过程中遇到的第三个要点:尽管我们已经指出了所使用的驱动程序 群,以及通过传递的参数进行配置 库贝莱 过时的(文档中直接指出),我们需要向文件添加参数,否则我们的集群将不会被初始化:
cat /dev/null > /etc/sysconfig/kubelet cat <<EOF > /etc/sysconfig/kubelet KUBELET_EXTRA_ARGS=--container-runtime=remote --cgroup-driver=systemd --container-runtime-endpoint='unix:///var/run/crio/crio.sock' EOF
- 现在我们可以激活守护进程 库贝莱:
sudo systemctl enable --now kubelet
自定义 控制平面 или 工人 几分钟内的节点,您可以使用
这个脚本 .
- 添加所需的存储库:
- 是时候初始化我们的集群了。
- 要初始化集群,请运行以下命令:
kubeadm init --pod-network-cidr=10.244.0.0/16
请务必写下加入集群的命令“kubeadm join ...”,该命令在输出末尾提供,或者至少写下指定的标记。
- 为 Pod 网络安装插件 (CNI)。 我建议使用 印花布。 可能更受欢迎 绒布 有兼容性问题 nftables,和 印花布 - 该项目唯一推荐并经过全面测试的 CNI 实现 Kubernetes:
kubectl --kubeconfig /etc/kubernetes/admin.conf apply -f https://docs.projectcalico.org/v3.15/manifests/calico.yaml
- 要将工作节点连接到我们的集群,您需要根据说明1和2进行配置,或者使用
脚本 ,然后从我们在上一步中记录的“kubeadm init ...”输出中运行命令:kubeadm join $CONTROL_PLANE_ADDRESS:6443 --token $TOKEN --discovery-token-ca-cert-hash $TOKEN_HASH
- 让我们检查一下我们的集群是否已初始化并开始工作:
kubectl --kubeconfig=/etc/kubernetes/admin.conf get pods -A
准备好! 您已经可以在 K8s 集群上托管有效负载。
- 要初始化集群,请运行以下命令:
我们的未来是什么
我希望上述说明有助于节省您的时间和精力。
行业中发生的流程的结果通常取决于相关领域的大多数最终用户和其他软件开发人员如何接受它们。 目前尚不完全清楚 OCI 计划在几年内将走向何方,但我们很乐意跟随它。 您现在可以在评论中分享您的意见。
敬请关注!
本文的创建归功于以下来源:
- 关于容器运行时的部分
Kubernetes 文档 页 互联网上的 CRI-O 项目- 红帽博客文章:
这个 ,这 和许多其他人
来源: habr.com