虚拟机安装流程:https://www.borimooc.com/video/19436.htm
基于文档,在Ubuntu 18.04 系统上安装Kubernetes 1.27.4需先完成环境准备(最少 2 台机器,Master 节点192.168.10.100、Node 节点192.168.10.101等,配置均为 2C4G80G),所有节点需执行共通步骤(禁止 swap 分区、设置主机名与 /etc/hosts、配置 net.bridge 网络参数、替换为阿里软件源、安装 Docker 并配置阿里云镜像加速器及代理);随后 Master 节点需安装 kubeadm、kubelet、kubectl(版本 1.27.4),配置 containerd(修改 sandbox_image、开启 SystemdCgroup、设置镜像加速),通过自定义 kubeadm-config.yaml 初始化集群并安装 Calico 网络;Node 节点完成同 Master 的工具与 containerd 配置后,使用 Master 生成的 token 执行 kubeadm join 加入集群,同时文档还提供了 token 过期处理、kubelet 日志排查等问题解决方法及 crictl/ctr 等常用命令。


操作流程

1. 环境准备
  • 虚拟化工具:支持 vmware 等虚拟化软件。
  • 机器数量与配置:最少需 2 台机器(1 个 Master+1 个 Node),推荐配置如下表,可扩展 1 个可选 Node 节点:
    虚拟机主机名 虚拟机 IP 地址 配置大小 备注
    k8s-master1 192.168.10.100 2C4G80G 必须
    k8s-node1 192.168.10.101 2C4G80G 必须
    k8s-node2 192.168.10.102 2C4G80G 可选
  • 连接要求:使用 Xshell 等 SSH 工具连接虚拟机,确保虚拟机可访问外网(用于拉取软件包与镜像)。
2. 所有节点共通操作(Master 与 Node 均需执行)
2.1 禁止 swap 分区
  • 暂时禁止:执行命令sudo swapoff -a(重启后失效)。
  • 永久禁止:执行sudo vi /etc/fstab,注释掉文件中包含 “swap” 的一行(重启后生效)。
2.2 配置主机名与 /etc/hosts
  • 设置主机名:Master 节点执行sudo hostnamectl set-hostname k8s-master1,Node 节点执行sudo hostnamectl set-hostname k8s-node1(对应节点名)。
  • 修改 /etc/hosts:执行sudo vi /etc/hosts,在文件末尾添加集群节点 IP 与主机名映射,示例:192.168.10.100 k8s-master1 192.168.10.101 k8s-node1
2.3 配置网络参数(开启桥接转发)
  • 生成配置文件:执行以下命令创建内核参数配置文件:

    bash

    cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    EOF
    
  • 生效配置:执行sudo sysctl --system使参数立即生效(Ubuntu 20.04 默认无需此步骤)。
  • 设置时区:执行timedatectl set-timezone Asia/Shanghai(可先通过tzselect查询时区)。
2.4 修改软件源为阿里源
  • 备份默认源:sudo mv /etc/apt/sources.list /etc/apt/sources.list.bak
  • 编辑新源:执行sudo vi /etc/apt/sources.list,添加阿里 Ubuntu 18.04(代号 bionic)源,共 10 行(含 deb 与 deb-src):

    plaintext

    deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
    
  • 更新源与软件:sudo apt update(更新软件包列表)、sudo apt upgrade(更新软件)。
2.5 安装并配置 Docker
  • 安装依赖包:sudo apt install -y apt-transport-https ca-certificates software-properties-common
  • 安装常用工具:sudo apt install -y vim curl net-tools python-pip(推荐安装,方便后续操作)。
  • 添加 Docker GPG key:sudo curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
  • 设置 Docker 阿里镜像源:

    bash

    sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
    
  • 安装 Docker CE:先执行sudo apt update,再执行sudo apt install docker-ce
  • 启动并设开机自启:sudo systemctl start docker(启动)、sudo systemctl enable docker(开机自启)。
  • 配置 Docker 镜像加速器(解决拉取慢问题):
    1. 创建目录:sudo mkdir -p /etc/docker
    2. 生成配置:

      bash

      sudo tee /etc/docker/daemon.json <<-'EOF'
      "registry-mirrors": ["https://d3ul9gtx.mirror.aliyuncs.com"]
      EOF
      
    3. 重启生效:sudo systemctl daemon-reloadsudo systemctl restart docker
  • 可选配置 Docker 代理(需代理环境时):
    1. 创建目录:mkdir /etc/systemd/system/docker.service.d/
    2. 编辑代理文件:vi /etc/systemd/system/docker.service.d/http-proxy.conf,添加:

      plaintext

      [Service]
      Environment="HTTP_PROXY=http://192.168.10.199:7890/"
      Environment="HTTPS_PROXY=http://192.168.10.199:7890/"
      
    3. 重启生效:systemctl daemon-reloadsystemctl restart docker
