【环境】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,可以随时修改

参考资料

相关推荐
tangdou3690986553 小时前
Docker系列-5种方案超详细讲解docker数据存储持久化(volume,bind mounts,NFS等)
docker·容器
later_rql3 小时前
k8s-集群部署1
云原生·容器·kubernetes
weixin_453965005 小时前
[单master节点k8s部署]31.ceph分布式存储(二)
分布式·ceph·kubernetes
大G哥8 小时前
记一次K8S 环境应用nginx stable-alpine 解析内部域名失败排查思路
运维·nginx·云原生·容器·kubernetes
妍妍的宝贝8 小时前
k8s 中微服务之 MetailLB 搭配 ingress-nginx 实现七层负载
nginx·微服务·kubernetes
大道归简9 小时前
Docker 命令从入门到入门:从 Windows 到容器的完美类比
windows·docker·容器
爱跑步的程序员~10 小时前
Docker
docker·容器
福大大架构师每日一题10 小时前
23.1 k8s监控中标签relabel的应用和原理
java·容器·kubernetes
程序那点事儿10 小时前
k8s 之动态创建pv失败(踩坑)
云原生·容器·kubernetes
疯狂的大狗10 小时前
docker进入正在运行的容器,exit后的比较
运维·docker·容器