查看原文
其他

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

周立 IT牧场 2019-07-12

18年9月,笔者撰写了 使用Kubespray部署生产可用的Kubernetes集群(1.11.2) ,当时Kubespray发布到2.6.0,近日有童鞋反馈,这篇文章对最新的Kubespray(2.8.3)无法完全适用。

故而编写本文。

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

部署方案优点缺点
Kubeadm(https://github.com/kubernetes/kubeadm)官方出品部署较麻烦、不够透明
Kubespray(https://github.com/kubernetes-sigs/kubespray)官方出品、部署较简单、懂Ansible就能上手不够透明
RKE(https://github.com/rancher/rke)部署较简单、需要花一些时间了解RKE的cluster.yml配置文件不够透明
手动部署,操作文档(https://github.com/opsnull/follow-me-install-kubernetes-cluster)完全透明、可配置、便于理解K8s各组件之间的关系部署非常麻烦,容易出错

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

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

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

注:撰写本文时,笔者临时租赁了几台海外阿里云机器,所以不存在无法连接gcr.io的问题。如果您的服务器在国内,请:

  • 科学上网

  • 修改Kubespray中的gcr地址,改为其他仓库地址,例如阿里云镜像地址(修改 roles/download/defaults/main.yml 即可)

  • 先弄个海外环境,安装完Kubernetes后,将镜像 docker save 下来,再到国内的服务器上 docker load 。

主机规划

IP作用
172.21.240.64ansible-client
172.21.240.65master,node
172.21.240.66master,node
172.21.240.67node
172.21.240.68node
172.21.240.69node

一、准备工作

1.1 关闭selinux

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

  1. ~]# setenforce 0

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

1.2 网络配置

在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. ~]# modprobe br_netfilter

  7. ~]# echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables

  8. ~]# sysctl -w net.ipv4.ip_forward=1

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

【可选】关闭防火墙

  1. systemctl stop firewalld

二、在ansible-client机器上安装必备软件

  1. # 安装epel源

  2. ~]# sudo yum install -y epel-release

  3. # 安装ansible

  4. ~]# sudo yum install -y ansible

  5. # 安装Python 3.6

  6. ~]# sudo yum install –y python36

三、在ansible-client机器上配置免密登录其他机器

3.1 生成ssh公钥和私钥

在ansible-cilent机器上执行:

  1. ~]# ssh-keygen

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

3.2 建立ssh单向通道

在ansible-cilent机器上执行:

  1. ~]# ssh-copy-id root@172.21.240.65 #将公钥分发给88机器

  2. ~]# ssh-copy-id root@172.21.240.66

  3. ~]# ssh-copy-id root@172.21.240.67

  4. ~]# ssh-copy-id root@172.21.240.68

  5. ~]# ssh-copy-id root@172.21.240.69

四、在ansible-client机器上安装kubespray

4.1 下载kubespray

TIPS

  • 笔者撰写本文时,最新的RELEASE是2.8.3,RELEASE版本下载地址:https://github.com/kubernetes-incubator/kubespray/releases)

  • 强烈大家使用RELEASE分支进行部署,特别是在生产环境!Master分支不一定能部署成功,近日有童鞋无法成功部署就是因为使用的Master分支。

  1. ~]# git clone https://github.com/kubernetes-incubator/kubespray.git

  2. ~]# cd kubespray

  3. ~]# git checkout v2.8.3

4.2 安装kubespray需要的包:

  1. ~]# sudo pip install -r requirements.txt

4.3 拷贝 inventory/sample ,命名为 inventory/mycluster ,mycluster可以改为其他你喜欢的名字

  1. cp -rfp inventory/sample inventory/mycluster

