云原生自动化高级项目实战(一)
·
一、项目说明
随着云计算技术的不断发展和普及,云原生项目的流程设计变得愈发重要。云原生项目流程设计是指在云计算环境下,针对软件开发、部署和运维等环节的流程设计和优化。本文将从云原生项目的定义、特点和流程设计的重要性等 方面进行探讨。
云原生项目是指在云计算环境下设计、开发和部署的项目。与传统的软件开发项目相比,云原生项目更加注重弹性、 可扩展性、高可用性和自动化等特点。云原生项目通常采用容器化技术(如Docker)微服务架构和持续集成/持续部署 (CI/CD)等最佳实践,以充分发挥云计算平台的优势。
云原生项目通常指的是那些遵循云原生原则和最佳实践构建的应用程序或系统。云原生的核心理念在于利用云计算提 供的弹性和敏捷性来构建、部署和管理应用。以下是云原生项目的一些关键特点和组成部分:
1. 容器化:使用如Docker这样的容器技术来打包应用程序及其依赖项,使得应用可以在任何环境中一致地运行。
2. 微服务架构:将应用程序分解为一组小的、独立的服务,每个服务执行特定的功能,并且可以通过HTTP API进行 通信。这种架构有助于提高系统的灵活性和可维护性。
3. DevOps 文化:强调开发(Dev)与运维(Ops)之间的紧密合作,通过持续集成(CI)和持续部署(CD)等自 动化流程来加速软件交付周期。
4. 不可变基础设施:通过版本控制基础设施定义文件(如使用TerraformCloudFormation),确保每次部都是 全新的状态,从而减少配置漂移问题。
5. 服务网格:如Istio或Linkerd,用于处理服务间的交互,提供负载均衡、服务发现、故障恢复等功能。
6. 声明式APIs:使用声明式的API来定义应用的状态,而不是命令式地指定如何改变状态,例如Kubernetes就是通 过YAML文件来声明集群的状态。
7. 弹性与容错性:设计时考虑到了故障的发生,能够自动检测并从故障中恢复,同时能够根据需求动态伸缩资源。
8. 可观测性:通过日志、指标和追踪来收集系统运行时的信息,帮助诊断问题和优化性能。
9. 自动化测试:集成自动化测试到开发过程中,确保应用的质量和可靠性。
云原生项目的目标是使应用程序更易于构建、部署、管理和扩展,同时降低运营成本,提高开发者的生产力。
二、实验背景
云原生作为一种利用云计算交付模型的优势来构建和运行应用程序的方法论,旨在解决传统软件开发和部署模式中的 一些问题。传统的软件开发和部署模式存在操作系统依赖强、系统紧耦合、手动化扩展、恢复缓慢以及瀑布式开发等 问题,这些问题限制了企业充分利用云计算的优势,如高可扩展性、高可靠性、高性能和高安全性。云原生通过采用微服务、容器、Kubernetes等技术和方法,使得应用程序能够更好地适应云计算环境,实现快速开发、部署和扩展, 同时提高资源的利用效率。
此外,云原生项目的背景还涉及到对金融信创发展的响应。在金融信创领域,随着国家政策的推动和市场需求的变化,金融行业的数字化转型成为必然趋势。云原生数字生产力平台建设项目的提出,旨在构建一个现代化的云原生数 字生产力平台,通过采用云原生的技术和方法,打造出“高可用、高安全、高弹性、高敏捷、高效能”的分布式架构体系,以适应金融信创发展的需求。
2.1项目结构
2.1.1 集群组件部署架构图

