
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.64 | ansible-client |
172.21.240.65 | master,node |
172.21.240.66 | |
172.21.240.67 | node |
172.21.240.68 | |
172.21.240.69 |
一、准备工作
1.1 关闭selinux
所有机器都必须关闭selinux,执行如下命令即可。
-
~]# setenforce 0
-
~]# sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
1.2 网络配置
在master机器上
-
~]# 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
如果关闭了防火墙,则只需执行最下面三行。
在node机器上
-
~]# 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
二、在ansible-client机器上安装必备软件
-
# 安装epel源
-
~]# sudo yum install -y epel-release
-
# 安装ansible
-
~]# sudo yum install -y ansible
-
# 安装Python 3.6
-
~]# sudo yum install –y python36
三、在ansible-client机器上配置免密登录其他机器
3.1 生成ssh公钥和私钥
在ansible-cilent机器上执行:
-
~]# ssh-keygen
然后三次回车,生成ssh公钥和私钥。
3.2 建立ssh单向通道
-
~]# ssh-copy-id [email protected] #将公钥分发给88机器
-
~]# ssh-copy-id [email protected]
-
~]# ssh-copy-id [email protected]
-
~]# ssh-copy-id [email protected]
-
~]# ssh-copy-id [email protected]
四、在ansible-client机器上安装kubespray
4.1 下载kubespray
TIPS:
- 笔者撰写本文时,最新的RELEASE是2.8.3,RELEASE版本下载地址:https://github.com/kubernetes-incubator/kubespray/releases)
- 强烈大家使用RELEASE分支进行部署,特别是在生产环境!Master分支不一定能部署成功,近日有童鞋无法成功部署就是因为使用的Master分支。
-
~]# 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.65
-
node2 ansible_host=172.21.240.66 ip=172.21.240.66
-
node3 ansible_host=172.21.240.67 ip=172.21.240.67
-
node4 ansible_host=172.21.240.68 ip=172.21.240.68
-
node5 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即可安装完毕。
五、验证
5.1 验证1:查看Node状态
主要是验证各个Node是否正常。
-
]# kubectl get nodes
-
NAME STATUS ROLES AGE VERSION
-
node1 Ready master,node 8m41s v1.12.5
-
node2 Ready master,node 7m32s v1.12.5
-
node3 Ready node 6m59s v1.12.5
-
node4 Ready node 6m59s v1.12.5
-
node5 Ready node 6m59s v1.12.5
每个node都是ready的,说明OK。
5.2 验证2:部署一个NGINX
主要是验证网络等是否正常,步骤如下。
1 在Master所在节点(本文使用的是
172.21.240.66
),准备一个名为
nginx.yaml
的文件,内容如下:
-
kind: Service
-
apiVersion: v1
-
metadata:
-
name: nginx-service
-
spec:
-
selector:
-
app: nginx
-
type: NodePort
-
ports:
-
# 协议:
-
- protocol: TCP
-
# service的端口,随便写
-
port: 80
-
targetPort: 80
-
nodePort: 32000
-
---
-
apiVersion: apps/v1
-
kind: Deployment
-
metadata:
-
name: nginx-deployment
-
# 描述Deployment的标签,让Deployment变得可读
-
labels:
-
app: nginx
-
spec:
-
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-service
-
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
-
nginx-service NodePort 10.233.59.132 <none> 80:32000/TCP 4m56s
-
# 访问测试,如果能够正常返回NGINX首页,说明正常
-
~]# curl 172.21.240.66:32000
六、卸载Kubespray
-
]# 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
TIPS:里面有将如何替换gcr镜像为国内镜像
4 Installing Kubernetes On-premises/Cloud Providers with Kubespray:https://kubernetes.io/docs/setup/custom-cloud/kubespray/