KubeOperator技术方案
KubeOperator技术方案
总体介绍⚓︎
KubeOperator 是一个开源的轻量级 Kubernetes 发行版,专注于帮助企业规划、部署和运营生产级别的 Kubernetes 集群。
KubeOperator 提供可视化的 Web UI,支持离线环境,支持物理机、VMware、OpenStack 和 FusionCompute 等 IaaS 平台,支持 x86 和 ARM64 架构,支持 GPU,内置应用商店,已通过 CNCF 的 Kubernetes 软件一致性认证。
KubeOperator 使用 Terraform 在 IaaS 平台上自动创建主机(用户也可以自行准备主机,比如物理机或者虚机),通过 Ansible 完成自动化部署和变更操作,支持 Kubernetes 集群 从 Day 0 规划,到 Day 1 部署,到 Day 2 运营的全生命周期管理。
页面展示⚓︎
组件项目⚓︎
- KubePi: 一个现代化的 K8s 面板
- Web Kubectl: 在 Web 浏览器中运行 kubectl 命令
技术优势⚓︎
- 简单易用: 提供可视化的 Web UI,极大降低 Kubernetes 部署和管理门槛,内置 KubePi 和 Webkubectl
- 按需创建: 调用云平台 API,一键快速创建和部署 Kubernetes 集群
- 按需伸缩: 快速伸缩 Kubernetes 集群,优化资源使用效率
- 按需修补: 快速升级和修补 Kubernetes 集群,并与社区最新版本同步,保证安全性
- 离线部署: 支持完全离线下的 Kubernetes 集群部署
- 自我修复: 通过重建故障节点确保集群可用性
- 全栈监控: 提供从Pod、Node到集群的事件、监控、告警、和日志方案
- Multi-AZ 支持: 将 Master 节点分布在不同的故障域上确保集群高可用
- 应用商店: 内置 KubeApps 应用商店
- GPU 支持: 支持 GPU 节点,助力运行深度学习等应用
主要概念
部署模式⚓︎
- 手动模式: 用户需要自己准备物理机或虚拟机,存储可选择 NFS 持久化存储,外部 ceph 存储等
- 自动模式: 用户只需要绑定云平台(比如 VMware)账号信息,KubeOperator 会根据预先定义的部署计划来自动创建主机实现一键自动化部署
部署计划⚓︎
自动部署模式下,部署计划定义了 Kubernetes 集群的部署细节,包括其部署模型、集群所在的区域、可用区、节点大小类型等
区域和可用区⚓︎
区域(Region)和可用区(AZ)这两个术语来自公有云。每个区域完全独立。每个可用区完全隔离,但同一个区域内的可用区之间使用低时延链路相连。区域和可用区之间的关系如下图所示
对于公有云厂商提供的托管 Kubernetes 服务,master 节点由公有云厂商托管并维护,其 3 个master 节点会分布在同个区域下面的 3 个不同可用区上面,实现真正的高可用
KubeOperator 借鉴公有云厂商的思路和概念,并应用到 VMware、OpenStack 和 FusionCompute 等私有云平台上面。例如,在 VMware 云平台下,区域对应为 Datacenter,可用区对应于 cluster,或者 cluster 下面的 resource pool
注意事项
- 如果用户只有一个 vSphere 集群,那么可以在集群下面建立三个 resource pool,每个resource pool 对应于一个可用区
- 如果用户有三个 vSphere 集群,那么每个集群对应于一个可用区
- vSAN 集群不能被多个 vSphere 集群共享,所以 3 个 vSphere 集群,持久化存储仅支持集中存储。 具体请参考此文档
权限模型⚓︎
支持通过在项目中设置用户权限等级来管理集群,分为系统管理员、项目管理员、集群管理员
系统管理员⚓︎
默认的 admin 账号可以创建系统管理员
- 管理集群,安装、卸载、升级、扩容、缩容、备份、恢复等等所有集群相关操作
- 管理用户,添加系统管理员和普通用户
- 管理项目,创建新项目,给项目创建集群、指定项目管理员和集群管理员、授权资源等
- 管理版本,启用、禁用 k8s 版本、查看版本详情等
- 管理资源,添加集群所需主机、部署计划、备份账号等
- 系统设置,设置添加仓库、凭据、NTP、邮箱、License等
- 查看系统日志
项目管理员⚓︎
- 管理集群,安装、卸载、升级、扩容、缩容、备份、恢复等所有集群相关操作
- 查看版本,查看版本详情
- 查看资源,查看集群所需主机、部署计划、备份账号等
- 查看项目,查看项目管理员和集群管理员、已授权资源等
- 查看系统日志
集群管理员⚓︎
- 管理集群,查看集群概览、监控、日志、事件、添加工具、启用CSI扫描等相关操作
- 查看系统日志
系统架构
系统架构⚓︎
组件说明⚓︎
- kubeoperator_server: 提供平台业务管理相关功能的后台服务;
- kubeoperator_ui: 提供平台业务管理相关功能的前台服务;
- kubeoperator_kubepi: 提供 Dashboard 的功能;
- kubeoperator_kobe: 提供执行 Ansible 任务创建 Kubernetes 集群的功能;
- kubeoperator_kotf: 提供执行 Terraform 任务创建虚拟机的功能;
- kubeoperator_webkubectl: 提供在 Web 浏览器中运行 kubectl 命令的功能;
- kubeoperator_nginx: 平台统一入口,并运行控制台的 Web 界面服务;
- kubeoperator_mysql: 数据库管理组件;
- kubeoperator_nexus: 仓库组件,提供 Docker、Helm、Raw、Yum等资源仓库功能;
各个组件间的关系可参考下图
安装部署
硬件要求⚓︎
最小化配置推荐配置
角色 | CPU核数 | 内存 | 系统盘 | 数量 |
---|---|---|---|---|
部署机 | 4 | 8G | 100G | 1 |
Master | 4 | 8G | 100G | 1 |
Worker | 4 | 8G | 100G | 1 |
软件要求⚓︎
KubeOperator 部署机
需求项 | 具体要求 | 参考(以CentOS7.6为例) |
---|---|---|
操作系统 | 支持 Docker 的 Linux OS | cat /etc/redhat-release |
CPU 架构 | 支持 x86_64 和 aarch64 | uname -m |
kernel 版本 | >=Linux 3.10.0-957.el7.x86_64 | uname -sr |
swap | 关闭 | swapoff -a sed -i '/ swap / s/^(.*)$/#\1/g' /etc/fstab |
防火墙 | 关闭 | systemctl stop firewalld && systemctl disable firewalld |
端口 | 所有节点防火墙必须放通 SSH(默认22)、80、8081-8083端口 | firewall-cmd --zone=public --add-port=80/tcp --permanent |
SELinux | 关闭 | setenforce 0 sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config |
K8s 集群节点
需求项 | 具体要求 | 参考(以CentOS7.6为例) |
---|---|---|
操作系统 | CentOS 7.4 - 7.9 RHEL 7.4 - 7.9 Ubuntu 20.04 / 18.04 Kylin v10 openEuler 22.03 EulerOS 2.5(x86_64) EulerOS 2.8(aarch64) | cat /etc/redhat-release |
CPU 架构 | 支持 x86_64 和 aarch64 | uname -m |
kernel 版本 | >=Linux 3.10.0-957.el7.x86_64 | uname -sr |
swap | 关闭。如果不满足,系统会有一定几率出现 io 飙升,造成 docker 卡死。kubelet 会启动失败(可以设置 kubelet 启动参数 --fail-swap-on 为 false 关闭 swap 检查) | swapoff -a sed -i '/ swap / s/^(.*)$/#\1/g' /etc/fstab |
防火墙 | 关闭。Kubernetes 官方要求 | systemctl stop firewalld && systemctl disable firewalld |
SELinux | 关闭 | setenforce 0 sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config |
时区 | 所有服务器时区必须统一,建议设置为 Asia/Shanghai | timedatectl set-timezone Asia/Shanghai |
安装说明⚓︎
离线安装
请自行下载 KubeOperator 最新版本的离线安装包
# 解压安装包
tar zxvf KubeOperator-release-v3.16.0-amd64.tar.gz
# arm64 的包名是 KubeOperator-release-v3.16.0-arm64.tar.gz
cd KubeOperator-release-v3.16.0
# 运行安装脚本
/bin/bash install.sh
# 等待安装脚本执行完成后,查看 KubeOperator 状态
koctl status
在线安装
⚠️安装完成后,检查服务状态。若有有异常,可以使用 koctl restart 命令进行重新启动
[root@kubeoperator ~]# koctl status
Name Command State Ports
------------------------------------------------------------------------------------------------------------------------------------------------
kubeoperator_kobe sh /root/entrypoint.sh Up (healthy) 8080/tcp
kubeoperator_kotf kotf-server Up (healthy) 8080/tcp
kubeoperator_kubepi kubepi-server Up (healthy) 80/tcp
kubeoperator_mysql /entrypoint.sh mysqld Up (healthy) 3306/tcp, 33060/tcp
kubeoperator_nexus sh -c ${SONATYPE_DIR}/star ... Up (healthy) 0.0.0.0:8081->8081/tcp, 0.0.0.0:8082->8082/tcp, 0.0.0.0:8083->8083/tcp
kubeoperator_nginx /docker-entrypoint.sh ngin ... Up (healthy) 0.0.0.0:80->80/tcp
kubeoperator_server ko-server Up (healthy) 8080/tcp
kubeoperator_ui /docker-entrypoint.sh ngin ... Up (healthy) 80/tcp
kubeoperator_webkubectl sh /opt/webkubectl/start-w ... Up (healthy)
⚠️登录
地址: http://<ko服务器_ip>:80
用户名: admin
密码: kubeoperator@admin123
⚠️帮助
koctl --help
升级说明⚓︎
离线升级
# 离线升级需要提前下载离线安装包,并解压到 KubeOperator 部署机
# 进入升级包目录
cd KubeOperator-release-v3.16.0
# 运行安装脚本
./koctl upgrade
# 查看 KubeOperator 状态
koctl status
混合架构部署说明⚓︎
⚠️定义:混合架构是指使用 KubeOperator 部署同时包含 x86_64 和 arm64 架构节点的 Kubernetes 集群
如下图所示,混合部署需要提供 x86_64 和 arm64 架构的 Nexus 仓库,以便于集群部署时可以下载到对应架构的资源,之后在 KubeOperator 系统设置添加不同架构的仓库信息即可。
例如:
1.可以分别部署两台不同架构的 KubeOperator(一台 arm64,一台 x86_64)
2.使用 x86_64 架构的主机作为日常操作的主机
3.将 arm64 的主机作为 arm 仓库使用并添加到 x86_64 的 KubeOperator 系统设置中
系统设置
仓库⚓︎
- CPU 架构: 支持 x86_64 和 aarch64
- 协议: 支持 http 和 https(需手动启用)
- 地址: 默认为部署 KubeOperator 的服务器 IP(将使用 IP:8081 来访问 nexus 仓库)
凭据⚓︎
- 凭据为 KubeOperator 连接主机资产的凭证。支持添加 password 和 privatekey 两种方式的凭据
- 系统会初始化名称为 kubeoperator 的凭据(自动模式默认模版创建服务器的密码),默认密码为: KubeOperator@2019
密钥
- 1、在 KubeOperator 主机通过 ssh-keygen 命令生成 id_rsa 和 id_rsa.pub 密钥对
- 2、将 id_rsa.pub 公钥内容添加到目标主机 .ssh/authorized_keys 文件中
- 3、将 id_rsa 私钥内容添加到凭据密钥框中
NTP⚓︎
- 支持配置多个 NTP 服务器地址
- 支持手动启用或禁用 NTP 服务器
Dashboard⚓︎
此处为 admin 用户登录凭据,需要和 Dashboard 用户管理中设置的密码保持一致。
集群规划
手动模式
- 手动模式下,用户需要自行准备主机
- 本章节以手动模式部署一个开发测试用集群,每台服务器的用途和需求如下表:
角色 | 数量 | 操作系统 | 最低配置 | 推荐配置 |
---|---|---|---|---|
部署机 | 1 | CentOS 7.6 | 4C 8G | 4C 16G |
Master | 1 | CentOS 7.6 | 2C 4G | 4C 8G |
Worker | 1 | CentOS 7.6 | 2C 4G | 4C 8G |
添加主机⚓︎
- 推荐使用全新的机器
- KubeOperator 部署机不能作为 Kubernetes 集群节点使用
主机列表⚓︎
主机列表可以看到已添加主机的详细信息,包括 IP、CPU、内存、操作系统等
自动模式
- KubeOperator 推荐使用自动模式部署 Kubernetes 集群
- 在自动模式下,用户需要准备软件定义的 IaaS 云平台,比如 VMware vSphere、Openstack 和 FusionCompute 等
- 本章节以 VMware vSphere 平台作为示例,讲解整个 K8s 集群的规划、部署及管理过程,部署示意图如下图所示:
IP 池配置⚓︎
IP 池在创建可用区时使用,池中的 IP 地址将分配给虚拟机
添加 IP 池⚓︎
创建 IP 池要配置好子网掩码、起止 IP、网关和 DNS 等
查看 IP 使用情况⚓︎
- 列表页点击 IP 使用情况可查看 IP 池中所有 IP 的状态(可达、可用和占用)
- 在 IP 池页面,可手动添加 IP 段、同步 IP 状态等
虚拟机配置⚓︎
- 支持添加和修改虚拟机配置(CPU、内存)
- 默认 small、medium、large、xlarge、2xlarge 和 4xlarge 六种配置
自定义模版配置⚓︎
- 支持 VMware vSphere 和 OpenStack 两种 IaaS 云平台
区域(Region)⚓︎
- 与公有云中的 Region 概念相似,可以简单理解为地理上的区域
- 创建区域时,首先选择提供商,目前支持 VMware vSphere、OpenStack 和 FusionCompute
- 配置参数时,需要提供 vSphere 环境信息,包括 vCenter 主机,端口,用户名和密码(建议直接绑定带有管理员角色的用户)
- 单击【获取数据中心】,获取并绑定目标数据中心
可用区(Zone)⚓︎
- 与公有云中的 AZ 概念相似,可以简单理解为 Region 中具体的机房
- 在 vSphere 体系中我们使用不同的 Cluster 或者同个 Cluster 下的不同 Resource Pool 来实现 Zone 的划分
- 选择可用区配置参数时,需要选择计算集群,资源池,存储类型以及网络适配器等信息,这些信息依赖于 vCenter 环境配置
- 支持已有模版、默认模版和自定义模版
部署计划(Plan)⚓︎
- 用来描述在哪个区域下,哪些可用区中,使用什么样的机器规格,部署什么类型的集群的一个抽象概念
- 部署计划配置包括选择可用区(可用区可以单选或多选),并设置 Master 节点,Worker 节点的规格
- 多主多节点集群可以选择多个可用区的部署计划
默认模版⚓︎
下载⚓︎
默认模版
- 离线环境下,需要手动上传模版文件至 nexus 仓库
- 模版文件下载地址如下:
vSphere
- ovf: https://kubeoperator.fit2cloud.com/terraform/images/vsphere/kubeoperator_centos_7.6.1810/kubeoperator_centos_7.6.1810.ovf
- vmdk: https://kubeoperator.fit2cloud.com/terraform/images/vsphere/kubeoperator_centos_7.6.1810/kubeoperator_centos_7.6.1810-1.vmdk
OpenStack
- qcow2: https://kubeoperator.fit2cloud.com/terraform/images/openstack/kubeoperator_centos_7.6.1810-1.qcow2
FusionCompute
- ovf: https://kubeoperator.fit2cloud.com/terraform/images/fusioncompute/kubeoperator_centos_7.6.1810/kubeoperator_centos_7.6.1810.ovf
- vhd: https://kubeoperator.fit2cloud.com/terraform/images/fusioncompute/kubeoperator_centos_7.6.1810/kubeoperator_centos_7.6.1810-vda.vhd
上传⚓︎
- 模版文件需要上传至 binary-k8s-raw 仓库
- 仓库默认用户名/密码:admin/admin123
vSphere
- 需上传 ovf 和 vmdk 文件
- 文件路径:/terraform/images/vsphere/kubeoperator_centos_7.6.1810
OpenStack
- 需上传 qcow2 文件
- 文件路径:/terraform/images/openstack
FusionCompute
- 需上传 ovf 和 vhd 文件
- 文件路径:/terraform/images/fusioncompute/kubeoperator_centos_7.6.1810
集群部署
集群信息⚓︎
- 项目: 选择集群所属项目
- 供应商: 支持裸金属(手动模式)和部署计划(自动模式)
- 版本: 支持版本管理中最新的两个 Kubernetes 版本
- 架构: 支持 AMD64 和 ARM64
- Yum 仓库: 支持替换、共存和不操作三种类型
Yum 仓库
- 替换: 此操作将会对 K8S 节点服务器原始 yum repo 文件进行备份,之后生成并仅使用 KubeOperator 的 yum repo
- 共存: 此操作将保持K8S节点服务器原始 yum repo 文件不变,同时生成并使用 kubeoperator 的 yum repo
- 不操作: 此操作将保持使用 K8S 节点服务器原始 yum repo 文件,不对K8S节点服务器的 yum repo 做任何操作
集群设置⚓︎
- 容器网络: CIDR不能与目标IP段重叠,否则会造成初始化失败
- POD 数量上限/节点: 默认 256
- Service 数量上限/集群: 默认 256
- proxy 模式: 支持 iptables 和 ipvs
- dns 缓存: 支持开启 NodeLocal DNSCache
- kubernetes 审计: 支持开启日志审计功能
运行时设置⚓︎
- 容器运行时: 支持 Docker 和 Containerd
- Docker 数据路径: 默认 /var/lib/docker
- Container 子网: 默认 172.17.0.1/16
容器网络设置⚓︎
- 网卡名称: 多网卡环境需要指定使用的网卡名称,单网卡环境可不填
- 容器网络: 支持 flannel 、 calico 和 cilium
vxlan 和 ipip 网络模式
- 基于隧道,在任何网络环境下都可以正常工作
- 优势是对物理网络环境没有特殊要求,只要宿主机IP层可以路由互通即可
- 劣势是封包和解包耗费CPU性能,且额外的封装导致带宽浪费
host-gw 和 bgp 网络模式
- 基于路由,不适用于公有云环境
- 优势是没有封包和解包过程,完全基于两端宿主机的路由表进行转发
- 劣势是要求宿主机在2层网络是互通,且路由表膨胀会导致性能降低
cilium Overlay
- 支持 vxlan 和 geneve
- 基于封装的虚拟网络,产生所有主机。目前 VXLAN 和 Geneve 已经完成,但可以启用 Linux 支持的所有封装格式
- 此模式具有最小的基础设施和集成要求。它几乎适用于任何网络基础设施,因为唯一的要求是主机之间的IP连接,这通常已经给出
cilium Native Routing
- 使用 Linux 主机的常规路由表。网络必须能够路由应用程序容器的IP地址,此模式适用于高级用户,需要了解底层网络基础结构。
- 适用于(1. 原生 IPv6 网络、2. 与云网络路由器配合使用、3. 如果您已经在运行路由守护进程)
组件设置⚓︎
- helm: 支持 v2 和 v3
- ingress 类型: 支持 nginx-ingress 和 traefik-ingress
- 安装 GPU 套件: 按需使用,默认选择禁用
节点信息⚓︎
根据不同的节点角色选择目标主机(手动模式)
选择已授权部署计划,设置 Worker 节点数量(自动模式)
确认信息⚓︎
日志⚓︎
集群创建过程中为 Initializing 状态,点击可查看集群安装进度并支持查看当前任务的实时日志(支持手动暂停任务日志输出)
集群导入
基本信息⚓︎
- 支持导入非 KubeOperator 创建的集群
- 导入非 KubeOperator 创建的集群不支持扩缩容、升级、备份等 Day2 操作
获取架构
选择集群节点的 CPU 架构类型(支持 amd64、arm64 和混合架构三种类型)
获取 Api Server
cat ~/.kube/config | grep server: | awk '{print $2}'
注意:如果 server IP 为 127.0.0.1,需要将 IP 替换为任意 master 节点 IP
获取 Router
装有 kube-proxy 的任意 K8s 集群节点的 IP 地址
kubectl -n kube-system get pod -o wide | grep kube-proxy
注意:获取任意节点的 IP 地址
获取 Token
KubeOperator 创建集群自建集群
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep ko-admin | awk '{print $1}') | grep token: | awk '{print $2}'
非 KubeOperator 创建集群⚓︎
使用工具⚓︎
仓库配置
- 工具中涉及到的镜像来源于 nexus 镜像仓库。在启用工具之前,需要在所有 K8s 集群节点上对 nexus 镜像仓库进行 http 授信。
vim /etc/docker/daemon.json
{
...
"insecure-registries" : [ "...", "kubeoperator-ip:8082", "..." ]
...
}
注意:kubeoperator-ip 为 KubeOperator 部署机 IP
# 重新启动 docker 服务使得配置生效
systemctl restart docker.service
KubeOperator 创建集群⚓︎
获取容器运行时参数⚓︎
Docker
# 集群任意节点执行
cat /etc/docker/daemon.json
{
...
"bip": "172.17.0.1/16", # Container 子网
"data-root": "/var/lib/docker", # Docker 数据路径
...
}
Containerd
# 集群任意节点执行
cat /etc/containerd/config.toml
...
root = "/var/lib/containerd" # Containerd 数据路径
...
获取容器网络参数⚓︎
flannel/calico
网络模式
# 集群任意节点执行
kubectl -n kube-system
net-conf.json: |
{
"Network": "10.0.0.0/14",
"Backend": {
"Type": "vxlan" # 网络模式为 vxlan
}
}
...
}
多网络设置
# 集群任意节点执行
kubectl -n kube-system get daemonsets.apps kube-flannel-ds -o yaml
...
containers:
- args:
- --ip-masq
- --kube-subnet-mgr
- --iface=ens192 # 多网络设置为启用,网卡名称为 ens192
...