# 使用kubeadm安装kubernetes_v1.16.2

# 文档特点

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

    # 配置要求

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

    • 至少2台 2核4G 的服务器
    • Cent OS 7.6

    腾讯云11.11爆款1核2G云服务器首购88元,免费领9888元代金券,百款云产品一折起 (opens new window)

    阿里云双十一,All in Cloud,低至一折 (opens new window)

    警告

    • 因为双十一,许多网友使用腾讯云、阿里云不同的账号各买了一台优惠价格的机器。目前我没有找到方法将不同局域网内的机器通过公网连接组成K8S集群,请谨慎。
    • 建议的做法是:腾讯云(或阿里云)采购一台优惠价格的包年实例作为 Master,同时再采购一台竞价实例(腾讯云)或抢占式实例(阿里云)作为 Worker 节点。竞价实例(抢占式实例)按分钟付费,以阿里云为例,一台2核8G的机器一天下来的费用大概是 1.2 - 1.5元。
    • 再次强调:按照本文档进行安装时,所有节点必须在同一个局域网内

    安装后的软件版本为

    • Kubernetes v1.16.2
      • calico 3.9
      • nginx-ingress 1.5.5
    • Docker 18.09.7

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

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

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

    Kubernetes安装:Kubernetes安装拓扑图

    关于二进制安装

    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 版本 本文档是否兼容 备注
    7.7 😄 已验证
    7.6 😄 已验证
    7.5 😞 已证实会出现 kubelet 无法启动的问题
    7.4 😞 同上
    7.3 😞 同上
    7.2 😞 同上

    修改 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 映射、无安全组或防火墙隔离)

    # 安装docker及kubelet

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

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







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

    • docker
    • nfs-utils
    • kubectl / kubeadm / kubelet
    # 在 master 节点和 worker 节点都要执行
    
    curl -sSL https://kuboard.cn/install-script/v1.16.2/install_kubelet.sh | sh
    
    
    1
    2
    3
    4

    # 初始化 master 节点

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

    • APISERVER_NAME 不能是 master 的 hostname
    • APISERVER_NAME 必须全为小写字母、数字、小数点,不能包含减号
    • POD_SUBNET 所使用的网段不能与 master节点/worker节点 所在的网段重叠。该字段的取值为一个 CIDR 值,如果您对 CIDR 这个概念还不熟悉,请仍然执行 export POD_SUBNET=10.100.0.1/16 命令,不做修改
    # 只在 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.1/16
    echo "${MASTER_IP}    ${APISERVER_NAME}" >> /etc/hosts
    curl -sSL https://kuboard.cn/install-script/v1.16.2/init_master.sh | sh
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

    检查 master 初始化结果

    # 只在 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

    # 初始化 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.16.2
    demo-worker-a-1   Ready    <none>   2m26s   v1.16.2
    demo-worker-a-2   Ready    <none>   3m56s   v1.16.2
    
    1
    2
    3
    4
    5

    # 安装 Ingress Controller

    在 master 节点上执行

    # 只在 master 节点执行
    kubectl apply -f https://kuboard.cn/install-script/v1.16.2/nginx-ingress.yaml
    
    1
    2

    配置域名解析

    将域名 *.demo.yourdomain.com 解析到 demo-worker-a-2 的 IP 地址 z.z.z.z (也可以是 demo-worker-a-1 的地址 y.y.y.y)

    验证配置

    在浏览器访问 a.demo.yourdomain.com,将得到 404 NotFound 错误页面

    提示

    许多初学者在安装 Ingress Controller 时会碰到问题,请不要灰心,可暂时跳过 安装 Ingress Controller 这个部分,等您学完 www.kuboard.cn 上 Kubernetes 入门 以及 通过互联网访问您的应用程序 这两部分内容后,再来回顾 Ingress Controller 的安装。

    WARNING

    如果您打算将 Kubernetes 用于生产环境,请参考此文档 Installing Ingress Controller (opens new window),完善 Ingress 的配置

    # 下一步

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

    🎉 🎉 🎉

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

    点击此处,给个GitHub Star 支持一下吧,

    这么多人都 star 了呢,怎么能少得了您呢?

    安装 Kuboard - 微服务管理界面

    获取 Kubernetes 免费教程

    更新时间: 2021-04-03 22:11:52