摘要

本博文主要是使用的KubeSphere来实现Kubernetes集群管理,以此更好的构建Athena系统中所设计到的基础的环境,例如:nacos、mysql、redis、MQ、ES、等基础容器,同时为系统的管理和项目的部署提供的一个一站式的环境管理。构建系统整体的架构设计与系统测试,CICD等。结合Github实现对code的质量的管理与控制。为系统在真实的互联网下的上线做好相关前置准备。

一、KubeSphere容器平台

KubeSphere 愿景是打造一个以 Kubernetes 为内核的云原生分布式操作系统,它的架构可以非常方便地使第三方应用与云原生生态组件进行即插即用(plug-and-play)的集成,支持云原生应用在多云与多集群的统一分发和运维管理。

二、KubeSphere安装构建

由于个人资源有限,因此在构建整体系统采用的单节点构建KubeSphere容器平台。在后期的项目真实的上线的时候可能多集群架构来实现的项目的安装与部署工作。同时后期本人将介绍相关的实战内容。

2.1 单节点的机器准备

# 机器最低要求:

8核 12G内存 100G的硬盘

# 机器系统:

centos7.4

# 防火墙放行 30000~32767

--开启防火墙
systemctl start firewalld
--重启防火墙
systemctl restart firewalld
--关闭防火墙
systemctl stop firewalld
--永久关闭防火墙(禁止开机自启动)
systemctl disable firewalld
--开启自启动防火墙
systemctl enable firewalld
--查看防火墙规则
firewall-cmd --list-all
--对指定IP放行指定端口(如果要取消,则将add替换为remove)
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.142.166" port protocol="tcp" port="30000" accept"
--对指定ip放行指定端口段
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.142.166" port protocol="tcp" port="30000-31000" accept"
--对指定ip放行所有端口
firewall-cmd --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.1.10" accept" --permanent
--对所有ip放行指定端口
firewall-cmd --zone=public --add-port=10022/tcp --permanent 
--也可以直接编辑防火墙配置文件/etc/firewalld/zones/public.xml,保存后重启防火墙才生效

# 修改hostname 

hostnamectl set-hostname node_name

2.2 使用KubeKey引导安装集群

安装 KubeKey

export KKZONE=cn

curl -sfL https://get-kk.kubesphere.io | VERSION=v1.2.1 sh -

# 安装相关依赖

yum install -y conntrack

# 使用kk 安装kubesphere

./kk create cluster --with-kubernetes v1.21.5 --with-kubesphere v3.2.1

2.3  KubeSphere 安装与测试

三、KubeSphere系统基础镜像的部署

KubeSphere——常用应用UI可视化部署实战(1)_庄小焱-CSDN博客_kubesphere部署应用

KubeSphere——常用应用UI可视化部署实战(2)_庄小焱-CSDN博客

KubeSphere——使用deployment文件部署实战(3)_庄小焱-CSDN博客

3.1 Harobr仓库的部署构建

Harobr是一个开源仓库,通过各种策略和基于角色的访问控制来保护制品,确保镜像经过扫描且没有漏洞,并对镜像签名使其受信。

内置应用 - 在 KubeSphere 中部署 Harbor - 《KubeSphere v3.2 使用手册》 - 书栈网 · BookStack

3.1.1 准备工作

  • 请确保已启用 OpenPitrix 系统。
  • 您需要创建一个企业空间、一个项目和一个用户帐户 (project-regular) 供本教程操作使用。该帐户需要是平台普通用户,并邀请至项目中赋予 operator 角色作为项目操作员。以project-regular 身份登录控制台,在企业空间 demo-workspace 中的 demo-project 项目中进行操作。

3.1.2 从应用商店中部署 Harbor

在 demo-project 项目的概览页面,点击左上角的应用商店。找到 Harbor,点击应用信息页面上的安装。设置名称并选择应用版本。请确保将 Harbor 部署在 demo-project 中,点击下一步。

在应用配置页面,编辑 Harbor 的配置文件,请注意以下字段。

  • type:访问 Harbor 服务的方式。本示例使用 nodePort。
  • tls:指定是否启用 HTTPS。多数情况下设置为 false。
  • externalURL:暴露给租户的 URL。

备注:请指定 externalURL,如果您访问 Harbor 有问题,该字段会对解决问题非常有用。配置编辑完成后,点击安装继续。稍等片刻待 Harbor 启动并运行。

