注意:我们发现 runc 在运行容器,处理系统文件描述符时存在一个漏洞。 恶意容器可以利用此漏洞覆盖 runc 二进制文件的内容,并以此在主机系统的容器上运行任意的命令。
适用性
说明: 本文档是为在 Linux 上安装 CRI 的用户编写的。 对于其他操作系统,请查找特定于您平台的文档。
您应该以 root 身份执行本指南中的所有命令。 例如,使用 sudo 前缀命令,或者成为 root 并以该用户身份运行命令。
Cgroup 驱动程序
当某个 Linux 系统发行版使用 systemd 作为其初始化系统时,初始化进程会生成并使用一个 root 控制组 (cgroup),并充当 cgroup 管理器。 systemd 与 cgroup 集成紧密,并将为每个进程分配 cgroup。 您也可以配置容器运行时和 kubelet 使用 cgroupfs。 连同 systemd 一起使用 cgroupfs 意味着将有两个不同的 cgroup 管理器。
控制组用来约束分配给进程的资源。 单个 cgroup 管理器将简化分配资源的视图,并且默认情况下将对可用资源和使用中的资源具有更一致的视图。 当有两个管理器时,最终将对这些资源产生两种视图。 在此领域我们已经看到案例,某些节点配置让 kubelet 和 docker 使用 cgroupfs,而节点上运行的其余进程则使用 systemd;这类节点在资源压力下会变得不稳定。
更改设置,令容器运行时和 kubelet 使用 systemd 作为 cgroup 驱动,以此使系统更为稳定。 请注意在 docker 下设置 native.cgroupdriver=systemd 选项。
注意:强烈建议不要更改已加入集群的节点的 cgroup 驱动。 如果 kubelet 已经使用某 cgroup 驱动的语义创建了 pod,尝试更改运行时以使用别的 cgroup 驱动,为现有 Pods 重新创建 PodSandbox 时会产生错误。 重启 kubelet 也可能无法解决此类问题。 推荐将工作负载逐出节点,之后将节点从集群中删除并重新加入。
Docker
在您的每台机器上安装 Docker。 推荐安装 19.03.4 版本,但是 1.13.1、17.03、17.06、17.09、18.06 和 18.09 版本也是可以的。 请跟踪 Kubernetes 发行说明中经过验证的 Docker 最新版本变化。
使用以下命令在您的系统上安装 Docker:
- CentOS/RHEL 7.4+
<!-- # Install Docker CE ## Set up the repository ### Install required packages. yum install yum-utils device-mapper-persistent-data lvm2 ### Add Docker repository. yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo ## Install Docker CE. yum update && yum install \ containerd.io-1.2.10 \ docker-ce-19.03.4 \ docker-ce-cli-19.03.4 ## Create /etc/docker directory. mkdir /etc/docker # Setup daemon. cat > /etc/docker/daemon.json <<EOF { "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "storage-driver": "overlay2", "storage-opts": [ "overlay2.override_kernel_check=true" ] } EOF mkdir -p /etc/systemd/system/docker.service.d --> # 安装 Docker CE ## 设置仓库 ### 安装所需包 yum install yum-utils device-mapper-persistent-data lvm2 ### 新增 Docker 仓库。 yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo ## 安装 Docker CE. yum update && yum install docker-ce-18.06.2.ce ## 创建 /etc/docker 目录。 mkdir /etc/docker # 设置 daemon。 cat > /etc/docker/daemon.json <<EOF { "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "storage-driver": "overlay2", "storage-opts": [ "overlay2.override_kernel_check=true" ] } EOF mkdir -p /etc/systemd/system/docker.service.d <!-- # Restart Docker systemctl daemon-reload systemctl restart docker --> # 重启 Docker systemctl daemon-reload systemctl restart docker
CRI-O
本节包含安装 CRI-O 作为 CRI 运行时的必要步骤。
使用以下命令在系统中安装 CRI-O:
准备环境
modprobe overlay modprobe br_netfilter # 设置必需的sysctl参数,这些参数在重新启动后仍然存在。 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
- CentOS/RHEL 7.4+
<!-- # Install prerequisites yum-config-manager --add-repo=https://cbs.centos.org/repos/paas7-crio-115-release/x86_64/os/ # Install CRI-O yum install --nogpgcheck cri-o --> # 安装必备软件 yum-config-manager --add-repo=https://cbs.centos.org/repos/paas7-crio-115-release/x86_64/os/ # 安装 CRI-O yum install --nogpgcheck cri-o
启动 CRI-O
systemctl start crio
containerd
本节包含使用 containerd 作为 CRI 运行时的必要步骤。
使用以下命令在系统上安装容器:
准备环境
cat > /etc/modules-load.d/containerd.conf <<EOF overlay br_netfilter EOF modprobe overlay modprobe br_netfilter # 设置必需的sysctl参数,这些参数在重新启动后仍然存在。 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
安装 containerd
- CentOS/RHEL 7.4+
<!-- # Install containerd ## Set up the repository ### Install required packages yum install yum-utils device-mapper-persistent-data lvm2 ### Add docker repository yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo ## Install containerd yum update && yum install containerd.io # Configure containerd mkdir -p /etc/containerd containerd config default > /etc/containerd/config.toml --> # 安装 containerd ## 设置仓库 ### 安装所需包 yum install yum-utils device-mapper-persistent-data lvm2 ### 新增 Docker 仓库 yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo ## 安装 containerd yum update && yum install containerd.io # 配置 containerd mkdir -p /etc/containerd containerd config default > /etc/containerd/config.toml <!-- # Restart containerd systemctl restart containerd --> # 重启 containerd systemctl restart containerd
systemd
使用 systemd cgroup 驱动,在 /etc/containerd/config.toml 中设置 plugins.cri.systemd_cgroup = true。 当使用 kubeadm 时,请手动配置 kubelet 的 cgroup 驱动