3. Master 节点安装 Kubernetes(1.27.4)
3.1 安装 kubeadm、kubelet、kubectl
  • 安装依赖:sudo apt update && sudo apt install -y ca-certificates curl software-properties-common apt-transport-https
  • 添加 K8s 阿里源 GPG key:curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
  • 添加 K8s 源:

    bash

    sudo tee /etc/apt/sources.list.d/kubernetes.list <<EOF
    deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
    EOF
    
  • 安装指定版本(1.27.4):

    bash

    sudo apt update
    sudo apt install -y kubelet=1.27.4-00 kubeadm=1.27.4-00 kubectl=1.27.4-00
    
  • 锁定版本(防止意外升级):sudo apt-mark hold kubelet kubeadm kubectl
3.2 配置 containerd(解决 K8s 镜像拉取问题)
  • 创建目录:mkdir -p /etc/containerd
  • 生成默认配置:containerd config default | sudo tee /etc/containerd/config.toml
  • 编辑配置文件(sudo vi /etc/containerd/config.toml),修改 3 处关键参数:
    1. sandbox_image:将默认的k8s.gcr.io/pause:3.6改为registry.aliyuncs.com/google_containers/pause:3.9(阿里源镜像,避免境外拉取失败)。
    2. SystemdCgroup:在[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]下,将false改为true(适配 Systemd 管理)。
    3. config_path:在[plugins."io.containerd.grpc.v1.cri".registry]下,设置为/etc/containerd/certs.d(指定镜像加速配置目录)。
  • 配置 containerd 镜像加速:
    1. 创建目录:mkdir /etc/containerd/certs.d/docker.io -pv(针对 Docker Hub 镜像)。
    2. 生成加速配置:

      bash

      cat > /etc/containerd/certs.d/docker.io/hosts.toml << EOF
      server = "https://docker.io"
      [host."https://b9pmyelo.mirror.aliyuncs.com"]
      capabilities = ["pull", "resolve"]
      EOF
      
  • 加载内核模块:
    1. 生成模块配置:

      bash

      cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
      overlay
      br_netfilter
      EOF
      
    2. 生效模块:sudo modprobe overlaysudo modprobe br_netfilter
  • 重启 containerd:systemctl restart containerd,检查状态:systemctl status containerd(确保为 running)。
3.3 初始化 K8s 集群
  • 生成默认配置文件:sudo kubeadm config print init-defaults > kubeadm-config.yaml
  • 编辑配置文件(sudo vi kubeadm-config.yaml),修改 4 处关键参数:
    参数名 修改内容 目的
    advertiseAddress 改为 Master 内网 IP(如 192.168.10.100) 确保节点访问 API Server
    name 改为 k8s-master1 与主机名一致
    imageRepository 改为registry.aliyuncs.com/google_containers 用阿里源拉取 K8s 镜像
    serviceSubnet 改为 10.244.0.0/16 与后续 Calico 网络匹配
  • 执行初始化:sudo kubeadm init --config kubeadm-config.yaml --v=5--v=5用于输出详细日志,方便排错)。
    • 若初始化失败,执行sudo kubeadm reset重置后重新操作。
  • 配置 kubectl 权限(普通用户使用):

    bash

    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
    
     
    • 若为 root 用户,直接执行export KUBECONFIG=/etc/kubernetes/admin.conf