用一个完整例子串起来
假设你想让这个系统跑一个 “计算器网站”:
-
你通过前台(apiserver)说:“我要运行一个计算器网站,一共3份”。
-
接待员把这话记在备忘录(etcd)上。
-
调度经理(scheduler)看看3个厨师谁有空,决定让 Node01、02、03 各做一份。
-
纠察员(controller-manager)盯着:如果 Node02 死机了,它马上让 Node01 再补做一份,保证永远有3份。
-
每个 Node 上的小组长(kubelet)命令炒菜师傅(Docker)把计算器网站跑起来。
-
骑手(kube-proxy)给这3份计算器网站挂上一个统一门牌号。用户访问这个门牌号,就能自动吃到其中一份计算器网站了。
总结:
Master 是“不干活的领导”(只下命令、做决策),Node 是“干活的员工”(跑程序、提供网络)。kubectl 就是你的“嘴巴”,你用它跟这个系统说话。
2.1.2 集群整体底层架构图
2.1.3项目运行流程图如下所示:
2.2 项目节点规划
| 主机名 | IP地址 | 角色 | 软件 | 资源 |
|---|---|---|---|---|
|
k8s-registry
|
192.168.72.100 | respostory |
docker, harbor
|
2C2G
|
|
k8s-master
|
192.168.72.101 | master |
kubeadm, kubelet, kubectl, etcd,api-server,
controller-manager,scheduler
|
2C2G
|
| k8s-node1 | 192.168.72.102 | node |
kubelet,kube-proxy,docke
|
2C2G
|
| k8s-node2 | 192.168.72.103 | node |
kubelet,kube-proxy,docke
|
|
| k8s-node3 | 192.168.72.104 | node |
kubelet,kube-proxy,docke
|
2C2G
|
|
gitlab-server
|
192.168.72.105 | server |
docker, gitlab
|
8C6G
|
|
gitlab-runner
|
192.168.72.106 | runner |
docker, gitlab-runne
|
6C4G
|
三、实验目的
本实验旨在帮助学生理解项目的实施流程,能够将所学知识点串联起来形成一个知识体系。通过本实验,希望同学们能够达到如下目的:
1. 掌握Kubernetes服务安装方法
2. 掌握Kubernetes服务配置方法
3. 掌握常见故障排除
四、实验环境
列出实验所需的软硬件环境要求,细化到具体的软硬件设施细节版本等。
宿主机:windows11 专业版 23H2
虚拟软件:VMware-workstation-full-17.5.2-23775571.exe
远程连接工具:Xshell-7.0.0164p.exe
FTP上传软件:Xftp-7.0.0162p.exe
Linux操作系统:rhel-9.4-x86_64-dvd.iso
Docker Engine版本:27.1.2
Docker Compose版本:v2.29.1
Kubernetes 版本:1.31.0
Flannel版本:v0.25.6
Nginx版本:1.27.1
Tomcat版本:10.1.28
MySQL版本:8.4.2
Gitlab版本:gitlab-ee:17.3.1-ee.0
Maven版本:3.9.9
Git版本:2.43.0
JDK版本:21.0.4
五、项目实现步骤
5.1初始化环境
首先使用 RedHat 9.4 来安装一个最小化系统,磁盘空间选择 200G,内存选择 2G,CPU 选择 2 核 2 线程,网络选择 NAT 模式,设置root账号的密码为 redhat,同时创建一个名为 redhat 的普通用户,并且密码也是 redhat。
以下配置都是需要在所有节点上操作,为了方便,我们先在系统中安装好后再进行克隆,从而减轻重复配置工作。
5.1.1配置本地仓库
安装好系统,配置本地仓库
[root@master ~]# cd /etc/yum.repos.d/[root@master yum.repos.d]# vi base.repo
仓库内容如下:
[baseOS]name=baseosbaseurl=/mnt/BaseOSgpgcheck=0[appstream]name=appstreambaseurl=/mnt/AppStreamgpgcheck=0
配置好后,保存退出。
5.1.2挂载镜像
配置好本地仓库后,还需要将系统镜像挂载到系统的 /mnt 目录下。
[root@master yum.repos.d]# mount /dev/sr0 /mntmount: /mnt: WARNING: source write-protected, mounted read-only.[root@master yum.repos.d]# ls /mntAppStream EFI extra_files.json images media.repo RPM-GPG-KEY_redhat-releaseBaseOS EULA GPL isolinux RPM-GPG-KEY-redhat-beta
能看到如下信息表示挂载成功。
注意:这种挂载方式只是临时的,系统启动后挂载会失效。如果希望永久挂载,即开机后会自动挂载,我们可以修改 /etc/fstab 文件,在此文件中进行自动挂载配置。
[root@master yum.repos.d]# vi /etc/fstab
在文件的末尾添加如下内容:
/dev/sr0 /mnt iso9660 defaults 0 0
配置好后保存退出,并重启系统验证是否开机自动挂载。
注意:修改 /etc/fstab 文件时配置项不能写错,否则无法重启成功。
重启后可执行如下命令进行验证:
[root@master ~]# df -hFilesystem Size Used Avail Use% Mounted ondevtmpfs 4.0M 0 4.0M 0% /devtmpfs 968M 0 968M 0% /dev/shmtmpfs 387M 5.7M 382M 2% /run/dev/mapper/rhel-root 70G 1.8G 69G 3% //dev/nvme0n1p2 960M 188M 773M 20% /boot/dev/nvme0n1p1 599M 7.1M 592M 2% /boot/efi/dev/sr0 11G 11G 0 100% /mnt/dev/mapper/rhel-home 121G 893M 120G 1% /hometmpfs 194M 0 194M 0% /run/user/0[root@master ~]# ls /mntAppStream EFI extra_files.json images media.repo RPM-GPG-KEY-redhat-releaseBaseOS EULA GPL isolinux RPM-GPG-KEY-redhat-beta
可以发现,已经能够自动挂载镜像到 /mnt 目录下。
5.1.3安装基础软件guanli
由于系统是采用最小化安装,安装后很多动能都不能使用,因此需要安装一些重要且必要的软件。执行以下命令来进行安装。
dnf -y install vim net-tools gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel make wget
5.1.4 管理防火墙
5.1.4.1 关闭防火墙
对于防火墙来说,如果是用于学习过程中做为练习的项目,建议把防火墙关闭。执行如下命令来关闭防火墙
#停止动防火墙服务[root@master ~]# systemctl stop firewalld#禁止开机自启动动防火墙服务[root@master ~]# systemctl disable firewalldRemoved "/etc/systemd/system/multi-user.target.wants/firewalld.service".Removed "/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service"#查看动防火墙状态[root@master ~]# systemctl status firewalld○ firewalld.service - firewalld - dynamic firewall daemonLoaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; preset: enabled)Active: inactive (dead)Docs: man:firewalld(1)Aug 23 09:49:02 master systemd[1]: Starting firewalld - dynamic firewall daemon...Aug 23 09:49:02 master systemd[1]: Started firewalld - dynamic firewall daemon.Aug 23 09:58:31 master systemd[1]: Stopping firewalld - dynamic firewall daemon...Aug 23 09:58:31 master systemd[1]: firewalld.service: Deactivated successfully.Aug 23 09:58:31 master systemd[1]: Stopped firewalld - dynamic firewall daemon.
5.1.4.2 启用防火墙
但在生产环境中,为了项目的安全,不能关闭防火墙,而是将项目中所用到的服务或端口添加到防火墙规则中。
#放行API Server端口[root@master ~]# firewall-cmd --permanent --add-port=6443/tcp#放行Controller Manager端口[root@master ~]# firewall-cmd --permanent --add-port=10257/tcp#放行Scheduler端口[root@master ~]# firewall-cmd --permanent --add-port=10259/tcp#放行kubelet端口[root@master ~]# firewall-cmd --permanent --add-port=10250/tcp[root@master ~]# firewall-cmd --permanent --add-port=10255/tcp#放行etcd端口[root@master ~]# firewall-cmd --permanent --add-port=2379/tcp[root@master ~]# firewall-cmd --permanent --add-port=2380/tcp#放行CoreDNS端口[root@master ~]# firewall-cmd --permanent --add-port=53/tcp[root@master ~]# firewall-cmd --permanent --add-port=53/udp#放行calico端口[root@master ~]# firewall-cmd --permanent --add-port=179/tcp#放行fannel端口[root@master ~]# firewall-cmd --permanent --add-port=8285/tcp#放行tomcat端口[root@master ~]# firewall-cmd --permanent --add-port=8080/tcp[root@master ~]# firewall-cmd --reload注意:后续用到某个端口时,可根据实际情况来放行。
5.1.5 关闭swap分区
修改/etc/fstab 文件,将swap设备挂载命令注释掉。
[root@master ~]# vim /etc/fstab/dev/mapper/rhel-root / xfs defaults 0 0UUID=580f9381-7afb-49cf-b60e-b2292fe0474e /boot xfs defaults 0 0UUID=2C51-6BC9 /boot/efi vfat umask=0077,shortname=winnt 0 2/dev/mapper/rhel-home /home xfs defaults 0 0#/dev/mapper/rhel-swap none swap defaults 0 0/dev/sr0 /mnt iso9660 defaults 0 0
5.1.6 禁止SELinux
执行如下命令禁用SELinux功能。
[root@master ~]# vim /etc/selinux/config# 将文件中的SELINUX值改为disabledSELINUX=disabled# 或者执行如下命令来修改# 将 SELinux 设置为 permissive 模式(相当于将其禁用)[root@master ~]# sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
5.1.7 时间同步
Kubernetes集群要求集群中的节点时间必须精确一致,因此为了保证集群正常工作,需要对所有节点进行时间同步。执行如下命令来实现。
5.1.7.1 安装chrony
# 安装chrony[root@master ~]# dnf -y install chrony
5.1.7.2 配置chrony
# 备份配置文件[root@master ~]# cp /etc/chrony.conf /etc/chrony.conf.back# 编辑配置文件[root@master ~]# vim /etc/chrony.conf
为了防止配置错误,先备份原来的 chrony.conf 文件,然后再删除这个文件中所有内容后,将如下内容复制到文件中。
server ntp.aliyun.com iburststratumweight 0driftfile /var/lib/chrony/driftrtcsyncmakestep 10 3bindcmdaddress 127.0.0.1bindcmdaddress ::1keyfile /etc/chrony.keyscommandkey 1generatecommandkeylogchange 0.5logdir /var/log/chrony保存后退出。
5.1.7.3 启动chrony
配置好后,执行如下命令来启动服务,并设置为开机运行。
# 启动chronyd服务[root@master ~]# systemctl start chronyd# 设置chronyd服务开机自启[root@master ~]# systemctl enable chronyd# 查看是否同步[root@master ~]# chronyc sourcesMS Name/IP address Stratum Poll Reach LastRx Last sample===============================================================================^+ 139.199.214.202 2 10 367 780 -2980us[-2682us] +/- 40ms^- time.cloudflare.com 3 7 377 457 +46ms[ +46ms] +/- 153ms^+ stratum2-1.ntp.mow01.ru.> 2 10 327 772 -2312us[-2014us] +/- 61ms^* dns2.synet.edu.cn 1 10 377 719 +6693us[+6992us] +/- 34ms# System clock synchronized: yes 表示同步成功[root@master ~]# timedatectlLocal time: Fri 2024-08-23 11:08:46 CSTUniversal time: Fri 2024-08-23 03:08:46 UTCRTC time: Fri 2024-08-23 03:08:47Time zone: Asia/Shanghai (CST, +0800)System clock synchronized: yesNTP service: activeRTC in local TZ: no
5.1.8 配置主机映射
修改 /etc/hosts 文件,在文件中添加主机名与 IP 映射。
# 配置映射[root@master ~]# cat <<EOF >> /etc/hosts192.168.72.100 k8s-registry.com k8s-registry192.168.72.101 k8s-master.com k8s-master192.168.72.102 k8s-node1.com k8s-node1192.168.72.103 k8s-node2.com k8s-node2192.168.72.104 k8s-node3.com k8s-node3EOF# 查看配置结果[root@master ~]# cat /etc/hosts127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4::1 localhost localhost.localdomain localhost6 localhost6.localdomain6192.168.72.100 k8s-registry.com k8s-registry192.168.72.101 k8s-master.com k8s-master192.168.72.102 k8s-node1.com k8s-node1192.168.72.103 k8s-node2.com k8s-node2192.168.72.104 k8s-node3.com k8s-node3
5.1.9 安装Docker
由于所有节点上都要使用Docker容器,因此我们统一进行安装。
1)首先安装Docker必要的一些系统工具
[root@master ~]# dnf -y install yum-utils
2)添加软件源信息
[root@master ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/rhel/docker-ce.repoUpdating Subscription Management repositories.Unable to read consumer identityThis system is not registered with an entitlement server. You can use "rhc" or"subscription-manager" to register.Adding repo from: https://mirrors.aliyun.com/docker-ce/linux/rhel/docker-ce.repo
3)修改仓库下载源
[root@master ~]# sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+'/etc/yum.repos.d/docker-ce.repo
4)配置Docker镜像加速
#创建目录[root@master ~]# mkdir -p /etc/docker# 配置加速[root@master ~]# tee /etc/docker/daemon.json <<-'EOF'{"registry-mirrors": ["https://h7pcr6zf.mirror.aliyuncs.com"],"insecure-registries": ["k8s-registry.com"],"exec-opts": ["native.cgroupdirver=systemd"]}EOF注意:镜像加速地址换为你自己的。
5) 安装Docker
#安装Docker-ce[root@master ~]# dnf -y install docker-ce#查看Docker版本[root@master ~]# docker versionClient: Docker Engine - CommunityVersion: 27.1.2API version: 1.46Go version: go1.21.13Git commit: d01f264Built: Mon Aug 12 11:52:49 2024OS/Arch: linux/amd64Context: defaultCannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the dockerdaemon running?#查看compose版本[root@master ~]# docker compose versionDocker Compose version v2.29.1
6)启动Docker服务
#启动并加入开机名单[root@master ~]# systemctl enable --now dockerCreated symlink /etc/systemd/system/multi-user.target.wants/docker.service →/usr/lib/systemd/system/docker.service#查看服务状态[root@master ~]# systemctl status docker● docker.service - Docker Application Container EngineLoaded: loaded (/usr/lib/systemd/system/docker.service; enabled; preset: disabled)Active: active (running) since Fri 2024-08-23 14:41:28 CST; 1min 28s agoTriggeredBy: ● docker.socketDocs: https://docs.docker.comMain PID: 17114 (dockerd)Tasks: 10Memory: 26.1MCPU: 298msCGroup: /system.slice/docker.service└─17114 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sockAug 23 14:41:28 master systemd[1]: Starting Docker Application Container Engine...Aug 23 14:41:28 master dockerd[17114]: time="2024-08-23T14:41:28.319207923+08:00"level=info msg="Starting up"Aug 23 14:41:28 master dockerd[17114]: time="2024-08-23T14:41:28.343167417+08:00"level=info msg="Loading container>Aug 23 14:41:28 master dockerd[17114]: time="2024-08-23T14:41:28.622449450+08:00"level=info msg="Loading container>Aug 23 14:41:28 master dockerd[17114]: time="2024-08-23T14:41:28.636020240+08:00"level=info msg="Docker daemon" co>Aug 23 14:41:28 master dockerd[17114]: time="2024-08-23T14:41:28.636248887+08:00"level=info msg="Daemon has comple>Aug 23 14:41:28 master dockerd[17114]: time="2024-08-23T14:41:28.666159587+08:00"level=info msg="API listen on /ru>Aug 23 14:41:28 master systemd[1]: Started Docker Application Container Engine.
5.1.10 安装容器运行时
官网地址:https://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/
5.1.10.1启用IPV4数据包转发
在/etc/sysctl.d/目录下创建k8s.conf文件,设置相关参数来手动启用IPV4数据包转发。
[root@master ~]# cat <<"EOF" | tee /etc/sysctl.d/k8s.confnet.bridge.bridge-nf-call-iptables = 1net.bridge.bridge-nf-call-ip6tables = 1net.ipv4.ip_forward = 1vm.swappiness = 0EOF
创建好的执行如下命令来让参数生效。
# 应用 sysctl 参数而不重新启动[root@master ~]# sysctl --system#......省略net.bridge.bridge-nf-call-iptables = 1net.bridge.bridge-nf-call-ip6tables = 1net.ipv4.ip_forward = 1vm.swappiness = 0注意:要加上 vm.swappiness参数来禁止交换分区。
5.1.10.2 cri-docker
1、安装cri-dockerd
# 下载文件[root@master ~]# wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.15/cri-dockerd-0.3.15.amd64.tgz# 解压文件[root@master ~]# tar -zxvf cri-dockerd-0.3.15.amd64.tgz# 安装cri-dockerd[root@master ~]# cp cri-dockerd/cri-dockerd /usr/bin/说明:如果无法通过 wget 下载,可使用提供文件中的 cri-dockerd-0.3.15.amd64.tgz
2、配置cri-dockerd
2.1 获取源码,将源码systemd配置文件拷贝到相应目录。
# 下载源码[root@master ~]# wget https://github.com/Mirantis/cridockerd/archive/refs/tags/v0.3.15.tar.gz# 解压到临时目录[root@master ~]# tar -zxvf cri-dockerd-0.3.15.tar.gz# 将源中systemd配置文件拷贝到相应目录[root@master ~]# cp cri-dockerd-0.3.15/packaging/systemd/* /etc/systemd/system/注意:如果无法使用 wget 下载,可使用提供文件包中 cri-dockerd-0.3.15.tar.gz 文件
2.2、修改文件 /etc/systemd/system/cri-docker.service,为 Service.ExecStart 字段增加 --network-plugin 与 --pod-infra-container-image 选项。–pod-infra-container-image 镜像tag需要根据具体k8s安装版本指定。也就是要修改网络和根容器镜像。
[root@master ~]# vim /etc/systemd/system/cri-docker.service文件内容如下:[Unit]Description=CRI Interface for Docker Application Container EngineDocumentation=https://docs.mirantis.comAfter=network-online.target firewalld.service docker.serviceWants=network-online.targetRequires=cri-docker.socket[Service]Type=notifyExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --network-plugin=cni--pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.10ExecReload=/bin/kill -s HUP $MAINPIDTimeoutSec=0RestartSec=2Restart=always
3、启动服务
# 重新加载配置[root@master ~]# systemctl daemon-reload# 设置为开机自启动[root@master ~]# systemctl enable cri-dockerCreated symlink /etc/systemd/system/multi-user.target.wants/cri-docker.service →/etc/systemd/system/cri-docker.service.# 启动服务[root@master ~]# systemctl start cri-docker# 检查服务状态[root@master ~]# systemctl status cri-docker● cri-docker.service - CRI Interface for Docker Application Container EngineLoaded: loaded (/etc/systemd/system/cri-docker.service; enabled; preset: disabled)Active: active (running) since Fri 2024-08-23 21:04:03 CST; 10s agoTriggeredBy: ● cri-docker.socketDocs: https://docs.mirantis.comMain PID: 17804 (cri-dockerd)Tasks: 8Memory: 44.7MCPU: 77msCGroup: /system.slice/cri-docker.service└─17804 /usr/bin/cri-dockerd --container-runtime-endpoint fd:// --network-plugin=cni --pod-infra-contai>
5.1.11配置K8S镜像仓库
由于要安装kubernetes,因此需要在本地构建镜像构建镜像源仓库,执行如下命令配置kubernetes仓库。
cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo[kubernetes]name=Kubernetesbaseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.31/rpm/enabled=1gpgcheck=0EOF配置好后,关闭虚拟机,准备克隆系统。
更多推荐
所有评论(0)