4.4 使用inventory_builder,初始化inventory文件

  1. ~]# declare -a IPS=(172.21.240.65 172.21.240.66 172.21.240.67 172.21.240.68 172.21.240.69)

  2. ~]# CONFIG_FILE=inventory/mycluster/hosts.ini python36 contrib/inventory_builder/inventory.py ${IPS[@]}

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

  1. [all]

  2. node1 ansible_host=172.21.240.65 ip=172.21.240.65

  3. node2 ansible_host=172.21.240.66 ip=172.21.240.66

  4. node3 ansible_host=172.21.240.67 ip=172.21.240.67

  5. node4 ansible_host=172.21.240.68 ip=172.21.240.68

  6. node5 ansible_host=172.21.240.69 ip=172.21.240.69


  7. [kube-master]

  8. node1

  9. node2


  10. [etcd]

  11. node1

  12. node2

  13. node3


  14. [kube-node]

  15. node1

  16. node2

  17. node3

  18. node4

  19. node5


  20. [k8s-cluster:children]

  21. kube-master

  22. kube-node


  23. [calico-rr]


  24. [vault]

  25. node1

  26. node2

  27. node3

4.5 使用ansible playbook部署kubespray

  1. ~]# ansible-playbook -i inventory/mycluster/hosts.ini --become --become-user=root cluster.yml

4.6 等待大概20分钟左右,Kubernetes即可安装完毕。

五、验证

5.1 验证1:查看Node状态

主要是验证各个Node是否正常。

  1. ]# kubectl get nodes

  2. NAME STATUS ROLES AGE VERSION

  3. node1 Ready master,node 8m41s v1.12.5

  4. node2 Ready master,node 7m32s v1.12.5

  5. node3 Ready node 6m59s v1.12.5

  6. node4 Ready node 6m59s v1.12.5

  7. node5 Ready node 6m59s v1.12.5

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

5.2 验证2:部署一个NGINX

主要是验证网络等是否正常,步骤如下。

1 在Master所在节点(本文使用的是 172.21.240.66 ),准备一个名为 nginx.yaml 的文件,内容如下:

  1. kind: Service

  2. apiVersion: v1

  3. metadata:

  4. name: nginx-service

  5. spec:

  6. selector:

  7. app: nginx

  8. type: NodePort

  9. ports:

  10. # 协议:

  11. - protocol: TCP

  12. # service的端口,随便写

  13. port: 80

  14. targetPort: 80

  15. nodePort: 32000

  16. ---

  17. apiVersion: apps/v1

  18. kind: Deployment

  19. metadata:

  20. name: nginx-deployment

  21. # 描述Deployment的标签,让Deployment变得可读

  22. labels:

  23. app: nginx

  24. spec:

  25. replicas: 3

  26. selector:

  27. # label selector 标签选择器,他会找到带有app: nginx的所有pod

  28. matchLabels:

  29. app: nginx

  30. template:

  31. # Pod模板开始

  32. metadata:

  33. # 定义这些pod带有哪些标签

  34. labels:

  35. app: nginx

  36. spec:

  37. containers:

  38. - name: nginx

  39. image: nginx:1.7.9

  40. ports:

  41. - containerPort: 80

2 在该文件所在目录执行如下命令创建Service以及Deployment

  1. kubectl create -f nginx.yaml

如内容所示,该NGINX以NodePort方式暴露到Kubernetes集群外部,端口为32000。

3 执行如下命令验证:

  1. # 查看nginx服务详情

  2. ~]# kubectl get svc nginx-service

  3. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE

  4. nginx-service NodePort 10.233.59.132 <none> 80:32000/TCP 4m56s



  5. # 访问测试,如果能够正常返回NGINX首页,说明正常

  6. ~]# curl 172.21.240.66:32000

六、卸载Kubespray

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

七、参考文档

1 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的一些配置、可能会遇到的问题及解决方案等。

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

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

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

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

近期热文

干货分享

最近将个人学习笔记整理成册,使用PDF分享。关注我,回复如下代码,即可获得百度盘地址,无套路领取!

  • 001:《Java并发与高并发解决方案》学习笔记;

  • 002:《深入JVM内核——原理、诊断与优化》学习笔记;

  • 003:《Java面试宝典》

您的关注是对我最大的支持!

万水千山总是情,点个“好看”行不行

↓↓↓↓

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存