• 微服务 & 云原生:搭建 K8S 集群


    为节约时间和成本,仅供学习使用,直接在两台虚拟机上模拟 K8S 集群搭建

    踩坑之旅

    系统环境:CentOS-7-x86_64-Minimal-2009 镜像,为方便起见,直接在 root 账户下操作,现实情况最好不要这样做。

    基础准备

    1. 关闭防火墙
    systemctl disable firewalld
    systemctl stop firewalld
    
    • 1
    • 2
    1. 关闭 selinux
    # 临时禁用selinux
    setenforce 0
    
    # 永久关闭selinux 
    sed -i 's/SELINUX=permissive/SELINUX=disabled/' /etc/sysconfig/selinux
    sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    1. 禁用 Swap
    # 临时关闭 Swap
    swapoff -a
    
    # 永久禁用 Swap
    vi /etc/fstab
    在swap分区这行前加 # 注释掉
    #/dev/mapper/centos-swap swap
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    1. 设置存储库
    # 安装 yum-utils 包, 并设置稳定存储库
    yum install -y yum-utils
    yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    
    • 1
    • 2
    • 3
    1. 安装配置 Docker
    # 查看docker-ce支持版本
    yum list docker-ce --showduplicates|sort -r
    
    #查看docker-ce-cli版本
    yum list docker-ce-cli --showduplicates|sort -r
    
    # 指定版本号安装
    #yum install -y docker-ce-24.0.4 docker-ce-cli-24.0.4 containerd.io
    
    # 默认安装最新版本
    yum install docker-ce docker-ce-cli containerd.io
    
    # 启动 Docker
    systemctl enable docker && systemctl start docker
    
    # 查看版本
    docker -v
    
    # 配置国内镜像源,修改/新建 daemon.json
    vi /etc/docker/daemon.json
    
    # 在 daemon.json 中添加:
    {
            "registry-mirrors": [
                    "https://registry.docker-cn.com",
                    "https://docker.mirrors.ustc.edu.cn",
                    "http://hub-mirror.c.163.com",
                    "https://cr.console.aliyun.com/"
            ]
    }
    
    # 重启 Docker
    systemctl restart docker
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    1. 安装 Docker Compose
    # 下载 Docker Compose
    sudo curl -L https://github.com/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
    
    # 对二进制文件添加可执行权限
    chmod +x /usr/local/bin/docker-compose
    
    # 查看版本
    docker-compose -v
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    最好使用 GitHub 的地址,如果使用其他比如:
    curl -L "https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose,有几率会出现下面错误:

    /usr/local/bin/docker-compose: line 1: html: No such file or directory
    /usr/local/bin/docker-compose: line 2: syntax error near unexpected token `<'
    'usr/local/bin/docker-compose: line 2: `<head><title>502 Bad Gateway</title></head>
    
    • 1
    • 2
    • 3

    搭建 K8S 集群

    1. 修改 K8S 源
    cat <<EOF > /etc/yum.repos.d/kubernetes.repo
    [kubernetes]
    name=Kubernetes
    baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
    enabled=1
    gpgcheck=1
    repo_gpgcheck=1
    gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
    EOF
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    基础环境搭建完成后,令当前虚拟机做 Master 主机,利用虚拟机平台,比如 VMWare、VirtualBox 等的克隆功能,克隆一台 Worker 主机(当然也可以克隆多台)。注意,克隆后的多台主机要保证 ip 不同,不同软件的操作不同,具体操作此处此处不做赘述。

    1. Master 端安装 kubeadm、kubectl、kubelet
    # 安装指定版本
    # yum install -y kubeadm-1.21.3 kubelet-1.21.3 kubectl-1.21.3
    
    # 默认安装
    yum install -y kubectl kubeadm kubelet
    
    # 启动 kubelet 服务
    systemctl enable kubelet && systemctl start kubelet
    
    # 查看版本
    docker-compose version
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    1. Worker 端安装 kubeadm、kubelet
    # 安装
    yum install -y kubeadm kubelet
    
    # 启动 kubelet 服务
    systemctl enable kubelet && systemctl start kubelet
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. 启动容器运行时 containerd
    # Master 端和 Worker 端都要操作
    mv /etc/containerd/config.toml /etc/containerd/config.bak
    containerd config default | sudo tee /etc/containerd/config.toml
    systemctl restart containerd
    
    • 1
    • 2
    • 3
    • 4
    1. 配置主机名,需要同时在 Master 和 Worker 上操作
      • Master 节点下:
      # 编辑 hosts,添加各个节点的映射
      vi /etc/hosts
      
      # 我的 Master 主机 ip 为 192.168.65.130,Worker 主机 ip 为 192.168.65.132
      192.168.65.132 k8s-node1
      192.168.65.130 k8s-master
      
      # Master 节点
      hostnamectl --static set-hostname k8s-master
      
      # 立刻生效
      hostname $hostname
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • Worker 节点下:
      vi /etc/hosts
      
      192.168.65.132 k8s-node1
      192.168.65.130 k8s-master
      
      # Worker 节点
      hostnamectl --static set-hostname k8s-node1
      
      # 立刻生效
      hostname $hostname
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
    2. 初始化 Master 节点
    # 仅在 Master 主机上执行:
    kubeadm init \
    --image-repository registry.aliyuncs.com/google_containers \
    --apiserver-advertise-address=192.168.65.130 \
    --service-cidr=10.96.0.0/12 \
    --pod-network-cidr=10.244.0.0/16 \
    --token-ttl 0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • –apiserver-advertise-address=192.168.65.130,master 主机的 IP 地址
    • –image-repository=registry.aliyuncs.com/google_containers,这个是镜像地址
    • –service-cidr=10.96.0.0/12,IP 地址直接就套用10.96.0.0/12
    • –pod-network-cidr=10.244.0.0/16,K8S 内部的 pod 节点之间网络可以使用的 IP 段,是可以更改的,暂时用 10.244.0.0/16 也无所谓

    初始化完成后结果如下:
    在这里插入图片描述
    将这里提示的 kubeadm join xxx 命令保存下来,如果忘记了也可以通过下面命令查看:

    kubeadm token create --print-join-command
    
    • 1

    继续执行:

    mkdir -p ~/.kube
    sudo cp -i /etc/kubernetes/admin.conf ~/.kube/config
    sudo chown $(id -u):$(id -g) ~/.kube/config
    
    • 1
    • 2
    • 3
    1. 将 Worker 加入到 Master 节点
    # Worker 端,使用上一步得到的 join 命令
    kubeadm join 192.168.65.130:6443 --token 4olf44.2t6sqev73d6ewm48 --discovery-token-ca-cert-hash sha256:3603cf3bd9efa671e95a93f922f097580b1ffbfe3e55ca8b7f1876bf8fc4be69
    
    • 1
    • 2

    成功后的提示如下:
    在这里插入图片描述
    这一步可能报错:

    [ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1
    
    • 1

    解决办法:

    echo "1" >/proc/sys/net/bridge/bridge-nf-call-iptables
    
    • 1
    1. Master 端安装 Calico 网络插件
      注意,Calico 的版本需要与 kubelet 匹配,适配关系在 Calico 每个版本的说明都有,比如我的 kubelet 是 1.21.3,满足此版本的 Calico 有 3.20、3.21:
      在这里插入图片描述
      https://docs.tigera.io/archive/v3.20/getting-started/kubernetes/requirements
    # 下载 calico.yaml 到本地
    curl https://docs.projectcalico.org/v3.20/manifests/calico.yaml -O
    
    # 执行
    kubectl apply -f calico.yaml
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述
    9. 查看节点、pod 状态

    # 查看 nodes
    kubelet get node
    
    # 查看 pods
    kubectl get pods -n kube-system -o wide
    
    • 1
    • 2
    • 3
    • 4
    • 5

    一开始节点处于 NotReady 状态:
    在这里插入图片描述
    相关的 coredns 等也在启动中:
    在这里插入图片描述
    经过一段时间后,可以看到,所有 pods 均已启动(running),节点已就绪(Ready):
    在这里插入图片描述

    重置并初始化集群

    1. 所有 worker 节点删除工作目录,并重置 kubeadm
    rm -rf /etc/kubernetes/*
    kubeadm reset
    
    • 1
    • 2
    1. master 节点删除工作目录,并重置kubeadm
    rm -rf /etc/kubernetes/*
    rm -rf ~/.kube/*
    rm -rf /var/lib/etcd/*
    kubeadm reset -f
    
    • 1
    • 2
    • 3
    • 4
    1. 同上一节的操作,从初始化 master 节点开始
  • 相关阅读:
    网络安全(黑客)自学
    C# 基础(四)
    kafka消费者多线程开发
    QT实现qq登录
    Linux文件I/O与标准I/O缓冲机制及性能分析
    使用GParted为Ubuntu根目录扩容
    DJYGUI系列文章四:GK文本显示
    第五课 算术运算
    【猿创征文】Vue3 企业级优雅实战 - 组件库框架 - 3 搭建组件库开发环境
    CentOS7常用命令整理
  • 原文地址:https://blog.csdn.net/by6671715/article/details/131732459