## 请注意,192.168.0.9 是示例 IP 地址,您必须使用自己的地址。 
expose:
  type: nodePort
  tls:
    enabled: false
    secretName: ""
    notarySecretName: ""
    commonName: "192.168.0.9"  # 将 commonName 更改成您自己的值。
  nodePort:
    # NodePort 服务的名称。
    name: harbor
    ports:
      http:
        # 使用 HTTP 服务时,Harbor 监听的服务端口。
        port: 80
        # 使用 HTTP 服务时,Harbor 监听的节点端口。
        nodePort: 30002
      https:
        # 使用 HTTPS 服务时,Harbor 监听的服务端口。
        port: 443
        # 使用 HTTPS 服务时,Harbor 监听的服务端口。
        nodePort: 30003
      # 仅在 notary.enabled 设置为 true 时需要此配置。
      notary:
        # Notary 监听的服务端口。
        port: 4443
        # Notary 监听的节点端口。
        nodePort: 30004
externalURL: http://192.168.0.9:30002 # 使用您自己的 IP 地址。
# Harbor admin 的初始密码。启动 Harbor 后可以通过主页修改。
harborAdminPassword: "Harbor12345"
# 用于加密的密钥,必须是包含 16 个字符的字符串。
secretKey: "not-a-secure-key"

3.1.3 访问 Harbor

基于配置文件中 expose.type 字段的设置,访问方式可能会不同。本示例使用 nodePort 访问 Harbor,按照先前步骤中的设置,访问 http://nodeIP:30002

使用默认帐户和密码 (admin/Harbor12345) 登录 Harbor。密码由配置文件中 harborAdminPassword 字段定义。

3.1.4 Harbor常见问题

如何启用 HTTP 登录?

在步骤 1 中将 tls.enabled 设置为 falseexternalURL 的协议必须和 expose.nodePort.ports 相同。如果您使用 Docker 登录,请在 daemon.json 中将 externalURL 设置为 insecure-registries 其中之一,然后重新加载 Docker。

如何启用 HTTPS 登录?

使用自签名证书。

  • 在步骤 1 中将配置文件中的 tls.enabled 设置为 true,并对应编辑 externalURL
  • 将 Pod harbor-core 的 /etc/core/ca 中存储的自签名证书复制到您的主机。
  • 先在您的主机中信任该自签名证书,然后重启 Docker。

b. 使用公共 SSL。

  • 将证书添加为密钥 (Secret)。
  • 在步骤 1 中将配置文件中的 tls.enabled 设置为 true,并对应编辑 externalURL
  • 编辑 tls.secretName

3.2 Nacos部署k8s

Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。

3.2.1 docker拉取镜像

# docker拉取镜像

docker pull nacos/nacos-server

# 查看镜像

docker images

# 启动Nacos

docker run --env MODE=standalone --name nacos -d -p 8848:8848  nacos/nacos-server

# 访问Nacos

http://localhost:8848/nacos

# docker tag : docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

docker tag 0e5574283393 fedora/httpd:version1.0

# docker push 镜像到的自己的Harbor :docker push [OPTIONS] NAME[:TAG]

docker container commit c16378f943fe rhel-httpd:latest

docker image tag rhel-httpd:latest registry-host:5000/myadmin/rhel-httpd:latest

docker image push registry-host:5000/myadmin/rhel-httpd:latest

3.2.2 Nacos有状态服务部署工作

为了解决系统服务注册中心的高可用服务问题,在运行过程中会保存数据或状态。利用的Nacos的来构建Nacos集群的构建。登录 KubeSphere 控制台,在已创建的项目下选择 工作负载 → 有状态副本集,进入列表页。

第一步:填写基本信息

1.1. 点击 创建 按钮,将弹出创建部署的详情页。创建有状态副本集支持三种方式,页面创建导入 yaml 文件 创建,编辑模式 创建。以下主要介绍页面创建的方式。若选择以编辑模式,可点击右上角编辑模式进入代码界面,支持 yaml 和 json 格式。左上角显示配置文件列表和导入导出按钮。其中导入 yaml 文件方式会自动将 yaml 文件内容填充到页面上,用户根据需要可以在页面上调整后再行创建。编辑模式可以方便习惯命令行操作的用户直接在页面上编辑 yaml 文件并创建有状态副本集。本次我们在的利用页面创建式来判断。

1.2. 在基本信息页,需要输入部署的名称并选择创建部署的项目,用户可以根据需求填写部署的描述信息。

  • 名称:为创建的有状态副本集起一个简洁明了的名称,便于用户浏览和搜索。
  • 别名:帮助您更好的区分资源,并支持中文名称。
  • 描述信息:简单介绍该有状态副本集,让用户进一步了解其作用。

第二步:配置仓库和秘钥

配置中心 - 密钥 - 《KubeSphere v2.1 使用手册》 - 书栈网 · BookStack

