容器运行时

FEATURE STATE: Kubernetes v1.6 稳定

该功能是“稳定的”,意味着:

  • 版本名是 vX,其中 X 是整数。
  • 该功能将出现在多个后续释出的软件稳定版中。

Kubernetes 使用容器运行时来实现在 pod 中运行容器。 这是各种运行时的安装说明。

警告:

我们发现 runc 在运行容器,处理系统文件描述符时存在一个漏洞。 恶意容器可以利用此漏洞覆盖 runc 二进制文件的内容,并以此在主机系统的容器上运行任意的命令。

请参考此链接以获取有关此问题的更多信息 cve-2019-5736 : runc vulnerability

适用性

注意:

本文档是为在 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:

  1. <!--
  2. # Install Docker CE
  3. ## Set up the repository:
  4. ### Install packages to allow apt to use a repository over HTTPS
  5. apt-get update && apt-get install \
  6. apt-transport-https ca-certificates curl software-properties-common
  7. ### Add Docker’s official GPG key
  8. curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
  9. -->
  10. # 安装 Docker CE
  11. ## 设置仓库
  12. ### 安装软件包以允许 apt 通过 HTTPS 使用存储库
  13. apt-get update && apt-get install \
  14. apt-transport-https ca-certificates curl software-properties-common
  15. ### 新增 Docker 的 官方 GPG 秘钥
  16. curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
  17. <!--
  18. ### Add Docker apt repository.
  19. add-apt-repository \
  20. "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
  21. $(lsb_release -cs) \
  22. stable"
  23. ## Install Docker CE.
  24. apt-get update && apt-get install \
  25. containerd.io=1.2.10-3 \
  26. docker-ce=5:19.03.4~3-0~ubuntu-$(lsb_release -cs) \
  27. docker-ce-cli=5:19.03.4~3-0~ubuntu-$(lsb_release -cs)
  28. # Setup daemon.
  29. cat > /etc/docker/daemon.json <<EOF
  30. {
  31. "exec-opts": ["native.cgroupdriver=systemd"],
  32. "log-driver": "json-file",
  33. "log-opts": {
  34. "max-size": "100m"
  35. },
  36. "storage-driver": "overlay2"
  37. }
  38. EOF
  39. mkdir -p /etc/systemd/system/docker.service.d
  40. -->
  41. ### 添加 Docker apt 仓库
  42. add-apt-repository \
  43. "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
  44. $(lsb_release -cs) \
  45. stable"
  46. ## 安装 Docker CE
  47. apt-get update && apt-get install docker-ce=18.06.2~ce~3-0~ubuntu
  48. # 设置 daemon
  49. cat > /etc/docker/daemon.json <<EOF
  50. {
  51. "exec-opts": ["native.cgroupdriver=systemd"],
  52. "log-driver": "json-file",
  53. "log-opts": {
  54. "max-size": "100m"
  55. },
  56. "storage-driver": "overlay2"
  57. }
  58. EOF
  59. mkdir -p /etc/systemd/system/docker.service.d
  60. <!--
  61. # Restart docker.
  62. systemctl daemon-reload
  63. systemctl restart docker
  64. -->
  65. # 重启 docker.
  66. systemctl daemon-reload
  67. systemctl restart docker
  1. <!--
  2. # Install Docker CE
  3. ## Set up the repository
  4. ### Install required packages.
  5. yum install yum-utils device-mapper-persistent-data lvm2
  6. ### Add Docker repository.
  7. yum-config-manager \
  8. --add-repo \
  9. https://download.docker.com/linux/centos/docker-ce.repo
  10. ## Install Docker CE.
  11. yum update && yum install \
  12. containerd.io-1.2.10 \
  13. docker-ce-19.03.4 \
  14. docker-ce-cli-19.03.4
  15. ## Create /etc/docker directory.
  16. mkdir /etc/docker
  17. # Setup daemon.
  18. cat > /etc/docker/daemon.json <<EOF
  19. {
  20. "exec-opts": ["native.cgroupdriver=systemd"],
  21. "log-driver": "json-file",
  22. "log-opts": {
  23. "max-size": "100m"
  24. },
  25. "storage-driver": "overlay2",
  26. "storage-opts": [
  27. "overlay2.override_kernel_check=true"
  28. ]
  29. }
  30. EOF
  31. mkdir -p /etc/systemd/system/docker.service.d
  32. -->
  33. # 安装 Docker CE
  34. ## 设置仓库
  35. ### 安装所需包
  36. yum install yum-utils device-mapper-persistent-data lvm2
  37. ### 新增 Docker 仓库。
  38. yum-config-manager \
  39. --add-repo \
  40. https://download.docker.com/linux/centos/docker-ce.repo
  41. ## 安装 Docker CE.
  42. yum update && yum install docker-ce-18.06.2.ce
  43. ## 创建 /etc/docker 目录。
  44. mkdir /etc/docker
  45. # 设置 daemon。
  46. cat > /etc/docker/daemon.json <<EOF
  47. {
  48. "exec-opts": ["native.cgroupdriver=systemd"],
  49. "log-driver": "json-file",
  50. "log-opts": {
  51. "max-size": "100m"
  52. },
  53. "storage-driver": "overlay2",
  54. "storage-opts": [
  55. "overlay2.override_kernel_check=true"
  56. ]
  57. }
  58. EOF
  59. mkdir -p /etc/systemd/system/docker.service.d
  60. <!--
  61. # Restart Docker
  62. systemctl daemon-reload
  63. systemctl restart docker
  64. -->
  65. # 重启 Docker
  66. systemctl daemon-reload
  67. systemctl restart docker

