• k8s + docker 基于 kubeadm 多节点集群部署


    k8s + docker 基于 kubeadm 多节点集群部署

    博客文章地址:https://blog.taoluyuan.com/posts/install-k8s/

    各个节点环境准备

    [环境准备] 这章的操作都要在两台机器上分别执行,我准备了两台机器,如下:

    1. 一台master,一台node
    2. 主机1(master) ip:192.168.31.122,主机2 192.168.31.166

    1. docker 安装

    如已经安装好docker 可跳过
    docker 官方安装 https://docs.docker.com/engine/install/ubuntu/ 有点慢
    清华大学 镜像安装方法 https://mirrors.tuna.tsinghua.edu.cn/help/docker-ce/

    安装依赖

    sudo apt-get install ca-certificates curl gnupg
    sudo install -m 0755 -d /etc/apt/keyrings
    sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
    echo \
      "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu \
      "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    安装 docker-ce

    sudo apt-get update
    sudo apt-get install docker-ce
    
    • 1
    • 2

    docker组授予用户根级权限,让当前登陆也可以使用docker

    sudo groupadd docker
    sudo usermod -aG docker $USER
    newgrp docker
    
    
    • 1
    • 2
    • 3
    • 4

    镜像加速器

    通过修改daemon配置文件/etc/docker/daemon.json修改 registry,我使用的是上海交大

    sudo mkdir -p /etc/docker
    sudo tee /etc/docker/daemon.json <<-'EOF'
    {
      "registry-mirrors": ["https://docker.mirrors.sjtug.sjtu.edu.cn/"]
    }
    EOF
    sudo systemctl daemon-reload
    sudo systemctl restart docker
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    2. 安装 kubeadm, kubelet 和 kubectl

    阿里云官方推荐源

    apt-get update && apt-get install -y apt-transport-https
    curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add - 
    cat </etc/apt/sources.list.d/kubernetes.list
    deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
    EOF
    sudo apt-get update
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    安装1.22.0版本

    apt-get install -y kubelet=1.22.0-00 kubeadm=1.22.0-00 kubectl=1.22.0-00
    
    • 1

    查看版本

    kubelet --version
    kubeadm version
    kubectl version
    
    • 1
    • 2
    • 3

    kubelet 开机自启

    systemctl enable kubelet
    
    • 1

    使用 systemd 作为 docker cgroup 驱动程序

    从 v1.22 开始,在使用 kubeadm 创建集群时,kubeadm 默认使用 systemd,而 docker 默认使用 cgroupfs,所以需要修改 docker 的 cgroup 驱动程序为 systemd,k8s cgroup-drivers说明
    打开 /etc/docker/daemon.json 文件,追加以下配置

    {
      "exec-opts": ["native.cgroupdriver=systemd"]
    }
    
    • 1
    • 2
    • 3

    重启docker

    systemctl daemon-reload
    systemctl restart docker
    systemctl enable docker
    
    • 1
    • 2
    • 3

    查看cgroup驱动,必须是systemd,才行

    docker info|grep Cgroup
    
    • 1

    4. swapoff 设置

    设置 swapoff

    sudo swapoff -a
    
    • 1

    永久设置 swapoff,注释掉swap那一行

    vim /etc/fstab
    
    • 1

    查看swapon,必须是空的,不然接下来的kubeadm init会报错

    swapon -s
    
    • 1

    kubeadm 主节点 安装 k8s

    kubeadm init 安装 k8s
    1. 可以先拉取镜像,这样kubeadm init的时候就不会拉取镜
    sudo kubeadm config images pull --kubernetes-version=v1.22.0 --image-repository registry.aliyuncs.com/google_containers
    
    • 1
    1. 执行init
    • –kubernetes-version 指定k8s 版本为1.22.0,
    • –image-repository 指定镜像仓库为阿里云:registry.aliyuncs.com/google_containers,因为 k8s 默认的镜像仓库是 gcr.io,国内访问不了
    • –pod-network-cidr 指定pod的网段,需要与cni插件的网段一致,否则会出现pod无法通信的问题 ,flannel的网段是 10.244.0.0/16
    sudo kubeadm init --kubernetes-version=v1.22.0 --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16
    
    • 1
    1. kubectl get nodes 查看节点状态
    kubectl get nodes
    
    • 1

    应该会 出现 localhost:8080 was refused - did you specify the right host or port? 错误
    将 /etc/kubernetes/admin.conf 拷贝到 $HOME/.kube/config

    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown -R $USER:$USER $HOME/.kube
    
    • 1
    • 2
    • 3

    再查看nodes状态

    安装网络插件

    此时获取节点状态会发现有一个节点是 NotReady 状态,
    而且,查看pod状态会发现,coredns 也是 Pending 状态

    kubectl get pods --all-namespaces
    
    • 1

    这是因为还没有安装网络插件,这里我选择安装 flannel

    kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    
    • 1

    网络不好可以使用ghproxy

    kubectl apply -f https://ghproxy.com/https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    
    • 1

    等待会再次查看pod状态,coredns状态是 Running,节点状态是 Ready

    子节点加入集群

    1. master节点生成token,并且指定master节点的ip,生成join命令
    kubeadm token create --print-join-command --ttl 0 --kubeconfig /etc/kubernetes/admin.conf
    
    • 1

    会出现 类似以下 join 命令

    kubeadm join 192.168.31.122:6443 --token kzmdey.dk0tcgyg4ivr8y87 --discovery-token-ca-cert-hash sha256:bc2e3252080ba81e342933955682ae119decc948fef2180e5135b0dd891e5891
    
    • 1
    1. 在子节点执行上面的join命令,加入集群
    2. 在master节点查看节点状态
     k get nodes -o wide
    
    • 1

    可以看到两个节点都是 Ready 状态

    NAME    STATUS   ROLES                  AGE   VERSION   INTERNAL-IP      EXTERNAL-IP   OS-IMAGE       KERNEL-VERSION      CONTAINER-RUNTIME
    song    Ready    control-plane,master   45h   v1.22.0   192.168.31.122           Ubuntu 22.10   5.19.0-21-generic   docker://24.0.2
    song2   Ready                     77m   v1.22.0   192.168.31.166           Ubuntu 22.10   5.19.0-21-generic   docker://24.0.2
    
    • 1
    • 2
    • 3

    安装相关问题排查

    1. container runtime is not running: output: time=“2023-06-08T14:09:02Z” level=fatal msg=“validate service connection: CRI v1 runtime API is not implemented for endpoint “unix:///var/run/containerd/containerd.sock”: rpc error: code = Unimplemented desc = unknown service runtime.v1.RuntimeService”
      解决方法
    sudo rm /etc/containerd/config.toml
    sudo systemctl restart containerd
    
    • 1
    • 2
    1. [WARNING Swap]: swap is enabled; production deployments should disable swap unless testing the NodeSwap feature gate of the kubelet
      ubuntu系统
    swapoff -a
    
    • 1
    1. 查看pod出现错误,要是出现类似 pod cidr not assigned,如果是flannel网络插件,那么就是没有设置pod-network-cidr
    2. 排查kubelet 日志
    sudo systemctl status kubelet.service
    sudo journalctl -xu kubelet.service
    
    • 1
    • 2
  • 相关阅读:
    增强语言模型导读
    Hololens2部署很慢可能是unity工程选择不对
    SpringBoot整合Shiro(Java安全框架)案例(含源码)
    larvel 中的api.php_Laravel 开发 API
    tokenizers pre_tokenizers模块
    Linux常用命令
    MAC显示解锁记录(show last times the screen was unlocked in mac os)
    【力扣题:循环队列】
    mybatis动态SQL
    【操作系统】内存管理
  • 原文地址:https://blog.csdn.net/qq_21956483/article/details/131147124