# 使用kubeadm安装kubernetes_v1.21.x

# 文档特点

网上那么多 Kubernetes 安装文档,为什么这篇文档更有参考价值?
K8S安装_K8S培训_每天超过300人参考此文档成功安装K8S
广泛验证
  • 每天有超过
    0
    人参考此文档完成 Kubernetes 集群的安装
  • 不断有网友对安装文档提出改进意见
  • K8S安装_K8S培训_始终有最新的K8S版本
    持续更新
  • 始终有最新的 Kubernetes 稳定版安装文档
  • 当前版本 Kubernetes v1.21.x
  • 已完成了
    0
    次更新
    ,每次更新都帮您排除一个或更多可能踩的坑。 查看更新历史
  • K8S安装_K8S培训_适应各种环境下的安装过程
    适应面广
  • 大部分的 K8S 安装文档都是个人爱好者的一份笔记而已,他当时的特定条件并不一定适用于你
  • 此文档经众多网友验证,在公有云、私有云、自建虚拟机等多种条件下均适用
  • K8S安装_K8S培训_在线答疑
    在线答疑
    Kubernetes安装:微信群在线答疑

    参考此免费文档,98%以上的概率,您能够顺利完成 K8S 安装,极个别的问题可以到QQ群里免费答疑。

    观看本节视频讲解

    # 配置要求

    对于 Kubernetes 初学者,在搭建K8S集群时,推荐在阿里云或腾讯云采购如下配置:(您也可以使用自己的虚拟机、私有云等您最容易获得的 Linux 环境)

    • 至少2台 2核4G 的服务器
    • 本文档中,CPU 必须为 x86 架构,暂时未适配 arm 架构的 CPU
    • CentOS 7.8CentOS Stream 8

    【云上优选 特惠来袭】华为云回馈用户,产品低至2折 (opens new window)

    【腾讯云】云产品限时秒杀,爆款1核2G云服务器,首年99元 (opens new window)

    安装后的软件版本为

    • Kubernetes v1.21.x
      • calico 3.17.1
      • nginx-ingress 1.9.1
    • Containerd.io 1.4.3

    如果要安装 Kubernetes 历史版本,请参考:

    安装后的拓扑图如下:下载拓扑图源文件 使用Axure RP 9.0可打开该文件

    强烈建议初学者先按照此文档完成安装,在对 K8S 有更多理解后,再参考文档 安装Kubernetes高可用

    Kubernetes安装:Kubernetes安装拓扑图

    Container Runtime

    • Kubernetes v1.21 开始,默认移除 docker 的依赖,如果宿主机上安装了 docker 和 containerd,将优先使用 docker 作为容器运行引擎,如果宿主机上未安装 docker 只安装了 containerd,将使用 containerd 作为容器运行引擎;
    • 本文使用 containerd 作为容器运行引擎;

    关于二进制安装

    • kubeadm 是 Kubernetes 官方支持的安装方式,“二进制” 不是。本文档采用 kubernetes.io 官方推荐的 kubeadm 工具安装 kubernetes 集群。

    # 检查 centos / hostname

    # 在 master 节点和 worker 节点都要执行
    cat /etc/redhat-release
    
    # 此处 hostname 的输出将会是该机器在 Kubernetes 集群中的节点名字
    # 不能使用 localhost 作为节点的名字
    hostname
    
    # 请使用 lscpu 命令,核对 CPU 信息
    # Architecture: x86_64    本安装文档不支持 arm 架构
    # CPU(s):       2         CPU 内核数量不能低于 2
    lscpu
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11

    操作系统兼容性

    CentOS 版本 本文档是否兼容 备注
    CentOS Stream 8 😄 已验证
    CentOS 7.8 😄 已验证
    CentOS 7.7 😞 未验证
    CentOS 7.6 😞 未验证

    修改 hostname

    如果您需要修改 hostname,可执行如下指令:

    # 修改 hostname
    hostnamectl set-hostname your-new-host-name
    # 查看修改结果
    hostnamectl status
    # 设置 hostname 解析
    echo "127.0.0.1   $(hostname)" >> /etc/hosts
    
    1
    2
    3
    4
    5
    6

    # 检查网络

    在所有节点执行命令


     








     

     


    [root@demo-master-a-1 ~]$ ip route show
    default via 172.21.0.1 dev eth0 
    169.254.0.0/16 dev eth0 scope link metric 1002 
    172.21.0.0/20 dev eth0 proto kernel scope link src 172.21.0.12 
    
    [root@demo-master-a-1 ~]$ ip address
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
        link/ether 00:16:3e:12:a4:1b brd ff:ff:ff:ff:ff:ff
        inet 172.17.216.80/20 brd 172.17.223.255 scope global dynamic eth0
           valid_lft 305741654sec preferred_lft 305741654sec
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14

    kubelet使用的IP地址

    • ip route show 命令中,可以知道机器的默认网卡,通常是 eth0,如 default via 172.21.0.23 dev eth0
    • ip address 命令中,可显示默认网卡的 IP 地址,Kubernetes 将使用此 IP 地址与集群内的其他节点通信,如 172.17.216.80
    • 所有节点上 Kubernetes 所使用的 IP 地址必须可以互通(无需 NAT 映射、无安全组或防火墙隔离)

    # 安装containerd/kubelet/kubeadm/kubectl

    请认真核对如下选项,6 个都选中后才能显示如何安装。

    选中后显示 安装 docker/kubelet 的文档






    使用 root 身份在所有节点执行如下代码,以安装软件:

    • containerd
    • nfs-utils
    • kubectl / kubeadm / kubelet

    请将脚本最后的 1.21.6 替换成您需要的版本号(必须是 1.21 的小版本,不能是 1.19.1 等), 脚本中间的 v1.21.x 不要替换

    docker hub 镜像请根据自己网络的情况任选一个

    • 第四行为腾讯云 docker hub 镜像
    • 第六行为DaoCloud docker hub 镜像
    • 第八行为华为云 docker hub 镜像
    • 第十行为阿里云 docker hub 镜像
    # 在 master 节点和 worker 节点都要执行
    # 最后一个参数 1.21.6 用于指定 kubenetes 版本,支持所有 1.21.x 版本的安装
    # 腾讯云 docker hub 镜像
    # export REGISTRY_MIRROR="https://mirror.ccs.tencentyun.com"
    # DaoCloud 镜像
    # export REGISTRY_MIRROR="http://f1361db2.m.daocloud.io"
    # 华为云镜像
    # export REGISTRY_MIRROR="https://05f073ad3c0010ea0f4bc00b7105ec20.mirror.swr.myhuaweicloud.com"
    # 阿里云 docker hub 镜像
    export REGISTRY_MIRROR=https://registry.cn-hangzhou.aliyuncs.com
    curl -sSL https://kuboard.cn/install-script/v1.21.x/install_kubelet.sh | sh -s 1.21.6
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11

    # 初始化 master 节点

    关于初始化时用到的环境变量

    • APISERVER_NAME 不能是 master 的 hostname
    • APISERVER_NAME 必须全为小写字母、数字、小数点,不能包含减号
    • POD_SUBNET 所使用的网段不能与 master节点/worker节点 所在的网段重叠。该字段的取值为一个 CIDR 值,如果您对 CIDR 这个概念还不熟悉,请仍然执行 export POD_SUBNET=10.100.0.0/16 命令,不做修改

    请将脚本最后的 1.21.6 替换成您需要的版本号(必须是 1.21 的小版本,不能是 1.19.1 等), 脚本中间的 v1.21.x 不要替换










     

    # 只在 master 节点执行
    # 替换 x.x.x.x 为 master 节点实际 IP(请使用内网 IP)
    # export 命令只在当前 shell 会话中有效,开启新的 shell 窗口后,如果要继续安装过程,请重新执行此处的 export 命令
    export MASTER_IP=x.x.x.x
    # 替换 apiserver.demo 为 您想要的 dnsName
    export APISERVER_NAME=apiserver.demo
    # Kubernetes 容器组所在的网段,该网段安装完成后,由 kubernetes 创建,事先并不存在于您的物理网络中
    export POD_SUBNET=10.100.0.0/16
    echo "${MASTER_IP}    ${APISERVER_NAME}" >> /etc/hosts
    curl -sSL https://kuboard.cn/install-script/v1.21.x/init_master.sh | sh -s 1.21.6
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

    感谢 https://github.com/zhangguanzhang/google_containers (opens new window) 提供最新的 google_containers 国内镜像

    如果出现如下错误:





     
     


    [config/images] Pulled registry.aliyuncs.com/k8sxio/pause:3.2
    [config/images] Pulled registry.aliyuncs.com/k8sxio/etcd:3.4.13-0
    failed to pull image "swr.cn-east-2.myhuaweicloud.com/coredns:1.8.0": output: time="2021-04-30T13:26:14+08:00" level=fatal 
    msg="pulling image failed: rpc error: code = NotFound desc = failed to pull and unpack image \"swr.cn-east-2.myhuaweicloud.com/coredns:1.8.0\": 
    failed to resolve reference \"swr.cn-east-2.myhuaweicloud.com/coredns:1.8.0\": 
    swr.cn-east-2.myhuaweicloud.com/coredns:1.8.0: not found", error: exit status 1
    To see the stack trace of this error execute with --v=5 or higher
    
    1
    2
    3
    4
    5
    6
    7

    请执行如下命令:

    在原命令的最后增加参数 /coredns

    curl -sSL https://kuboard.cn/install-script/v1.21.x/init_master.sh | sh -s 1.21.6 /coredns
    
    1

    检查 master 初始化结果

    coredns 将处于启动失败的状态,请继续下一步,完成 安装网络插件 这个步骤后,coredns 将正常启动。

    # 只在 master 节点执行
    
    # 执行如下命令,等待 3-10 分钟,直到所有的容器组处于 Running 状态
    watch kubectl get pod -n kube-system -o wide
    
    # 查看 master 节点初始化结果
    kubectl get nodes -o wide
    
    1
    2
    3
    4
    5
    6
    7

    # 安装网络插件

    网络插件可以选择 calico 或者 flannel(任意选择其一即可)。

    阿里云

    如果您在阿里云上安装 K8S,建议使用 flannel,有多个案例表明 calico 与阿里云存在兼容性问题。

    export POD_SUBNET=10.100.0.0/16
    kubectl apply -f https://kuboard.cn/install-script/v1.21.x/calico-operator.yaml
    wget https://kuboard.cn/install-script/v1.21.x/calico-custom-resources.yaml
    sed -i "s#192.168.0.0/16#${POD_SUBNET}#" calico-custom-resources.yaml
    kubectl apply -f calico-custom-resources.yaml
    
    1
    2
    3
    4
    5

    # 初始化 worker节点

    # 获得 join命令参数

    在 master 节点上执行

    # 只在 master 节点执行
    kubeadm token create --print-join-command
    
    1
    2

    可获取kubeadm join 命令及参数,如下所示

    # kubeadm token create 命令的输出
    kubeadm join apiserver.demo:6443 --token mpfjma.4vjjg8flqihor4vt     --discovery-token-ca-cert-hash sha256:6f7a8e40a810323672de5eee6f4d19aa2dbdb38411845a1bf5dd63485c43d303
    
    1
    2

    有效时间

    该 token 的有效时间为 2 个小时,2小时内,您可以使用此 token 初始化任意数量的 worker 节点。

    # 初始化worker

    针对所有的 worker 节点执行

    # 只在 worker 节点执行
    # 替换 x.x.x.x 为 master 节点的内网 IP
    export MASTER_IP=x.x.x.x
    # 替换 apiserver.demo 为初始化 master 节点时所使用的 APISERVER_NAME
    export APISERVER_NAME=apiserver.demo
    echo "${MASTER_IP}    ${APISERVER_NAME}" >> /etc/hosts
    
    # 替换为 master 节点上 kubeadm token create 命令的输出
    kubeadm join apiserver.demo:6443 --token mpfjma.4vjjg8flqihor4vt     --discovery-token-ca-cert-hash sha256:6f7a8e40a810323672de5eee6f4d19aa2dbdb38411845a1bf5dd63485c43d303
    
    1
    2
    3
    4
    5
    6
    7
    8
    9

    # 检查初始化结果

    在 master 节点上执行

    # 只在 master 节点执行
    kubectl get nodes -o wide
    
    1
    2

    输出结果如下所示:

    [root@demo-master-a-1 ~]# kubectl get nodes
    NAME     STATUS   ROLES    AGE     VERSION
    demo-master-a-1   Ready    master   5m3s    v1.21.x
    demo-worker-a-1   Ready    <none>   2m26s   v1.21.x
    demo-worker-a-2   Ready    <none>   3m56s   v1.21.x
    
    1
    2
    3
    4
    5

    # 下一步

    如果您使用自己笔记本上的虚拟机安装的集群,将来打算重启虚拟机,请参考 重启Kubernetes集群

    🎉 🎉 🎉

    您已经完成了 Kubernetes 集群的安装,下一步请:

    观看本节视频讲解

    安装 Kuboard - 微服务管理界面

    获取 Kubernetes 免费教程

    更新时间: 2021-11-14 22:00:02