使用 ezctl 工具部署和管理 Kubernetes 集群
1 ezctl 命令行介绍
kubeasz 项目致力于快速部署高可用的 Kubernetes 集群,同时也提供了关于 Kubernetes 详细的学习资料,在这里强烈推荐给初学者。kubeasz 项目地址:https://github.com/easzlab/kubeasz 。
kubeasz 项目使用 ezctl 方便地创建和管理多个 Kubernetes 集群,ezctl 使用 shell 脚本封装 ansible-playbook 执行命令,它十分轻量、简单和易于扩展。查看 ezctl 工具的命令行提示信息,如下所示:
Usage: ezctl COMMAND [args]
-------------------------------------------------------------------------------------
Cluster setups:list to list all of the managed clusterscheckout <cluster> to switch default kubeconfig of the clusternew <cluster> to start a new k8s deploy with name 'cluster'setup <cluster> <step> to setup a cluster, also supporting a step-by-step waystart <cluster> to start all of the k8s services stopped by 'ezctl stop'stop <cluster> to stop all of the k8s services temporarilyupgrade <cluster> to upgrade the k8s clusterdestroy <cluster> to destroy the k8s clusterbackup <cluster> to backup the cluster state (etcd snapshot)restore <cluster> to restore the cluster state from backupsstart-aio to quickly setup an all-in-one cluster with 'default' settingsCluster ops:add-etcd <cluster> <ip> to add a etcd-node to the etcd clusteradd-master <cluster> <ip> to add a master node to the k8s clusteradd-node <cluster> <ip> to add a work node to the k8s clusterdel-etcd <cluster> <ip> to delete a etcd-node from the etcd clusterdel-master <cluster> <ip> to delete a master node from the k8s clusterdel-node <cluster> <ip> to delete a work node from the k8s clusterExtra operation:kcfg-adm <cluster> <args> to manage client kubeconfig of the k8s clusterUse "ezctl help <command>" for more information about a given command.- 命令集 1:集群安装相关操作- 显示当前所有管理的集群- 切换默认集群- 创建新集群配置- 安装新集群- 启动临时停止的集群- 临时停止某个集群(包括集群内运行的 pod)- 升级集群 k8s 组件版本- 删除集群- 备份集群(仅 etcd 数据,不包括 pv 数据和业务应用数据)- 从备份中恢复集群- 创建单机集群(类似 minikube)
- 命令集 2:集群节点操作- 增加 etcd 节点- 增加主节点- 增加工作节点- 删除 etcd 节点- 删除主节点- 删除工作节点
- 命令集3:额外操作- 管理客户端 kubeconfig
2 单机 All in One 快速部署 Kubernetes 环境
首先介绍一下如何在单机环境上快速部署一个单节点的 Kubernetes 集群,在国内环境下比官方的 minikube 方便、简单很多。
2.1 基础系统配置
- 准备一台虚机配置内存 2G,硬盘 30G 以上。
- 最小化安装
Ubuntu 16.04 server
或者CentOS 7 Minimal
。
注意: 确保在干净的系统上开始安装,不要使用曾经装过 kubeadm 或其他 Kubernetes 发行版的环境。
2.2 下载文件
下载工具脚本 ezdown,例如使用最新的 kubeasz 版本 3.1.1。
export release=3.1.1
wget https://github.com/easzlab/kubeasz/releases/download/${release}/ezdown
chmod +x ./ezdown
下载安装部署 Kubernetes 需要的依赖和镜像。
./ezdown -D
下载系统包(可选,当无法使用 yum/apt 在线安装系统包时可以使用)
./ezdown -P
上述脚本运行成功后,所有文件(kubeasz 代码、二进制、离线镜像)均已整理好放入目录 /etc/kubeasz
。
/etc/kubeasz
包含 kubeasz 版本为 ${release} 的发布代码。/etc/kubeasz/bin
包含 kubernetes/etcd/docker/cni 等二进制文件。/etc/kubeasz/down
包含集群安装时需要的离线容器镜像。/etc/kubeasz/down/packages
包含集群安装时需要的系统基础软件。
2.3 安装集群
运行 kubeasz 容器,在 kubeasz 容器中封装了 ezctl 和 ansible。
./ezdown -S
使用默认配置安装 aio(All in One) 集群。
docker exec -it kubeasz ezctl start-aio
接下来 kubeasz 会使用 ansible playbook 来部署 Kubernetes,运行完毕后如下图所示。
2.4 验证安装
如果提示 kubectl: command not found
,退出重新 ssh 登录一下,让环境变量生效即可。
$ kubectl version # 验证集群版本
$ kubectl get node # 验证节点就绪 (Ready) 状态
$ kubectl get pod -A # 验证集群 pod 状态,默认已安装网络插件、coredns、metrics-server 等
$ kubectl get svc -A # 验证集群服务状态
2.5 登录 Dashboard
默认情况下,Kubernetes Dashboard 已经使用 NodePort 类型的 Service 发布服务了。
$ kubectl get svc -n kube-system|grep dashboard
dashboard-metrics-scraper ClusterIP 10.68.53.35 <none> 8000/TCP 10m
kubernetes-dashboard NodePort 10.68.181.208 <none> 443:31538/TCP 10m
在 Kubernetes 集群外部通过 https://<节点 IP>:<NodePort 端口> 访问 Dashboard。我们选择使用 Token 方式登录 Dashboard,使用以下命令获取 Token。
# 获取 Bearer Token,找到输出中 ‘token:’ 开头的后面部分
$ kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')
Name: admin-user-token-4mj2j
Namespace: kube-system
Labels: <none>
Annotations: kubernetes.io/service-account.name: admin-userkubernetes.io/service-account.uid: 86a705ae-50be-4523-8ccb-ceaa0e2bc224Type: kubernetes.io/service-account-tokenData
====
token: eyJhbGciOiJSUzI1NiIsImtpZCI6InlMTng0WTE5NUh3UTg0ZVZ5U1pqTjN6RWZjOHZjT25DRXZmRmdBWjNPQ0UifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLTRtajJqIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiI4NmE3MDVhZS01MGJlLTQ1MjMtOGNjYi1jZWFhMGUyYmMyMjQiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06YWRtaW4tdXNlciJ9.QHOOBISVRqvdKCbt53-tK2wa9FF3vxvWI4bZLlThhNScqP77q6g3wINVa7f4FGomi7uyuvnU4Hsgdzvey9k_FFg5qtpfR4Rzk8i9GcN7N9-FJFZ9w5yXjbftd0hSQynnySQDD_T2hDdID07LJX_fIbSlNhiRtf-FJVD0LyNxVPgdF9XQ8D_Liqs2IQMhWYD6fVb5QNlm98wzFP8B6RD_X7iMW_CFjyKyxOG7-20cm733ilcumQA8qXty1iTcO4WHasJzFLH7Ovd7Ds-9vcgYiJESPvn9oQV8cilJ5DDhTd9tkPxvYP0aYXDpH3ipjOrPONbBjzjbJ7wFItVOjWAr4A
ca.crt: 1350 bytes
namespace: 11 bytes
粘贴 Token,点击登录。
登录成功后的页面如下图所示。
2.6 清理现场
在宿主机上,按照如下步骤清理
- 清理集群
docker exec -it kubeasz ezctl destroy default
。 - 清理运行的容器
./ezdown -C
。 - 清理容器镜像
docker system prune -a
。 - 停止 docker 服务
systemctl stop docker
。 - 使用以下命令删除 docker 文件。
umount /var/run/docker/netns/defaultumount /var/lib/docker/overlayrm -rf /var/lib/docker /var/run/docker
上述清理脚本执行成功后,建议重启节点,以确保清理残留的虚拟网卡、路由等信息。
3 部署多套 Kubernetes 集群
使用一台单独的机器作为 ezctl 的部署节点,ezctl 节点需要能够免密登录部署 Kubernetes 的机器,并且在 ezctl 节点上安装好 ansible(或者直接使用 kubeasz 容器)。
3.1 机器规划
主机名 | IP 地址 | 角色 | 集群 |
---|---|---|---|
cluster01-1 | 11.8.36.159 | master | 集群 1 |
cluster01-2 | 11.8.36.161 | worker | 集群 1 |
cluster01-3 | 11.8.36.160 | worker | 集群 1 |
cluster02-1 | 11.8.36.162 | master | 集群 2 |
cluster02-2 | 11.8.36.163 | worker | 集群 2 |
cluster02-3 | 11.8.38.148 | worker | 集群 2 |
ansible01 | 11.8.36.21 | ezctl 节点 |
3.2 配置免密登录
在 ansible01 机器上配置对 Kubernetes 节点的免密登录。
# 生产公私钥对
ssh-keygen# 拷贝公钥到其他机器
ssh-copy-id root@11.8.36.159
ssh-copy-id root@11.8.36.161
ssh-copy-id root@11.8.36.160
ssh-copy-id root@11.8.36.162
ssh-copy-id root@11.8.36.163
ssh-copy-id root@11.8.38.148
3.3 创建配置文件
使用以下命令生成 Kubernetes 集群的配置文件,在 /etc/kubeasz/clusters/<集群名>
目录下会生产 hosts 和 config.yml 两个配置文件。
# cluster01 是自己取的集群名
./ezctl new cluster01
修改 hosts 配置文件,设置相关节点角色的 IP 地址,其他配置可以保持默认。config.yml 配置文件可以保持默认。
# cluster01 主机信息
# 'etcd' cluster should have odd member(s) (1,3,5,...)
[etcd]
11.8.36.159
11.8.36.161
11.8.36.160# master node(s)
[kube_master]
11.8.36.159# work node(s)
[kube_node]
11.8.36.161
11.8.36.160# 设置网络插件为 calico (可选),默认是 flannel
CLUSTER_NETWORK= "calico"
3.4 安装集群
使用以下命令安装 Kubernetes 集群。
# 一键安装
./ezctl setup cluster01 all# 或者分步安装,具体使用 ezctl help setup 查看分步安装帮助信息
./ezctl setup cluster01 01
./ezctl setup cluster01 02
./ezctl setup cluster01 03
./ezctl setup cluster01 04
...
重复步骤 3.3 创建配置文件和 3.4 安装集群创建 cluster02 集群。
3.5 查看集群状态
# cluster01 状态
root@cluster01-1:/root #kubectl get node
NAME STATUS ROLES AGE VERSION
11.8.36.159 Ready,SchedulingDisabled master 91m v1.22.2
11.8.36.160 Ready node 90m v1.22.2
11.8.36.161 Ready node 90m v1.22.2# cluster02 状态
root@cluster02-1:/root #kubectl get node
NAME STATUS ROLES AGE VERSION
11.8.36.162 Ready,SchedulingDisabled master 5m43s v1.22.2
11.8.36.163 Ready node 4m56s v1.22.2
11.8.38.148 Ready node 4m56s v1.22.2
4 备份和恢复 Etcd
Kubernetes 使用 Etcd 数据库来存储集群中的数据,Etcd 备份的是某一时刻 Kubernetes 集群中的完整状态。接下来将分别介绍 Etcd 的备份与恢复:
- 从运行的 Etcd 集群备份数据到磁盘文件。
- 从 Etcd 备份文件恢复数据,从而使集群恢复到备份时状态。
首先在已经搭建好的 Kubernetes 集群中部署两个测试 deployment。
kubectl create deployment nginx-a --image=nginx
kubectl create deployment nginx-b --image=nginx
查看 deployment 和 pod 运行状态。
$ kubectl get deployments.apps
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-a 1/1 1 1 34s
nginx-b 1/1 1 1 30s$ kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-a-76865cf8c8-w4mqf 1/1 Running 0 29s
nginx-b-6bcf96755c-wwgs4 1/1 Running 0 25s
4.1 备份数据
接下来使用 ezctl backup
命令对集群 cluster01 的 Etcd 进行备份,在备份的时候 Kubernetes 集群中的服务不受影响。
./ezctl backup cluster01
执行完毕可以在部署 ezctl 主机的 /etc/kubeasz/clusters/<集群名>/backup/
目录下检查备份情况,其中,snapshot.db 始终为最近一次备份文件,还有一个带有时间戳的文件表示具体的备份版本,因为我们当前只有一次备份,因此这两个备份文件的内容是一样的。
$ ls -l /etc/kubeasz/clusters/cluster01/backup/
total 6160
-rw------- 1 root root 3149856 Dec 14 13:28 snapshot_202112141328.db
-rw------- 1 root root 3149856 Dec 14 13:29 snapshot.db
现在我们假装误删除 deployment nginx-a。
kubectl delete deployments.apps nginx-a# 查看当前的 deployment,现在只剩下 nginx-b
$ kubectl get deployments.apps
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-b 1/1 1 1 10m
4.2 恢复数据
然后使用 ezctl restore
命令来恢复 Etcd 的备份数据,默认情况下是恢复最近一次的备份文件 snapshot.db,如果需要指定恢复的版本,可以在 roles/cluster-restore/defaults/main.yml
文件中配置需要恢复的 Etcd 备份版本。
./ezctl restore cluster01
在恢复的时候会停止 kube-apiserver,kube-controller-manager, kube-scheduler, kubelet, etcd 等服务,待 Etcd 恢复完毕后,再重启启动服务。
查看恢复后的 deployment 和 pod,可以看到现在 nginx-a deployment 已经恢复。
$ kubectl get deployments.apps
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-a 1/1 1 1 14m
nginx-b 1/1 1 1 14m$ kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-a-76865cf8c8-w4mqf 1/1 Running 0 15m
nginx-b-6bcf96755c-wwgs4 1/1 Running 0 14m
5 参考资料
- kubeasz github 项目地址
- Deploy a Production Ready Kubernetes Cluster
- Ansible for k8s
- K8S 集群备份与恢复
- Kubernetes Etcd 数据备份与恢复
- 通过备份 Etcd 来完美恢复 Kubernetes 中的误删数据
欢迎关注
使用 ezctl 工具部署和管理 Kubernetes 集群相关推荐
- 使用FIT2CLOUD在青云QingCloud快速部署和管理Kubernetes集群
一.Kubernetes概述 Kubernetes是Google一直在推进的容器调度和管理系统,是Google内部使用的容器管理系统Borg的开源版本.它可以实现对Docker容器的部署,配置,伸缩和 ...
- 简单部署 rancher 管理kubernetes集群(3)
rancher 简单使用 运行docker 容器 环境部署 关闭防火墙与selinux systemctl stop firewalld systemctl disable firewalldsed ...
- 检查集群状态命令_轻松管理Kubernetes集群的7个工具
Kubernetes正在不断加快在云原生环境的应用,但如何以统一.安全的方式对运行于任何地方的Kubernetes集群进行管理面临着挑战,而有效的管理工具能够大大降低管理的难度. K9s k9s是基于 ...
- 《Kubernetes部署篇:基于docker使用kubespray工具部署高可用K8S集群(国内互联网方案四)》
文章目录 一.部署背景简介 二.部署工具介绍 三.部署方案介绍 四.部署环境信息 五.部署资源下载 六.部署准备工作 6.1.系统内核升级 6.2.设置主机名 6.3.环境初始化 6.4.ssh多机互 ...
- 《Kubernetes部署篇:基于docker使用kubespray工具部署高可用K8S集群(国内互联网方案三)》
文章目录 一.部署背景简介 二.部署工具介绍 三.部署方案介绍 四.部署环境信息 五.部署资源下载 六.部署准备工作 6.1.系统内核升级 6.2.设置主机名 6.3.环境初始化 6.4.ssh多机互 ...
- 在阿里云上部署生产级别Kubernetes集群
阿里云是国内非常受欢迎的基础云平台,随着Kubernetes的普及,越来越多的企业开始筹划在阿里云上部署自己的Kubernetes集群. 本文将结合实战中总结的经验,分析和归纳一套在阿里云上部署生产级 ...
- k8s.4-kubeadm部署高可用kubernetes集群 1.21
kubeadm部署高可用kubernetes集群 1.21 一.kubernetes 1.21发布 1.1 介绍 2021年04月,Kubernetes 1.21正式与大家见面,这是我们 2021 ...
- 基于ansible的自动化二进制模式部署高可用Kubernetes集群
[说明] 本文档详细描述了在openEuler 22.03 LTS上通过ansible以二进制模式自动化部署高可用Kubernetes集群(适用k8s v1.26版本). 本文档参考了小陈运维的ans ...
- K9s 使用教程:如何高效管理 Kubernetes 集群
文章首发于个人公众号:「阿拉平平」 之前我向大家介绍过一款 K8s 的 IDE:Lens.通过图形界面,我们可以很方便地管理多个集群.不过有的小伙伴可能更习惯使用 kubectl 去管理集群,所以今天 ...
最新文章
- AI时代的幕后英雄:谁在生产高质量的AI训练数据?
- 基于激光雷达点云的3D检测方法汇总(LiDAR only)
- leetcode 贪心_LeetCode进阶1029-贪心
- AI:大力出奇迹?Bigger is better?AI下一代浪潮?—人工智能的大语言模型(LLMs)的简介、发展以及未来趋势
- java arrays.equals_Java Arrays类的常见使用
- android 状态栏、标题栏、屏幕高度
- 基于python和opencv的人脸识别
- 腾讯终于有动作了:国行版Switch快来了...
- 认识IT圈的这些人 你的路将走的更顺利
- VScode正则表达式
- EMC Isilon存储服务器误删除虚拟机恢复过程
- 学习做产品阶段性总结
- BLDC四大方案(转)
- [小白向]Python使用request库调用API并获取返回的JSON数据包中的内容
- 【Hgame2022】第一周misc和web题解
- vbs脚本实现Ping功能
- 增加/删除临时IP地址
- ping命令的常用参数
- 快速上手 Kotlin 开发系列之数据类和枚举
- 手动刷入Android 4.4.1 KOT49E OTA更新包