更新时间:2023 年 2 月
安装 kubernetes 版本:kubenetes 1.25.x
根据 kubernetes 版本,使用 kubeasz 版本为:kubeasz 3.4.3
简介
kubernetes 安装工具 CNCF 认证:Cloud Native Landscape (cncf.io)
kubernetes 各版本安装工具认证:cncf/k8s-conformance
kubernetes 传统安装方式较复杂,各个公司或个人会推出一些简便的安装工具,对传统的二进制安装方式或者 kubeadm 安装方式进行封装。CNCF 针对不同版本的 kubernetes,会对各个工具进行一致性测试,通过后对该安装工具颁发 CNCF 认证。以 kubernetes 1.25.x 为例,通过认证的有 Kubeasz、Kubespray 等等。本文将使用 kubeasz 安装 kubenetes 1.25.x 集群
kubeasz 官方 github 地址: easzlab/kubeasz
kubeasz 是一个部署 k8s
集群的工具,主要特点是基于二进制方式部署和利用 ansible-playbook
实现自动化。kubeasz 可以同时创建、管理多个集群
+----------------+ +-----------------+
|ezctl 1.1.1.1 | |cluster-aio: |
+--+---+---+-----+ | |
| | | |master 4.4.4.4 |
| | +-------------------->+etcd 4.4.4.4 |
| | |node 4.4.4.4 |
| +--------------+ +-----------------+
| |
v v
+--+------------+ +---+----------------------------+
| cluster-1: | | cluster-2: |
| | | |
| master 2.2.2.1| | master 3.3.3.1/3.3.3.2 |
| etcd 2.2.2.2| | etcd 3.3.3.1/3.3.3.2/3.3.3.3 |
| node 2.2.2.3| | node 3.3.3.4/3.3.3.5/3.3.3.6 |
+---------------+ +--------------------------------+
支持的环境
支持环境随版本变更略有不同,请参考:easzlab/kubeasz
**集群版本:**kubernetes v1.22,v1.23,v1.24,v1.25,v1.26
**操作系统:**CentOS/RedHat 7/8,Debian 9/10,Ubuntu 16.04/18.04/20.04/22.04
运行时:containerd v1.6.x,docker 20.10.x (k8s < 1.24)
网络:calico,cilium,flannel,kube-ovn,kube-router
版本选择
kubeasz 会维护近 4~5 个 kubernetes 版本的安装
推荐使用版本对照表
Kubernetes version | kubeasz version |
---|---|
1.22 | 3.1.1 |
1.23 | 3.2.0 |
1.24 | 3.3.1 |
1.25 | 3.4.3 |
1.26 | 3.5.0 |
安装 kubernetes 版本:kubenetes 1.25.x
根据 kubernetes 版本,使用 kubeasz 版本为:kubeasz 3.4.3
准备
主机列表
主机名 | IP | 配置 | 角色 | 安装服务 | 描述 |
---|---|---|---|---|---|
kubeasz-deploy.skynemo.cn | 192.168.111.181 | 1C1G | 部署节点 | kubeasz 3.4.2 | 用于运行 ansible /ezctl 命令 |
etcd-1.skynemo.cn | 192.168.111.182 | etcd 数据库节点 | etcd | 根据 Raft 选举算法,etcd 集群需要奇数个节点 | |
etcd-2.skynemo.cn | 192.168.111.183 | etcd 数据库节点 | etcd | ||
etcd-3.skynemo.cn | 192.168.111.184 | etcd 数据库节点 | etcd | ||
kube-cp-1.skynemo.cn | 192.168.111.185 | 控制面节点 | apiserver kube-controller-manager kube-scheduller | 高可用集群至少 2 个控制面节点 | |
kube-cp-2.skynemo.cn | 192.168.111.186 | 控制面节点 | apiserver kube-controller-manager kube-scheduller | ||
kube-node-1.skynemo.cn | 192.168.111.187 | 工作节点 | kubelet kube-proxy containerd | 运行应用负载的节点 | |
kube-node-2.skynemo.cn | 192.168.111.188 | 工作节点 | kubelet kube-proxy containerd |
注意:默认配置下容器运行时和 kubelet 会占用 /var
的磁盘空间,如果磁盘分区特殊,可以设置 config.yml 中的容器运行时和 kubelet 数据目录:CONTAINERD_STORAGE_DIR
DOCKER_STORAGE_DIR
KUBELET_ROOT_DIR
拓扑结构
其他准备工作
关闭防火墙
所有节点关闭防火墙和 SELinux
# 关闭防火墙和 SELinux
$ systemctl disable --now firewalld
# 关闭 SELinux
$ setenforce 0 && sed -i 's/=enforcing/=disabled/g' /etc/selinux/config
配置主机名解析
$ cat >> /etc/hosts << EOF
192.168.111.181 kubeasz-deploy.skynemo.cn
192.168.111.182 etcd-1.skynemo.cn
192.168.111.183 etcd-2.skynemo.cn
192.168.111.184 etcd-3.skynemo.cn
192.168.111.185 kube-cp-1.skynemo.cn
192.168.111.186 kube-cp-2.skynemo.cn
192.168.111.187 kube-node-1.skynemo.cn
192.168.111.188 kube-node-2.skynemo.cn
EOF
配置 ssh 免密登陆
需要配置从部署节点可以用 root 用户 ssh 免密登录到所有节点,并设置 python 链接
准备
# 安装 sshpass,方便拷贝 ssh 秘钥
$ dnf install -y sshpass
# 生成 SSH 密钥
$ [ -f /root/.ssh/id_rsa ] || ssh-keygen -f /root/.ssh/id_rsa -P ''
创建脚本
$ vim ./ssh-copy-key.sh
#!/bin/bash
# 设置节点 IP 列表
export ips=(192.168.111.181 192.168.111.182 192.168.111.183 192.168.111.184 192.168.111.185 192.168.111.186 192.168.111.187 192.168.111.188)
# 设置连接到节点的 SSH 登录密码
export SSHPASS=520123
for i in ${ips[*]}; do
echo "###### 开始设置节点 ${i} ######"
# 拷贝秘钥到节点
sshpass -e ssh-copy-id -o StrictHostKeyChecking=no root@${i}
# 安装 python3
sshpass -e ssh -o StrictHostKeyChecking=no root@${i} 'dnf -y install python3' &> /dev/null
# 设置 python 链接
sshpass -e ssh -o StrictHostKeyChecking=no root@${i} 'ln -s /usr/bin/python3 /usr/bin/python' &> /dev/null
echo "###### 节点 ${i} 设置完成 ######"
done
执行脚本完成设置
$ bash ./ssh-copy-key.sh
配置时区和时间同步
设置时区
$ timedatectl set-timezone Asia/Shanghai
设置时间同步
本文使用 kubeasz 安装时进行配置(参考:kubeasz/chrony.md ),也可以手动设置
安装 conntrack
conntrack 作为连接跟踪,在非 eBPF 的网络结构下与 kube-proxy 配合使用
$ dnf -y install conntrack
kubeasz 的使用
根据 kubernetes 版本,使用 kubeasz 版本为:kubeasz 3.4.3
kubeasz 的组成可以分为两个部分
-
ezdown
:一个简单的下载脚本,用于下载 kubeasz 项目工具、kubernetes 相关的二进制文件及离线镜像 -
ezctl
:使用 shell 脚本封装 ansible-playbook 执行命令,主要用于创建和管理多个 kubernetes 集群
安装使用 kubeasz
参考文档:kubeasz/00-planning_and_overall_intro.md at master
kubeasz 的 github 版本发布地址:Releases · easzlab/kubeasz (github.com)
下载 ezdown
脚本
# 下载 ezdown
$ export release=3.4.3
$ wget https://github.com/easzlab/kubeasz/releases/download/${release}/ezdown
# 授予执行权限
$ chmod +x ./ezdown
下载相关镜像和工具
# 指定下载的 kubernetes 版本为 1.25.4
$ ./ezdown -D -k v1.25.4
# 下载一些额外镜像(可选,,若需要安装 prometheus 等额外插件时,必须下载)
$ ./ezdown -X
容器化运行 kubeasz
$ ./ezdown -S
使用 ezctl
配置命令 alias
,方便执行容器中的 ezctl
命令
$ echo "alias dk='docker exec -it kubeasz'" >> /root/.bashrc
$ source /root/.bashrc
检查是否正常使用 ezctl
$ dk ezctl --help
ezdown
脚本使用方法
帮助文档
# 查看帮助文档
$ ./ezdown
Usage: ezdown [options] [args]
option:
-C stop&clean all local containers
-D download default binaries/images into "/etc/kubeasz"
-P download system packages for offline installing
-R download Registry(harbor) offline installer
-S start kubeasz in a container
-X download extra images
-a <arc> set architecture, default auto-detected by (uname -m)
-d <ver> set docker-ce version, default "20.10.18"
-e <ver> set kubeasz-ext-bin version, default "1.6.2"
-k <ver> set kubeasz-k8s-bin version, default "v1.25.4"
-m <str> set docker registry mirrors, default "CN"(used in Mainland,China)
-p <ver> set kubeasz-sys-pkg version, default "0.5.2"
-z <ver> set kubeasz version, default "3.4.2"
常用的变量和参数
# 可以直接在脚本中查看支持的变量
$ vim ./ezdown
常用的变量如下
# BASE : 用于指定默认的下载路径(包括所有的镜像和二进制文件),默认为 /etc/kubeasz
BASE="/etc/kubeasz"
###### 可以直接在命令行修改环境变量 #######
# DOCKER_VER : 在部署节点安装 docker 的版本,一般无需修改
DOCKER_VER=20.10.18
# KUBEASZ_VER : 使用的 kubeasz 版本,会使用 docker 进行下载构建
# dockerfile 下载的地址为:https://github.com/easzlab/dockerfile-kubeasz
KUBEASZ_VER=3.4.2
# K8S_BIN_VER : 要下载的 kubernetes 版本,,会使用 docker 进行下载构建
# dockerfile 下载的地址为:https://github.com/easzlab/dockerfile-kubeasz-k8s-bin
K8S_BIN_VER=v1.25.4
# EXT_BIN_VER : 指定 helm、containerd、cilium、etcd 等第三方软件版本,会使用 docker 进行下载构建
# dockerfile 下载的地址为:https://github.com/easzlab/dockerfile-kubeasz-ext-bin
# 详细的软件版本需要到对应 EXT_BIN_VER 版本指定的 dockerfile 中查看
EXT_BIN_VER=1.6.2
# SYS_PKG_VER : 指定 ipset、ipvsadm、socat 等第三方软件版本,会使用 docker 进行下载构建
# dockerfile 下载的地址为:https://github.com/easzlab/dockerfile-kubeasz-sys-pkg
# 详细的软件版本需要到对应 SYS_PKG_VER 版本指定的 dockerfile 中查看
SYS_PKG_VER=0.5.2
常用命令
注:
ezdown
下载的所有文件(kubeasz 代码、二进制、离线镜像)默认均放入目录/etc/kubeasz
下载 kubeasz 代码、二进制、默认容器镜像
# 国内环境
$ ./ezdown -D
# 海外环境
$ ./ezdown -D -m standard
【可选】下载额外容器镜像(cilium、flannel、prometheus 等)
$ ./ezdown -X
【可选】下载离线系统包 (适用于无法使用 yum/apt 仓库情形,)
注:离线系统包仅支持部分操作系统,详见:kubeasz/offline_install.md at master · easzlab/kubeasz (github.com)
$ ./ezdown -P
容器化运行 ezctl
注:
ezctl
依赖于 ansible,容器化运行ezctl
可以不用在本地安装 ansible
$ ./ezdown -S
ezctl
脚本使用方法
参考文档:kubeasz/ezctl.md at master · easzlab/kubeasz (github.com)
配置命令别名
配置命令 alias
,方便执行容器中的 ezctl
命令
echo "alias dk='docker exec -it kubeasz'" >> /root/.bashrc
source /root/.bashrc
帮助文档
$ dk ezctl --help
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:
kca-renew <cluster> to force renew CA certs and all the other certs (with caution)
kcfg-adm <cluster> <args> to manage client kubeconfig of the k8s cluster
Use "ezctl help <command>" for more information about a given command.
当前版本支持的所有命令集合如下:
- 命令集 1:集群相关操作
ezctl list
:显示当前所有管理的集群ezctl checkout <cluster>
:切换默认集群ezctl new <cluster>
:创建新集群配置ezctl setup <cluster> <step>
:安装新集群,可以根据步骤一步步安装,也可以一键执行多个步骤ezctl start <cluster>
:启动临时停止(ezctl stop <cluster>
)的集群ezctl stop <cluster>
:临时停止某个集群(包括集群内运行的 pod)ezctl upgrade <cluster>
:升级集群 kubernetes 组件版本ezctl destroy <cluster>
:删除集群ezctl backup <cluster>
:备份集群(仅使用快照方式备份 etcd 中的数据,不包括 pv 数据和业务应用数据)ezctl restore <cluster>
:从备份中恢复集群ezctl start-aio
:创建单机 all-in-one 集群(类似 minikube)
- 命令集 2:集群节点操作
ezctl add-etcd <cluster> <ip>
:增加 etcd 节点ezctl add-master <cluster> <ip>
:增加控制面节点ezctl add-node <cluster> <ip>
:增加工作节点ezctl del-etcd <cluster> <ip>
:删除 etcd 节点ezctl del-master <cluster> <ip>
:删除控制面节点ezctl del-node <cluster> <ip>
:删除工作节点
- 命令集3:其他操作
ezctl kca-renew <cluster>
:强制刷新集群的 CA 证书以及其他证书ezctl kcfg-adm <cluster> <args>
:管理客户端 kubeconfigezctl help <command>
:显示对应命令的详细帮助文档
setup
帮助文档
$ dk ezctl help setup
Usage: ezctl setup <cluster> <step>
available steps:
01 prepare to prepare CA/certs & kubeconfig & other system settings
02 etcd to setup the etcd cluster
03 container-runtime to setup the container runtime(docker or containerd)
04 kube-master to setup the master nodes
05 kube-node to setup the worker nodes
06 network to setup the network plugin
07 cluster-addon to setup other useful plugins
90 all to run 01~07 all at once
10 ex-lb to install external loadbalance for accessing k8s from outside
11 harbor to install a new harbor server or to integrate with an existed one
examples: ./ezctl setup test-k8s 01 (or ./ezctl setup test-k8s prepare)
./ezctl setup test-k8s 02 (or ./ezctl setup test-k8s etcd)
./ezctl setup test-k8s all
./ezctl setup test-k8s 04 -t restart_master
安装 kubernetes
安装 kubernetes 版本:kubenetes 1.25.4
参考:kubeasz/docs/setup at master · easzlab/kubeasz (github.com)
创建一个新的集群
集群名称为 skynemo.cn
$ dk ezctl new skynemo.cn
2023-01-31 05:37:59 DEBUG generate custom cluster files in /etc/kubeasz/clusters/skynemo.cn
2023-01-31 05:37:59 DEBUG set versions
2023-01-31 05:37:59 DEBUG cluster skynemo.cn: files successfully created.
2023-01-31 05:37:59 INFO next steps 1: to config '/etc/kubeasz/clusters/skynemo.cn/hosts'
2023-01-31 05:37:59 INFO next steps 2: to config '/etc/kubeasz/clusters/skynemo.cn/config.yml'
创建集群后,会生成两个集群的配置文件,分别用于配置主机信息和集群信息
/etc/kubeasz/clusters/skynemo.cn/hosts
/etc/kubeasz/clusters/skynemo.cn/config.yml
00-基础参数设置
设置节点信息
$ vim /etc/kubeasz/clusters/skynemo.cn/hosts
cat /etc/kubeasz/clusters/skynemo.cn/hosts
# 'etcd' cluster should have odd member(s) (1,3,5,...)
[etcd]
192.168.111.182
192.168.111.183
192.168.111.184
# master node(s)
[kube_master]
192.168.111.185
192.168.111.186
# work node(s)
[kube_node]
192.168.111.187
192.168.111.188
# [optional] harbor server, a private docker registry
# 'NEW_INSTALL': 'true' to install a harbor server; 'false' to integrate with existed one
[harbor]
#192.168.1.8 NEW_INSTALL=false
# [optional] loadbalance for accessing k8s from outside
[ex_lb]
#192.168.1.6 LB_ROLE=backup EX_APISERVER_VIP=192.168.1.250 EX_APISERVER_PORT=8443
#192.168.1.7 LB_ROLE=master EX_APISERVER_VIP=192.168.1.250 EX_APISERVER_PORT=8443
# [optional] ntp server for the cluster
[chrony]
#192.168.1.1
192.168.111.181
[all:vars]
# --------- Main Variables ---------------
# Secure port for apiservers
SECURE_PORT="6443"
# Cluster container-runtime supported: docker, containerd
# if k8s version >= 1.24, docker is not supported
CONTAINER_RUNTIME="containerd"
# Network plugins supported: calico, flannel, kube-router, cilium, kube-ovn
CLUSTER_NETWORK="calico"
# Service proxy mode of kube-proxy: 'iptables' or 'ipvs'
PROXY_MODE="ipvs"
# K8S Service CIDR, not overlap with node(host) networking
SERVICE_CIDR="10.68.0.0/16"
# Cluster CIDR (Pod CIDR), not overlap with node(host) networking
CLUSTER_CIDR="172.20.0.0/16"
# NodePort Range
NODE_PORT_RANGE="30000-32767"
# Cluster DNS Domain
CLUSTER_DNS_DOMAIN="skynemo.cn"
# -------- Additional Variables (don't change the default value right now) ---
# Binaries Directory
bin_dir="/opt/kube/bin"
# Deploy Directory (kubeasz workspace)
base_dir="/etc/kubeasz"
# Directory for a specific cluster
cluster_dir="{{ base_dir }}/clusters/skynemo.cn"
# CA and other components cert/key Directory
ca_dir="/etc/kubernetes/ssl"
设置 kubernetes 集群信息
$ vim /etc/kubeasz/clusters/skynemo.cn/config.yml
############################
# prepare
############################
# 可选离线安装系统软件包 (offline|online)
INSTALL_SOURCE: "online"
# 可选进行系统安全加固 github.com/dev-sec/ansible-collection-hardening
OS_HARDEN: false
############################
# role:deploy
############################
# default: ca will expire in 100 years
# default: certs issued by the ca will expire in 50 years
CA_EXPIRY: "876000h"
CERT_EXPIRY: "438000h"
# force to recreate CA and other certs, not suggested to set 'true'
CHANGE_CA: false
# kubeconfig 配置参数
CLUSTER_NAME: "skynemo.cn"
CONTEXT_NAME: "context-{{ CLUSTER_NAME }}"
# k8s version
K8S_VER: "1.25.4"
############################
# role:etcd
############################
# 设置不同的wal目录,可以避免磁盘io竞争,提高性能
ETCD_DATA_DIR: "/var/lib/etcd"
ETCD_WAL_DIR: ""
############################
# role:runtime [containerd,docker]
############################
# ------------------------------------------- containerd
# [.]启用容器仓库镜像
ENABLE_MIRROR_REGISTRY: true
# [containerd]基础容器镜像
SANDBOX_IMAGE: "easzlab.io.local:5000/easzlab/pause:3.9"
# [containerd]容器持久化存储目录
CONTAINERD_STORAGE_DIR: "/var/lib/containerd"
# ------------------------------------------- docker
# [docker]容器存储目录
DOCKER_STORAGE_DIR: "/var/lib/docker"
# [docker]开启Restful API
ENABLE_REMOTE_API: false
# [docker]信任的HTTP仓库
INSECURE_REG: '["http://easzlab.io.local:5000"]'
############################
# role:kube-master
############################
# k8s 集群 master 节点证书配置,可以添加多个ip和域名(比如增加公网ip和域名)
MASTER_CERT_HOSTS:
- "192.168.111.185"
- "192.168.111.186"
- "kube-cp-1.skynemo.cn"
- "kube-cp-2.skynemo.cn"
#- "10.1.1.1"
#- "k8s.easzlab.io"
#- "www.test.com"
# node 节点上 pod 网段掩码长度(决定每个节点最多能分配的pod ip地址)
# 如果flannel 使用 --kube-subnet-mgr 参数,那么它将读取该设置为每个节点分配pod网段
# https://github.com/coreos/flannel/issues/847
NODE_CIDR_LEN: 24
############################
# role:kube-node
############################
# Kubelet 根目录
KUBELET_ROOT_DIR: "/var/lib/kubelet"
# node节点最大pod 数
MAX_PODS: 110
# 配置为kube组件(kubelet,kube-proxy,dockerd等)预留的资源量
# 数值设置详见templates/kubelet-config.yaml.j2
KUBE_RESERVED_ENABLED: "no"
# k8s 官方不建议草率开启 system-reserved, 除非你基于长期监控,了解系统的资源占用状况;
# 并且随着系统运行时间,需要适当增加资源预留,数值设置详见templates/kubelet-config.yaml.j2
# 系统预留设置基于 4c/8g 虚机,最小化安装系统服务,如果使用高性能物理机可以适当增加预留
# 另外,集群安装时候apiserver等资源占用会短时较大,建议至少预留1g内存
SYS_RESERVED_ENABLED: "no"
############################
# role:network [flannel,calico,cilium,kube-ovn,kube-router]
############################
# ------------------------------------------- flannel
# [flannel]设置flannel 后端"host-gw","vxlan"等
FLANNEL_BACKEND: "vxlan"
DIRECT_ROUTING: false
# [flannel]
flannel_ver: "v0.19.2"
# ------------------------------------------- calico
# [calico] IPIP隧道模式可选项有: [Always, CrossSubnet, Never],跨子网可以配置为Always与CrossSubnet(公有云建议使用always比较省事,其他的话需要修改各自公有云的网络配置,具体可以参考各个公有云说明)
# 其次CrossSubnet为隧道+BGP路由混合模式可以提升网络性能,同子网配置为Never即可.
CALICO_IPV4POOL_IPIP: "Always"
# [calico]设置 calico-node使用的host IP,bgp邻居通过该地址建立,可手工指定也可以自动发现
IP_AUTODETECTION_METHOD: "can-reach={{ groups['kube_master'][0] }}"
# [calico]设置calico 网络 backend: brid, vxlan, none
CALICO_NETWORKING_BACKEND: "brid"
# [calico]设置calico 是否使用route reflectors
# 如果集群规模超过50个节点,建议启用该特性
CALICO_RR_ENABLED: false
# CALICO_RR_NODES 配置route reflectors的节点,如果未设置默认使用集群master节点
# CALICO_RR_NODES: ["192.168.1.1", "192.168.1.2"]
CALICO_RR_NODES: []
# [calico]更新支持calico 版本: ["3.19", "3.23"]
calico_ver: "v3.23.5"
# [calico]calico 主版本
calico_ver_main: "{{ calico_ver.split('.')[0] }}.{{ calico_ver.split('.')[1] }}"
# ------------------------------------------- cilium
# [cilium]镜像版本
cilium_ver: "1.12.4"
cilium_connectivity_check: true
cilium_hubble_enabled: false
cilium_hubble_ui_enabled: false
# ------------------------------------------- kube-ovn
# [kube-ovn]选择 OVN DB and OVN Control Plane 节点,默认为第一个master节点
OVN_DB_NODE: "{{ groups['kube_master'][0] }}"
# [kube-ovn]离线镜像tar包
kube_ovn_ver: "v1.5.3"
# ------------------------------------------- kube-router
# [kube-router]公有云上存在限制,一般需要始终开启 ipinip;自有环境可以设置为 "subnet"
OVERLAY_TYPE: "full"
# [kube-router]NetworkPolicy 支持开关
FIREWALL_ENABLE: true
# [kube-router]kube-router 镜像版本
kube_router_ver: "v0.3.1"
busybox_ver: "1.28.4"
############################
# role:cluster-addon
############################
# coredns 自动安装
dns_install: "yes"
corednsVer: "1.9.3"
ENABLE_LOCAL_DNS_CACHE: true
dnsNodeCacheVer: "1.22.13"
# 设置 local dns cache 地址
LOCAL_DNS_CACHE: "169.254.20.10"
# metric server 自动安装
metricsserver_install: "no"
metricsVer: "v0.5.2"
# dashboard 自动安装
dashboard_install: "yes"
dashboardVer: "v2.7.0"
dashboardMetricsScraperVer: "v1.0.8"
# prometheus 自动安装
prom_install: "no"
prom_namespace: "monitor"
prom_chart_ver: "39.11.0"
# nfs-provisioner 自动安装
nfs_provisioner_install: "no"
nfs_provisioner_namespace: "kube-system"
nfs_provisioner_ver: "v4.0.2"
nfs_storage_class: "managed-nfs-storage"
nfs_server: "192.168.1.10"
nfs_path: "/data/nfs"
# network-check 自动安装
network_check_enabled: false
network_check_schedule: "*/5 * * * *"
############################
# role:harbor
############################
# harbor version,完整版本号
HARBOR_VER: "v2.1.5"
HARBOR_DOMAIN: "harbor.easzlab.io.local"
HARBOR_PATH: /var/data
HARBOR_TLS_PORT: 8443
HARBOR_REGISTRY: "{{ HARBOR_DOMAIN }}:{{ HARBOR_TLS_PORT }}"
# if set 'false', you need to put certs named harbor.pem and harbor-key.pem in directory 'down'
HARBOR_SELF_SIGNED_CERT: true
# install extra component
HARBOR_WITH_NOTARY: false
HARBOR_WITH_TRIVY: false
HARBOR_WITH_CLAIR: false
HARBOR_WITH_CHARTMUSEUM: true
01-环境初始化
环境初始化的 task 文件为:
/etc/kubeasz/roles/prepare/tasks/main.yml
详细的操作可以参考:kubeasz/01-CA_and_prerequisite.md
环境初始化会准备证书并对系统做一些设置
$ dk ezctl setup skynemo.cn 01
# 或
$ dk ezctl setup skynemo.cn prepare
02-安装 etcd
安装 etcd 的 task 文件为:
/etc/kubeasz/roles/etcd/tasks/main.yml
详细的操作可以参考:kubeasz/02-install_etcd.md
$ dk ezctl setup skynemo.cn 02
# 或
$ dk ezctl setup skynemo.cn etcd
验证 etcd 安装情况
进入 etcd 服务器,使用 etcdctl
命令验证 etcd 健康状态
$ export ETCD_IPS="192.168.111.182 192.168.111.183 192.168.111.184"
$ for ip in ${ETCD_IPS};do
ETCDCTL_API=3
/opt/kube/bin/etcdctl \
--endpoints=https://${ip}:2379 \
--cacert=/etc/kubernetes/ssl/ca.pem \
--cert=/etc/kubernetes/ssl/etcd.pem \
--key=/etc/kubernetes/ssl/etcd-key.pem \
endpoint health;
done
# 返回如下信息标识 etcd 健康
https://192.168.111.182:2379 is healthy: successfully committed proposal: took = 13.685927ms
https://192.168.111.183:2379 is healthy: successfully committed proposal: took = 10.039673ms
https://192.168.111.184:2379 is healthy: successfully committed proposal: took = 9.707021ms
注:etcd 常用工具包括
etcdctl
和etcdutl
。根据官方介绍,etcdctl
后续会主要负责网络部分,etcdutl
主要负责数据部分
03-安装容器运行时
安装 etcd 的 task 文件为:
/etc/kubeasz/roles/containerd/tasks/main.yml
详细的操作可以参考:kubeasz/03-container_runtime.md
注:kubeasz 根据 k8s 版本提供不同的默认容器运行时:
- k8s 版本 < 1.24 时,支持 docker、containerd 二选一
- k8s 版本 >= 1.24 时,仅支持 containerd
$ dk ezctl setup skynemo.cn 03
# 或
$ dk ezctl setup skynemo.cn container-runtime
04-安装控制面节点组件
安装控制面节点组件的 task 文件为:
/etc/kubeasz/roles/kube-master/tasks/main.yml
详细的操作可以参考:kubeasz/04-install_kube_master.md
$ dk ezctl setup skynemo.cn 04
# 或
$ dk ezctl setup skynemo.cn kube-master
验证控制面节点组件安装情况
在控制面节点查看组件安装以及运行情况
# 查看进程状态
$ systemctl status kube-apiserver
$ systemctl status kube-controller-manager
$ systemctl status kube-scheduler
# 查看进程运行日志
$ journalctl -u kube-apiserver
$ journalctl -u kube-controller-manager
$ journalctl -u kube-scheduler
在部署节点使用 kubectl
检查节点情况
$ /etc/kubeasz/bin/kubectl get componentstatus
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
scheduler Healthy ok
etcd-2 Healthy {"health":"true","reason":""}
etcd-1 Healthy {"health":"true","reason":""}
etcd-0 Healthy {"health":"true","reason":""}
05-安装工作节点组件
安装工作节点组件的 task 文件为:
/etc/kubeasz/roles/kube-node/tasks/main.yml
详细的操作可以参考:kubeasz/05-install_kube_node.md
$ dk ezctl setup skynemo.cn 05
# 或
$ dk ezctl setup skynemo.cn kube-node
验证工作节点组件状态
在工作节点查看组件安装以及运行情况
# 查看状态
$ systemctl status kubelet
$ systemctl status kube-proxy
# 查看运行日志
$ journalctl -u kubelet
$ journalctl -u kube-proxy
在部署节点使用 kubectl
检查节点情况
$ /etc/kubeasz/bin/kubectl get node
NAME STATUS ROLES AGE VERSION
192.168.111.185 Ready,SchedulingDisabled master 9m47s v1.25.4
192.168.111.186 Ready,SchedulingDisabled master 9m46s v1.25.4
192.168.111.187 Ready node 4m17s v1.25.4
192.168.111.188 Ready node 4m17s v1.25.4
06-安装网络组件
安装工作节点组件的 task 文件为:
/etc/kubeasz/roles/kube-node/tasks/main.yml
详细的操作可以参考:kubeasz/06-install_network_plugin.md
安装的网络组件类型可以在/etc/kubeasz/clusters/skynemo.cn/hosts
文件中设置变量 CLUSTER_NETWORK="calico"
calico 组件安装的详细流程:kubeasz/calico.md
kubeasz 安装 calico 流程
-
安装前检查主机名不能有大写字母,只能由
小写字母
-
.
组成。官方原话:name must consist of lower case alphanumeric characters, '-' or '.'
虽然 calico-node v3.0.6 以上版本已经解决主机大写字母问题,但仍建议使用小写
-
安装前必须确保各节点主机名不重复 ,calico node name 由节点主机名决定,如果重复,那么重复节点在etcd 中只存储一份配置,BGP 邻居也不会建立。
-
安装之前必须确保
kube_master
和kube_node
节点已经成功部署 -
轮询等待 calico 网络插件安装完成,删除之前 kube_node 安装时默认 cni 网络配置
安装
$ dk ezctl setup skynemo.cn 06
# 或
$ dk ezctl setup skynemo.cn network
验证 calico 网络
验证网络组件状态
$ /etc/kubeasz/bin/kubectl get pod --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system calico-kube-controllers-76b7d65789-l4grl 1/1 Running 0 2m1s
kube-system calico-node-d8f45 1/1 Running 0 2m1s
kube-system calico-node-hs89f 1/1 Running 0 2m1s
kube-system calico-node-kf6xj 1/1 Running 0 2m1s
kube-system calico-node-xzfhn 1/1 Running 0 2m1s
查看所有 calico 节点状态
$ /opt/kube/bin/calicoctl node status
Calico process is running.
IPv4 BGP status
+-----------------+-------------------+-------+----------+-------------+
| PEER ADDRESS | PEER TYPE | STATE | SINCE | INFO |
+-----------------+-------------------+-------+----------+-------------+
| 192.168.111.186 | node-to-node mesh | up | 05:47:17 | Established |
| 192.168.111.187 | node-to-node mesh | up | 05:47:18 | Established |
| 192.168.111.188 | node-to-node mesh | up | 05:47:25 | Established |
+-----------------+-------------------+-------+----------+-------------+
IPv6 BGP status
No IPv6 peers found.
BGP 协议是通过 TCP 连接来建立邻居的,因此可以用 netstat
或 ss
命令验证 BGP Peer
$ ss -antp | grep ESTAB | grep ':179'
ESTAB 0 0 192.168.111.185:179 192.168.111.187:45687 users:(("bird",pid=58902,fd=9))
ESTAB 0 0 192.168.111.185:179 192.168.111.188:44719 users:(("bird",pid=58902,fd=10))
ESTAB 0 0 192.168.111.185:179 192.168.111.186:41595 users:(("bird",pid=58902,fd=8))
查看 etcd 中 calico 相关信息
# 查看所有 calico 相关数据
ETCDCTL_API=3 etcdctl --endpoints="http://127.0.0.1:2379" get --prefix /calico
# 查看 calico 网络为各节点分配的网段
ETCDCTL_API=3 etcdctl --endpoints="http://127.0.0.1:2379" get --prefix /calico/ipam/v2/host
检查 calico 创建网络接口是否正常
创建测试 pod
$ /etc/kubeasz/bin/kubectl run test --image=busybox sleep 30000
$ /etc/kubeasz/bin/kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test 1/1 Running 0 9m47s 172.20.195.1 192.168.111.187 <none> <none>
到 pod 的运行节点上查看网络接口
$ ip a | grep '^[0-9]'
......
4: tunl0@NONE: <NOARP,UP,LOWER_UP> mtu 1480 qdisc noqueue state UNKNOWN group default qlen 1000
7: cali1037a54e65e@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
- 可以看到包含类似 calixxxxx 的网卡,是 calico 为测试 pod 生成的
- tunl0 网卡则是默认生成的,当开启 calico 的 IPIP 特性时使用的隧道
07-安装集群主要插件
kubeasz 支持安装的插件包括 coredns、metric server、dashboard、prometheus、nfs-provisioner。可以在配置文件 /etc/kubeasz/clusters/skynemo.cn/config.yml
中设置要安装的插件。也可以手动进行部署安装
安装 coredns
coredns 官网:CoreDNS: DNS and Service Discovery
coredns 配置如下
....
# coredns 自动安装
dns_install: "yes"
corednsVer: "1.9.3"
ENABLE_LOCAL_DNS_CACHE: true
dnsNodeCacheVer: "1.22.13"
# 设置 local dns cache 地址
LOCAL_DNS_CACHE: "169.254.20.10"
安装插件
$ dk ezctl setup skynemo.cn 07
# 或
$ dk ezctl setup skynemo.cn cluster-addon
检查
检查 pod 状态
$ /etc/kubeasz/bin/kubectl get pods -A | grep coredns
kube-system coredns-6994896589-z4nbs 1/1 Running 0 110s
检查域名解析
$ /etc/kubeasz/bin/kubectl run busybox --rm -it --image=busybox:1.28.4 sh
If you don't see a command prompt, try pressing enter.
/ # nslookup kubernetes
Server: 169.254.20.10
Address 1: 169.254.20.10
Name: kubernetes
Address 1: 10.68.0.1 kubernetes.default.svc.skynemo.cn
安装 dashboard
dashborad 的 github 地址: kubernetes/dashboard: General-purpose web UI for Kubernetes clusters
dashboard 配置
....
# dashboard 自动安装
dashboard_install: "yes"
dashboardVer: "v2.7.0"
dashboardMetricsScraperVer: "v1.0.8"
安装插件
$ dk ezctl setup skynemo.cn 07
# 或
$ dk ezctl setup skynemo.cn cluster-addon
检查安装情况
$ /etc/kubeasz/bin/kubectl get pods -A | grep dashboard
kube-system dashboard-metrics-scraper-86cbf5f9dd-m469b 1/1 Running 0 90s
kube-system kubernetes-dashboard-747c6cbd4b-d4wlf 1/1 Running 0 90s
升级 kubernetes
参考文档 1:kubeasz/upgrade.md at master · easzlab/kubeasz (github.com)
参考文档 2:kubeasz/cluster_restore.md at master · easzlab/kubeasz (github.com)
注:集群升级存在一定风险,请谨慎操作
- kubeasz 支持 k8s 相同大版本基础上升级任意小版本,比如当前安装集群为1.25.0,你可以方便的升级到任何1.25.x 版本
- 不建议跨大版本升级,一般大版本更新时 k8s api 有一些变动
备份 etcd 数据
方式一:使用 kubeasz 备份
kubeasz
项目可以执行备份恢复操作,详情文档:kubeasz/cluster_restore.md
$ dk ezctl backup skynemo.cn
方式二:手动备份
在任意的 etcd 节点上运行
# snapshot 备份
$ ETCDCTL_API=3 etcdctl snapshot save backup.db
# 查看备份
$ ETCDCTL_API=3 etcdctl --write-out=table snapshot status backup.db
升级 k8s 小版本
升级k8s
小版本,比较常见如Bug 修复
特性发布
时使用,kubeasz 提供了升级 k8s 的方案
流程
- 首先去官网 release 页面下载待升级的 k8s 版本,例如
https://dl.k8s.io/v1.25.6/kubernetes-server-linux-amd64.tar.gz
- 解压下载的 tar.gz 文件,找到如下
kube*
开头的二进制,复制替换 kubeasz 控制端目录/etc/kubeasz/bin
对应文件- kube-apiserver
- kube-controller-manager
- kubectl
- kubelet
- kube-proxy
- kube-scheduler
- 在 kubeasz 控制端执行
dk ezctl upgrade <cluster name>
即可完成 k8s 升级,不会中断业务应用
下载二进制文件
$ wget https://dl.k8s.io/v1.25.6/kubernetes-server-linux-amd64.tar.gz
备份二进制文件
$ ll /etc/kubeasz/bin/kube*
$ mkdir -p /etc/kubeasz/bin/backup-k8s-v1.25.4
$ mv /etc/kubeasz/bin/kube* /etc/kubeasz/bin/backup-k8s-v1.25.4/
解压
$ tar xvf kubernetes-server-linux-amd64.tar.gz
# 复制到对应目录
$ cp kubernetes/server/bin/{kube-apiserver,kube-controller-manager,kubectl,kubelet,kube-proxy,kube-scheduler} /etc/kubeasz/bin/
升级
$ dk ezctl upgrade skynemo.cn
验证
$ /opt/kube/bin/kubelet --version
Kubernetes v1.25.6
升级 containerd
kubeasz 没有提供升级 containerd 的升级方案,需要进行手动升级,并且为了保证业务的可用性,建议一个一个节点升级
此处仅演示升级以下 containerd 相关组件
containerd
containerd-shim
containerd-shim-runc-v1
containerd-shim-runc-v2
ctr
其他相关组件(
crictl
、runc
)升级类似,需手动下载替换
驱逐节点 pod
一般现网业务要求零中断,所以升级前需要先驱逐 pod
# 停止调度
$ /etc/kubeasz/bin/kubectl cordon 192.168.111.187
# 驱逐 pod
$ /etc/kubeasz/bin/kubectl drain 192.168.111.187 --delete-emptydir-data --force --ignore-daemonsets
升级 containerd
关闭相关服务进程
$ systemctl stop kubelet
关闭 containerd
进程
$ systemctl stop containerd
检查当前版本
$ /opt/kube/bin/containerd --version
containerd github.com/containerd/containerd v1.6.14 9ba4b250366a5ddde94bb7c9d1def331423aa323
升级
# 下载新版本 containerd
$ wget https://github.com/containerd/containerd/releases/download/v1.6.16/containerd-1.6.16-linux-amd64.tar.gz
# 创建备份目录
$ mkdir -p /opt/kube/bin//backup-containerd-v1.6.14
# 备份原有的 containerd
$ cp /opt/kube/bin/containerd* /opt/kube/bin//backup-containerd-v1.6.14
# 解压覆盖
$ tar -zxvf containerd-1.6.16-linux-amd64.tar.gz -C /opt/kube/
检查版本
$ /opt/kube/bin/containerd --version
containerd github.com/containerd/containerd v1.6.16 31aa4358a36870b21a992d3ad2bef29e1d693bec
关闭 containerd
进程
$ systemctl start containerd
关闭相关服务进程
$ systemctl start kubelet
恢复节点调度
$ /etc/kubeasz/bin/kubectl uncordon 192.168.111.187
其他升级说明
etcd 的升级
-
下载所有组件相关新的二进制解压并替换
/etc/kubeasz/bin/
目录下文件 -
升级 etcd
$ dk ansible-playbook -i clusters/k8s-01/hosts -e @clusters/k8s-01/config.yml -t upgrade_etcd playbooks/02.etcd.yml
扩容 kubernetes
新增控制面节点
注:新增节点需要关闭防火墙、配置 ssh 免密登录等操作
查看原有节点
$ /etc/kubeasz/bin/kubectl get nodes
NAME STATUS ROLES AGE VERSION
192.168.111.185 Ready,SchedulingDisabled node 7d3h v1.25.6
192.168.111.186 Ready,SchedulingDisabled node 7d3h v1.25.6
192.168.111.187 Ready node 7d3h v1.25.6
192.168.111.188 Ready node 7d3h v1.25.6
新增节点
$ dk ezctl add-master skynemo.cn 192.168.111.189
查看新增节点情况
$ /etc/kubeasz/bin/kubectl get nodes
NAME STATUS ROLES AGE VERSION
192.168.111.185 Ready,SchedulingDisabled node 7d5h v1.25.6
192.168.111.186 Ready,SchedulingDisabled node 7d5h v1.25.6
192.168.111.187 Ready node 7d5h v1.25.6
192.168.111.188 Ready node 7d5h v1.25.6
192.168.111.189 Ready,SchedulingDisabled master 2m8s v1.25.6
其他相关信息
# kubeasz 会自动修改 ansible 的 hosts 文件
$ cat /etc/kubeasz/clusters/skynemo.cn/hosts
......
# master node(s)
[kube_master]
192.168.111.189
192.168.111.185
192.168.111.186
......
# kubeasz 会自动修改工作节点上负载均衡的后端节点信息
$ cat /etc/kube-lb/conf/kube-lb.conf
user root;
worker_processes 1;
error_log /etc/kube-lb/logs/error.log warn;
events {
worker_connections 3000;
}
stream {
upstream backend {
server 192.168.111.189:6443 max_fails=2 fail_timeout=3s;
server 192.168.111.185:6443 max_fails=2 fail_timeout=3s;
server 192.168.111.186:6443 max_fails=2 fail_timeout=3s;
}
server {
listen 127.0.0.1:6443;
proxy_connect_timeout 1s;
proxy_pass backend;
}
}
新增工作节点
注:新增节点需要关闭防火墙、配置 ssh 免密登录等操作
查看原有节点
$ /etc/kubeasz/bin/kubectl get node
NAME STATUS ROLES AGE VERSION
192.168.111.185 Ready,SchedulingDisabled node 7d6h v1.25.6
192.168.111.186 Ready,SchedulingDisabled node 7d6h v1.25.6
192.168.111.187 Ready node 7d6h v1.25.6
192.168.111.188 Ready node 7d6h v1.25.6
192.168.111.189 Ready,SchedulingDisabled master 20m v1.25.6
新增节点
$ dk ezctl add-node skynemo.cn 192.168.111.190
查看新增节点情况
$ /etc/kubeasz/bin/kubectl get nodes
NAME STATUS ROLES AGE VERSION
192.168.111.185 Ready,SchedulingDisabled node 7d6h v1.25.6
192.168.111.186 Ready,SchedulingDisabled node 7d6h v1.25.6
192.168.111.187 Ready node 7d6h v1.25.6
192.168.111.188 Ready node 7d6h v1.25.6
192.168.111.189 Ready,SchedulingDisabled master 26m v1.25.6
192.168.111.190 Ready node 3m12s v1.25.6
其他相关信息
# kubeasz 会自动修改 ansible 的 hosts 文件
$ cat /etc/kubeasz/clusters/skynemo.cn/hosts
......
# work node(s)
[kube_node]
192.168.111.190
192.168.111.187
192.168.111.188
......
其他集群操作
kubeasz 操作集群备份恢复
参考文档:kubeasz/cluster
kubeasz 的集群备份恢复本质上即是通过 etcd 的快照备份恢复
etcd 的快照备份恢复,新手操作时容易出现脑裂,不推荐现网项目使用,项目上会用一些集成工具进行备份恢复
kubeasz 关于备份恢复的 ansible-playbook 文件
- 备份:
/etc/kubeasz/playbooks/94.backup.yml
- 恢复:
/etc/kubeasz/playbooks/95.restore.yml
新建测试 deployment
创建 deployment 的 yaml 文件
$ vim demo-busybox-1.28.4.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: busybox
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: busybox-selector
template:
metadata:
labels:
app: busybox-selector
spec:
restartPolicy: Always
containers:
- name: busybox
command:
- sleep
- "3600"
image: busybox:1.28.4
应用 yaml 文件
$ /etc/kubeasz/bin/kubectl apply -f demo-busybox-1.28.4.yaml
备份
$ dk ezctl backup skynemo.cn
查看备份文件
# snapshot.db 始终为最近一次备份文件
$ ll /etc/kubeasz/clusters/skynemo.cn/backup/
total 8904
-rw-------. 1 root root 2396192 Feb 1 18:08 snapshot_202302011008.db
-rw-------. 1 root root 3354656 Feb 8 17:54 snapshot_202302080954.db
-rw-------. 1 root root 3354656 Feb 8 17:54 snapshot.db
删除测试 deployment
$ /etc/kubeasz/bin/kubectl delete -f demo-busybox-1.28.4.yaml
恢复
注: kubeasz 采用数据覆盖的方式恢复,极易出现 etcd 脑裂情况。项目上使用建议先修改 playbook 文件
# 使用 snapshot.db 进行恢复一份数据,然后覆盖其他数据
# 如果需要其他备份版本,则重命名为 snapshot.db
$ dk ezctl restore skynemo.cn
cat /etc/kubeasz/playbooks/94.backup.yml
# cluster-backup playbook
# read the guide: 'op/cluster_restore.md'
- hosts:
- localhost
tasks:
# step1: find a healthy member in the etcd cluster
- name: set NODE_IPS of the etcd cluster
set_fact: NODE_IPS="{% for host in groups['etcd'] %}{{ host }} {% endfor %}"
- name: get etcd cluster status
shell: 'for ip in {{ NODE_IPS }};do \
ETCDCTL_API=3 {{ base_dir }}/bin/etcdctl \
--endpoints=https://"$ip":2379 \
--cacert={{ cluster_dir }}/ssl/ca.pem \
--cert={{ cluster_dir }}/ssl/etcd.pem \
--key={{ cluster_dir }}/ssl/etcd-key.pem \
endpoint health; \
done'
register: ETCD_CLUSTER_STATUS
ignore_errors: true
- debug: var="ETCD_CLUSTER_STATUS"
- name: get a running ectd node
shell: 'echo -e "{{ ETCD_CLUSTER_STATUS.stdout }}" \
"{{ ETCD_CLUSTER_STATUS.stderr }}" \
|grep "is healthy"|cut -d: -f2|cut -d/ -f3'
register: RUNNING_NODE
- debug: var="RUNNING_NODE.stdout"
- name: get current time
shell: "date +'%Y%m%d%H%M'"
register: timestamp
# step2: backup data to the ansible node
- name: make a backup on the etcd node
shell: "mkdir -p {{ cluster_dir }}/backup/{{ item }} && cd {{ cluster_dir }}/backup && \
ETCDCTL_API=3 {{ base_dir }}/bin/etcdctl \
--endpoints=https://{{ item }}:2379 \
--cacert={{ cluster_dir }}/ssl/ca.pem \
--cert={{ cluster_dir }}/ssl/etcd.pem \
--key={{ cluster_dir }}/ssl/etcd-key.pem \
snapshot save {{ item }}/snapshot_{{ timestamp.stdout }}.db"
args:
warn: false
loop: "{{ RUNNING_NODE.stdout_lines }}"
- name: update the latest backup
shell: 'cd {{ cluster_dir }}/backup/ && /bin/cp -f {{ item }}/snapshot_{{ timestamp.stdout }}.db {{ item }}/snapshot.db'
loop: "{{ RUNNING_NODE.stdout_lines }}"
vim /etc/kubeasz/roles/cluster-restore/tasks/main.yml
- name: set NODE_IPS of the etcd cluster
set_fact: NODE_IPS="{% for host in groups['etcd'] %}{{ host }} {% endfor %}"
- name: get etcd cluster status
shell: 'for ip in {{ NODE_IPS }};do \
ETCDCTL_API=3 {{ base_dir }}/bin/etcdctl \
--endpoints=https://"$ip":2379 \
--cacert={{ cluster_dir }}/ssl/ca.pem \
--cert={{ cluster_dir }}/ssl/etcd.pem \
--key={{ cluster_dir }}/ssl/etcd-key.pem \
endpoint health; \
done'
register: ETCD_CLUSTER_STATUS
ignore_errors: true
delegate_to: 127.0.0.1
- debug: var="ETCD_CLUSTER_STATUS"
- name: get a running ectd node
shell: 'echo -e "{{ ETCD_CLUSTER_STATUS.stdout }}" \
"{{ ETCD_CLUSTER_STATUS.stderr }}" \
|grep "is healthy"|cut -d: -f2|cut -d/ -f3'
register: RUNNING_NODE
- name: 停止ectd 服务
service: name=etcd state=stopped
- name: 清除etcd 数据目录
file: name={{ ETCD_DATA_DIR }}/member state=absent
- name: 清除 etcd 备份目录
file: name={{ cluster_dir }}/backup/etcd-restore state=absent
delegate_to: 127.0.0.1
run_once: true
- name: 分发恢复文件到 etcd 各个节点
copy: src={{ cluster_dir }}/backup/{{ inventory_hostname }}/snapshot.db dest={{ bin_dir }}/
#loop: "{{ RUNNING_NODE.stdout_lines }}"
- name: etcd 数据恢复
shell: "cd {{ bin_dir }} && \
ETCDCTL_API=3 {{ bin_dir }}/etcdctl snapshot restore snapshot.db \
--data-dir={{ ETCD_DATA_DIR }}"
#delegate_to: 127.0.0.1
#run_once: true
#- name: 分发恢复文件到 etcd 各个节点
#copy: src={{ cluster_dir }}/backup/etcd-restore/member dest={{ ETCD_DATA_DIR }}
- name: 重启etcd 服务
service: name=etcd state=restarted
- name: 以轮询的方式等待服务同步完成
shell: "systemctl is-active etcd.service"
register: etcd_status
until: '"active" in etcd_status.stdout'
retries: 8
delay: 8
检查恢复的 deployment
$ /etc/kubeasz/bin/kubectl get pods
NAME READY STATUS RESTARTS AGE
busybox-7bf7b6d58c-z7wmq 1/1 Running 0 13m
dashboard 的使用
获取 dashboard 信息
查看 dashboard 的 pod 和 service 情况,获取 service 的 NodePort 端口
$ /etc/kubeasz/bin/kubectl get svc,pod -A | grep 'dashboard'
kube-system service/dashboard-metrics-scraper ClusterIP 10.68.61.86 <none> 8000/TCP 39h
kube-system service/kubernetes-dashboard NodePort 10.68.205.194 <none> 443:31364/TCP 39h
kube-system pod/dashboard-metrics-scraper-86cbf5f9dd-bw22f 1/1 Running 0 39h
kube-system pod/kubernetes-dashboard-747c6cbd4b-f78k4 1/1 Running 3 (3m49s ago) 39h
浏览器打开 dashboard 页面
根据获取到的端口打开 dashboard 页面,IP 使用控制面节点或工作节点的 IP 均可。此处为 https://192.168.111.185:31364/
Token 登录
获取 token 信息
$ /etc/kubeasz/bin/kubectl get secret -A | grep 'admin'
kube-system admin-user kubernetes.io/service-account-token 3 39h
$ /etc/kubeasz/bin/kubectl describe secret admin-user -n kube-system
Name: admin-user
Namespace: kube-system
Labels: <none>
Annotations: kubernetes.io/service-account.name: admin-user
kubernetes.io/service-account.uid: 9d67cc3b-728b-423c-a413-4a607048d5b5
Type: kubernetes.io/service-account-token
Data
====
ca.crt: 1310 bytes
namespace: 11 bytes
token: eyJhbGciOiJSUzI1NiIsImtpZCI6Im0wNGNQVHFVSEo4TzRUbDBZejc1RGlON1hhVEVud3pDbFFRdTNmYlJzNVUifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiI5ZDY3Y2MzYi03MjhiLTQyM2MtYTQxMy00YTYwNzA0OGQ1YjUiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06YWRtaW4tdXNlciJ9.0wxP7O-PX565PkYfKX54Ld9K0sapISpm8dhD56XeymFlnxb00QuyB635bp3BOxGlwKNvMoGSgHTEEOdmkhamWRM5kl7bQdtLSOdA9wX38pTXQfxyKiWajkj8_N9ND-_v7PuLWi_QvFlVwgsUvpJsvbvVDvONQuMp0w43cUDXSgw6MfDEdAU_Myy2DtBYqlTderQ-wTxewzIGD_ILdbOpC1G9Z3_cgYIXYtQujW_8wZZ5if4asz317JfE96psWDVSinhMBLbYbaQ-jQRhLlnUCZ0FXJZQC-XzdHkHxKpBRE00z1TK5_fjQUxhXTQP1xvBGizXTSlDrT1RXmwkM-3eog
填入 dashboard 登录界面
登录成功
登录后可以在 dashboard 看到一些简单的资源展示,还可以做一些 yaml文件应用、pod 伸缩、shell 执行等基础操作