首页
学习
活动
专区
圈层
工具
发布
50 篇文章
1
kubernetes与velero的第一次尝试
2
在Kubernetes中如何针对Namespace进行资源限制?
3
kubernetes之metrics-server安装与配置
4
kubernetes部署metrics-server
5
Kubernetes1.20.9摘掉一个master节点再重新加入(ETCD需要注意的)
6
Kubernetes 1.17.17升级到1.18.20
7
Kubernetes 1.18.20升级到1.19.12
8
Kubernetes 1.19.12升级到1.20.9(强调一下selfLink)
9
Kubernetes 1.16.15升级到1.17.17
10
使用 kainstall 工具一键部署 kubernetes 高可用集群
11
附034.Kubernetes_v1.21.0高可用部署架构二
12
附016.Kubernetes_v1.17.4高可用部署
13
附022.Kubernetes_v1.18.3高可用部署架构一
14
附024.Kubernetes_v1.18.3高可用部署架构二
15
使用 StatefulSet 部署 etcd 集群
16
Kubernetes 稳定性保障手册 -- 极简版
17
Linux(centos7)离现安装kubernetes1.19.2和docker——组件部分
18
docker register 私有仓库部署 - http模式
19
KubeSphere 开源 KubeEye:Kubernetes 集群自动巡检工具
20
K8S 中的 CPUThrottlingHigh 到底是个什么鬼?
21
全链路分布式跟踪系统 Apache SkyWalking 入门教程
22
pod Evicted的状态究竟是何人所为
23
使用 ezctl 工具部署和管理 Kubernetes 集群
24
Kubernetes部署策略详解
25
kubernetes容器探针检测
26
使用Spring Boot实现动态健康检查HealthChecks
27
真一文搞定 ingress-nginx 的使用
28
K8S备份、恢复、迁移神器 Velero
29
一次关于k8s kubectl top 和 contained ps 不一致的问题探究
30
kubernetes备份恢复之velero
31
使用 Velero 进行集群备份与迁移
32
TKE集群中nginx-ingress使用实践
33
使用velero进行kubernetes灾备
34
Kubernetes 映射外部服务
35
运维体系建设套路
36
k8s解决pod调度不均衡的问题
37
ingress中虚拟路径解决方案
38
容器下的两地三中心建设
39
k8s集群外的主机访问pod的解决方案
40
k8s基础-健康检查机制
41
k8s基础-标签使用
42
ingress-nginx请求改写
43
nginx ingress server alias 多域名多证书问题
44
JAVA | Java 解决跨域问题 花式解决跨域问题
45
如何通过ingress-nginx实现应用灰度发布?
46
在Kubernetes(k8s)中使用GPU
47
使用 Prometheus-Operator 监控 Calico
48
使用Kubespray部署Kubernetes集群
49
云原生下的CI/CD:Argo CD 详解,手把手教你入门
50
Pod的健康检查机制
清单首页k8s文章详情

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

1 ezctl 命令行介绍

kubeasz 项目致力于快速部署高可用的 Kubernetes 集群,同时也提供了关于 Kubernetes 详细的学习资料,在这里强烈推荐给初学者。kubeasz 项目地址:https://github.com/easzlab/kubeasz 。

kubeasz 项目使用 ezctl 方便地创建和管理多个 Kubernetes 集群,ezctl 使用 shell 脚本封装 ansible-playbook 执行命令,它十分轻量、简单和易于扩展。查看 ezctl 工具的命令行提示信息,如下所示:

代码语言:javascript
复制
Usage: ezctl COMMAND [args]
-------------------------------------------------------------------------------------
Cluster setups:
    list                       to list all of the managed clusters
    checkout    <cluster>            to switch default kubeconfig of the cluster
    new         <cluster>            to start a new k8s deploy with name 'cluster'
    setup       <cluster>  <step>    to setup a cluster, also supporting a step-by-step way
    start       <cluster>            to start all of the k8s services stopped by 'ezctl stop'
    stop        <cluster>            to stop all of the k8s services temporarily
    upgrade     <cluster>            to upgrade the k8s cluster
    destroy     <cluster>            to destroy the k8s cluster
    backup      <cluster>            to backup the cluster state (etcd snapshot)
    restore     <cluster>            to restore the cluster state from backups
    start-aio                   to quickly setup an all-in-one cluster with 'default' settings

