本文共 4272 字,大约阅读时间需要 14 分钟。
Kubernetes的安装部署是难中之难,每个版本安装方式都略有区别。笔者一直想找一种支持多平台
、相对简单
、适用于生产环境
的部署方案。经过一段时间的调研,有如下几种解决方案进入笔者视野:
部署方案 | 优点 | 缺点 |
---|---|---|
官方出品 | 部署较麻烦、不够透明 | |
官方出品、部署较简单、懂Ansible就能上手 | 不够透明 | |
部署较简单、需要花一些时间了解RKE的cluster.yml配置文件 | 不够透明 | |
手动部署 | 完全透明、可配置、便于理解K8s各组件之间的关系 | 部署非常麻烦,容易出错 |
其他诸如Kops之类的方案,由于无法跨平台,或者其他因素,被我pass了。
最终,笔者决定使用Kubespray部署Kubernetes集群。也希望大家能够一起讨论,总结出更加好的部署方案。
废话不多说,以下是操作步骤。
<!-- more -->
注:撰写本文时,笔者临时租赁了几台海外阿里云机器,实现了科学上网。如果您的机器在国内,请:
- 考虑科学上网
- 或修改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,执行如下命令即可。
~]# setenforce 0~]# sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
~]# firewall-cmd --permanent --add-port=6443/tcp~]# firewall-cmd --permanent --add-port=2379-2380/tcp~]# firewall-cmd --permanent --add-port=10250/tcp~]# firewall-cmd --permanent --add-port=10251/tcp~]# firewall-cmd --permanent --add-port=10252/tcp~]# firewall-cmd --permanent --add-port=10255/tcp~]# firewall-cmd --reload~]# modprobe br_netfilter~]# echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables~]# sysctl -w net.ipv4.ip_forward=1
如果关闭了防火墙,则只需执行最下面三行。
~]# firewall-cmd --permanent --add-port=10250/tcp~]# firewall-cmd --permanent --add-port=10255/tcp~]# firewall-cmd --permanent --add-port=30000-32767/tcp~]# firewall-cmd --permanent --add-port=6783/tcp~]# firewall-cmd --reload~]# echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables~]# sysctl -w net.ipv4.ip_forward=1
如果关闭了防火墙,则只需执行最下面两行。
systemctl stop firewalld
~]# sudo yum install epel-release~]# sudo yum install ansible
~]# easy_install pip~]# pip2 install jinja2 --upgrade
如果执行pip2 install jinja2 --upgrade
出现类似如下的提示:
You are using pip version 9.0.1, however version 18.0 is available.You should consider upgrading via the 'pip install --upgrade pip' command.
则执行pip install --upgrade pip
升级pip,再执行pip2 install jinja2 --upgrade
~]# sudo yum install python36 –y
在ansible-cilent机器上执行:
~]# ssh-keygen
然后三次回车,生成ssh公钥和私钥。
在ansible-cilent机器上执行:
~]# ssh-copy-id root@172.20.0.88 #将公钥分发给88机器~]# ssh-copy-id root@172.20.0.89~]# ssh-copy-id root@172.20.0.90~]# ssh-copy-id root@172.20.0.91~]# ssh-copy-id root@172.20.0.92
1 下载kubespray
TIPS:本文下载的是master分支,如果大家要部署到线上环境,建议下载RELEASE分支。笔者撰写本文时,最新的RELEASE是2.6.0,RELEASE版本下载地址:)
~]# git clone https://github.com/kubernetes-incubator/kubespray.git
2 安装kubespray需要的包:
~]# cd kubespray~]# sudo pip install -r requirements.txt
3 拷贝inventory/sample
,命名为inventory/mycluster
,mycluster可以改为其他你喜欢的名字
cp -r inventory/sample inventory/mycluster
4 使用inventory_builder,初始化inventory文件
~]# declare -a IPS=(172.20.0.88 172.20.0.89 172.20.0.90 172.20.0.91 172.20.0.92)~]# CONFIG_FILE=inventory/mycluster/hosts.ini python36 contrib/inventory_builder/inventory.py ${IPS[@]}
此时,会看到inventory/mycluster/host.ini
文件内容类似如下:
[k8s-cluster:children]kube-master kube-node [all]node1 ansible_host=172.20.0.88 ip=172.20.0.88node2 ansible_host=172.20.0.89 ip=172.20.0.89node3 ansible_host=172.20.0.90 ip=172.20.0.90node4 ansible_host=172.20.0.91 ip=172.20.0.91node5 ansible_host=172.20.0.92 ip=172.20.0.92[kube-master]node1 node2 [kube-node]node1 node2 node3 node4 node5 [etcd]node1 node2 node3 [calico-rr] [vault]node1 node2 node3
5 使用ansible playbook部署kubespray
~]# ansible-playbook -i inventory/mycluster/hosts.ini cluster.yml
6 大概20分钟左右,Kubernetes即可安装完毕。
验证1:查看Node状态
]# kubectl get nodesNAME STATUS ROLES AGE VERSIONnode1 Ready master,node 2m v1.11.2node2 Ready master,node 2m v1.11.2node3 Ready node 2m v1.11.2node4 Ready node 2m v1.11.2node5 Ready node 2m v1.11.2
每个node都是ready的,说明OK。
验证2:部署一个NGINX
# 启动一个单节点nginx ]# kubectl run nginx --image=nginx:1.7.9 --port=80 # 为“nginx”服务暴露端口 ]# kubectl expose deployment nginx --type=NodePort # 查看nginx服务详情 ]# kubectl get svc nginxNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEnginx NodePort 10.233.29.9680:32345/TCP 14s# 访问测试,如果能够正常返回NGINX首页,说明正常 ]# curl localhost:32345
]# ansible-playbook -i inventory/mycluster/hosts.ini reset.yml
Calico网络插件部署失效。这是Calico 3.2所带来的问题,原因详见:
解决方法: ,即:将Calico降级到3.1.3。
本文转自开源中国-
转载地址:http://hcgia.baihongyu.com/