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的问题。如果您的服务器在国内,请:
roles/download/defaults/main.yml
即可)docker save
下来,再到国内的服务器上 docker load
。
IP | 作用 |
---|---|
172.21.240.64 | ansible-client |
172.21.240.65 | master,node |
172.21.240.66 | master,node |
172.21.240.67 | node |
172.21.240.68 | node |
172.21.240.69 | 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~]# modprobe br_netfilter~]# echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables~]# sysctl -w net.ipv4.ip_forward=1
如果关闭了防火墙,则只需执行最下面两行。
systemctl stop firewalld
# 安装epel源~]# sudo yum install -y epel-release# 安装ansible~]# sudo yum install -y ansible# 安装Python 3.6~]# sudo yum install –y python36
在ansible-cilent机器上执行:
~]# ssh-keygen
然后三次回车,生成ssh公钥和私钥。
在ansible-cilent机器上执行:
~]# ssh-copy-id root@172.21.240.65 #将公钥分发给88机器~]# ssh-copy-id root@172.21.240.66~]# ssh-copy-id root@172.21.240.67~]# ssh-copy-id root@172.21.240.68~]# ssh-copy-id root@172.21.240.69
4.1 下载kubespray
TIPS:
~]# git clone https://github.com/kubernetes-incubator/kubespray.git~]# cd kubespray~]# git checkout v2.8.3
4.2 安装kubespray需要的包:
~]# sudo pip install -r requirements.txt
4.3 拷贝 inventory/sample
,命名为 inventory/mycluster
,mycluster可以改为其他你喜欢的名字
cp -rfp inventory/sample inventory/mycluster
4.4 使用inventory_builder,初始化inventory文件
~]# declare -a IPS=(172.21.240.65 172.21.240.66 172.21.240.67 172.21.240.68 172.21.240.69)~]# CONFIG_FILE=inventory/mycluster/hosts.ini python36 contrib/inventory_builder/inventory.py ${IPS[@]}
此时,会看到 inventory/mycluster/host.ini
文件内容类似如下:
[all]node1 ansible_host=172.21.240.65 ip=172.21.240.65node2 ansible_host=172.21.240.66 ip=172.21.240.66node3 ansible_host=172.21.240.67 ip=172.21.240.67node4 ansible_host=172.21.240.68 ip=172.21.240.68node5 ansible_host=172.21.240.69 ip=172.21.240.69
[kube-master]node1 node2
[etcd]node1 node2 node3
[kube-node]node1 node2 node3 node4 node5
[k8s-cluster:children]kube-master kube-node
[calico-rr]
[vault]node1 node2 node3
4.5 使用ansible playbook部署kubespray
~]# ansible-playbook -i inventory/mycluster/hosts.ini --become --become-user=root cluster.yml
4.6 等待大概20分钟左右,Kubernetes即可安装完毕。
主要是验证各个Node是否正常。
]# kubectl get nodesNAME STATUS ROLES AGE VERSIONnode1 Ready master,node 8m41s v1.12.5node2 Ready master,node 7m32s v1.12.5node3 Ready node 6m59s v1.12.5node4 Ready node 6m59s v1.12.5node5 Ready node 6m59s v1.12.5
每个node都是ready的,说明OK。
主要是验证网络等是否正常,步骤如下。
1 在Master所在节点(本文使用的是 172.21.240.66
),准备一个名为 nginx.yaml
的文件,内容如下:
kind: ServiceapiVersion: v1metadata: name: nginx-servicespec: selector: app: nginx type: NodePort ports: # 协议: - protocol: TCP # service的端口,随便写 port: 80 targetPort: 80 nodePort: 32000---apiVersion: apps/v1kind: Deploymentmetadata: name: nginx-deployment # 描述Deployment的标签,让Deployment变得可读 labels: app: nginxspec: replicas: 3 selector: # label selector 标签选择器,他会找到带有app: nginx的所有pod matchLabels: app: nginx template: # Pod模板开始 metadata: # 定义这些pod带有哪些标签 labels: app: nginx spec: containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 80
2 在该文件所在目录执行如下命令创建Service以及Deployment
kubectl create -f nginx.yaml
如内容所示,该NGINX以NodePort方式暴露到Kubernetes集群外部,端口为32000。
3 执行如下命令验证:
# 查看nginx服务详情~]# kubectl get svc nginx-serviceNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEnginx-service NodePort 10.233.59.132 <none> 80:32000/TCP 4m56s
# 访问测试,如果能够正常返回NGINX首页,说明正常~]# curl 172.21.240.66:32000
]# 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/