K8s 生产环境安装
容器运行时
说明: 自 1.24 版起,Dockershim 已从 Kubernetes 项目中移除。
在集群内每个节点上安装一个 容器运行时 以使 Pod 可以运行在上面。
Kubernetes 1.31 要求你使用符合容器运行时接口(CRI)的运行时。
在 Kubernetes 中几个常见的容器运行时的用法。
这里仅说明containerd的使用。Docker Engine 没有实现 CRI, 而这是容器运行时在 Kubernetes 中工作所需要的。 为此,必须安装一个额外的服务 cri-dockerd。
containerd
使用 containerd 作为 CRI 运行时的必要步骤。
containerd 内置了对 Kubernetes 容器运行时接口 (CRI) 的支持。
https://github.com/containerd/containerd/blob/main/docs/getting-started.md
1 | # 下载 |
自定义containerd
生成默认配置containerd config default > /etc/containerd/config.toml
。
在 Linux 上,containerd 的默认 CRI 套接字是 /run/containerd/containerd.sock
。
配置 systemd
cgroup 驱动
在 /etc/containerd/config.toml
中
1 | SystemdCgroup = true |
应用此更改,请确保重新启动 containerd:
1 | sudo systemctl restart containerd |
当使用 kubeadm 时,请手动配置 kubelet 的 cgroup 驱动。
沙箱(pause)镜像
在 /etc/containerd/config.toml
中, 可以通过设置以下选项重载沙箱镜像:
1 | [plugins."io.containerd.grpc.v1.cri"] |
需要重启 containerd
:systemctl restart containerd
。
先决条件
默认情况下,Linux 内核不允许 IPv4 数据包在接口之间路由。 大多数 Kubernetes 集群网络实现都会更改此设置。
启用IPv4数据包转发
1 | # 设置所需的 sysctl 参数,参数在重新启动后保持不变 |
cgroup 驱动
在 Linux 上,控制组(CGroup)用于限制分配给进程的资源。
kubelet 和底层容器运行时都需要对接控制组来强制执行 为 Pod 和容器管理资源 并为诸如 CPU、内存这类资源设置请求和限制。若要对接控制组,kubelet 和容器运行时需要使用一个 cgroup 驱动。 关键的一点是 kubelet 和容器运行时需使用相同的 cgroup 驱动并且采用相同的配置。
可用的 cgroup 驱动有两个:
当 systemd 是选定的初始化系统时, kubelet 和容器运行时将 systemd
用作 cgroup 驱动。
使用部署工具安装 Kubernetes
搭建 Kubernetes 生产集群有工具,例如:
这里仅说明kubeadm。
使用 kubeadm 引导集群
准备条件:
- 一台兼容的 Linux 主机。Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux 发行版以及一些不提供包管理器的发行版提供通用的指令。
- 每台机器 2 GB 或更多的 RAM(如果少于这个数字将会影响你应用的运行内存)。
- CPU 2 核心及以上。
- 集群中的所有机器的网络彼此均能相互连接(公网和内网都可以)。
- 节点之中不可以有重复的主机名、MAC 地址或 product_uuid。请参见这里了解更多详细信息。
- 开启机器上的某些端口。请参见这里了解更多详细信息。
- 交换分区的配置。kubelet 的默认行为是在节点上检测到交换内存时无法启动。 如果 kubelet 未被正确配置使用交换分区,则你必须禁用交换分区。
例如,sudo swapoff -a
将暂时禁用交换分区。要使此更改在重启后保持不变,请确保在如 /etc/fstab
、systemd.swap
等配置文件中禁用交换分区,具体取决于你的系统如何配置。
1 | vim /etc/fstab |
安装 kubeadm、kubelet 和 kubectl
在每台机器上安装以下的软件包:
kubeadm
:用来初始化集群的指令。kubelet
:在集群中的每个节点上用来启动 Pod 和容器等。kubectl
:用来与集群通信的命令行工具。
kubeadm 不能安装或者管理 kubelet
或 kubectl
, 所以需要确保它们与通过 kubeadm 安装的控制平面的版本相匹配。
1.更新 apt
包索引并安装使用 Kubernetes apt
仓库所需要的包:
1 | sudo apt-get update |
2.下载用于 Kubernetes 软件包仓库的公共签名密钥。所有仓库都使用相同的签名密钥,因此你可以忽略URL中的版本:
1 | # 如果 `/etc/apt/keyrings` 目录不存在,则应在 curl 命令之前创建它,请阅读下面的注释。 |
3.添加 Kubernetes apt
仓库。 请注意,此仓库仅包含适用于 Kubernetes 1.31 的软件包
1 | # 此操作会覆盖 /etc/apt/sources.list.d/kubernetes.list 中现存的所有配置。 |
4.更新 apt
包索引,安装 kubelet、kubeadm 和 kubectl,并锁定其版本
1 | sudo apt-get update |
配置 cgroup 驱动程序
要将 systemd
设置为 cgroup 驱动,需编辑 KubeletConfiguration
的 cgroupDriver
选项,并将其设置为 systemd
。
1 | kubeadm config print init-defaults > kubeadm-config.yaml |
在kubeadm-config.yaml中修改,添加如下的内容
1 |
|
使用 kubeadm 创建集群
前提条件:在所有主机上安装容器运行时和 kubeadm。
kubeadm 与其他 Kubernetes 组件类似,会尝试在与主机默认网关关联的网络接口上找到可用的 IP 地址。 这个 IP 地址随
1 | ip route show # 查找以 "default via" 开头的行 |
后用于由某组件执行的公告和/或监听。
初始化控制平面节点
控制平面节点是运行控制平面组件的机器, 包括 etcd(集群数据库) 和 API 服务器 (命令行工具 kubectl 与之通信)。
初始化控制平面节点,请运行:
1 | # kubeadm init <args> |
要再次运行 kubeadm init
,你必须首先卸载集群。
kubeadm init
首先运行一系列预检查以确保机器为运行 Kubernetes 准备就绪。 这些预检查会显示警告并在错误时退出。然后 kubeadm init
下载并安装集群控制平面组件。这可能会需要几分钟。完成之后应该看到:
1 | Your Kubernetes control-plane has initialized successfully! |
要使非 root 用户可以运行 kubectl,运行以下命令, 它们也是 kubeadm init
输出的一部分:
1 | mkdir -p $HOME/.kube |
警告:
kubeadm init
生成的 kubeconfig 文件admin.conf
包含一个带有Subject: O = kubeadm:cluster-admins, CN = kubernetes-admin
的证书。kubeadm:cluster-admins
组被绑定到内置的cluster-admin
ClusterRole 上。 不要与任何人共享admin.conf
文件。
kubeadm init
生成另一个 kubeconfig 文件super-admin.conf
, 其中包含带有Subject: O = system:masters, CN = kubernetes-super-admin
的证书。system:masters
是一个紧急访问、超级用户组,可以绕过授权层(例如 RBAC)。 不要与任何人共享super-admin.conf
文件,建议将其移动到安全位置。
记录 kubeadm init
输出的 kubeadm join
命令。 你需要此命令将节点加入集群。
令牌用于控制平面节点和加入节点之间的相互身份验证。 这里包含的令牌是密钥。
安装 Pod 网络附加组件
必须部署一个基于 Pod 网络插件的容器网络接口(CNI), 它由一个规范和库组成,用于编写插件来配置 Linux 容器中的网络接口,以及许多受支持的插件。以便 Pod 可以相互通信。在安装网络之前,集群 DNS (CoreDNS) 将不会启动。
每个集群只能安装一个 Pod 网络。
这里仅说明 Calico
。官方安装教程
Calico 是一个联网和网络策略供应商。 Calico 支持一套灵活的网络选项,因此你可以根据自己的情况选择最有效的选项,包括非覆盖和覆盖网络,带或不带 BGP。 Calico 使用相同的引擎为主机、Pod 和(如果使用 Istio 和 Envoy)应用程序在服务网格层执行网络策略。
1.安装 Tigera Calico 操作器
1 | kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/tigera-operator.yaml |
2.创建必要的自定义资源来安装 Calico
1 | # 获取配置文件 |
3.应用自定义配置
1 | kubectl create -f custom-resources.yaml |
控制平面节点隔离
默认情况下,出于安全原因,你的集群不会在控制平面节点上调度 Pod。
能够在单机 Kubernetes 集群等控制平面节点上调度 Pod,请运行:
1 | kubectl taint nodes --all node-role.kubernetes.io/control-plane- |
(可选)从控制平面节点以外的计算机控制集群
将管理员 kubeconfig 文件从控制平面节点复制到工作站,如下所示:
1 | scp root@<control-plane-host>:/etc/kubernetes/admin.conf . |