Kubernetes的安装部署是难中之难,每个版本安装方式都略有区别。笔者一直想找一种支持多平台相对简单适用于生产环境 的部署方案。经过一段时间的调研,有如下几种解决方案进入笔者视野:

部署方案 优点 缺点
Kubeadm 官方出品 部署较麻烦、不够透明
Kubespray 官方出品、部署较简单、懂Ansible就能上手 不够透明
RKE 部署较简单、需要花一些时间了解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

所有机器都必须关闭selinux,执行如下命令即可。

~]# setenforce 0
~]# sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux

网络配置

在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
~]# echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables
~]# sysctl -w net.ipv4.ip_forward=1

如果关闭了防火墙,则只需执行最下面两行。

【可选】关闭防火墙

 systemctl stop firewalld

在ansible-client机器上安装ansible

安装ansible

~]# sudo yum install epel-release
~]# sudo yum install ansible 

安装jinja2

~]# 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

安装Python 3.6

~]# sudo yum install python36 –y

在ansible-client机器上配置免密登录

生成ssh公钥和私钥

在ansible-cilent机器上执行:

~]# ssh-keygen

然后三次回车,生成ssh公钥和私钥。

建立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

在ansible-client机器上安装kubespray

1 下载kubespray

TIPS:本文下载的是master分支,如果大家要部署到线上环境,建议下载RELEASE分支。笔者撰写本文时,最新的RELEASE是2.6.0,RELEASE版本下载地址:https://github.com/kubernetes-incubator/kubespray/releases)

~]# 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.88
node2 ansible_host=172.20.0.89 ip=172.20.0.89
node3 ansible_host=172.20.0.90 ip=172.20.0.90
node4 ansible_host=172.20.0.91 ip=172.20.0.91
node5 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 nodes
NAME STATUS ROLES AGE VERSION
node1 Ready master,node 2m v1.11.2
node2 Ready master,node 2m v1.11.2
node3 Ready node 2m v1.11.2
node4 Ready node 2m v1.11.2
node5 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 nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx NodePort 10.233.29.96 <none> 80:32345/TCP 14s

# 访问测试,如果能够正常返回NGINX首页,说明正常 ]# curl localhost:32345 

卸载

]# ansible-playbook -i inventory/mycluster/hosts.ini reset.yml 

遇到的问题

Calico网络插件部署失效。这是Calico 3.2所带来的问题,原因详见:https://github.com/kubernetes-incubator/kubespray/issues/3223

解决方法:https://github.com/wilmardo/kubespray/commit/1c87a49d1443bcdd237500a714f1a60d680c1ad8 ,即:将Calico降级到3.1.3。

本文转自开源中国-使用Kubespray部署生产可用的Kubernetes集群(1.11.2)

使用Kubespray部署生产可用的Kubernetes集群(1.11.2)相关推荐

  1. 部署Tectonic服务到kubernetes集群

    前提条件 已经部署完成并可运行kubernetes集群,如果没有请参考基于Vagrant CoreOS的kubernetes一键部署 需要注册Tectonic账号时提供的tectonic-licens ...

  2. 通过kubeadm部署高可用的k8s集群

    1环境准备 注意: 禁用swap 关闭selinux 关闭iptable 优化内核参数限制参数 root@kubeadm-master1:~# sysctl -p net.ipv4.ip_forwar ...

  3. Cloud Toolkit 部署应用到 EDAS Kubernetes 集群

    1.在 IntelliJ IDEA 上单击 Cloud Toolkit 的图标,在下拉列表中选择 Deploy to EDAS -> EDAS for Kubernetes Applicatio ...

  4. ASP.NET Core应用程序容器化、持续集成与Kubernetes集群部署(三

    在上文ASP.NET Core应用程序容器化.持续集成与Kubernetes集群部署(二)中,我介绍了如何使用Azure DevOps为ASP.NET Core应用程序案例:tasklist搭建持续集 ...

  5. 使用 ezctl 工具部署和管理 Kubernetes 集群

    1 ezctl 命令行介绍 kubeasz 项目致力于快速部署高可用的 Kubernetes 集群,同时也提供了关于 Kubernetes 详细的学习资料,在这里强烈推荐给初学者.kubeasz 项目 ...

  6. 管理数百个Kubernetes集群需要什么?

    运行和管理数百个Kubernetes集群需要什么?这就是本文分享的内容.下面,我们一起来看. 要点: 部署一个具备生产就绪所需所有依赖关系的Kubernetes集群需要数天时间. 如果不自动化这个过程 ...

  7. 在阿里云上部署生产级别Kubernetes集群

    阿里云是国内非常受欢迎的基础云平台,随着Kubernetes的普及,越来越多的企业开始筹划在阿里云上部署自己的Kubernetes集群. 本文将结合实战中总结的经验,分析和归纳一套在阿里云上部署生产级 ...

  8. 通过Rancher部署并扩容Kubernetes集群基础篇一

    一 应用场景描述 持续跟踪研究Kubernetes也有一段时间了,Kubernetes作为谷歌开源的生产级别的容器调度系统从开源初始便获得了众多的关注.一些有研发实力的公司调研过Kubernetes的 ...

  9. 想提高运维效率,那就把MySQL数据库部署到Kubernetes 集群中

    摘要:Kubernetes 很多看起来比较"繁琐"的设计的主要目的,都是希望为开发者提供更多的"可扩展性",给使用者带来更多的"稳定性"和& ...

最新文章

  1. Linux下CMake简明教程(七)对库进行链接
  2. java中jdbc的封装笔记_JDBC封装学习笔记(三)---面向对象的JDBC,使用preparedStatement...
  3. php面向对象项目,PHP的面向对象编程:开发大型PHP项目的方法(一)
  4. Android 高德地图在清除所有Marker,清除某一个MarKer
  5. 谷歌地球最新host_听说《流浪地球》被豆瓣鄙视了,我们用数据看一把真相(上)...
  6. 我们为什么使用Node
  7. 多元回归模型与热力图绘制
  8. 在Win7中IIS配置Asp.Net虚拟文件夹的方法及错误总结!
  9. 例外被抛出且未被接住--服务端与客户端隐藏
  10. 基频和倍频的概念_小知识:关于倍频程
  11. PS常用快捷键及模板使用
  12. yansongda 支付宝提现,商家转账
  13. 基于mongoose的httpclient配置SSL与cookie
  14. symbian3 java游戏测试,Symbian^3愤怒的小鸟测试版C7首发实测
  15. 微信小程序优惠券到期提醒功能设定指引
  16. jmeter测试服务器性能测试报告,Jmeter的性能测试
  17. postinvalidate、postinvalidateOnAnimation和invalidate的区别
  18. python爬取京东笔记本标题、品牌、价格、评论数
  19. 基于stm32的温湿度检测案例(一)
  20. 我们首先要知道哪些行业适合用微信赚钱

热门文章

  1. 利用梯度下降法求解一元线性回归和多元线性回归
  2. Java Double类parseDouble()方法的示例
  3. Java ObjectOutputStream writeFloat()方法与示例
  4. Python---实验九作业
  5. spring属性注入的set方法注入
  6. 百度地图infowindow的close事件_百度地图蒙圈:车主要加油误导母婴店 跑偏理由令人啼笑皆非...
  7. hdu 3094——A tree game
  8. 172. 阶乘后的零 golang
  9. C语言malloc和calloc的区别
  10. CF Gym 101630 B Box