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

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

master,node

172.21.240.67

node

172.21.240.68

node

172.21.240.69

node

一、准备工作

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单向通道

在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

四、在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.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即可安装完毕。

五、验证

5.1 验证1:查看Node状态

主要是验证各个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。

5.2 验证2:部署一个NGINX

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

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

六、卸载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

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/

原文发布于微信公众号 - IT牧场(itmuch_com)

原文发表时间:2019-03-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券