请参阅官方 Docker 安装指南 来获取更多的信息。

CRI-O

本节包含安装 CRI-O 作为 CRI 运行时的必要步骤。

使用以下命令在系统中安装 CRI-O:

准备环境

  1. modprobe overlay
  2. modprobe br_netfilter
  3. # 设置必需的sysctl参数,这些参数在重新启动后仍然存在。
  4. cat > /etc/sysctl.d/99-kubernetes-cri.conf <<EOF
  5. net.bridge.bridge-nf-call-iptables = 1
  6. net.ipv4.ip_forward = 1
  7. net.bridge.bridge-nf-call-ip6tables = 1
  8. EOF
  9. sysctl --system
  1. <!--
  2. # Install prerequisites
  3. apt-get update
  4. apt-get install software-properties-common
  5. add-apt-repository ppa:projectatomic/ppa
  6. apt-get update
  7. # Install CRI-O
  8. apt-get install cri-o-1.15
  9. -->
  10. # 安装必备软件
  11. apt-get update
  12. apt-get install software-properties-common
  13. add-apt-repository ppa:projectatomic/ppa
  14. apt-get update
  15. # 安装 CRI-O
  16. apt-get install cri-o-1.15
  1. <!--
  2. # Install prerequisites
  3. yum-config-manager --add-repo=https://cbs.centos.org/repos/paas7-crio-115-release/x86_64/os/
  4. # Install CRI-O
  5. yum install --nogpgcheck cri-o
  6. -->
  7. # 安装必备软件
  8. yum-config-manager --add-repo=https://cbs.centos.org/repos/paas7-crio-115-release/x86_64/os/
  9. # 安装 CRI-O
  10. yum install --nogpgcheck cri-o

启动 CRI-O

  1. systemctl start crio

请参阅CRI-O 安装指南 来获取更多的信息。

containerd

本节包含使用 containerd 作为 CRI 运行时的必要步骤。

使用以下命令在系统上安装容器:

准备环境

  1. cat > /etc/modules-load.d/containerd.conf <<EOF
  2. overlay
  3. br_netfilter
  4. EOF
  5. modprobe overlay
  6. modprobe br_netfilter
  7. # 设置必需的sysctl参数,这些参数在重新启动后仍然存在。
  8. cat > /etc/sysctl.d/99-kubernetes-cri.conf <<EOF
  9. net.bridge.bridge-nf-call-iptables = 1
  10. net.ipv4.ip_forward = 1
  11. net.bridge.bridge-nf-call-ip6tables = 1
  12. EOF
  13. sysctl --system

安装 containerd

  1. <!--
  2. # Install containerd
  3. ## Set up the repository
  4. ### Install packages to allow apt to use a repository over HTTPS
  5. apt-get update && apt-get install -y apt-transport-https ca-certificates curl software-properties-common
  6. ### Add Docker’s official GPG key
  7. curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
  8. ### Add Docker apt repository.
  9. add-apt-repository \
  10. "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
  11. $(lsb_release -cs) \
  12. stable"
  13. ## Install containerd
  14. apt-get update && apt-get install -y containerd.io
  15. # Configure containerd
  16. mkdir -p /etc/containerd
  17. containerd config default > /etc/containerd/config.toml
  18. -->
  19. # 安装 containerd
  20. ## 设置仓库
  21. ### 安装软件包以允许 apt 通过 HTTPS 使用存储库
  22. apt-get update && apt-get install -y apt-transport-https ca-certificates curl software-properties-common
  23. ### 安装 Docker 的官方 GPG 密钥
  24. curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
  25. ### 新增 Docker apt 仓库。
  26. add-apt-repository \
  27. "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
  28. $(lsb_release -cs) \
  29. stable"
  30. ## 安装 containerd
  31. apt-get update && apt-get install -y containerd.io
  32. # 配置 containerd
  33. mkdir -p /etc/containerd
  34. containerd config default > /etc/containerd/config.toml
  35. <!--
  36. # Restart containerd
  37. systemctl restart containerd
  38. -->
  39. # 重启 containerd
  40. systemctl restart containerd
  1. <!--
  2. # Install containerd
  3. ## Set up the repository
  4. ### Install required packages
  5. yum install yum-utils device-mapper-persistent-data lvm2
  6. ### Add docker repository
  7. yum-config-manager \
  8. --add-repo \
  9. https://download.docker.com/linux/centos/docker-ce.repo
  10. ## Install containerd
  11. yum update && yum install containerd.io
  12. # Configure containerd
  13. mkdir -p /etc/containerd
  14. containerd config default > /etc/containerd/config.toml
  15. -->
  16. # 安装 containerd
  17. ## 设置仓库
  18. ### 安装所需包
  19. yum install yum-utils device-mapper-persistent-data lvm2
  20. ### 新增 Docker 仓库
  21. yum-config-manager \
  22. --add-repo \
  23. https://download.docker.com/linux/centos/docker-ce.repo
  24. ## 安装 containerd
  25. yum update && yum install containerd.io
  26. # 配置 containerd
  27. mkdir -p /etc/containerd
  28. containerd config default > /etc/containerd/config.toml
  29. <!--
  30. # Restart containerd
  31. systemctl restart containerd
  32. -->
  33. # 重启 containerd
  34. systemctl restart containerd

systemd

使用 systemd cgroup 驱动,在 /etc/containerd/config.toml 中设置 plugins.cri.systemd_cgroup = true。 当使用 kubeadm 时,请手动配置 kubelet 的 cgroup 驱动

其他的 CRI 运行时:frakti

请参阅 Frakti 快速开始指南 来获取更多的信息。