本文首发于我的个人网站: https://hewanyue.com/
本文作者: Hechao
本文链接: https://hewanyue.com/blog/8f374cb8.html

  本文使用kubeasz项目基于二进制方式部署和利用ansible-playbook实现自动化部署K8s。
  架构图如下所示

kubeasz官方文档中高可用集群所需节点配置如下

角色 数量 描述
管理节点 1 运行ansible/easzctl脚本,可以复用master,建议使用独立节点(1c1g)
etcd节点 3 注意etcd集群需要1,3,5,7…奇数个节点,一般复用master节点
master节点 2 高可用集群至少2个master节点
node节点 3 运行应用负载的节点,可根据需要提升机器配置/增加节点数

配置集群环境

  此次部署节点设置如下:
ansible安装节点&master1:172.18.32.18
master2:172.18.32.19
harbor:172.19.32.20
node1:172.18.32.21
node2:172.18.32.22
etcd1:172.18.32.23
etcd2:172.18.32.24
etcd3:172.18.32.25
haproxy1+keepalived:172.18.32.183
haproxy2+keepalived:172.18.32.184 VIP:172.18.32.250

配置免密登录

  先将ansible安装节点也就是master1主机(可以不复用主机)的秘钥分发至各个主机。

vim fenfamiyao.sh#!/bin/bash
#目标主机列表
PASSWORD="password"
PORT="22"IP="
172.18.32.18
172.18.32.19
172.18.32.20
172.18.32.21
172.18.32.22
172.18.32.23
172.18.32.24
172.18.32.25
"[ -a /root/.ssh/id_rsa ] || ssh-keygen -t rsa
which sshpass &> /dev/null || yum install sshpass -y #适用于CentOSfor node in ${IP};dosshpass -p $PASSWORD ssh-copy-id -p$PORT -o StrictHostKeyChecking=no ${node}
#        if [ $? -eq 0 ];then
#                echo "${node} 秘钥 copy 完成,准备环境初始化....."
#                ssh -p$PORT ${node} "mkdir /etc/docker/certs.d/harbor.hechao.com -p"
#                echo "Harbor 证书目录创建成功!"
#                scp -P$PORT /usr/local/src/harbor/certs/harbor-ca.crt ${node}:/etc/docker/certs.d/harbor.hechao.com/harbor-ca.crt
#                echo "Harbor 证书拷贝成功!"
#                scp -P$PORT /etc/hosts ${node}:/etc/hosts
#                echo "host 文件拷贝完成"
#                scp -r -P$PORT /root/.docker ${node}:/root/
#                echo "Harbor 认证文件拷贝完成!"
#                scp -r -P$PORT /etc/resolv.conf ${node}:/etc/echo "镜像加速链接同步!"ssh ${node} "mkdir -p /etc/docker"scp -r -p$PORT /etc/docker/daemon.json ${node}:/etc/docker/daemon.json
#        else
#                echo "${node} 秘钥 copy 失败"
#        fi
done

安装ansible环境

  因为要使用ansible批量自动化部署K8s集群,每个主机都要先安装ansible环境。
  ubuntu默认的python版本是3.6,而ansible需要python2.7。

apt update
apt install python2.7
ln -s /usr/bin/python2.7 /usr/bin/python

  master1上安装ansible

apt install ansible

  centos一般是自带python2.X环境,所以一般不需要在进行额外操作。
  在master1上检查各节点连通性

ansible all -m ping

配置kubeasz

下载kubeasz

  官方文档地址为https://github.com/easzlab/kubeasz,根据适配的K8s版本选择合适的kubeasz版本。根据官方文档,目前支持以下版本

集群版本 kubernetes v1.13, v1.14, v1.15, v1.16
操作系统 CentOS/RedHat 7, Debian 9/10, Ubuntu 1604/1804
运行时 docker 18.06.x-ce, 18.09.x, containerd 1.2.6
网络 calico, cilium, flannel, kube-ovn, kube-router

  我们下载2.0.3版本的kubeasz,并给予执行权限

