• 使用Kubespray部署生产可用的Kubernetes集群(1.11.2)
    • 主机规划
    • 准备工作
      • 关闭selinux
      • 网络配置
        • 在master机器上
        • 在node机器上
        • 【可选】关闭防火墙
    • 在ansible-client机器上安装ansible
      • 安装ansible
      • 安装jinja2
      • 安装Python 3.6
    • 在ansible-client机器上配置免密登录
      • 生成ssh公钥和私钥
      • 建立ssh单向通道
    • 在ansible-client机器上安装kubespray
    • 验证
    • 卸载
    • 遇到的问题
    • 参考文档:

    使用Kubespray部署生产可用的Kubernetes集群(1.11.2)

    前提:科学上网,或自行将gcr.io的镜像转成其他镜像仓库的镜像。

    Kubernetes的安装部署是难中之难,每个版本安装方式都略有区别。笔者一直想找一种支持多平台相对简单适用于生产环境 的部署方案。经过一段时间的调研,有如下几种解决方案进入笔者视野:

    部署方案 优点 缺点
    Kubeadm 官方出品 部署较麻烦、不够透明
    Kubespray 官方出品、部署较简单、懂Ansible就能上手 不够透明
    RKE 部署较简单、需要花一些时间了解RKE的cluster.yml配置文件 不够透明
    手动部署 第三方操作文档 完全透明、可配置、便于理解K8s各组件之间的关系 部署非常麻烦,容易出错

    其他诸如Kops之类的方案,由于无法跨平台,或者其他因素,被我pass了。

    最终,笔者决定使用Kubespray部署Kubernetes集群。也希望大家能够一起讨论,总结出更加好的部署方案

    废话不多说,以下是操作步骤。

    注:撰写本文时,笔者临时租赁了几台海外阿里云机器,实现了科学上网。如果您的机器在国内,请:

    • 考虑科学上网
    • 或修改Kubespray中的gcr地址,改为其他仓库地址,例如阿里云镜像地址。

    主机规划

    IP 作用
    172.20.0.87 ansible-client
    172.20.0.88 master,node
    172.20.0.89 master,node
    172.20.0.90 node
    172.20.0.91 node
    172.20.0.92 node

    准备工作

    关闭selinux

    所有机器都必须关闭selinux,执行如下命令即可。

    1. ~]# setenforce 0
    2. ~]# sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux

    网络配置

    在master机器上

    1. ~]# firewall-cmd --permanent --add-port=6443/tcp
    2. ~]# firewall-cmd --permanent --add-port=2379-2380/tcp
    3. ~]# firewall-cmd --permanent --add-port=10250/tcp
    4. ~]# firewall-cmd --permanent --add-port=10251/tcp
    5. ~]# firewall-cmd --permanent --add-port=10252/tcp
    6. ~]# firewall-cmd --permanent --add-port=10255/tcp
    7. ~]# firewall-cmd --reload
    8. ~]# modprobe br_netfilter
    9. ~]# echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables
    10. ~]# sysctl -w net.ipv4.ip_forward=1

    如果关闭了防火墙,则只需执行最下面三行。

    在node机器上

    1. ~]# firewall-cmd --permanent --add-port=10250/tcp
    2. ~]# firewall-cmd --permanent --add-port=10255/tcp
    3. ~]# firewall-cmd --permanent --add-port=30000-32767/tcp
    4. ~]# firewall-cmd --permanent --add-port=6783/tcp
    5. ~]# firewall-cmd --reload
    6. ~]# echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables
    7. ~]# sysctl -w net.ipv4.ip_forward=1

    如果关闭了防火墙,则只需执行最下面两行。

    【可选】关闭防火墙

    1. systemctl stop firewalld

    在ansible-client机器上安装ansible

    安装ansible

    1. ~]# sudo yum install epel-release
    2. ~]# sudo yum install ansible

    安装jinja2

    1. ~]# easy_install pip
    2. ~]# pip2 install jinja2 --upgrade

    如果执行pip2 install jinja2 --upgrade 出现类似如下的提示:

    1. You are using pip version 9.0.1, however version 18.0 is available.
    2. You should consider upgrading via the 'pip install --upgrade pip' command.

    则执行pip install --upgrade pip 升级pip,再执行pip2 install jinja2 --upgrade

    安装Python 3.6

    1. ~]# sudo yum install python36 y

    在ansible-client机器上配置免密登录

    生成ssh公钥和私钥

    在ansible-cilent机器上执行:

    1. ~]# ssh-keygen

    然后三次回车,生成ssh公钥和私钥。

    建立ssh单向通道

    在ansible-cilent机器上执行:

    1. ~]# ssh-copy-id root@172.20.0.88 #将公钥分发给88机器
    2. ~]# ssh-copy-id root@172.20.0.89
    3. ~]# ssh-copy-id root@172.20.0.90
    4. ~]# ssh-copy-id root@172.20.0.91
    5. ~]# ssh-copy-id root@172.20.0.92

    在ansible-client机器上安装kubespray

    • 下载kubespray

      TIPS:本文下载的是master分支,如果大家要部署到线上环境,建议下载RELEASE分支。笔者撰写本文时,最新的RELEASE是2.6.0,RELEASE版本下载地址:https://github.com/kubernetes-incubator/kubespray/releases)

      1. ~]# git clone https://github.com/kubernetes-incubator/kubespray.git
    • 安装kubespray需要的包:

      1. ~]# cd kubespray
      2. ~]# sudo pip install -r requirements.txt
    • 拷贝inventory/sample ,命名为inventory/mycluster ,mycluster可以改为其他你喜欢的名字

      1. cp -r inventory/sample inventory/mycluster
    • 使用inventory_builder,初始化inventory文件

      1. ~]# declare -a IPS=(172.20.0.88 172.20.0.89 172.20.0.90 172.20.0.91 172.20.0.92)
      2. ~]# CONFIG_FILE=inventory/mycluster/hosts.ini python36 contrib/inventory_builder/inventory.py ${IPS[@]}

      此时,会看到inventory/mycluster/host.ini 文件内容类似如下:

      1. [k8s-cluster:children]
      2. kube-master
      3. kube-node
      4. [all]
      5. node1 ansible_host=172.20.0.88 ip=172.20.0.88
      6. node2 ansible_host=172.20.0.89 ip=172.20.0.89
      7. node3 ansible_host=172.20.0.90 ip=172.20.0.90
      8. node4 ansible_host=172.20.0.91 ip=172.20.0.91
      9. node5 ansible_host=172.20.0.92 ip=172.20.0.92
      10. [kube-master]
      11. node1
      12. node2
      13. [kube-node]
      14. node1
      15. node2
      16. node3
      17. node4
      18. node5
      19. [etcd]
      20. node1
      21. node2
      22. node3
      23. [calico-rr]
      24. [vault]
      25. node1
      26. node2
      27. node3
    • 使用ansible playbook部署kubespray

      1. ~]# ansible-playbook -i inventory/mycluster/hosts.ini cluster.yml
    • 大概20分钟左右,Kubernetes即可安装完毕。

    验证

    验证1:查看Node状态

    1. ]# kubectl get nodes
    2. NAME STATUS ROLES AGE VERSION
    3. node1 Ready master,node 2m v1.11.2
    4. node2 Ready master,node 2m v1.11.2
    5. node3 Ready node 2m v1.11.2
    6. node4 Ready node 2m v1.11.2
    7. node5 Ready node 2m v1.11.2

    每个node都是ready的,说明OK。

    验证2:部署一个NGINX

    1. # 启动一个单节点nginx
    2. ]# kubectl run nginx --image=nginx:1.7.9 --port=80
    3. # 为“nginx”服务暴露端口
    4. ]# kubectl expose deployment nginx --type=NodePort
    5. # 查看nginx服务详情
    6. ]# kubectl get svc nginx
    7. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    8. nginx NodePort 10.233.29.96 <none> 80:32345/TCP 14s
    9. # 访问测试,如果能够正常返回NGINX首页,说明正常
    10. ]# curl localhost:32345

    卸载

    1. ]# ansible-playbook -i inventory/mycluster/hosts.ini reset.yml

    遇到的问题

    Calico网络插件部署失效。这是Calico 3.2所带来的问题,原因详见:https://github.com/kubernetes-incubator/kubespray/issues/3223

    解决方法:https://github.com/wilmardo/kubespray/commit/1c87a49d1443bcdd237500a714f1a60d680c1ad8,即:将Calico降级到3.1.3。

    参考文档:

    • Kubespray – 10 Simple Steps for Installing a Production-Ready, Multi-Master HA Kubernetes Cluster:https://dzone.com/articles/kubespray-10-simple-steps-for-installing-a-product

      TIPS:主要的参考文档,里面还讲解了Kubespray的一些配置,与可能会遇到的问题及解决方案。

    • 使用Kubespray 部署kubernetes 高可用集群:https://yq.aliyun.com/articles/505382

    • kubespray(ansible)自动化安装k8s集群:https://www.cnblogs.com/iiiiher/p/8128184.html

      TIPS:里面有将如何替换gcr镜像为国内镜像

    • Installing Kubernetes On-premises/Cloud Providers with Kubespray:https://kubernetes.io/docs/setup/custom-cloud/kubespray/