Cluster ops:
    add-etcd    <cluster>  <ip>      to add a etcd-node to the etcd cluster
    add-master  <cluster>  <ip>      to add a master node to the k8s cluster
    add-node    <cluster>  <ip>      to add a work node to the k8s cluster
    del-etcd    <cluster>  <ip>      to delete a etcd-node from the etcd cluster
    del-master  <cluster>  <ip>      to delete a master node from the k8s cluster
    del-node    <cluster>  <ip>      to delete a work node from the k8s cluster

Extra operation:
    kcfg-adm    <cluster>  <args>    to manage client kubeconfig of the k8s cluster

Use "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。

代码语言:javascript
复制
export release=3.1.1
wget https://github.com/easzlab/kubeasz/releases/download/${release}/ezdown
chmod +x ./ezdown

下载安装部署 Kubernetes 需要的依赖和镜像。

代码语言:javascript
复制
./ezdown -D

下载系统包(可选,当无法使用 yum/apt 在线安装系统包时可以使用)

代码语言:javascript
复制
./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。

代码语言:javascript
复制
./ezdown -S

使用默认配置安装 aio(All in One) 集群。

代码语言:javascript
复制
docker exec -it kubeasz ezctl start-aio

接下来 kubeasz 会使用 ansible playbook 来部署 Kubernetes,运行完毕后如下图所示。

2.4 验证安装

如果提示 kubectl: command not found,退出重新 ssh 登录一下,让环境变量生效即可。

代码语言:javascript
复制
$ 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 发布服务了。

代码语言:javascript
复制
$ 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。

代码语言:javascript
复制
# 获取 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-user
              kubernetes.io/service-account.uid: 86a705ae-50be-4523-8ccb-ceaa0e2bc224

Type:  kubernetes.io/service-account-token

Data
====
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 文件。
代码语言:javascript
复制
 umount /var/run/docker/netns/default
 umount /var/lib/docker/overlay
 rm -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 节点的免密登录。

代码语言:javascript
复制
# 生产公私钥对
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 两个配置文件。

代码语言:javascript
复制
# cluster01 是自己取的集群名
./ezctl new cluster01

修改 hosts 配置文件,设置相关节点角色的 IP 地址,其他配置可以保持默认。config.yml 配置文件可以保持默认。

代码语言:javascript
复制
# 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 集群。

代码语言:javascript
复制
# 一键安装
./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 查看集群状态

代码语言:javascript
复制
# 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。

代码语言:javascript
复制
kubectl create deployment nginx-a --image=nginx
kubectl create deployment nginx-b --image=nginx

查看 deployment 和 pod 运行状态。

代码语言:javascript
复制
$ 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 集群中的服务不受影响。

代码语言:javascript
复制
./ezctl backup cluster01

执行完毕可以在部署 ezctl 主机的 /etc/kubeasz/clusters/<集群名>/backup/目录下检查备份情况,其中,snapshot.db 始终为最近一次备份文件,还有一个带有时间戳的文件表示具体的备份版本,因为我们当前只有一次备份,因此这两个备份文件的内容是一样的。

代码语言:javascript
复制
$ 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。

代码语言:javascript
复制
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 备份版本。

代码语言:javascript
复制
./ezctl restore cluster01

在恢复的时候会停止 kube-apiserver,kube-controller-manager, kube-scheduler, kubelet, etcd 等服务,待 Etcd 恢复完毕后,再重启启动服务。查看恢复后的 deployment 和 pod,可以看到现在 nginx-a deployment 已经恢复。

代码语言:javascript
复制
$ 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 项目地址] (https://github.com/easzlab/kubeasz)
  • [Deploy a Production Ready Kubernetes Cluster] (https://github.com/kubernetes-sigs/kubespray)
  • [Ansible for k8s] (https://cloud.tencent.com/developer/article/1564975)
  • [K8S 集群备份与恢复] (http://www.xuyasong.com/?p=2052)
  • [Kubernetes Etcd 数据备份与恢复] (http://www.mydlq.club/article/74/)
  • [通过备份 Etcd 来完美恢复 Kubernetes 中的误删数据] (https://mp.weixin.qq.com/s/4b2COdr5q4SFfJTy3wl8gA)
下一篇
举报
领券