curl -C- -fLO --retry 3 https://github.com/easzlab/kubeasz/releases/download/2.0.3/easzup
chmod +x easzup

  可以用file easzup命令看到这是一个ASCII文本文件,其实就是一个shell脚本。

root@DockerUbuntu18:~# file easzup
easzup: Bourne-Again shell script, ASCII text executable

  用vim编辑修改此文件。
  大部分地方无需修改,不过可以设置docker版本为18.09.9和K8s的版本为v1.15.5,其他地方不用动。

export DOCKER_VER=18.09.9
export K8S_BIN_VER=v1.15.5

  执行-- help查看脚本使用方法。

root@DockerUbuntu18:~# ./easzup --help
./easzup: illegal option -- -
Usage: easzup [options] [args]option: -{DdekSz}-C         stop&clean all local containers-D         download all into /etc/ansible-S         start kubeasz in a container-d <ver>   set docker-ce version, default "18.09.9"-e <ver>   set kubeasz-ext-bin version, default "0.3.0"-k <ver>   set kubeasz-k8s-bin version, default "v1.15.5"-m <str>   set docker registry mirrors, default "CN"(used in Mainland,China)-p <ver>   set kubeasz-sys-pkg version, default "0.3.2"-z <ver>   set kubeasz version, default "2.0.3"see more at https://github.com/kubeasz/dockerfiles

  先将/etc/ansible目录下所有自带的配置文件以及hosts文件删掉

