使用Kubespray 2.8.3部署生产可用的Kubernetes集群(1.12.5)
Kubernetes的安装部署是难中之难,每个版本安装方式都略有区别。笔者一直想找一种支持多平台
、相对简单
、适用于生产环境
的部署方案。经过一段时间的调研,有如下几种解决方案进入笔者视野:
部署方案 | 优点 | 缺点 |
---|---|---|
Kubeadm | 官方出品 | 部署较麻烦、不够透明 |
Kubespray | 官方出品、部署较简单、懂Ansible就能上手 | 不够透明 |
RKE | 部署较简单、需要花一些时间了解RKE的cluster.yml配置文件 | 不够透明 |
手动部署 第三方操作文档 | 完全透明、可配置、便于理解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 | master,node |
172.21.240.67 | node |
172.21.240.68 | node |
172.21.240.69 | node |
准备工作
关闭selinux
所有机器都必须关闭selinux,执行如下命令即可。
1 | setenforce 0 |
网络配置
在master机器上
1 | firewall-cmd --permanent --add-port=6443/tcp |
如果关闭了防火墙,则只需执行最下面三行。
在node机器上
1 | firewall-cmd --permanent --add-port=10250/tcp |
如果关闭了防火墙,则只需执行最下面两行。
【可选】关闭防火墙
1 | systemctl stop firewalld |
在ansible-client机器上安装必备软件
1 | 安装epel源 |
在ansible-client机器上配置免密登录其他机器
生成ssh公钥和私钥
在ansible-cilent机器上执行:
1 | ssh-keygen |
然后三次回车,生成ssh公钥和私钥。
建立ssh单向通道
在ansible-cilent机器上执行:
1 | ssh-copy-id root@172.21.240.65 #将公钥分发给88机器 |
在ansible-client机器上安装kubespray
下载kubespray
TIPS:
- 笔者撰写本文时,最新的RELEASE是2.8.3,RELEASE版本下载地址:https://github.com/kubernetes-incubator/kubespray/releases)
- 强烈大家使用RELEASE分支进行部署,特别是在生产环境!Master分支不一定能部署成功,近日有童鞋无法成功部署就是因为使用的Master分支。
1
2
3git clone https://github.com/kubernetes-incubator/kubespray.git
cd kubespray
git checkout v2.8.3安装kubespray需要的包:
1
sudo pip install -r requirements.txt
拷贝
inventory/sample
,命名为inventory/mycluster
,mycluster可以改为其他你喜欢的名字1
cp -rfp inventory/sample inventory/mycluster
使用inventory_builder,初始化inventory文件
1
2declare -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
文件内容类似如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33[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使用ansible playbook部署kubespray
1
ansible-playbook -i inventory/mycluster/hosts.ini --become --become-user=root cluster.yml
等待大概20分钟左右,Kubernetes即可安装完毕。
验证
验证1:查看Node状态
主要是验证各个Node是否正常。
1 | kubectl get nodes |
每个node都是ready的,说明OK。
验证2:部署一个NGINX
主要是验证网络等是否正常,步骤如下。
在Master所在节点(本文使用的是
172.21.240.66
),准备一个名为nginx.yaml
的文件,内容如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41kind: 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在该文件所在目录执行如下命令创建Service以及Deployment
1
kubectl create -f nginx.yaml
如内容所示,该NGINX以NodePort方式暴露到Kubernetes集群外部,端口为32000。
执行如下命令验证:
1
2
3
4
5
6
7
8查看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
1 | ansible-playbook -i inventory/mycluster/hosts.ini reset.yml |
参考文档:
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 / https://www.jianshu.com/p/d8bee7c8a1e6
TIPS:里面有将如何替换gcr镜像为国内镜像
Installing Kubernetes On-premises/Cloud Providers with Kubespray:https://kubernetes.io/docs/setup/custom-cloud/kubespray/
评论系统未开启,无法评论!