之前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的功能包括:
支持以下环境的部署:AWS、 GCE、 Azure、 OpenStack、 vSphere、 Packet、 Oracle Cloud Infrastrucure 或者 Baremetal。
高可用集群
可编排(不同的实例可选择不同的网络插件)
支持大多数流行的Linux发行版本
支持持续集成测试
支持的组件集合如下:
Corekubernetes v1.19.3etcd v3.4.3docker v19.03 (see note)containerd v1.3.7cri-o v1.19 (experimental: see CRI-O Note. Only on fedora, ubuntu and centos based OS)Network Plugincni-plugins v0.8.7calico v3.16.4canal (given calico/flannel versions)cilium v1.8.5contiv v1.2.1flanneld v0.13.0kube-ovn v1.3.0kube-router v1.1.0multus v3.6.0ovn4nfv v1.1.0weave v2.7.0Applicationambassador: v1.5cephfs-provisioner v2.1.0-k8s1.11rbd-provisioner v2.1.1-k8s1.11cert-manager v0.16.1coredns v1.7.0ingress-nginx v0.40.2

如上图所示, kubespray是基于ansible来完成k8s集群部署的, 官方文档里面指出, 在满足了部署前的环境准备之后(这块在国内因为防火墙的原因是比较特殊的), 部署k8s集群是很快的, 大概的步骤如下:
下载kubespray代码
安装python依赖requirements.txt
复制样例的清单为新的集群 命令为cp -rfp inventory/sample inventory/mycluster
按需采用模板工具生成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.ymlcat 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 xxxno_proxy=xxxexport no_proxy=xxxexport http_proxy=http://username:passwd1@ip:portexport https_proxy=http://username:passwd1@ip:portexport 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.yamlall:hosts:node1:ansible_host: ip1ip: ip1access_ip: ip1node2:ansible_host: ip2ip: ip2access_ip: ip2node3:ansible_host: ip3ip: ip3access_ip: ip3node4:ansible_host: ip4ip: ip4access_ip: ip4node5:ansible_host: ip5ip: ip5access_ip: ip5children: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 -vUsing 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=0host01 : ok=563 changed=61 unreachable=0 failed=0 skipped=1122 rescued=0 ignored=0host02 : ok=482 changed=49 unreachable=0 failed=0 skipped=963 rescued=0 ignored=0host03 : ok=384 changed=35 unreachable=0 failed=0 skipped=624 rescued=0 ignored=0host04 : ok=333 changed=34 unreachable=0 failed=0 skipped=571 rescued=0 ignored=0host05 : ok=333 changed=34 unreachable=0 failed=0 skipped=571 rescued=0 ignored=0
可以通过k8s的命令查看一下已经安装的集群信息:
[root@host01 ~]# kubectl get nodesNAME STATUS ROLES AGE VERSIONhost01 Ready master 10m v1.19.3host02 Ready master 10m v1.19.3host03 Ready <none> 8m37s v1.19.3host04 Ready <none> 8m37s v1.19.3host05 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 bridgeip addr add dev docker0 172.17.0.1/16
)