2.1 构建仓库秘钥

密钥 (Secret) 解决了密码、token、密钥等敏感数据的配置问题,配置密钥后不需要把这些敏感数据暴露到镜像或者工作负载 (Pod) 的 Spec 中。密钥可以在创建工作负载时以存储卷或者环境变量的方式使用。登录 KubeSphere 控制台,在所属的企业空间中选择已有 项目 或新建项目,访问左侧菜单栏,点击 配置中心 ➡ 密钥,进入密钥列表页。

创建密钥支持两种方式,页面创建 和 编辑模式 创建,以下主要介绍页面创建的方式。若选择以编辑模式,可点击右上角编辑模式进入代码界面,支持 yaml 和 json 格式,可以方便习惯命令行操作的用户直接在页面上编辑 yaml 文件创建密钥。

 第三步:配置容器组模板

3.1 添加仓库

选择已有镜像部署容器,从公开或者私有镜像仓库中拉取镜像,若不填写镜像仓库地址则镜像默认从 Docker Hub 中拉取。输入容器的名称和对应的镜像名,镜像名一般需要指定 tag,比如 mysql:5.6。容器中定义的镜像默认从 Docker Hub 中拉取。说明:若需要使用私有镜像仓库如 Harbor。通过代码构建新的容器镜像,从已有的代码仓库中获取代码。

  • 仓库地址:https://192.168.25.137:30002:nacos-service
  • 密钥:如果是私有代码仓库,请选择代码仓库密钥,参考 创建 GitHub 密钥
  • 映像模板:选择编译环境和对应的编译模板作为 Builder image;
  • 代码相对路径:可以指定代码编译的相对路径,默认为 /;
  • 映像名称:根据您的 Docker Hub 账号填写,例如 <dockerhub_username>/<image_name>dockerhub_username 为自己的账户名称,确保具有推拉权限;
  • tag:镜像标签;
  • 目标镜像仓库:选择已创建的镜像仓库,若还未创建请参考 创建 DockerHub 密钥。注意,基于代码地址中的源代码构建的镜像在部署和 S2i 任务创建完成后,该镜像直接 Push 至目标镜像仓库;
  • 环境变量参数 (可选):键值对,应用程序开发人员可以使用环境变量来配置此镜像的运行时行为。

2.2. 如果用户有更进一步的需求,可下滑至服务设置和高级设置部分。

  • 服务设置: 即设置容器的访问策略,指定容器需要暴露的端口并自定义端口名称,端口协议可以选择 TCP 和 UDP。
  • 健康检查:在业务级的监控检查方面,Kubernetes 定义了两种类型的健康检查探针,详见 设置健康检查器

    • 存活探针: 监测到容器实例不健康时,重启应用。
    • 就绪探针:监测到容器实例不健康时,将工作负载设置为未就绪状态,业务流量不会导入到该容器中。
  • 启动命令

    • 运行命令:可自定义容器的启动的运行命令,Kubernetes 的容器启动命令可参见 Kubernetes 官方文档
    • 参数: 可自定义容器的启动参数,Kubernetes 的容器启动的参数可参见 Kubernetes 官方文档
  • 环境变量: 环境变量是指容器运行环境中设定的一个变量,与 Dockerfile 中的 “ENV” 效果相同,为创建的工作负载提供极大的灵活性。

    • 添加环境变量: 以添加键值对的形式来设置环境变量。
    • 引入配置中心: 支持添加 Secret 和 ConfigMap 作为环境变量,用来保存键值对形式的配置数据,详见 配置 和 密钥
  • 镜像拉取策略:默认的镜像拉取策略是 IfNotPresent,在镜像已经在本地存在的情况下,kubelet 将不再去拉取镜像将使用本地已有的镜像。如果需要每次拉取仓库中的镜像,则设置拉取策略为 Always。如果设置为 IfNotPresent 或者 Never, 则会优先使用本地镜像。

注意,运行命令和参数部分需要参考如下规则进行使用:如果在容器启动时执行一段 shell 命令,则需要在运行命令分别添加两行命令,然后在参数中填写需要执行的 shell 命令,如果是执行 bash 命令则需要把 sh 换成 bash。

# 运行命令
sh  # 若执行 bash 命令这里需要替换为 bash
-c
# 参数 (填写需要执行的 shell 命令,如下给出一个示例)
while true; do wget -q -O- http://php-apache.default.svc.cluster.local; done

更新策略

