在 Ubuntu 中使用阿里源部署单节点 Kubernetes 集群

本教程是在 Ubuntu 操作系统中使用阿里云镜像源部署单节点 Kubernetes 集群。将使用 kubeadm 工具进行部署。

前提条件:

  • 已安装 Docker (本教程省略 Docker 安装步骤)
  • Ubuntu 操作系统 (当前版本:Linux shumo-ai 5.11.0-27-generic #29~20.04.1-Ubuntu SMP Wed Aug 11 15:58:17 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux)
  • 官方建议至少 2GB RAM 和 2 CPU 核心
  • 稳定的网络连接(当前教程为联网教程)
  • root 或具有 sudo 权限的用户

步骤 1: 更新系统并安装依赖

  1. 更新系统软件包列表:

    1
    sudo apt update
  2. 安装必要的依赖包:

    1
    sudo apt install -y apt-transport-https ca-certificates curl software-properties-common

步骤 2: 添加阿里云 Kubernetes 镜像源

  1. 添加阿里云 Kubernetes 镜像源:

    1
    2
    3
    4
    curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
    sudo tee /etc/apt/sources.list.d/kubernetes.list <<EOF
    deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
    EOF
  2. 更新软件包列表:

    1
    sudo apt update

步骤 3: 安装 kubeadm、kubelet 和 kubectl

  1. 安装 kubeadm、kubelet 和 kubectl:

    1
    sudo apt install -y kubelet kubeadm kubectl
  2. 设置 kubelet 开机自启:

    1
    sudo systemctl enable kubelet

步骤 4: 初始化 Kubernetes 控制平面

  1. 初始化 Kubernetes 控制平面:

    1
    sudo kubeadm init --image-repository registry.aliyuncs.com/google_containers

如果遇到报错,可以添加参数--v=5输出详细报错内容,根据报错内容进行排查。

此命令将输出类似以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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:
https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>
  1. 按照输出提示,执行以下命令配置 kubectl:

    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

步骤 5: 安装 Pod 网络插件

  1. 安装 Calico 网络插件:

    1
    kubectl apply -f https://docs.projectcalico.org/v3.14/manifests/calico.yaml

步骤 6: 移除 Master 节点污点

默认情况下,Kubernetes Master 节点会打上污点,防止普通 Pod 调度到该节点。对于单节点集群,我们需要移除该污点:

  1. 查看节点名称:

    1
    kubectl get nodes
  2. 移除污点:

    1
    kubectl taint nodes <node-name> node-role.kubernetes.io/master-

    <node-name> 替换为实际的节点名称。

步骤 7: 验证集群状态

  1. 查看节点状态:

    1
    kubectl get nodes

    输出应显示节点状态为 Ready

  2. 查看 Pod 状态:

    1
    kubectl get pods --all-namespaces

    输出应显示所有 Pod 状态为 RunningCompleted

如果没有问题,目前就已经安装好了

官方注意事项:

在许多教程中,并不推荐单节点部署,因此需要注意以下几点:

  • 单节点不利于实际生产环境,生产环境建议使用多节点集群。
  • 单节点集群存在单点故障风险,建议在生产环境中使用高可用方案。
  • 您可以根据需要选择其他 Pod 网络插件,例如 Flannel、Weave Net 等。

参考文档:

补充注意事项

注意事项一:单独下载镜像或查看下载的镜像列表

在执行 sudo kubeadm init --image-repository registry.aliyuncs.com/google_containers 时,如果网络较差,或者希望预先下载镜像,或者想了解具体下载了哪些镜像,可以按照以下步骤操作:

  1. 查看需要下载的镜像列表
    使用以下命令可以查看 kubeadm 初始化时需要下载的镜像列表:

    1
    kubeadm config images list --image-repository registry.aliyuncs.com/google_containers

    输出示例:

    1
    2
    3
    4
    5
    6
    7
    registry.aliyuncs.com/google_containers/kube-apiserver:v1.28.0
    registry.aliyuncs.com/google_containers/kube-controller-manager:v1.28.0
    registry.aliyuncs.com/google_containers/kube-scheduler:v1.28.0
    registry.aliyuncs.com/google_containers/kube-proxy:v1.28.0
    registry.aliyuncs.com/google_containers/pause:3.9
    registry.aliyuncs.com/google_containers/etcd:3.5.9-0
    registry.aliyuncs.com/google_containers/coredns:v1.10.1
  2. 手动下载镜像
    如果网络较差,可以手动下载这些镜像。使用以下命令:

    1
    kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers

    该命令会拉取所有需要的镜像到本地。

  3. 验证镜像是否下载成功
    使用以下命令查看已下载的镜像:

    1
    crictl images

    确保所有需要的镜像都已下载完成。

  4. 继续初始化集群
    镜像下载完成后,可以继续执行初始化命令:

    1
    sudo kubeadm init --image-repository registry.aliyuncs.com/google_containers

注意事项二:加载自定义镜像的命令 ctr -n k8s.io images import

在 Kubernetes 中,容器运行时(如 containerd)负责管理镜像。如果您有自定义的镜像文件(通常是 .tar 格式),可以使用 ctr 命令将其加载到容器运行时中。

  1. 为什么使用 ctr -n k8s.io images import

    • ctr 是 containerd 的命令行工具,用于管理容器和镜像。
    • -n k8s.io 指定了命名空间,Kubernetes 使用的 containerd 命名空间是 k8s.io
    • images import 是用于导入镜像的命令。
  2. 如何使用该命令
    假设您有一个自定义镜像文件 my-custom-image.tar,可以使用以下命令导入:

    1
    sudo ctr -n k8s.io images import my-custom-image.tar
  3. 验证镜像是否导入成功
    使用以下命令查看已导入的镜像:

    1
    sudo ctr -n k8s.io images list

    确保您的自定义镜像已成功加载。

  4. 在 Kubernetes 中使用自定义镜像
    在 Pod 的 YAML 文件中,可以直接引用自定义镜像的名称和标签。


注意事项三:CRI 集成插件被禁止的情况及处理方法

CRI(Container Runtime Interface)是 Kubernetes 与容器运行时(如 containerd、CRI-O)之间的接口。CRI 集成插件(如 cri-tools)可能会在某些情况下被禁止,以下是可能的原因及处理方法:

  1. CRI 集成插件被禁止的常见原因

    • 容器运行时未正确配置:如果容器运行时(如 containerd)未正确配置或未启动,CRI 插件可能无法正常工作。
    • Kubernetes 版本与 CRI 版本不兼容:某些 Kubernetes 版本可能需要特定版本的 CRI 插件。
    • 安全策略限制:某些安全策略(如 SELinux、AppArmor)可能会限制 CRI 插件的运行。
    • 网络问题:如果节点无法访问所需的镜像仓库或网络配置错误,CRI 插件可能无法拉取镜像。
  2. 处理方法

    • 检查容器运行时状态
      确保容器运行时(如 containerd)已正确安装并运行:

      1
      sudo systemctl status containerd

      如果未运行,可以启动并设置开机自启:

      1
      sudo systemctl enable --now containerd
    • 检查 Kubernetes 与 CRI 的兼容性
      确保 Kubernetes 版本与 CRI 插件版本兼容。可以参考 Kubernetes 官方文档中的版本兼容性列表。

    • 检查安全策略
      如果启用了 SELinux 或 AppArmor,确保它们未阻止 CRI 插件的运行。可以尝试临时禁用 SELinux:

      1
      sudo setenforce 0

      如果问题解决,可以调整安全策略以允许 CRI 插件运行。

    • 检查网络配置
      确保节点可以访问所需的镜像仓库。可以尝试手动拉取镜像:

      1
      crictl pull <image-name>

      如果网络有问题,检查节点的 DNS 配置和防火墙规则。

    • 重新初始化集群
      如果问题仍然存在,可以尝试清理集群并重新初始化:

      1
      2
      sudo kubeadm reset
      sudo kubeadm init --image-repository registry.aliyuncs.com/google_containers

离线下载方案

基于以上教程与官网提供的下载安装包可以实现离线安装部署,注意镜像版本对应关系。