千家信息网

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

发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,Kubernetes的安装部署是难中之难,每个版本安装方式都略有区别。笔者一直想找一种支持多平台、相对简单 、适用于生产环境 的部署方案。经过一段时间的调研,有如下几种解决方案进入笔者视野:部署方案优
千家信息网最后更新 2025年12月02日使用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.64ansible-client
172.21.240.65master,node
172.21.240.66master,node
172.21.240.67node
172.21.240.68node
172.21.240.69node

准备工作

关闭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~]# 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机器上配置免密登录其他机器

生成ssh公钥和私钥

在ansible-cilent机器上执行:

~]# ssh-keygen

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

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

  • 下载kubespray

    TIPS

    • 笔者撰写本文时,最新的RELEASE是2.8.3,RELEASE版本下载地址:
    • 强烈大家使用RELEASE分支进行部署,特别是在生产环境!Master分支不一定能部署成功,近日有童鞋无法成功部署就是因为使用的Master分支。
    ~]# git clone https://github.com/kubernetes-incubator/kubespray.git~]# cd kubespray~]# git checkout v2.8.3
  • 安装kubespray需要的包:

    ~]# sudo pip install -r requirements.txt
  • 拷贝inventory/sample ,命名为inventory/mycluster ,mycluster可以改为其他你喜欢的名字

    cp -rfp inventory/sample inventory/mycluster
  • 使用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
  • 使用ansible playbook部署kubespray

    ~]# ansible-playbook -i inventory/mycluster/hosts.ini --become --become-user=root cluster.yml
  • 等待大概20分钟左右,Kubernetes即可安装完毕。

验证

验证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。

验证2:部署一个NGINX

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

  • 在Master所在节点(本文使用的是172.21.240.66 ),准备一个名为nginx.yaml 的文件,内容如下:

    kind: ServiceapiVersion: v1metadata:name: nginx-servicespec:selector:  app: nginxtype: NodePortports:  # 协议:  - protocol: TCP    # service的端口,随便写    port: 80    targetPort: 80    nodePort: 32000---apiVersion: apps/v1kind: Deploymentmetadata:name: nginx-deployment# 描述Deployment的标签,让Deployment变得可读labels:  app: nginxspec:replicas: 3selector:  # label selector 标签选择器,他会找到带有app: nginx的所有pod  matchLabels:    app: nginxtemplate:  # Pod模板开始  metadata:    # 定义这些pod带有哪些标签    labels:      app: nginx  spec:    containers:      - name: nginx        image: nginx:1.7.9        ports:          - containerPort: 80
  • 在该文件所在目录执行如下命令创建Service以及Deployment

    kubectl create -f nginx.yaml

    如内容所示,该NGINX以NodePort方式暴露到Kubernetes集群外部,端口为32000。

  • 执行如下命令验证:

    # 查看nginx服务详情~]# kubectl get svc nginx-serviceNAME            TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGEnginx-service   NodePort   10.233.59.132           80:32000/TCP   4m56s# 访问测试,如果能够正常返回NGINX首页,说明正常~]# curl 172.21.240.66:32000

卸载Kubespray

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

参考文档:

  • Kubespray - 10 Simple Steps for Installing a Production-Ready, Multi-Master HA Kubernetes Cluster:

    TIPS:主要参考文档,里面还讲解了Kubespray的一些配置、可能会遇到的问题及解决方案等。

  • 使用Kubespray 部署kubernetes 高可用集群:

  • kubespray(ansible)自动化安装k8s集群: /

    TIPS:里面有将如何替换gcr镜像为国内镜像

  • Installing Kubernetes On-premises/Cloud Providers with Kubespray:

Docker与Kubernetes开源书

  • Gitee:
  • GitHub:

本文首发

http://www.itmuch.com/install/kubernetes-deploy-by-kubespray2.8.3/

干货分享

0