更新策略是指定新的 Pod 替换旧的 Pod 的策略,有状态副本集的更新策略分为 滚动更新 (RollingUpdate) 和 删除容器组时更新 (OnDelete) 两种类型:

  • 滚动更新 (RollingUpdate):推荐使用该策略,有状态副本集中实现 Pod 的自动滚动更新。当更新策略设置为滚动更新时,有状态副本集控制器将在有状态副本集中删除并重新创建每个 Pod。 它将以与 Pod 终止相同的顺序进行 (从最大的序数到最小的序数),每次更新一个 Pod。在更新其前身之前,它将等待正在更新的 Pod 状态变成正在运行并就绪。

  • Partition:通过指定 Partition 来对滚动更新策略进行分区。如果指定了分区,则当 StatefulSet 的 template 更新时,具有大于或等于分区序数的所有 Pod 将被更新。具有小于分区的序数的所有 Pod 将不会被更新,即使删除它们也将被重新创建。如果 Partition 大于其副本数,则其 template 的更新将不会传播到 Pod。在大多数情况下,您不需要使用分区,只有需要进行分阶段更新时才会使用到。
  • 删除容器组时更新 (OnDelete):设置为 OnDelete 时,StatefulSet 控制器将不会自动更新 StatefulSet 中的 Pod。用户必须手动删除旧版本 Pod 以触发控制器创建新的 Pod。

添加存储卷

点击 添加存储卷模板,填写存储卷的名称,选择存储类型,存储类型需要预先创建,参考 存储类型 - 创建存储类型。然后指定卷的容量和访问模式,确定存储卷在容器内的挂载路径,详见 存储卷

第四步:服务设置

由于有状态副本集必须包含一个 Headless 服务,因此需创建服务。填写服务名称,服务端口和目标端口,目标端口对应容器对外暴露的端口。基于客户端 IP 地址进行会话保持的模式,即第一次客户端访问后端某个 Pod,之后的请求都转发到这个 Pod 上。若要实现基于客户端 IP 的会话亲和性,可以将会话亲和性的值设置为 "ClientIP" (默认值为 "None"),该设置可将来自同一个 IP 地址的访问请求都转发到同一个后端 Pod。

添加标签

标签设置页用于指定资源对应的一组或者多组标签 (Label)。Label 以键值对的形式附加到任何对象上,如 Pod,Service,Node 等,定义好标签后,其他对象就可以通过标签来对对象进行引用,最常见的用法便是通过节点选择器来引用对象。一般来说,我们可以为一个 Pod (或其他对象) 定义多个标签,以便于配置、部署等管理工作。例如,部署不同版本的应用到不同的环境中;或者监控和分析应用 (日志记录、监控、报警等)。通过多个标签的设置,我们就可以多维度地对对象进行精细化管理,如 relase: stable ; tier: frontend

第六步:添加节点选择器

带有标签的对象创建好之后,我们就可以通过节点选择器 (Selector) 来引用这些对象。节点选择器页面,用户可以通过按节点选择或通过设置一组或者多组键值对来指定期望运行容器组的主机。当不指定时,将会在集群内的所有节点上启动容器组。点击右下角的创建后,集群就会按照用户的配置创建对应的守护进程集。

点击创建,即可完成有状态副本集的创建,状态显示 “更新中” 是由于拉取镜像需要一定时间,待镜像 pull 成功后状态将显示“运行中” 。

3.3 Mysql的部署

Mysql是一个开源的关系型数据库管理系统 (RDBMS),它基于最常用的数据库管理语言 SQL。作为世界上最受欢迎的开源数据库,MySQL 为云原生应用部署提供了完全托管的数据库服务。

3.3.1 从应用商店部署 MySQL

  1. 在 demo-project 的概览页面,点击左上角的应用商店

  2. 找到 MySQL,在应用信息页面点击安装

  3. 设置应用名称和版本,确保 MySQL 部署在 demo-project 项目中,然后点击下一步

  4. 应用配置页面,取消对 mysqlRootPassword 字段的注释并设置密码,然后点击安装

  5. 等待 MySQL 创建完成并开始运行。

3.3.2 访问 MySQL 终端

  1. 打开工作负载页面并点击 MySQL 的工作负载名称。

  2. 容器组区域,展开容器详情,点击终端图标。

  3. 在终端窗口中,执行 mysql -uroot -ptesting 命令以 root 用户登录 MySQL。

3.3.3 从集群外访问 MySQL 数据库

