暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

这就是kubespray之一(基本介绍及集群快速搭建)

埋头过坎 2020-11-22
2945

    之前ansible系列介绍了研究ansible的初衷是想要搭建自己的k8s集群,也进行了ad-hoc的实践, 接着就要到palybook模式的实践。基于ansible来搭建k8s集群, 看到有两个项目,分别是  kubeasz  (https://github.com/easzlab/kubeasz) 及kubespray (https://github.com/kubernetes-sigs/kubespray), 看了下项目介绍kubeasz是国人的项目, 特色强调不受国内网络环境影响, kubespray则朝着部署生产环境的k8s集群为目标, 主要是基于国外的网络环境的。 

    

项目
star数量
fork数量
contributors数量
kubeasz
6.2k
2.4k
52
kubespray
9.7k
4.1k
870

    从上面的一些项目的统计数据来看, kubespray是要比kubeasz胜出的, 而网上找了下相关的资料, kubespray无论是中文还是英文资料都不少, 另外一个原因是笔者内网也有人使用kubespray完成了k8s集群的搭建。基于这些考虑, 在两者之间是直接选择了kubespray。

    谈及k8s的自动化部署, 业界内其实也有其它的软件方案, 在k8s的官方文档网站里 (https://kubernetes.io/docs/setup/production-environment/tools/kubespray/) 也提到了kubespray与kops及kubeadm的对比 (https://github.com/kubernetes-sigs/kubespray/blob/master/docs/comparisons.md), 大体是说与kops相比, kubespray支持的运行环境更丰富、更灵活,而kops则是跟它支持的云的特性是紧耦合的, 灵活性差; 与kubeadm相比, 两者并不是竞争关系, kubeadm可以看成是k8s cluster operator, 而kubespray则是从操作系统层面(OS operators)负责更通用的配置管理任务的, 而且从v2.3版本开始, kubespray已经支持了kubeadm。 

    背景大概如上。下面来简单介绍一下kubespray。kubespray的功能包括:

  1. 支持以下环境的部署:AWS、 GCE、 Azure、 OpenStack、 vSphere、 Packet、 Oracle Cloud Infrastrucure 或者 Baremetal。

  2.  高可用集群

  3. 可编排(不同的实例可选择不同的网络插件)

  4.  支持大多数流行的Linux发行版本

  5.  支持持续集成测试

    支持的组件集合如下:

    Core
    kubernetes v1.19.3
    etcd v3.4.3
    docker v19.03 (see note)
    containerd v1.3.7
    cri-o v1.19 (experimental: see CRI-O Note. Only on fedora, ubuntu and centos based OS)
    Network Plugin
    cni-plugins v0.8.7
    calico v3.16.4
    canal (given calico/flannel versions)
    cilium v1.8.5
    contiv v1.2.1
    flanneld v0.13.0
    kube-ovn v1.3.0
    kube-router v1.1.0
    multus v3.6.0
    ovn4nfv v1.1.0
    weave v2.7.0
    Application
    ambassador: v1.5
    cephfs-provisioner v2.1.0-k8s1.11
    rbd-provisioner v2.1.1-k8s1.11
    cert-manager v0.16.1
    coredns v1.7.0
    ingress-nginx v0.40.2

        如上图所示, kubespray是基于ansible来完成k8s集群部署的, 官方文档里面指出, 在满足了部署前的环境准备之后(这块在国内因为防火墙的原因是比较特殊的), 部署k8s集群是很快的, 大概的步骤如下:

    1. 下载kubespray代码

    2. 安装python依赖requirements.txt

    3. 复制样例的清单为新的集群 命令为cp -rfp inventory/sample inventory/mycluster

    4. 按需采用模板工具生成hosts.yml文件 

      • declare -a IPS=(10.10.1.3 10
        .10.1.4 10.10.1.5)
        CONFIG_FILE=inventory/mycluster/hosts.yaml python3 contrib/inventory_builder/invent
      • 定制集群的相关参数(代理、网络组件等)

        • cat inventory/mycluster/group_vars/all/all.yml
          cat inventory/mycluster/group_vars/k8s-cluster/k8s-cluster.yml
        •  运行ansible-playbook命令安装:ansible-playbook -i inventory/mycluster/hosts.yaml  --become --become-user=root cluster.yml


             只需要上面这些步骤就可以快速的搭建k8s集群, 实际上笔者实践时, 按照上面的流程也是成功搭建了k8s集群的。下面介绍实践的过程及其中遇到的问题和相应的解决方案。

            由于众所周知的原因, 在国内直接访问k8s.gcr.io、 dockerhub等站点是失败的, 这导致国外很方便直接的用法到了国内,先要解决网络的问题。 在Linux环境下, 可以通过配置相应的http(s) proxy来实现, 大体如下:

        在/etc/profile里面添加以下配置, 然后执行 source etc/profile

          # proxy setup  by xxx on xxx
          no_proxy=xxx
          export no_proxy=xxx
          export http_proxy=http://username:passwd1@ip:port
          export https_proxy=http://username:passwd1@ip:port
          export ftp_proxy=http://username:passwd1@ip:port
          ## proxy setup end.

            配置好之后, 可以随便找一两个之前访问不了的外网用curl访问一下确认连通性。 

              全局的网络问题解决之后, 还可以配置yum源、pip源为国内源。然后执行上面的第1个步骤,安装相关的依赖 pip install -r requirements.txt。  紧接着对要搭建的集群要做一个整体的规划, 笔者采用了5台机器来搭建集群, 相关的节点规划如下:(主机名、IP均采用脱敏处理)

          主机名
          IP

          角色
          host01
          ip01
          master、etcd、ansible管理机
          host02
          ip02
          master、etcd
          host03
          ip03
          worker, etcd
          host04
          ip04
          worker
          host05
          ip05
          worker


          ansible相关的环境在之前已经配置好了, 实现了从ansible管理机可以无密登录到其它被管理机器, python等也准备好了。 接着就进入正式的集群搭建过程, 基本跟上面官方文档给的示例是一致的。 

          先复制新的inventory, 如下

            (base) bash-4.1$ pwd
            /home/<user-xx>/kubespray


            (base) bash-4.1$ cp -rfp inventory/sample inventory/datalab


            再生成host.yml文件,如下

              (base) bash-4.1$ declare -a IPS=(ip1 ip2 ip3 ip4 ip5)
              (base) bash-4.1$ CONFIG_FILE=inventory/datalab/hosts.yml python3 contrib/inventory_builder/inventory.py ${IPS[@]}

              这里需要注意的是, 模板生成的节点名是按照node-x来命名的, 如果不修改,它将会在执行时修改各机器上的host文件, 从而修改主机名, 根据需要可以将hosts.yml文件中的相应的node-x修改成当前主机名。

                (base) bash-4.1$ cat inventory/datalab/hosts.yaml 
                all:
                hosts:
                node1:
                ansible_host: ip1
                ip: ip1
                access_ip: ip1
                node2:
                ansible_host: ip2
                ip: ip2
                access_ip: ip2
                node3:
                ansible_host: ip3
                ip: ip3
                access_ip: ip3
                node4:
                ansible_host: ip4
                ip: ip4
                access_ip: ip4
                node5:
                ansible_host: ip5
                ip: ip5
                access_ip: ip5
                children:
                kube-master:
                hosts:
                node1:
                node2:
                kube-node:
                hosts:
                node1:
                node2:
                node3:
                node4:
                node5:
                etcd:
                hosts:
                node1:
                node2:
                node3:
                k8s-cluster:
                children:
                kube-master:
                kube-node:
                calico-rr:
                hosts: {}
                (base) bash-4.1$

                接着修改了全局变量中的代理相关变量,如下:

                  (base) bash-4.1$ cat inventory/datalab/group_vars/all/all.yml |grep http_proxy
                  # http_proxy: ""
                  http_proxy: "http://username:passwd1@ip:port"

                  就可以开始执行下面的命令进行安装了

                    (base) bash-4.1$ ansible-playbook -i inventory/datalab/hosts.yml cluster.yml -b -v   
                    Using home/<user-xx>/kubespray/ansible.cfg as config file

                    如果希望回头查看安装的具体过程, 可以在ansible.cfg中配置log_path选项。

                        一路安装下来, 最后看到下面的输出的话, 恭喜你, 大概率成功了。

                      PLAY RECAP ********************************************************************************************************************************************
                      localhost : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
                      host01 : ok=563 changed=61 unreachable=0 failed=0 skipped=1122 rescued=0 ignored=0
                      host02 : ok=482 changed=49 unreachable=0 failed=0 skipped=963 rescued=0 ignored=0
                      host03 : ok=384 changed=35 unreachable=0 failed=0 skipped=624 rescued=0 ignored=0
                      host04 : ok=333 changed=34 unreachable=0 failed=0 skipped=571 rescued=0 ignored=0
                      host05 : ok=333 changed=34 unreachable=0 failed=0 skipped=571 rescued=0 ignored=0


                      可以通过k8s的命令查看一下已经安装的集群信息:

                        [root@host01 ~]# kubectl get nodes
                        NAME STATUS ROLES AGE VERSION
                        host01 Ready master 10m v1.19.3
                        host02 Ready master 10m v1.19.3
                        host03 Ready <none> 8m37s v1.19.3
                        host04 Ready <none> 8m37s v1.19.3
                        host05 Ready <none> 8m37s v1.19.3

                        可以看到安装好的集群和原先规划的是一致的。也可以通过"kube"、"etcd"等关键字去各主机过滤出已经在运行的进程, 和规划的也是一致的。

                            至此, 我们便按照kubespray的说明文档快速地搭建了k8s集群, 整体来讲, 真正搭建的过程是比较顺利的, 前期准备系统、网络等运行环境是比较耗时且有一定挑战的。

                        (附:在安装的过程中遇到docker启动失败的问题,如下:

                          failed to start daemon: Error initializing network controller: list bridge addresses failed: PredefinedLocalScopeDefaultNetworks List:

                          相应的解决方案是手工配置IP, 如下:

                            ip link add name docker0  type bridge
                            ip addr add dev docker0 172.17.0.1/16


                            文章转载自埋头过坎,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                            评论