KubeOperator技术方案

KubeOperator技术方案

总体介绍⚓︎

KubeOperator 是一个开源的轻量级 Kubernetes 发行版,专注于帮助企业规划、部署和运营生产级别的 Kubernetes 集群。

KubeOperator 提供可视化的 Web UI,支持离线环境,支持物理机、VMwareOpenStackFusionCompute 等 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 部署和管理门槛,内置 KubePiWebkubectl
  • 按需创建: 调用云平台 API,一键快速创建和部署 Kubernetes 集群
  • 按需伸缩: 快速伸缩 Kubernetes 集群,优化资源使用效率
  • 按需修补: 快速升级和修补 Kubernetes 集群,并与社区最新版本同步,保证安全性
  • 离线部署: 支持完全离线下的 Kubernetes 集群部署
  • 自我修复: 通过重建故障节点确保集群可用性
  • 全栈监控: 提供从Pod、Node到集群的事件、监控、告警、和日志方案
  • Multi-AZ 支持: 将 Master 节点分布在不同的故障域上确保集群高可用
  • 应用商店: 内置 KubeApps 应用商店
  • GPU 支持: 支持 GPU 节点,助力运行深度学习等应用

主要概念

部署模式⚓︎

  • 手动模式: 用户需要自己准备物理机或虚拟机,存储可选择 NFS 持久化存储,外部 ceph 存储等
  • 自动模式: 用户只需要绑定云平台(比如 VMware)账号信息,KubeOperator 会根据预先定义的部署计划来自动创建主机实现一键自动化部署

部署计划⚓︎

自动部署模式下,部署计划定义了 Kubernetes 集群的部署细节,包括其部署模型、集群所在的区域、可用区、节点大小类型等

区域和可用区⚓︎

region-zone

区域(Region)和可用区(AZ)这两个术语来自公有云。每个区域完全独立。每个可用区完全隔离,但同一个区域内的可用区之间使用低时延链路相连。区域和可用区之间的关系如下图所示

对于公有云厂商提供的托管 Kubernetes 服务,master 节点由公有云厂商托管并维护,其 3 个master 节点会分布在同个区域下面的 3 个不同可用区上面,实现真正的高可用

KubeOperator 借鉴公有云厂商的思路和概念,并应用到 VMwareOpenStackFusionCompute 等私有云平台上面。例如,在 VMware 云平台下,区域对应为 Datacenter,可用区对应于 cluster,或者 cluster 下面的 resource pool

注意事项

  • 如果用户只有一个 vSphere 集群,那么可以在集群下面建立三个 resource pool,每个resource pool 对应于一个可用区
  • 如果用户有三个 vSphere 集群,那么每个集群对应于一个可用区
  • vSAN 集群不能被多个 vSphere 集群共享,所以 3 个 vSphere 集群,持久化存储仅支持集中存储。 具体请参考此文档

权限模型⚓︎

支持通过在项目中设置用户权限等级来管理集群,分为系统管理员、项目管理员、集群管理员

系统管理员⚓︎

默认的 admin 账号可以创建系统管理员

  • 管理集群,安装、卸载、升级、扩容、缩容、备份、恢复等等所有集群相关操作
  • 管理用户,添加系统管理员和普通用户
  • 管理项目,创建新项目,给项目创建集群、指定项目管理员和集群管理员、授权资源等
  • 管理版本,启用、禁用 k8s 版本、查看版本详情等
  • 管理资源,添加集群所需主机、部署计划、备份账号等
  • 系统设置,设置添加仓库、凭据、NTP、邮箱、License等
  • 查看系统日志

项目管理员⚓︎

  • 管理集群,安装、卸载、升级、扩容、缩容、备份、恢复等所有集群相关操作
  • 查看版本,查看版本详情
  • 查看资源,查看集群所需主机、部署计划、备份账号等
  • 查看项目,查看项目管理员和集群管理员、已授权资源等
  • 查看系统日志

集群管理员⚓︎

  • 管理集群,查看集群概览、监控、日志、事件、添加工具、启用CSI扫描等相关操作
  • 查看系统日志

系统架构

系统架构⚓︎

Architecture

组件说明⚓︎

  • 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等资源仓库功能;

各个组件间的关系可参考下图

image-20221215185615941

安装部署

硬件要求⚓︎

最小化配置推荐配置

角色 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 系统设置中

KubeOperator-mixed-arch

系统设置

仓库⚓︎

  • CPU 架构: 支持 x86_64 和 aarch64
  • 协议: 支持 http 和 https(需手动启用)
  • 地址: 默认为部署 KubeOperator 的服务器 IP(将使用 IP:8081 来访问 nexus 仓库)

system

凭据⚓︎

  • 凭据为 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 私钥内容添加到凭据密钥框中

password

key

NTP⚓︎

  • 支持配置多个 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 集群节点使用

host-add

主机列表⚓︎

主机列表可以看到已添加主机的详细信息,包括 IP、CPU、内存、操作系统等

host-list

自动模式

  • KubeOperator 推荐使用自动模式部署 Kubernetes 集群
  • 在自动模式下,用户需要准备软件定义的 IaaS 云平台,比如 VMware vSphere、Openstack 和 FusionCompute 等
  • 本章节以 VMware vSphere 平台作为示例,讲解整个 K8s 集群的规划、部署及管理过程,部署示意图如下图所示:

overview

IP 池配置⚓︎

IP 池在创建可用区时使用,池中的 IP 地址将分配给虚拟机

ip-pool-list

添加 IP 池⚓︎