3.4 部署 Calico 网络插件(必选,否则 Pod 无法通信)
  • 克隆仓库(需代理时加-c http.proxy参数):

    bash

    git clone -c http.proxy="http://192.168.10.199:7890" https://github.com/dotbalo/k8s-ha-install.git/
    # 或无代理时:git clone https://github.com/dotbalo/k8s-ha-install.git
    
  • 切换分支:cd k8s-ha-installgit checkout manual-installation-v1.26.x
  • 进入 Calico 目录:cd /root/k8s-ha-install/calico,备份配置:cp calico.yaml calico.yaml.bak
  • 核对网段:执行cat /etc/kubernetes/manifests/kube-apiserver.yaml,确认--service-cluster-ip-range=10.244.0.0/16(与 kubeadm-config.yaml 一致)。
  • 修改 Calico 网段:sudo vi calico.yaml,搜索CALICO_IPV4POOL_CIDR,将value改为"172.16.0.0/16"
  • 部署 Calico:kubectl apply -f calico.yaml(若后续更新配置,执行kubectl replace -f calico.yaml)。
  • 验证:kubectl get pod -n kube-system,若未添加 Node 节点,部分 Calico Pod(如 calico-node)异常属正常。
4. Node 节点安装 Kubernetes
4.1 安装 kubeadm、kubelet、kubectl
  • 步骤与 Master 节点完全一致:安装依赖、添加 K8s 阿里源、安装 1.27.4 版本工具、锁定版本(参考 3.1)。
4.2 配置 containerd
  • 步骤与 Master 节点完全一致:生成配置、修改 3 处参数、配置镜像加速、加载内核模块、重启 containerd(参考 3.2)。
4.3 安装依赖包
  • 执行pip install --upgrade pip(升级 pip)、pip install python-zunclient(安装 K8s 相关依赖)。
4.4 加入 K8s 集群
  • 执行 Master 节点初始化成功后输出的kubeadm join命令(示例,需以实际输出为准):

    bash

    kubeadm join 192.168.10.100:6443 --token ltlaym.3aj9nwrqmk2lra7v \
    --discovery-token-ca-cert-hash sha256:d819b5e8078d40c937087bcae418862f86ef5d2aa8276ed46be6e036b4e93993
    
     
    • 注意:此命令不可在 Master 节点执行,仅用于 Node 节点加入。
5. 问题排查
  • 通用排查命令
    • 查看 kubelet 日志(定位启动失败原因):journalctl -fxeu kubelet
    • 检查 10250 端口(K8s 节点通信端口)占用:sudo netstat -tunlp | grep 10250
    • 验证集群状态:kubectl get node(查看节点是否 Ready)、kubectl get pod -A(查看所有 Pod 状态)。
    • 查看异常 Pod 详情:kubectl logs -f <Pod名称> -n kube-system(日志)、kubectl describe pod <Pod名称> -n kube-system(描述信息)。
  • Token 过期问题(Node 无法加入集群时常见):
    1. 检查 Token:在 Master 执行kubeadm token list,无输出则表示过期。
    2. 生成新 Token:kubeadm token create(记录生成的 Token)。
    3. 计算新的discovery-token-ca-cert-hash

      bash

      openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
      
    4. 替换 Token 与 Hash:将新 Token 和 Hash 代入kubeadm join命令,重新在 Node 执行。
6. 常用命令(containerd 与 K8s 管理)
6.1 crictl 命令(K8s 容器管理专用)
  • 配置:创建/etc/crictl.yaml,添加runtime-endpoint: unix:///run/containerd/containerd.sock(指定容器运行时端点)。
  • 常用操作:
    命令 功能
    crictl images 查看 K8s 环境下的镜像
    crictl pods 查看所有 Pod
    crictl pods --name <Pod 名称> 查看指定名称的 Pod
    crictl ps 查看运行中的容器
    crictl ps -a 查看所有容器(含已停止)
    crictl exec -i -t <容器 ID> < 命令 > 在容器内执行命令(如 ls)
    crictl logs <容器 ID> 查看容器所有日志
    crictl logs --tail=2 <容器 ID> 查看容器最近 2 行日志
    crictl pull <镜像名>(如 busybox) 拉取镜像
6.2 ctr 与 Docker 命令对比(containerd 原生工具)
Containerd 命令(ctr) Docker 命令 功能
ctr task ls docker ps 查看运行中的容器
ctr image ls docker images 查看镜像列表
ctr image pull <镜像名> docker pull <镜像名> 拉取镜像
ctr image push <镜像名> docker push <镜像名> 推送镜像
ctr image import <镜像 tar 包> docker load -i <镜像 tar 包> 导入本地镜像包
ctr run -d <镜像名> < 容器名 > docker run -d --name=<容器名> < 镜像名 > 后台运行容器
ctr image tag <原镜像> < 新镜像 > docker tag <原镜像> < 新镜像 > 为镜像打标签