要从集群外访问 MySQL,您需要先用 NodePort 暴露该应用。

  1. 打开服务页面并点击 MySQL 的服务名称。

  2. 点击更多操作,在下拉菜单中选择编辑外部访问

  3. 访问模式设置为 NodePort 并点击确定。有关更多信息,请参见项目网关

  4. 您可以在端口区域查看暴露的端口。该端口号和公网 IP 地址将在下一步用于访问 MySQL 数据库。

  5. 您需要使用 MySQL Client 或第三方应用(例如 SQLPro Studio)才能访问 MySQL 数据库。以下演示如何使用 SQLPro Studio 访问 MySQL 数据库。

3.4 Redis的部署

Redis是一个开源的(遵循 BSD 协议)、内存中的 (in-memory) 数据结构存储库,用作数据库、缓存和消息代理。

3.4.1 从应用商店中部署 Redis

  1. 在 demo-project 项目的概览页面,点击左上角的应用商店

  2. 找到 Redis,点击应用信息页面上的安装

  3. 设置名称并选择应用版本。请确保将 Redis 部署在 demo-project 中,点击下一步

  4. 应用配置页面,为应用指定持久化存储卷和密码。操作完成后,点击安装

  5. 稍等片刻待 Redis 启动并运行。

备注:要为 Redis 指定更多值,请打开右上角的拨动开关查看 YAML 格式的应用清单文件,编辑其配置。

3.4.2 开启Redis NodePort访问方式

  1. 转到服务页面,点击 Redis 的服务名称。

  2. 容器组中展开菜单查看容器详情,随后点击终端图标。

  3. 在弹出窗口的终端中运行 redis-cli 命令来使用该应用。

  4. 在服务处新建redis同时制定工作负载和访问方式

3.5 MQ的部署

RabbitMQ是部署最广泛的开源消息代理。它轻量且易于在本地和云上部署,支持多种消息协议。RabbitMQ 可在分布和联邦的配置中部署,以满足大规模和高可用性需求。

3.5.1 从应用商店部署 RabbitMQ

  1. 在 demo-project 的概览页面,点击左上角的应用商店

  2. 找到 RabbitMQ,在应用信息页面点击安装

  3. 设置应用名称和版本,确保 RabbitMQ 部署在 demo-project 项目中,然后点击下一步

  4. 应用配置页面,您可以直接使用默认配置,也可以通过修改表单参数或编辑 YAML 文件自定义配置。您需要记录 Root Username 和 Root Password 的值,用于在后续步骤中登录系统。设置完成后点击安装

    提示:如需查看清单文件,请点击 编辑YAML 开关。

  5. 等待 RabbitMQ 创建完成并开始运行。

3.5.2 访问 RabbitMQ 并开放NodePort

要从集群外访问 RabbitMQ,您需要先用 NodePort 暴露该应用。

  1. 打开服务页面并点击 RabbitMQ 的服务名称。

  2. 点击更多操作,在下拉菜单中选择编辑外部访问

  3. 访问模式设置为 NodePort 并点击确定。有关更多信息,请参见项目网关

  4. 您可以在端口区域查看暴露的端口。

  5. 用 <NodeIP>:<NodePort> 地址以及步骤 1 中记录的用户名和密码访问 RabbitMQ 的 management 端口。

3.6 Elasticsearch的部署

3.6.1 从应用商店部署elasticsearch

Elasticsearch 是一个分布式的、开源的搜索分析引擎,支持各种数据类型,包括文本、数字、地理、结构化、非结构化。Elasticsearch 是 Elastic 产品栈的核心,Elastic 产品栈是个开源工具集合,用于数据接收、存储、分析、可视化。

  1. 在 demo-project 的概览页面,点击左上角的应用商店

  2. 找到 elasticsearch,在应用信息页面点击安装

  3. 设置应用名称和版本,确保 elasticsearch部署在 demo-project 项目中,然后点击下一步

  4. 应用配置页面,您可以直接使用默认配置,也可以通过修改表单参数或编辑 YAML 文件自定义配置。您需要记录 Root Username 和 Root Password 的值,用于在后续步骤中登录系统。设置完成后点击安装

    提示:如需查看清单文件,请点击 编辑YAML 开关。

  5. 等待 elasticsearch创建完成并开始运行。

3.6.2 访问 elasticsearch并开放NodePort

要从集群外访问 elasticsearch,您需要先用 NodePort 暴露该应用。

  1. 打开服务页面并点击 elasticsearch的服务名称。

  2. 点击更多操作,在下拉菜单中选择编辑外部访问

  3. 访问模式设置为 NodePort 并点击确定。有关更多信息,请参见项目网关

  4. 您可以在端口区域查看暴露的端口。

  5. 用 <NodeIP>:<NodePort> 地址以及步骤 1 中记录的用户名和密码访问 elasticsearch的 management 端口。

博文参考

Logo

开源、云原生的融合云平台

更多推荐