【环境】Ubuntu 安装 Kubernetes

环境说明

以下是笔者的尝试过的搭建环境:

  • ubuntu 18.04 / 22.04
  • Kubernetes 1.24 ~ 1.26
  • docker / containerd

需要注意的是,Kubernetes 在 1.24 版本后删除了 dockershim ,搭建过程中如遇容器运行时、镜像等问题,参考一些旧版本的基于 docker 的解决方法大概率是不可行的。

环境准备

无论是 master 还是 worker 节点,都需要完成如下环境的修改与软件安装。

设置静态 IP

  • ifconfig查看当前 IP 和子网掩码,route -n查看网关地址

  • 进入/etc/netplan目录,编辑其中的01-network-manager-all.yaml文件(不同版本 Ubuntu 的文件名可能不一样),格式形如:

    yaml 复制代码
    network:
      version: 2
      renderer: NetworkManager
      ethernets:
        enp1s0:  # 网卡名称
          dhcp4: no  # 关闭dhcp
          dhcp6: no
          addresses: [192.168.122.120/24]  # 静态IP
          gateway4: 192.168.122.1  # 网关
          nameservers:
            addresses: [8.8.8.8, 114.114.114.114]  # DNS
  • 使配置生效:sudo netplan apply

  • 桌面版可以直接在网络设置的图形化界面设置

系统优化

  • 禁用 swap 分区:编辑/etc/fstab,将 swap 那行注释掉

  • 修改模块配置(安装了 docker 可跳过这步)

    bash 复制代码
    # 临时修改(立即生效,重启后失效)
    
    modprobe br_netfilter
    echo "1" > /proc/sys/net/ipv4/ip_forward
    
    # 永久修改(重启后生效)
    
    # 开机自动加载 br_netfilter 模块
    cat > /etc/modules-load.d/k8s.conf <<EOF
    br_netfilter
    EOF
    
    # 开机自动设置 ip_forward 值为1
    cat > /etc/sysctl.d/k8s.conf << EOF
    net.ipv4.ip_forward=1
    EOF
  • 重启

软件安装

  • 安装基础软件

    bash 复制代码
    sudo apt update
    sudo apt install -y apt-transport-https ca-certificates curl
  • 安装 conteinerd / docker(二选一即可)

    bash 复制代码
    sudo apt install -y docker.io
    sudo apt install -y containerd
  • 安装 kubenetes

    • 添加软件源

      bash 复制代码
      curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add - 
      cat > /etc/apt/sources.list.d/kubernetes.list << EOF
      deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
      EOF
    • 安装组件

      bash 复制代码
      sudo apt update
      sudo apt install -y kubelet kubeadm kubectl
      sudo apt-mark hold kubelet kubeadm kubectl  # 锁定版本

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

k8s 配置

master 节点配置

master 的作用是创建集群网络

  • 初始化集群:

    css 复制代码
    kubeadm init \
    --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
    --pod-network-cidr=10.244.0.0/16
    [--cri-socket unix:///var/run/cri-dockerd.sock]

    参数说明:
    image-repository:镜像源
    pod-network-cidr:pod 网络地址范围

    这里是最容易出问题的地方,一般会显示超时,解决办法见文末。

    成功后会显示 Your Kubernetes control-plane has initialized successfully! ,注意记下最后生成的包含 token 的 join 命令。

  • 配置 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
  • 配置 flannel 网络(否则节点状态为NotReady

    bash 复制代码
    kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

worker 节点配置

该配置是为了将 worker 节点加入集群网络

  • 拉取镜像

    bash 复制代码
    kubeadm config images pull --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers
  • 使用 join 命令加入网络

    bash 复制代码
    # 请换成你自己的 master 生成的命令
    kubeadm join 192.168.142.134:6443 --token q1twco.j374oo66pybp1lf2 --discovery-token-ca-cert-hash sha256:959c16f041e1b218bec3c8b27a4a75318590c6377e54ccdbda4956ba6d1424a2
  • 使用 kubectl get nodes 查看网络中的节点

Some Tips

  • 查看日志

    bash 复制代码
    journalctl -xeu kubelet
  • 主节点重新初始化前,或者工作节点加入集群前,都需要重置环境

    bash 复制代码
    kubeadm reset -f [--cri-socket unix:///var/run/cri-dockerd.sock]
  • 主节点初始化后,需要重新配置$HOME/.kube/config

  • 生成新的 Token

    bash 复制代码
    kubeadm token create --print-join-command

问题处理

  • (日志中)错误提示: failed to get sandbox image "registry.k8s.io/pause:3.6"

    解决:从国内仓库拉取pause镜像,修改tag,注意版本号和 tag 与报错提示的一致

    bash 复制代码
    ctr -n k8s.io i pull -k registry.aliyuncs.com/google_containers/pause:3.6
    ctr -n k8s.io i tag registry.aliyuncs.com/google_containers/pause:3.6 registry.k8s.io/pause:3.6
  • crictl 报错:runtime connect using default endpoints

    解决:指定容器运行时

    bash 复制代码
    # kubernetes 1.24 之后,dockershim 变成了 cri-dockerd,需要额外安装
    crictl config runtime-endpoint unix:///run/cri-dockerd.sock
    crictl config image-endpoint unix:///run/cri-dockerd.sock
    # 选择用 containerd 作为容器运行时
    crictl config runtime-endpoint unix:///run/containerd/containerd.sock
    crictl config image-endpoint unix:///run/containerd/containerd.sock
    # 还可以设置其他的容器运行时

    生成的配置在cat /etc/crictl.yaml,可以随时修改

参考资料

相关推荐
说实话起个名字真难啊34 分钟前
用docker来安装openclaw
docker·ai·容器
恬静的小魔龙1 小时前
【群晖Nas】群晖Nas中实现SVN Server功能、Docker/ContainerManager等
docker·svn·容器
Zfox_2 小时前
CANN Catlass 算子模板库深度解析:高性能 GEMM 融合计算、Cube Unit Tiling 机制与编程范式实践
docker·云原生·容器·eureka
农民工老王2 小时前
K8s 1.31 私有化部署实战:从 Calico 崩溃到 NFS 挂载失败的排坑全记录
云原生·kubernetes
广州中轴线2 小时前
OpenStack on Kubernetes 生产部署实战(十四)
kubernetes·智能路由器·openstack
春日见2 小时前
如何创建一个PR
运维·开发语言·windows·git·docker·容器
DARLING Zero two♡3 小时前
告别 Docker 命令行!Portainer+cpolar 让容器管理从局域网走向公网
运维·docker·容器
liu****3 小时前
2.深入浅出理解虚拟化与容器化(含Docker实操全解析)
运维·c++·docker·容器·虚拟化技术
logocode_li4 小时前
OCI/CRI 双标准下:从 dockerd 到 containerd 的 K8s 运行时迭代史
docker·云原生·容器·k8s
lpruoyu18 小时前
【Docker进阶-05】Docker网络
网络·docker·容器