Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

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
2
3
4
5
# 下载
wget https://github.com/containerd/containerd/releases/download/v1.7.5/cri-containerd-1.7.5-linux-amd64.tar.gz
# 安装
# 可以安装到/usr/local
tar xf cri-containerd-1.7.5-linux-amd64.tar.gz -C /
自定义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
2
[plugins."io.containerd.grpc.v1.cri"]
sandbox_image = "registry.k8s.io/pause:3.2"

需要重启 containerdsystemctl restart containerd

先决条件

默认情况下,Linux 内核不允许 IPv4 数据包在接口之间路由。 大多数 Kubernetes 集群网络实现都会更改此设置。

启用IPv4数据包转发

1
2
3
4
5
6
7
8
9
# 设置所需的 sysctl 参数,参数在重新启动后保持不变
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
EOF

# 应用 sysctl 参数而不重新启动
sudo sysctl --system
# 验证
sysctl net.ipv4.ip_forward

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/fstabsystemd.swap 等配置文件中禁用交换分区,具体取决于你的系统如何配置。

1
2
vim /etc/fstab
# 找到 /swap.img none swap sw 0 0 这一行,给注释掉
安装 kubeadm、kubelet 和 kubectl

在每台机器上安装以下的软件包:

  • kubeadm:用来初始化集群的指令。
  • kubelet:在集群中的每个节点上用来启动 Pod 和容器等。
  • kubectl:用来与集群通信的命令行工具。

kubeadm 不能安装或者管理 kubeletkubectl, 所以需要确保它们与通过 kubeadm 安装的控制平面的版本相匹配。

1.更新 apt 包索引并安装使用 Kubernetes apt 仓库所需要的包:

1
2
3
sudo apt-get update
# apt-transport-https 可能是一个虚拟包(dummy package);如果是的话,你可以跳过安装这个包
sudo apt-get install -y apt-transport-https ca-certificates curl gpg

2.下载用于 Kubernetes 软件包仓库的公共签名密钥。所有仓库都使用相同的签名密钥,因此你可以忽略URL中的版本:

1
2
3
# 如果 `/etc/apt/keyrings` 目录不存在,则应在 curl 命令之前创建它,请阅读下面的注释。
# sudo mkdir -p -m 755 /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.31/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

3.添加 Kubernetes apt 仓库。 请注意,此仓库仅包含适用于 Kubernetes 1.31 的软件包

1
2
# 此操作会覆盖 /etc/apt/sources.list.d/kubernetes.list 中现存的所有配置。
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.31/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list

4.更新 apt 包索引,安装 kubelet、kubeadm 和 kubectl,并锁定其版本

1
2
3
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
配置 cgroup 驱动程序

要将 systemd 设置为 cgroup 驱动,需编辑 KubeletConfigurationcgroupDriver 选项,并将其设置为 systemd

1
kubeadm config print init-defaults > kubeadm-config.yaml

在kubeadm-config.yaml中修改,添加如下的内容

1
2
3
4
---
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
cgroupDriver: systemd

使用 kubeadm 创建集群

前提条件:在所有主机上安装容器运行时和 kubeadm。

kubeadm 与其他 Kubernetes 组件类似,会尝试在与主机默认网关关联的网络接口上找到可用的 IP 地址。 这个 IP 地址随

1
ip route show # 查找以 "default via" 开头的行

后用于由某组件执行的公告和/或监听。

初始化控制平面节点

控制平面节点是运行控制平面组件的机器, 包括 etcd(集群数据库) 和 API 服务器 (命令行工具 kubectl 与之通信)。

初始化控制平面节点,请运行:

1
2
# kubeadm init <args>
kubeadm init --config kubeadm-config.yaml

要再次运行 kubeadm init,你必须首先卸载集群

kubeadm init 首先运行一系列预检查以确保机器为运行 Kubernetes 准备就绪。 这些预检查会显示警告并在错误时退出。然后 kubeadm init 下载并安装集群控制平面组件。这可能会需要几分钟。完成之后应该看到:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

You should now deploy a Pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
/docs/concepts/cluster-administration/addons/

You can now join any number of machines by running the following on each node
as root:

kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>

要使非 root 用户可以运行 kubectl,运行以下命令, 它们也是 kubeadm init 输出的一部分:

1
2
3
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

警告:

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
2
3
4
5
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/tigera-operator.yaml
# 查看命名空间tigera-operator
kubectl get ns
# 查看命名空间tigera-operator中的pod
kubectl get pods -n tigera-operator

2.创建必要的自定义资源来安装 Calico

1
2
3
4
5
6
# 获取配置文件
wget https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/custom-resources.yaml
# 编辑
vim custom-resources.yaml
# 修改网段
cidr: 10.244.0.0/16

3.应用自定义配置

1
2
3
4
5
kubectl create -f custom-resources.yaml
# 查看命名空间calico-system
kubectl get ns
# 查看命名空间calico-system中的pod
kubectl get pods -n calico-system
控制平面节点隔离

默认情况下,出于安全原因,你的集群不会在控制平面节点上调度 Pod。

能够在单机 Kubernetes 集群等控制平面节点上调度 Pod,请运行:

1
kubectl taint nodes --all node-role.kubernetes.io/control-plane-
(可选)从控制平面节点以外的计算机控制集群

将管理员 kubeconfig 文件从控制平面节点复制到工作站,如下所示:

1
2
scp root@<control-plane-host>:/etc/kubernetes/admin.conf .
kubectl --kubeconfig ./admin.conf get nodes

评论