创建 IP 池要配置好子网掩码、起止 IP、网关和 DNS 等

ip-pool-add

查看 IP 使用情况⚓︎

  • 列表页点击 IP 使用情况可查看 IP 池中所有 IP 的状态(可达、可用和占用)
  • 在 IP 池页面,可手动添加 IP 段、同步 IP 状态等

ip-pool-use

虚拟机配置⚓︎

  • 支持添加和修改虚拟机配置(CPU、内存)
  • 默认 small、medium、large、xlarge、2xlarge 和 4xlarge 六种配置

virtual-config-list

自定义模版配置⚓︎

  • 支持 VMware vSphere 和 OpenStack 两种 IaaS 云平台

virtual-config-list

区域(Region)⚓︎

  • 与公有云中的 Region 概念相似,可以简单理解为地理上的区域
  • 创建区域时,首先选择提供商,目前支持 VMware vSphere、OpenStack 和 FusionCompute
  • 配置参数时,需要提供 vSphere 环境信息,包括 vCenter 主机,端口,用户名和密码(建议直接绑定带有管理员角色的用户)
  • 单击【获取数据中心】,获取并绑定目标数据中心

region-1

可用区(Zone)⚓︎

  • 与公有云中的 AZ 概念相似,可以简单理解为 Region 中具体的机房
  • 在 vSphere 体系中我们使用不同的 Cluster 或者同个 Cluster 下的不同 Resource Pool 来实现 Zone 的划分
  • 选择可用区配置参数时,需要选择计算集群,资源池,存储类型以及网络适配器等信息,这些信息依赖于 vCenter 环境配置
  • 支持已有模版、默认模版和自定义模版

zone-1

部署计划(Plan)⚓︎

  • 用来描述在哪个区域下,哪些可用区中,使用什么样的机器规格,部署什么类型的集群的一个抽象概念
  • 部署计划配置包括选择可用区(可用区可以单选或多选),并设置 Master 节点,Worker 节点的规格
  • 多主多节点集群可以选择多个可用区的部署计划

plan-1

默认模版⚓︎

下载⚓︎

默认模版

  • 离线环境下,需要手动上传模版文件至 nexus 仓库
  • 模版文件下载地址如下:

vSphere

OpenStack

FusionCompute

上传⚓︎

  • 模版文件需要上传至 binary-k8s-raw 仓库
  • 仓库默认用户名/密码:admin/admin123

template-upload

vSphere

  • 需上传 ovf 和 vmdk 文件
  • 文件路径:/terraform/images/vsphere/kubeoperator_centos_7.6.1810

template-vsphere

OpenStack

  • 需上传 qcow2 文件
  • 文件路径:/terraform/images/openstack

template-openstack

FusionCompute

  • 需上传 ovf 和 vhd 文件
  • 文件路径:/terraform/images/fusioncompute/kubeoperator_centos_7.6.1810

template-fusioncompute

集群部署

集群信息⚓︎

  • 项目: 选择集群所属项目
  • 供应商: 支持裸金属(手动模式)和部署计划(自动模式)
  • 版本: 支持版本管理中最新的两个 Kubernetes 版本
  • 架构: 支持 AMD64 和 ARM64
  • Yum 仓库: 支持替换、共存和不操作三种类型

Yum 仓库

  • 替换: 此操作将会对 K8S 节点服务器原始 yum repo 文件进行备份,之后生成并仅使用 KubeOperator 的 yum repo
  • 共存: 此操作将保持K8S节点服务器原始 yum repo 文件不变,同时生成并使用 kubeoperator 的 yum repo
  • 不操作: 此操作将保持使用 K8S 节点服务器原始 yum repo 文件,不对K8S节点服务器的 yum repo 做任何操作

deploy-1

集群设置⚓︎

  • 容器网络: CIDR不能与目标IP段重叠,否则会造成初始化失败
  • POD 数量上限/节点: 默认 256
  • Service 数量上限/集群: 默认 256
  • proxy 模式: 支持 iptables 和 ipvs
  • dns 缓存: 支持开启 NodeLocal DNSCache
  • kubernetes 审计: 支持开启日志审计功能

deploy-2

运行时设置⚓︎

  • 容器运行时: 支持 Docker 和 Containerd
  • Docker 数据路径: 默认 /var/lib/docker
  • Container 子网: 默认 172.17.0.1/16

deploy-3

容器网络设置⚓︎

  • 网卡名称: 多网卡环境需要指定使用的网卡名称,单网卡环境可不填
  • 容器网络: 支持 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. 如果您已经在运行路由守护进程)

deploy-4

组件设置⚓︎

  • helm: 支持 v2 和 v3
  • ingress 类型: 支持 nginx-ingress 和 traefik-ingress
  • 安装 GPU 套件: 按需使用,默认选择禁用

deploy-5

节点信息⚓︎

根据不同的节点角色选择目标主机(手动模式)

deploy-hosts

选择已授权部署计划,设置 Worker 节点数量(自动模式)

deploy-plan

确认信息⚓︎

deploy-review

日志⚓︎

集群创建过程中为 Initializing 状态,点击可查看集群安装进度并支持查看当前任务的实时日志(支持手动暂停任务日志输出)

deploy-log

集群导入

基本信息⚓︎

  • 支持导入非 KubeOperator 创建的集群
  • 导入非 KubeOperator 创建的集群不支持扩缩容、升级、备份等 Day2 操作

cluster-import

获取架构

选择集群节点的 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
...
posted @ 2023-02-06 16:31  IT人生--MarkGuo  阅读(413)  评论(0编辑  收藏  举报