4. 关键问题与答案

问题 1:安装 Kubernetes 1.27.4 前,Master 和 Node 节点必须完成的 “共通核心配置” 有哪些?这些配置的核心目的是什么?

答案:共通核心配置有 5 项,目的分别如下:

  1. 禁止 swap 分区:执行sudo swapoff -a(暂时)和注释 /etc/fstab 中 swap 行(永久),目的是避免 K8s 调度时因 swap 分区导致性能波动,K8s 要求必须禁用 swap。
  2. 配置主机名与 /etc/hosts:设置主机名并添加集群 IP - 主机名映射,目的是确保集群内节点间能通过主机名通信,避免 IP 依赖。
  3. 开启桥接网络转发:配置 net.bridge.bridge-nf-call-iptables=1 并生效,目的是让 K8s 的 Service 和 Pod 网络规则能通过 iptables 正常转发,保证网络通信。
  4. 替换为阿里软件源:将 Ubuntu 默认源改为阿里源,目的是解决境外源下载慢或失败问题,加速 apt 软件包(如 Docker、kube 工具)的安装。
  5. 安装并配置 Docker:安装 docker-ce 并配置阿里镜像加速器,目的是为 K8s 提供容器运行时(初期依赖 Docker,后续通过 containerd 适配),同时解决 Docker 镜像拉取慢问题。
问题 2:Master 节点初始化 K8s 集群时,kubeadm-config.yaml 的核心修改参数有哪些?为何必须修改这些参数?

答案:需修改 4 个核心参数,修改原因与 K8s 部署稳定性和可用性直接相关:

  1. advertiseAddress: 192.168.10.100:必须改为 Master 节点的内网 IP(而非默认的 1.2.3.4),原因是该地址是 API Server 对外暴露的通信地址,若用默认值,Node 节点无法定位 API Server,导致集群无法组建。
  2. imageRepository: registry.aliyuncs.com/google_containers:必须替换默认的 k8s.gcr.io 源,原因是 k8s.gcr.io 为境外仓库,国内环境无法直接访问,替换为阿里源可确保 K8s 核心镜像(如 apiserver、controller-manager)能正常拉取。
  3. serviceSubnet: 10.244.0.0/16:必须设置为与后续 Calico 网络匹配的网段,原因是 ServiceSubnet 是 K8s Service 的 IP 分配范围,若与 Calico 的 Pod 网段冲突,会导致 Service 与 Pod 无法通信。
  4. name: k8s-master1:必须改为 Master 节点的实际主机名,原因是该参数用于标识 Master 节点在集群中的名称,需与hostnamectl设置的主机名一致,否则节点身份识别会失败。
问题 3:Node 节点执行 kubeadm join 时提示 “token 过期”,从 “问题定位” 到 “解决操作” 的完整流程是什么?(需明确操作节点与命令)

答案:完整流程需在 Master 节点操作,分 4 步:

  1. 定位问题:在 Master 节点执行kubeadm token list,若命令无输出,即可确认 “token 过期”(K8s 默认 token 有效期为 24 小时)。
  2. 生成新 token:在 Master 节点执行kubeadm token create,命令会输出新 token(如gi0150.yhebhisi5rd4qu2y),记录该 token。
  3. 计算新的 discovery-token-ca-cert-hash:在 Master 节点执行以下命令,获取 CA 证书的 SHA256 哈希值(如2b69d7200704a4f82c26ad5b62bd97d8cb5a211165afa8de87cdf3973395aa2c):

    bash

    openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
    
  4. 更新 join 命令并执行:在 Node 节点,将新 token 和新 hash 代入kubeadm join命令,示例:

    bash

    kubeadm join 192.168.10.100:6443 --token gi0150.yhebhisi5rd4qu2y \
    --discovery-token-ca-cert-hash sha256:2b69d7200704a4f82c26ad5b62bd97d8cb5a211165afa8de87cdf3973395aa2c --v=5
    

    执行后,在 Master 节点用kubectl get node可查看 Node 是否成功加入(状态为 Ready)。
     
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