\rm -rf /etc/ansible/*

  执行脚本下载所有需要的镜像和二进制文件

./easzup -D

  稍等片刻之后,下载好需要的镜像和二进制文件,此时就可以开始ansible自动部署安装K8s集群了。

ansible部署K8s

  kubeasz工具都已经写好了playbook,只需要设定好hosts文件即可一键安装了。先进入/etc/ansible目录,然后复制提供好的host模版文件并编辑。

cd /etc/ansible/
cp example/hosts.multi-node hosts
vim hosts
root@DockerUbuntu18:/etc/ansible# grep -v ^# hosts|grep -v ^$
[etcd]
172.18.32.23 NODE_NAME=etcd1
172.18.32.24 NODE_NAME=etcd2
172.18.32.25 NODE_NAME=etcd3
[kube-master]
172.18.32.18
172.18.32.19
[kube-node]
172.18.32.21
172.18.32.22
[harbor]
[ex-lb]
[chrony]
[all:vars]
CONTAINER_RUNTIME="docker"
CLUSTER_NETWORK="calico"
SERVICE_CIDR="10.68.0.0/16"
CLUSTER_CIDR="172.20.0.0/16"
NODE_PORT_RANGE="30000-65000"
CLUSTER_DNS_DOMAIN="cluster.local."
bin_dir="/usr/kube/bin"
ca_dir="/etc/kubernetes/ssl"
base_dir="/etc/ansible"

  以为我本地已经搭好harbor服务器了,所以就不要设置harbor服务让他来安装了。除了各节点IP以外,需要修改的就是bin_dir目录,这样就省去了创建软链接的步骤,也省去配置PATH变量了。我选择的网卡是calico,也可以使用默认的flannel,之后具体区别会再详细介绍。
  直接执行 playbook剧本90.setup.yml可以直接一键安装完成,不过如果出现问题我们不好排错,推荐一个剧本一个剧本的来跑。

  • 01.prepare.yml
ansible-playbook 01.prepare.yml

  这个剧本总共三个环节,一般来说都不会报错(如果提示软链接创建失败,则可忽略)。
  1.如果设置了chrony服务器,则master、node、etcd主机都会向chrony服务器同步时间。
  2.控制节点上创建CA、创建集群参数及客户端认证参数
  3分发证书工具CFSSL及kubeconfig配置文件

  • 02.etcd.yml
ansible-playbook 02.etcd.yml

  这个剧本是在配置etcd服务器。在3个etcd节点上,创建etcd目录并分发证书,导入之前下载在控制端的二进制程序etcdetcdctl及导入etcd的systemctl unit文件,设置开机自动启动etcd服务。这步也很简单,一般也不会出现什么问题。

  • 03.docker.yml

  因为我们在hosts文件中设置了运行时为docker,所以我们第三个剧本选择03.docker.yml,选择执行03.containerd,yml剧本也不会执行,里面做了条件判断

root@DockerUbuntu18:/etc/ansible# cat 03.containerd.yml
# to install containerd service
- hosts:- kube-master- kube-noderoles:- { role: containerd, when: "CONTAINER_RUNTIME == 'containerd'" }

  这个阶段的剧本比较复杂,要在每一个节点上安装docker,在执行这一步之前,先检查一下模版二进制文件的docker版本是否和我们之前预设的一样。

/etc/ansible/bin/docker -v
Docker version 18.09.6, build 481bc77

  如果不一样,可以去/opt/kube/bin/目录下找一下之前下好的二进制文件,确认下版本。

/opt/kube/bin/docker -v

  这个目录下的版本一般是不会错的,将此目录下的二进制文件复制至模版目录/etc/ansible/bin/

cp /opt/kube/bin/* /etc/ansible/bin/

  执行ansible剧本

ansible-playbook 03.docker.yml
  • 04.kube-master.yml

  这个剧本是对两个master节点操作,执行了以下操作
  1.创建kubernetes签名请求以及证书和私钥
  2.导入配置文件,启动kube-apiserver、kube-controller-manager及kube-scheduler服务
  3.设置主节点的kube-apiserver.service文件,并设置apiserver的IP地址并创建配置用户rbac权限。
  此时使用命令kubectl get node可以看到两个主节点都是出于ready状态了。

root@DockerUbuntu18:~# kubectl get node
NAME           STATUS                     ROLES    AGE    VERSION
172.18.32.18   Ready,SchedulingDisabled   master   1m    v1.15.5
172.18.32.19   Ready,SchedulingDisabled   master   1m    v1.15.5
  • 05…kube-node.yml

  这个剧本主要是将几个node节点加到集群中来。流程比较复杂,大致有以下步骤:
  1,创建kube-node目录:/var/lib/kubelet、/var/lib/kube-proxy和/etc/cni/net.d目录
  2.导入之前准备好的二进制可执行文件kubectl、kubelet、kube-proxy、bridge、host-local和loopback
  3.配置haproxy,监听本地的127.0.0.1:6443端口,代理至两个主节点的6443端口
  4.生成node节点的kubelet的配置文件,并分发至各个node节点。kubelet连接主节点的apiserver。
  5.node节点连接后,对node节点标记为kubernetes.io/role=node

  这步很容易出现kubelet服务无法启动,或者一直处于loaded状态,返回值为255。这是因为node节点的kubelet的认证失败。可以去node节点主机上查看服务kubelet服务状态。

systemctl status kubectl
journalctl -u kubelet -e

  我遇到几次node节点kubelet无法正常启动的情况,但是换了个全新的node节点就可以加进去了,说明问题不是在主节点上,一般将node节点还原至干净系统都可以解决问题。
  还有一次返回值255但报错提示是,找不到/run/systemd/resolve/resolv.conf文件,于是创建一个

mkdir /run/systemd/resolve/;echo "nameserver 233.5.5.5" > /run/systemd/resolve/resolv.conf

  自己创建一个解析之后问题解决。
  顺利的话,使用kubectl get node可以看到主节点和node节点都处于ready状态。

root@DockerUbuntu18:/etc/ansible# kubectl get node
NAME           STATUS                     ROLES    AGE   VERSION
172.18.32.18   Ready,SchedulingDisabled   master   2h   v1.15.5
172.18.32.19   Ready,SchedulingDisabled   master   2h   v1.15.5
172.18.32.21   Ready                      node     2h   v1.15.5
172.18.32.22   Ready                      node     2h   v1.15.5
  • 06.network.yml

  在这个剧本中,主要是配置各个pod之间的网络访问。需要在每个物理节点上都生成一个calico-node服务的pod,再启动一个calico-kube-controllers服务的pod来管理他们,(因为默认主节点设置了不可调度,所以这个calico-kube-contronllers一般是在node节点上生成)。因为使用的是pod方式启动,所以这个剧本中,除了配置calicao证书及私钥外,主要是生成了一个calico DaemonSet yaml文件,路径为/opt/kube/kube-system/calico.yaml,所以之后如果修改网络配置,可以直接在此路径下修改这个yaml文件,例如如果想要修改镜像地址为私有harbor地址,则

kubectl delete -f /opt/kube/kube-system/calico.yaml
vim /opt/kube/kube-system/calico.yaml
kubectl apply -f /opt/kube/kube-system/calico.yaml

  需要注意的是,如果将yaml文件中拉取镜像的地址改为了私有harbor,则需要在yaml文件中加入Secret资源,使用imagePullSecrets拉取。
  当我们的node节点不需要跨网段时,通常会选择将IPIP模式(ip-in-ip叠加模式)关掉,使用calico的BGP模式,以节约大量主机内部访问时封装的性能损耗。
  查看路由,可以看到目前荣期间通信的网络接口为tunl0

root@DockerUbuntu18:~# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.18.0.1      0.0.0.0         UG    0      0        0 eth0
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
172.18.0.0      0.0.0.0         255.255.0.0     U     0      0        0 eth0
172.20.185.64   0.0.0.0         255.255.255.192 U     0      0        0 *
172.20.233.128  172.18.32.19    255.255.255.192 UG    0      0        0 tunl0
172.20.250.128  172.18.32.22    255.255.255.192 UG    0      0        0 tunl0
172.20.250.192  172.18.32.21    255.255.255.192 UG    0      0        0 tunl0
192.168.0.0     0.0.0.0         255.255.0.0     U     0      0        0 eth1

  于是可以编辑/etc/ansible/roles/calico/defaults/main.yml或者直接修改/opt/kube/kube-system/calico.yaml文件,将其中的 CALICO_IPV4POOL_IPIP修改为off,将name: FELIX_IPINIPMTU属性注释掉,改为FELIX_IPINIPENABLED值为false

            - name: CALICO_IPV4POOL_IPIPvalue: "off"- name: FELIX_IPINIPENABLEDvalue: "false"

  然后执行kubectl delete -f /opt/kube/kube-system/calico.yaml将网络组件calico的pod都先停掉,reboot重启后,使用命令ifconfig就会发现,之前使用的tunl0网卡就不见了。再使用命令kubectl apply -f /opt/kube/kube-system/calico.yaml,将k8s网络连接起来,使用命令route -n查看路由信息,就会发现,跨主机通信直接使用eth0网卡了。此时模式从IPIP修改为BGP模式。

root@DockerUbuntu18:~# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.18.0.1      0.0.0.0         UG    0      0        0 eth0
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
172.18.0.0      0.0.0.0         255.255.0.0     U     0      0        0 eth0
172.20.185.64   0.0.0.0         255.255.255.192 U     0      0        0 *
172.20.233.128  172.18.32.19    255.255.255.192 UG    0      0        0 eth0
172.20.250.128  172.18.32.22    255.255.255.192 UG    0      0        0 eth0
172.20.250.192  172.18.32.21    255.255.255.192 UG    0      0        0 eth0
192.168.0.0     0.0.0.0         255.255.0.0     U     0      0        0 eth1
  • 07.cluster-addon.yml

  第七步是安装一些功能插件,如在node节点生成dns解析(默认使用的是coredns,可以在roles/cluster-addon/defaults/main.yml文件中设置),安装dashboard(可视化web界面)。我们也可以选择自己安装这些功能插件。
  可参考官方文档https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/#deploying-the-dashboard-ui
  dashboard默认是1.6.3版本的,比较老。我们这里手动安装dashboard1.10.1版本,过程如下

cd /etc/ansible/manifests/dashboard
mkdir 1.10.1
cp 1.6.3/ui* 1.10.1/
cd 1.10.1

  先下载yaml文档

wget https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml

  再创建admin tokenvim admin-user-sa-rbac.yaml

apiVersion: v1
kind: ServiceAccount
metadata:name: admin-usernamespace: kube-system---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: admin-user
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: cluster-admin
subjects:
- kind: ServiceAccountname: admin-usernamespace: kube-system

  创建集群角色vim read-user-sa-rbac.yaml

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:name: dashboard-read-clusterrole
rules:
- apiGroups:- ""resources:- configmaps- endpoints- persistentvolumeclaims- pods- replicationcontrollers- replicationcontrollers/scale- serviceaccounts- services- nodes- persistentvolumeclaims- persistentvolumesverbs:- get- list- watch
- apiGroups:- ""resources:- bindings- events- limitranges- namespaces/status- pods/log- pods/status- replicationcontrollers/status- resourcequotas- resourcequotas/statusverbs:- get- list- watch
- apiGroups:- ""resources:- namespacesverbs:- get- list- watch
- apiGroups:- appsresources:- daemonsets- deployments- deployments/scale- replicasets- replicasets/scale- statefulsetsverbs:- get- list- watch
- apiGroups:- autoscalingresources:- horizontalpodautoscalersverbs:- get- list- watch
- apiGroups:- batchresources:- cronjobs- jobsverbs:- get- list- watch
- apiGroups:- extensionsresources:- daemonsets- deployments- deployments/scale- ingresses- networkpolicies- replicasets- replicasets/scale- replicationcontrollers/scaleverbs:- get- list- watch
- apiGroups:- policyresources:- poddisruptionbudgetsverbs:- get- list- watch
- apiGroups:- networking.k8s.ioresources:- networkpoliciesverbs:- get- list- watch
- apiGroups:- storage.k8s.ioresources:- storageclasses- volumeattachmentsverbs:- get- list- watch
- apiGroups:- rbac.authorization.k8s.ioresources:- clusterrolebindings- clusterroles- roles- rolebindingsverbs:- get- list- watch

  此时目录结构如下

root@DockerUbuntu18:/etc/ansible/manifests/dashboard/1.10.1# tree
.
├── admin-user-sa-rbac.yaml
├── kubernetes-dashboard.yaml
├── read-user-sa-rbac.yaml
├── ui-admin-rbac.yaml
└── ui-read-rbac.yaml0 directories, 5 files

  然后通过yaml文件启动dashboard的pod

kubectl apply -f .

  可以通过命令查看pod 是否启动成功。

kubectl get pods --all-namespaces | grep dashboard

  看到状态running之后,输入命令开启认证生成登陆用户名密码

easzctl basic-auth -s
[INFO]basic-auth for apiserver is enabled!
BASIC_AUTH_USER: 'admin'
BASIC_AUTH_PASS: '4fe554e56c32f27b'
[INFO] Action successed : basic-auth basic-auth -s`

  通过命令kubectl cluster-info查看集群信息来查看登陆url

kubectl cluster-info

  使用命令来获取token

kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')

  这时就可以登陆web界面查看K8s集群信息了。

使用kubeasz自动化部署K8s相关推荐

  1. K8S实战集训第一课 Ansible自动化部署k8s、弹性伸缩、Helm包管理、k8s网络模型介绍

    Ansible自动化部署K8S集群 一.Ansible自动化部署K8S集群 1.1 Ansible介绍 Ansible是一种IT自动化工具.它可以配置系统,部署软件以及协调更高级的IT任务,例如持续部 ...

  2. 还在手动部署 Kubernetes 集群吗,是时候使用 Kubespray 完成自动化部署了!

    公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! 前言 部署 Kubernetes 除了手动方式外,还有诸如 Kubeadm.Kubespray.Breeze.Ra ...

  3. kubeasz一键部署containerd运行时、高可用k8s(1.26.x)集群-Day 02

    1. 生产环境部署架构 (1)多master节点,实现master节点的高可用和高性能. (2)单独的etcd分布式集群(生产使用SSD盘),高可用持久化k8s资源对象数据,并实现高可用. (3)多n ...

  4. K8S搭建自动化部署环境(三)Jenkins下载、安装和启动

    各位大佬,前文如下: K8S搭建自动化部署环境(一)安装Kubernetes K8S搭建自动化部署环境(二)安装K8S管理工具Kuboard V3 一.jenkins 下载 jenkins下载地址:h ...

  5. kubeasz部署k8s高可用集群

    前言:如无特殊说明,所有操作都用root账号在所有节点执行. 说明:kubeasz是一款国产开源的k8s部署软件,采用ansible role的部署方式,部署k8s二进制集群.熟悉ansible ro ...

  6. K8S搭建自动化部署环境(四)Jenkins多分支流水线Blue Ocean的安装和使用

    各位大佬,前文如下: K8S搭建自动化部署环境(一)安装Kubernetes K8S搭建自动化部署环境(二)安装K8S管理工具Kuboard V3 K8S搭建自动化部署环境(三)Jenkins下载.安 ...

  7. 【Kubernetes】如何使用Kubeadm部署K8S集群

    一 . 准备机器 本次环境采用华为云ECS弹性云服务器部署(也可以使用VMware) vm01(2V4G): Ubuntu_18.04作为K8S master节点 vm02(1V1G): Ubuntu ...

  8. kubernetes+Azure DevOps实现.Net Core项目的自动化部署均衡负载

    1. 前言 前前后后学习kubernetes也有一个来月了,关于kubernetes的博客也写了有十多篇.但是技术如果无法落地到实际的应用场景终归是纸上谈兵,所以就有了这一出:通过结合kubernet ...

  9. asp.net core结合Gitlab-CI实现自动化部署

    一.前言 在之前的文章中写过k8s+Jenkins+GitLab-自动化部署asp.net core项目 的topic,这次讲解一下gitlab-ci的CI/CD,说实话,自动化部署是在是非常的舒服, ...

  10. 架构设计:服务自动化部署和管理流程

    本文源码:GitHub·点这里 || GitEE·点这里 一.分布式服务 从常规分布式架构系统来说,划分出十来个独立的微服务模块是很常见的,然后不同的开发人员分工几个服务块,负责日常开发和维护,微服务 ...

最新文章

  1. 【转载】写博意味着什么?
  2. Error:Execution failed for task ':app:dexDebug'. com.android.ide.common.process.ProcessException
  3. pythonturtle是标准库_Python中turtle库的使用
  4. 九年级数学解方程50道_九年级数学知识点总结与重点难点总结,考前必看!
  5. 计算机房安全等级标准,电子计算机房的分级标准
  6. 论文中的图片处理方法
  7. Web前端程序员该如何准备面试?这些面试知识应该掌握
  8. Atitit.php opcode虚拟机指令集 分类以及详细解释
  9. CleanMyPC比360管家好用N倍的电脑清理软件
  10. GreenPlum分区表原理
  11. python爬虫下载恩智浦智能车竞赛技术报告
  12. ajax 的四步法处理
  13. 中间件技术及双十一实践·EagleEye篇
  14. 金和IUapp制作“手机之家”
  15. 洪灾面前,能抗衡的很少,但能做的很少
  16. HTML5表单验证required提示的中文设置为英文
  17. 分享| 三款在线临时文件分享工具,无需注册
  18. 用javascript自定义SharePoint文档库/列表项菜单
  19. 7-18 用格里高利公式求给定精度的PI值
  20. 编译小度deng wifi源码出错

热门文章

  1. WP采集插件全自动采集伪原创发布插件免费
  2. 宝峰c1对讲机写频软件_宝峰对讲机写频软件下载7.01 官方正式版-宝峰BF480,BF520,F25,F26对讲机写频软件西西软件下载...
  3. 软件体系结构复习指南
  4. linux 下令chmod 755的意思
  5. 【论文】(COPRA)Finding overlapping communities in networks by label propagation
  6. 大地测量学基础(复习)第三部分
  7. 高中计算机网络技术因特网协议,高中信息技术网络协议.ppt
  8. 超越网络的JavaScript
  9. PcShare远程控制
  10. JAVA项目在服务器部署过程