OpenShift 与 Rancher

news2024/9/19 10:54:02

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。

推荐:Linux运维老纪的首页,持续学习,不断总结,共同进步,活到老学到老
导航剑指大厂系列:全面总结 运维核心技术:系统基础、数据库、网路技术、系统安全、自动化运维、容器技术、监控工具、脚本编程、云服务等。
常用运维工具系列:常用的运维开发工具, zabbix、nagios、docker、k8s、puppet、ansible等
数据库系列:详细总结了常用数据库 mysql、Redis、MongoDB、oracle 技术点,以及工作中遇到的 mysql 问题等
懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂
非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

案例: OpenShift Rancher
技能目标:
-
了解 Rancher
-
掌握 Rancher 安装和配置
-
了解 OpenShift
-
掌握 OpenShift 安装和配置 在了解云计算的工程中不关心虚拟机监控程序和虚拟机是不可能的,虚拟化是云计算的 核心。虚拟化技术的涵盖面很广,这在云中是很有价值的。其中包含着一个普遍的虚拟化模
容器技术。随着 Docker 容器技术的不断成熟,云计算与 Docker 的结合也越来越紧密
了。

9.1 案例分析一

9.1.1 案例概述

Kubernetes 是一个强大的容器编排工具,可以帮助用户在可伸缩性系统上可靠地部署

和运行容器化应用。直接安装 Kubernetes 的操作复杂并且容易出错。Rancher 容器管理平

台原生支持 Kubernetes,使用户可以简单轻松地部署 Kubernetes 集群。

9.1.2 案例前置知识点

在使用 Rancher 之前,先来了解一下 Rancher 相关知识。

Rancher 是一个容器管理平台,专为在生产中部署容器的组织而构建。Rancher 可以

轻松地在任何地方运行 Kubernetes,为 DevOps 团队提供支持。Rancher DevOps 工程

师提供直观的用户界面,以管理他们的应用程序工作负载。用户无需深入了解 Kubernetes

概念即可开始使用 Rancher

Rancher IT DevOps 领域中扮演的角色,如图 9.1 所示。

9.1 Rancher IT DevOps 组织中扮演的角色

Rancher 包含一组有用的 DevOps 工具。Rancher 获得了广泛的云原生态系统产品认

证,包括安全工具,监控系统,容器注册表以及存储和网络驱动程序。每个团队在他们选择

的公共云或私有云上部署他们的应用程序。系统管理员可以跨所有用户、群集和云获得可见

性并实施策略。

9.1.3 案例环境

1.本案例环境

本案例环境如表 9-1 所示。

9-1 案例环境

角色

操作系统

主机名/IP 地址

安装软件

Rancher

CentOS 7.3

rancher/192.168.0.10

Rancher/Docker-ce

Node1

CentOS 7.3

node1/192.168.0.11

Docker-ce

Node2

CentOS 7.3

node2/192.168.0.12

Docker-ce

实验的拓扑图,如图 9.2 所示。

9.2 实验拓扑

2.案例需求

本案例的需求是:在服务中使用 Rancher 部署集群并进行集群管理。

3.案例实现思路

本案例的实现思路如下:

1)对三台主机进行系统初始化配置;

2)在三台主机上安装并启动 Docker 服务;

3)安装部署 Rancher 服务;

4)使用 Rancher 自定义集群;

5)使用 Rancher 为节点部署服务。

9.2 案例实施一

9.2.1 主机配置

在安装配置 Rancher 之前,需要先对主机进行基本的初始化配置,例如:设置主机名、

关闭防火墙与 SELinux、在 hosts 文件中添加地址解析、修改内核参数等。具体操作步骤如

下所示。

(1)设置主机名

在三台主机上分别设置主机名。

[root@localhost ~]# hostnamectl set-hostname rancher

//IP 地址为 192.168.0.10 主机上设置主机名为 rancher

[root@localhost ~]# bash

[root@rancher ~]#

[root@localhost ~]# hostnamectl set-hostname node1

//IP 地址为 192.168.0.11 主机上设置主机名为 node1

[root@localhost ~]# bash

[root@node1 ~]#

[root@localhost ~]# hostnamectl set-hostname node2

//IP 地址为 192.168.0.12 主机上设置主机名为 node2

[root@localhost ~]# bash

[root@node2 ~]#

(2)关闭防火墙与 SELinux

将所有主机的防火墙与 SELinux 都设置为关闭状态,下面以 rancher 主机为例进行操

作。

[root@rancher ~]# systemctl disable firewalld

[root@rancher ~]# systemctl stop firewalld

[root@rancher ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

//关闭 SELinux 后需要重启机器才能生效

[root@rancher ~]# setenforce 0

(3)添加地址解析记录

在所有主机的 hosts 文件中添加 hosts 地址解析,下面以 rancher 主机为例进行操作。

[root@rancher ~]# vim /etc/hosts

192.168.0.10 rancher

192.168.0.11 node1

192.168.0.12 node2

(4)修改内核参数

在所有主机上修改内核参数并执行 sysctl -p 命令使配置立即生效。下面以 rancher

机为例进行操作。

[root@rancher ~]# cat <<EOF >> /etc/sysctl.conf

net.ipv4.ip_forward = 1

EOF

[root@rancher ~]# sysctl -p

net.ipv4.ip_forward = 1

9.2.2 安装并启动 Docker

Rancher 官网中推荐使用社区版 Docker CE 进行部署,所以需要重新配置 Docker 安装

源来。在所有主机上安装 Docker CE,下面以 rancher 主机为例进行操作。

[root@rancher ~]# yum install -y yum-utils device-mapper-persistent-data lvm2

//安装依赖包

[root@rancher ~]# yum-config-manager \

--add-repo \

https://download.docker.com/linux/centos/docker-ce.repo

//添加 Docker-ce 软件包源

已加载插件:fastestmirror, langpacks

adding repo from: https://download.docker.com/linux/centos/docker-ce.repo

grabbing

file

https://download.docker.com/linux/centos/docker-ce.repo

to

/etc/yum.repos.d/docker-ce.repo

repo saved to /etc/yum.repos.d/docker-ce.repo

[root@rancher ~]# yum install -y docker-ce

//安装 Docker CE

[root@rancher ~]# mkdir /etc/docker

[root@rancher ~]# tee /etc/docker/daemon.json <<-'EOF'

{ "registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"] }

EOF

//推荐使用阿里云镜像加速,“xxxx”要更换为自己阿里镜像加速地址

[root@rancher ~]# systemctl start docker

[root@rancher ~]# systemctl enable docker

9.2.3 部署 Rancher

安装完 Docker 后,在 rancher 主机上使用 Docker 创建并运行 Rancher 容器,具体操

作如下所示。[root@rancher ~]# docker run -d --restart=unless-stopped -p 80:80 -p 443:443

rancher/rancher:v2.0.8

Unable to find image 'rancher/rancher:v2.0.8' locally

stable: Pulling from rancher/rancher

124c757242f8: Pull complete

2ebc019eb4e2: Pull complete

dac0825f7ffb: Pull complete

82b0bb65d1bf: Pull complete

ef3b655c7f88: Pull complete

437f23e29d12: Pull complete

52931d58c1ce: Pull complete

b930be4ed025: Pull complete

4a2d2c2e821e: Pull complete

9137650edb29: Pull complete

f1660f8f83bf: Pull complete

a645405725ff: Pull complete

Digest: sha256:6d53d3414abfbae44fe43bad37e9da738f3a02e6c00a0cd0c17f7d9f2aee373a

Status: Downloaded newer image for rancher/rancher:stable

87c4893fea3250adb02857f1244d27ef6abb97de6bb4529e0d21fea9c7456515

上述命令执行完后,在浏览器中输入 http://192.168.0.10,页面会提示您的连接不是私

密连接,单击页面的高级按钮,继续单击继续前往 192.168.0.10”链接,单击保存 URL”

最后访问到 Rancher 图形界面控制台,如图 9.3 所示。

9.3 Rancher 图形界面控制台

首次访问时需要为默认管理员 admin 用户设置密码,本章中密码设置为 123.com,如

9.4 所示。如果认为设置的密码过于简单,也可以勾选下面的使用新的随机生成的密码

选项就会出现一个新生成的随机密码,可使用该密码作为管理员 admin 用户的密码。

9.4 admin 用户设置密码

设置完密码后单击继续按钮,即可进入 Rancher 图形管理界面,如图 9.5 所示。

9.5 Rancher 首页

9.2.4 自定义集群

Rancher 2.0 开始,Rancher 中的每个集群都将基于 Kubernetes,用户可以充分利

Kubernetes 的强大性能及其迅速壮大的生态系统。

RKERancher Kubernetes Engine)是一个用 Golang 编写的 Kubernetes 安装程序。

Rancher 中使用 Docker Machine RKE 可以在内部部署的裸机服务器上创建

Kubernetes 集群,这是 Rancher 自己的轻量级 Kubernetes 安装程序,极为简单易用,用

户不需要做大量的准备工作,即可拥有闪电般快速的 Kubernetes 安装部署体验。除裸机服

务器外,RKE 还可以通过与节点驱动程序集成在任何 IaaS 提供商上来创建集群。

Rancher 中创建集群,需要访问要用作 Kubernetes 集群的服务器。根据 Rancher

的要求配置每个服务器,其中包括一些硬件规范和 Docker。在每台服务器上安装 Docker

后,运行 Rancher 中提供的命令将每台服务器转换为 Kubernetes 节点。

Kubernetes 集群创建的具体步骤如下所示。

(1)添加群集

可以在 Rancher 管理页面中单击添加集群”->“添加主机自建 Kubernetes 集群,并设

集群名称“rancher-1”,其他配置保持默认即可,如图 9.6 所示。

9.6 添加集群

单击下一步按钮,进入自定义主机运行命令界面。

(2)自定义主机运行命令

自定义主机运行命令主机角色配置项中选择全部如图 9.7 所示。复制图中的

docker run 命令,粘贴到 Node1 节点上执行,然后点击完成”按钮。

9.7 自定义主机运行命令

因为 Node 节点在执行过程中需要下载多个 Docker 镜像,所以注册过程可能会比较慢。

为避免执行时因镜像下载问题而导致报错,可提前下载镜像。下面以 Node1 节点为例拉取

所需镜像。如果拉取镜像速度比较慢,也可以使用发布时提供的镜像包文件导入镜像。

[root@node1 ~]# docker pull rancher/rancher-agent:v2.0.8

[root@node1 ~]# docker pull rancher/hyperkube:v1.11.2-rancher1

[root@node1 ~]# docker pull rancher/rke-tools:v0.1.13

[root@node1 ~]# docker pull rancher/nginx-ingress-controller:0.16.2-rancher1

[root@node1 ~]# docker pull rancher/hello-world

[root@node1 ~]# docker pull rancher/calico-node:v3.1.1

[root@node1 ~]# docker pull rancher/calico-cni:v3.1.1

[root@node1 ~]# docker pull rancher/k8s-dns-dnsmasq-nanny-amd64:1.14.10

[root@node1 ~]# docker pull rancher/k8s-dns-kube-dns-amd64:1.14.10

[root@node1 ~]# docker pull rancher/k8s-dns-sidecar-amd64:1.14.10

13 页 共 47 [root@node1 ~]# docker pull rancher/coreos-etcd:v3.2.18

[root@node1 ~]# docker pull rancher/pause-amd64:3.1

[root@node1 ~]# docker pull rancher/metrics-server-amd64:v0.2.1

[root@node1 ~]# docker pull rancher/coreos-flannel:v0.9.1

[root@node1 ~]# docker pull rancher/nginx-ingress-controller-defaultbackend:1.4

[root@node1 ~]# docker pull rancher/cluster-proportional-autoscaler-amd64:1.0.0

注册完成后,单击集群名称“rancher-1”,出现如图 9.8 所示界面查看集群信息。

9.8 集群状态信息

若想在集群中添加 node2 或更多主机,在相应的新 Node 节点中执行上述的 docker run

命令,Rancher 会自行完成后续工作。

9.2.5 部署服务

Node 节点注册成功后,就可以通过 Rancher 在节点中部署服务。

(1)工作负载

“rancher-1”配置项的下拉菜单中选择“Default”对群集进行默认配置。如图 9.9 所示。

9.9 进入集群默认配置界面

工作负载界面中单击部署服务进入部署工作负载界面。在该界面中设置名称

“myapp”“Docker 镜像字段中输入“rancher/hello-world”(此字段区分大小写)。其他配置保

持默认,点击启动按钮进行部署,如图 9.10 所示。

9.10 部署工作负载

当工作负载完成部署时,会为其分配一个“Active”状态,可以在工作负载页面查看此

状态,如图 9.11 所示。

9.11 查看状态

(2)负载均衡

单击负载均衡添加 Ingress”即可进入添加 Ingress”的界面,如图 9.12 所示。

9.12 进入添加 Ingress”的界面

添加 Ingress”界面中设置名称“hello”

目标服务为之前创建的工作负载 myapp

端口80,其他配置项默认,点击保存进行部署,如图 9.13 所示。图 9.13 添加 Ingress

部署完成后,在负载均衡页面显示部署结果,如图 9.14 所示。

9.14 负载均衡部署结果

18 页 共 47 单击目标下方的链接出现如图 9.15 所示的执行结果,说明服务部署成功。

9.15 访问负载均衡

9.3 案例分析二
9.3.1 案例概述
常见的开源私有云平台除了 OpenStack 之外,常用的还有红帽公司推出的 OpenShift
云平台。下面将学习 OpenShift 云平台部署与基本管理。
9.3.2 案例前置知识点
1.OpenShift 概述
OpenShift 是由红帽公司推出的 PaaS 云计算平台,目前共提供三种产品:OpenShift
OnlineOpenShift Enterprise OpenShift Origin。其中,OpenShift Online 是面向普通开
发者和小微企业的线上公有云平台;OpenShift Enterprise 是面向企业的私有云平台;
OpenShift Origin 属于一个开源项目,是构成前两个的基础。OpenShift Enterprise 是开源
的私有云版本,由 OpenShift Origin 管理。OpenShift Enterprise 支持 GitHub,开发者可以
19 页 共 47 使用 Git 来发布自己的 Web 应用程序到平台上。
OpenShift 汇集了 Docker Kubernetes,所以简称为 OKD,并提供了一个 API 来管
理这些服务。OKD 允许创建和管理容器。
OpenShift 是自由和开放源码的云计算平台,开发人员可以创建、测试和运行他们的应
用程序,并且可以把它们部署到云中。OpenShift 广泛支持多种编程语言和框架,如 Java
Ruby PHP 等。另外它还提供了多种集成开发工具如 Eclipse integrationJBoss
Developer Studio Jenkins 等。OpenShift 基于一个开源生态系统为移动应用,数据库服
务等提供支持。
通常情况下,容器是在其自己的环境中运行的独立进程,独立于操作系统和底层基础结
构。而 OpenShift 可以帮助开发、部署和管理基于容器的应用程序,提供了一个自助服务平
台,可以按需创建、修改和部署应用,从而实现更快的开发和发布生命周期。
2.OpenShift 术语
下面是 OpenShif 中常用的关键术语:
Broker:管理着整个平台,选择合适的 Node 节点处理请求;
Node:由众多的 Gear 组成;
Gear:资源容器,约束着 CPU、内存、存储等软硬件资源,并负责运行应用;
Cartridge:技术堆栈,如语言、框架、服务,或者被打包的常用功能;
ApplicationCartridge 的载体,以及应用代码本身;
Scaled/Scalable Application:多个 Gear 协同构成的应用;
Client ToolsCLIEclipseWeb Console 等创建或管理应用的工具。
3.OpenShift 结构
OpenShift 可以由一个 Broker 节点和一个或多个 Node 节点构成的分层结构,自下而上
主要包括以下五层:基础架构层、容器引擎层、容器编排层、PaaS 服务层、界面及工具层。
基础架构层:为 Openshift 平台的运行提供基础的运行环境。Openshift 支持运行
在物理机、虚拟机(KVMVmwareVirtual Box 等)、公有云(阿里云,AWS
等)、私有云、混合云上;
容器引擎层:以当前主流的 Docker 作为容器引擎;
容器编排层:以 Google Kubernetes 进行容器编排;
PaaS 服务层:容器云平台的最终目的是为上层应用服务提供支持,提高开发,测
试,部署,运维的速度和效率。用户在 OpenShift 云平台上可以快速的获取和部署
一个数据库、缓存等;
界面及工具层:OpenShift 提供了多种用户的接入渠道:Web 控制台、命令行、
RestFul 接口等。
OpenShift 工作流程如图 9.16 所示。
9.16 OpenShift 工作流程开发者可以使用 rhcWeb 控制台等工具向 Broker 节点发送 REST 请求,也可以直接
通过 SSH 登录到应用所在 Gear 直接对应用进行操作。
Broker 节点主要由 Broker controller 两个子项目构成,其中 Broker 主要完成配置任
务,而逻辑则实现于 ControllerController 子项目是整个 OpenShift 项目的核心之一,另
一核心是 Node 子项目,存储着平台数据/状态,以及通过接口实现授权、DNS 等功能。此
外,还有 Broker-util 子项目提供命令,方便管理 Broker 节点。
Node 节点主要就是存放用户应用以及管理它们。每个 Gear 就是一个由软硬件资源构
成的容器,放置着用户应用代码和所使用的 Cartridge 实例。同一个 Gear 内的 Cartridge
在本地一样,是可以直接通信的;而不同 Gear 之间则可以通过端口转发实现,相同原理,
部分 Cartridge 可以像在本地一样操作它们。
此外,与 Broker 节点一样,Node 节点也有 node-util 子项目提供命令,管理 Node
点或者位于 Node 之下的众多 GearCartridge
最终用户访问应用时,根据携带的参数,通过 Apache 转发可直接到达指定 Gear 处理,
快捷高效,而且安全性得到提高。
4.OpenShift 核心组件
OpenShift 的核心组件及其之间的关联关系如图 9.17 所示。
9.17 OpenShift 的核心组件之间的关系
OpenShift 在容器编排层使用了 Kubernetes,所以 OpenShift 在架构上和 Kubernetes
十分接近。其内部许多组件和概念都是从 Kubernetes 衍生而来,但是也存在一些在容器编
排层之上。
(1)Master 节点
Master 节点属于主控节点,集群内的管理组件都运行在 Master 节点上。Master 节点
负责集群的配置管理,维护集群的状态。Master 节点上所运行的服务组件有:
API Server:负责提供 Web Console RESTful API。集群内所有节点都会访问
API Server,更新节点的状态及容器状态。
数据源(Data store):负责存储信息。集群内所有状态信息都会存储在后端的一
etcd 的分布式数据库中。
调度控制器(Scheduler):负责按用户输入的要求寻找合适的计算节点。
复制控制器(Replication Controller):负责监控当前容器实例的数量和用户部署
指定的数量是否匹配,若有容器异常退出,复制控制器发现实际数少于部署定义数,
从而触发部署新的实例。
(2)Node 节点
Node 节点是计算节点,用于接收 Master 节点的指令,来运行和维护 Docker 容器。
Master 节点也可以是 Node 节点,只是在一般环境中,其运行容器的功能是关闭的。
3)Project 和 Namespace
Kubernetes 中使用命名空间的概念来分隔资源。在同一个命名空间中,某一个对象
的名称在其分类中必须是唯一的,但是分布在不同命令空间的对象则可以同名。OpenShift
继承了 Kubernetes 命名空间的概念,而且在其之上定义了 Project 对象的概念。每一个
Project 会和一个 Namespace 相关联,甚至可以简单地认为,Project 就是 Namespace
所以在 OpenShift 中进行操作时,首先要确认当前执行的上下文是哪一个 Project
(4)Pod
OpenShift 运行的容器会被 Pod 包裹,用户不会直接看到 Docker 容器本身。从
技术上来说,Pod 其实也是一种特殊的容器。
(5)Service
由于容器是一个非持久化的对象,所有对容器的修改在容器销毁后都会丢失,而且每个
容器的IP地址会不断变化。
k
8s提供了Service组件,当部署某个应用时,会创建一个Service
对象,该对象与一个或多个 Pod 关联,同时每个 Service 分配一个相对恒定的 IP,通过访
问该 IP 及相应的端口,请求就会转发到对应 Pod 端口。除了可通过 IP,也可以通过域名访
Service,格式为:..svc.cluster.local
(6)Router 和 Route
Service 提供了一个通往后端 Pod 集群的稳定入口,但是 Service IP 地址只是集群
内部的节点和容器可见。外部需通过 Router(路由器)来转发。Router 组件是 Openshift
集群中一个重要的组件,它是外界访问集群内容器应用的入口。用户可以创建 Route(路由
规则)对象,一个 Route 会与一个 Service 关联,并绑定一个域名。Route 规则被 Router
加载。当集群外部的请求通过指定域名访问应用时,域名被解析并指向 Router 所在的计算
机节点上,Router 获取该请求,然后根据 Route 规则定义转发给与这个域名对应的 Service
后端所关联的 Pod 容器实例。上述转发流程类似于 NginxRouter 负责将集群外的请求转
发到集群的容器,Service 则负责把来自集群内部的请求转发到指定的容器中。
(7)Persistent Storage
容器默认是非持久化的,所有的修改在容器销毁时都会丢失。Docker 提供了持久化卷
挂载的能力,Openshift 除了提供持久化卷挂载的能力,还提供了一种持久化供给模型即 PV
Persistent Volume)和 PVCPersistent Volume Claim)。在 PV PVC 模型中,集群
管理员会创建大量不同大小和不同特性的 PV。用户在部署应用时显示的声明对持久化的需
求,创建 PVC,在 PVC 中定义所需要的存储大小,访问方式。OpenShift 集群会自动寻找
符合要求的 PV PVC 自动对接。
(8)Registry
OpenShift 提供了一个内部的 Docker 镜像仓库(Registry),该镜像仓库用于存放用户
通过内置的 Source to Image 镜像构建流程所产生的镜像。Registry 组件默认以容器的方式
提供。
(9)Source to Image
Source to ImageS2I)是 Openshift 内部的镜像仓库,主要用于存放内置的 S2I 构建
流程所产生的镜像。
9.3.3 案例环境
1.本案例环境
本案例环境如表 9-2 所示。
9-2 案例环境
角色
操作系统
主机名/IP 地址
硬件配置要求
Master
CentOS 7.3
master.example.com/192.168.9.155
2 4G 硬盘 100G
Node1
CentOS 7.3
node1.example.com/192.168.9.167
1 2G 硬盘 100G
Node2
CentOS 7.3
node2.example.com/192.168.9.168
1 2G 硬盘 100G
实验网络拓扑如图 9.18 所示。
9.18 OpenShift 实验拓扑
2.案例需求
本案例的需求如下:
部署 OpenShift 并创建容器应用。
3.案例实现思路
本案例的实现思路如下:
1)通过 Ansible 部署 OpenShift Origin
2)管理 OpenShift
9.4 案例实施二
9.4.1 部署 OpenShift Origin
1.主机配置
在安装配置 OpenShift 之前,需要先对主机进行基本的初始化配置。具体操作步骤如下所示。
(1)设置主机名
在三台主机上分别设置主机名。
[root@localhost ~]# hostnamectl set-hostname master.example.com
//IP 地址为 192.168.9.155 主机上设置主机名为 master.example.com
[root@localhost ~]# bash
[root@master ~]#
[root@localhost ~]# hostnamectl set-hostname node1.example.com
//IP 地址为 192.168.9.167 主机上设置主机名为 node1.example.com
[root@localhost ~]# bash
[root@node1 ~]#
[root@localhost ~]# hostnamectl set-hostname node2.example.com
//IP 地址为 192.168.9.168 主机上设置主机名为 node2.example.com
[root@localhost ~]# bash
[root@node2 ~]#
(2)设置防火墙与 SELinux
将所有主机的防火墙都设置为关闭状态,并保证 SELinux 必须处于 Enforcing 状态。下
面以 master.example.com 主机为例进行操作。
[root@master ~]# systemctl disable firewalld
[root@master ~]# systemctl stop firewalld
[root@master ~]# getenforce
//SELinux 必须处于 Enforcing 状态
Enforcing
(3)添加地址解析记录
在所有主机的 hosts 文件中添加 hosts 地址解析,下面以 master.example.com 主机为
例进行操作。
[root@master ~]# cat <<EOF >> /etc/hosts
192.168.9.155 master.example.com
192.168.9.167 node1.example.com
192.168.9.168 node2.example.com
EOF
(4)安装基础包
master.example.com 主机为例,所有主机都要执行。
[root@master ~]# yum install vim wget git net-tools bind-utils yum-utils iptables-services
bridge-utils bash-completion kexec-tools sos psacct -y
(5)将系统更新至最新版本
master.example.com 主机为例,所有主机都要执行。
[root@master ~]# yum -y update
[root@master ~]# reboot
(6)安装 EPEL 源
master.example.com 主机为例,所有主机都要执行。
[root@master
~]#
wget
-O
/etc/yum.repos.d/epel.repo
http://mirrors.aliyun.com/repo/epel-7.repo
(7)安装 Ansible
master.example.com 主机为例,所有主机都要执行。
[root@master ~]# yum install ansible pyOpenSSL -y
(8)下载 OpenShift Origin 3.11 源码
master.example.com 主机上执行。[root@master ~]# git clone -b release-3.11 https://github.com/openshift/openshift-ansible.git
Cloning into 'openshift-ansible'...
remote: Enumerating objects: 54, done.
remote: Counting objects: 100% (54/54), done.
remote: Compressing objects: 100% (45/45), done.
remote: Total 146620 (delta 18), reused 22 (delta 6), pack-reused 146566
Receiving objects: 100% (146620/146620), 40.31 MiB | 142.00 KiB/s, done.
Resolving deltas: 100% (92004/92004), done.
(9)修改内核参数
在所有主机上修改内核参数并执行 sysctl -p 命令使配置立即生效。下面以
master.example.com 主机为例进行操作。
[root@master ~]# cat <<EOF >> /etc/sysctl.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
[root@master ~]# modprobe br_netfilter
[root@master ~]# sysctl -p
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
(10)配置 Docker
启动 Docker 服务并添加 Docker 国内镜像加速地址。以 master.example.com 主机为
例,所有主机都要执行。
[root@master ~]# yum -y install docker
[root@master ~]# systemctl enable docker
Created
symlink
from
/etc/systemd/system/multi-user.target.wants/docker.service
to
/usr/lib/systemd/system/docker.service.
[root@master ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"]
}
//推荐使用阿里镜像加速地址,mirror 前面的“xxxx”需要根据自己的地址进行调整
[root@master ~]# systemctl start docker
(11)配置节点间 SSH 免密码登陆
配置 Master 节点与 Nod1Node2 节点之间免密码登录,包括 Master 自己也要免密码
登登录。
[root@master ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:xFbYRDU5lFiDJ9Omj1YZZULxvmW81+QBBTNMbF+ymgY root@master.example.com
The key's randomart image is:
+---[RSA 2048]----+
|
=+O&X+. |
|
...* OX= .|
|
+ *.=oo.|
|
o E o.oo |
|
S = o..=|
|
o = *+|
|
. . ..+|
|
.|
|
|
+----[SHA256]-----+
[root@master ~]# ssh-copy-id root@master.example.com
[root@master ~]# ssh-copy-id root@node1.example.com
[root@master ~]# ssh-copy-id root@node2.example.com
(12) 安装 OpenShift 安装工具
安装 OpenShift 安装工具,以 master.example.com 主机为例,所有主机都要安装。
[root@master ~]# yum -y install atomic atomic-openshift-utils
(13) 安装 OpenShift Origin 源
源安装完成后需要修改成国内地址。所有主机上都执行。
[root@master ~]# yum -y install centos-release-openshift-origin311
[root@master ~]# vim /etc/yum.repos.d/CentOS-OpenShift-Origin311.repo
[centos-openshift-origin311]
name=CentOS OpenShift Origin
baseurl=https://mirrors.aliyun.com/centos/7/paas/x86_64/openshift-origin311/
//修改为阿里源
地址
enabled=1
gpgcheck=0
//关闭检查
2.配置 Ansible
master.example.com 主机配置 Ansible host 文件。
[root@master ~]# mv /etc/ansible/hosts /etc/ansible/hosts.bak
//备份原来 ansible hosts
[root@master ~]# vim /etc/ansible/hosts
# add follows to the end
[OSEv3:children]
masters
nodes
etcd
[OSEv3:vars]
# admin user created in previous section
ansible_ssh_user=root
openshift_deployment_type=origin
# use HTPasswd for authentication
openshift_master_identity_providers=[{'name': 'htpasswd_auth', 'login': 'true', 'challenge': 'true',
'kind': 'HTPasswdPasswordIdentityProvider'}]openshift_disable_check=disk_availability,docker_storage,memory_availability,docker_image_avail
ability,package_version,package_availability
# allow unencrypted connection within cluster
openshift_docker_insecure_registries=172.30.0.0/16
[masters]
master.example.com
[etcd]
master.example.com
[nodes]
# set labels [region: ***, zone: ***] (any name you like)
master.example.com openshift_node_group_name='node-config-all-in-one'
node1.example.com openshift_node_group_name='node-config-compute'
node2.example.com openshift_node_group_name='node-config-compute'
3.部署并访问 OpenShift
使用 deploy_cluster.yml 文件部署 OpenShift 时会在各个主机上下载多个镜像,为避免
执行 deploy_cluster.yml 文件时因镜像问题而导致报错,可提前下载镜像。
[root@master ~]# docker pull docker.io/openshift/origin-web-console:v3.11.0
[root@master ~]# docker pull docker.io/openshift/origin-docker-registry:v3.11.0
[root@master ~]# docker pull docker.io/openshift/origin-haproxy-router:v3.11.0
[root@master ~]# docker pull docker.io/openshift/origin-deployer:v3.11.0
[root@master ~]# docker pull docker.io/openshift/origin-service-catalog:v3.11.0
[root@master ~]# docker pull docker.io/openshift/origin-template-service-broker:v3.11.0
[root@master ~]# docker pull docker.io/openshift/origin-pod:v3.11.0
[root@master
~]#
docker
pull
docker.io/ansibleplaybookbundle/origin-ansible-service-broker:v3.11
[root@node1 ~]# docker pull docker.io/cockpit/kubernetes:latest
[root@node1 ~]# docker pull docker.io/openshift/origin-deployer:v3.11.0
[root@node1 ~]# docker pull docker.io/openshift/origin-pod:v3.11.0
[root@node2 ~]# docker pull docker.io/cockpit/kubernetes:latest
[root@node2 ~]# docker pull docker.io/openshift/origin-deployer:v3.11.0
[root@node2 ~]# docker pull docker.io/openshift/origin-pod:v3.11.0
如果下载缓慢,也可以使用发布时提供的镜像文件上传导入,完成镜像的准备工作。
master.example.com 主机上运行 deploy_cluster.yml 文件部署 OpenShift
[root@master ~]# cd openshift-ansible
//通过 Git 下载的 OpenShift 源码目录
[root@master ~]# ansible-playbook playbooks/prerequisites.yml //对安装条件进行检查,没问
题后进行 deploy 部署
[root@master ~]# ansible-playbook playbooks/deploy_cluster.yml
。。。。。。
//省略部分内容
PLAY
RECAP *****************************************************
localhost
: ok=12
changed=0
unreachable=0
failed=0
master.example.com
: ok=613 changed=247 unreachable=0
failed=0
node1.example.com
: ok=133 changed=51
unreachable=0
failed=0
node2.example.com
: ok=133 changed=51
unreachable=0
failed=0
INSTALLER
STATUS ****************************************************
Initialization
: Complete (0:02:35)
Health Check
: Complete (0:00:06)
etcd Install
: Complete (0:03:01)
Master Install
: Complete (0:09:41)
Master Additional Install : Complete (0:01:31)
Node Install
: Complete (0:17:21)
Hosted Install
: Complete (0:03:40)
Web Console Install
: Complete (0:01:12)
Service Catalog Install
: Complete (0:05:42)
修改宿主机 hosts 文件,添加 192.168.9.155 master.example.com 内容,让宿主机可
以解析 Master 的主机名。在浏览器输入 https://master.example.com:8443,即可打开
OpenShift 管理控制台,如图 9.19 所示。
9.19 OpenShift 管理控制台
9.4.2 管理 OpenShift
安装成功后可以对 OpenShift 进行简单管理。
1. 创建集群管理员
创建一个账号名为 admin,密码为 admin,并配置为集群管理员。
[root@master ~]# htpasswd -b /etc/origin/master/htpasswd admin admin
Adding password for user admin
[root@master ~]# oc adm policy add-cluster-role-to-user cluster-admin admin
cluster role "cluster-admin" added: "admin"
可以通过 oc get user 命令查看创建的用户。
[root@master ~]# oc get user
NAME
UID
FULL NAME
IDENTITIES
admin 4c700b27-adfd-11e8-88210.000c297b97b6
htpasswd_auth:admin
2. 登录 OpenShift 控制台
admin 管理员账号登录 OpenShift 控制台,如图 9.20 所示。
9.20 OpenShift 控制台
3. 创建项目
创建 project,名字为 myproject
[root@master ~]# oc new-project myproject
Now using project "myproject" on server "https://master.example.com:8443".
You can add applications to this project with the 'new-app' command. For example, try:
oc new-app centos/ruby-25-centos7~https://github.com/sclorg/ruby-ex.git
to build a new example application in Ruby.
4. 配置权限
OpenShift 中有 scc 概念,即安全上下文,需要对权限进行管理。如果不配置,可能会
出现容器权限的问题。
[root@master ~]# oc login -u system:admin
[root@master ~]# oc project myproject
[root@master
~]#
oc
adm
policy
add-scc-to-user
privileged
system:serviceaccount:default:router
scc "privileged" added to: ["system:serviceaccount:default:router"]
[root@master
~]#
oc
adm
policy
add-scc-to-user
privileged
system:serviceaccount:myproject:admin
scc "privileged" added to: ["system:serviceaccount:myproject:admin"]
[root@master
~]#
oc
adm
policy
add-scc-to-user
anyuidsystem:serviceaccount:myproject:admin
scc "anyuid" added to: ["system:serviceaccount:myproject:admin"]
[root@master ~]# oc adm policy add-scc-to-group anyuid system:authenticated
scc "anyuid" added to groups: ["system:authenticated"]
[root@master ~]# oc adm policy add-scc-to-user anyuid -z default
scc "anyuid" added to: ["system:serviceaccount:myproject:default"]
5. 构建镜像
使用 Dockfile 构建一个镜像,Dockerfile 文件如下。
[root@master ~]# vim Dockerfile
FROM centos:7
MAINTAINER openshift
RUN yum -y install wget && \
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo && \
yum -y install nginx && \
rm -f /usr/share/nginx/html/index.html && \
echo “This is my first project for Openshift Origin” > /usr/share/nginx/html/index.html && \
yum clean all && \
rm -rf /tmp/*
EXPOSE 80
CMD ["/usr/sbin/nginx","-g","daemon off;"]
[root@master ~]# docker build -t docker-registry.default.svc:5000/myproject/nginx .
。。。。。。
//省略部分内容
Cleaning up list of fastest mirrors
---> c12d34277549
Removing intermediate container 00d5fca88ee1
Step 4/5 : EXPOSE 80
---> Running in a388c1fe377c
---> 3fc6945c7fcb
Removing intermediate container a388c1fe377c
Step 5/5 : CMD /usr/sbin/nginx -g daemon off;
---> Running in 74cf61db2190
---> 2ad1be3dfa7f
Removing intermediate container 74cf61db2190
Successfully built 2ad1be3dfa7f
若出现无法构建镜像的情况,提示如下错误信息。
Could
not
retrieve
mirrorlist
http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=container error was
14: curl#6 - "Could not resolve host: mirrorlist.centos.org; Unknown error"根本原因是在构建 Docker 过程中无法解析域名导致的。可通过在/etc/docker/daemon.json
文件中添加 DNS 服务器地址来解决此问题。
[root@master ~]# vim /etc/docker/daemon.json
{
"dns": ["119.29.29.29"],
"registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"]
}
6. 推送镜像到镜像仓库
使用 admin 登录。
[root@master ~]# oc login -u admin -p admin
获取当前用户 Token
[root@master ~]# oc whoami -t
6bp-zvMLyi7bffdUx47dyKIEekng7TV4bfjmCI8f65A
使用 admin 用户登录 OpenShift Registry,密码为当前用户的 Token
[root@master ~]# docker login -u admin -p 6bp-zvMLyi7bffdUx47dyKIEekng7TV4bfjmCI8f65A
docker-registry.default.svc:5000
Login Succeeded
[root@master ~]# docker push docker-registry.default.svc:5000/myproject/nginx
The push refers to a repository [docker-registry.default.svc:5000/myproject/nginx]
af489dd90715: Pushed
1d31b5806ba4: Pushed
latest:
digest:
sha256:204ca88e5055691719454dacb29f5507b479a99060207add9a2886bd26bc28f6 size: 741
[root@master ~]# oc get all
//查看已经上传的镜像
NAME
DOCKER REPO
TAGS
UPDATED
imagestreams/nginx
docker-registry.default.svc:5000/myproject/nginx
latest
About a
minute ago
7. 创建应用
使用刚才上传的镜像创建一个 Nginx 应用。
[root@master ~]# oc new-app docker-registry.default.svc:5000/myproject/nginx --name=nginx
W0916 14:47:25.663505
19340 dockerimagelookup.go:233] Docker registry lookup failed: Get
https://docker-registry.default.svc:5000/v2/: x509: certificate signed by unknown authority
W0916 14:47:25.825801
19340 newapp.go:480] Could not find an image stream match for
"docker-registry.default.svc:5000/myproject/nginx:latest". Make sure that a Docker image with that
tag is available on the node for the deployment to succeed.
--> Found Docker image 2ad1be3 (7 minutes old) from docker-registry.default.svc:5000 for
"docker-registry.default.svc:5000/myproject/nginx:latest"
* This image will be deployed in deployment config "nginx"
* Port 80/tcp will be load balanced by service "nginx"
* Other containers can access this service through the hostname "nginx"
* WARNING: Image "docker-registry.default.svc:5000/myproject/nginx:latest" runs as the 'root'
user which may not be permitted by your cluster administrator
--> Creating resources ...
deploymentconfig "nginx" created
service "nginx" created
--> Success
Application is not exposed. You can expose services to the outside world by executing one or
more of the commands below:
'oc expose svc/nginx'
Run 'oc status' to view your app.
将应用的地址暴露出来。
[root@master ~]# oc expose svc/nginx
route.route.openshift.io/nginx exposed
[root@master ~]# oc get route
NAME
HOST/PORT
PATH
SERVICES
PORT
TERMINATION
WILDCARD
nginx
nginx-myproject.router.default.svc.cluster.local
nginx
80-tcp
None
通过 oc get route 命令查看 router 信息。
8. 访问应用
访问应用的主机地址,如下所示。
[root@master ~]# curl nginx-myproject.router.default.svc.cluster.local
“This is my first project for Openshift Origin”
9. 指定应用域名
由于默认的应用名过长,使用 oc edit routes/nginx 命令可以指定应用域名,然后通过
应用域名访问应用。
[root@master ~]# oc edit routes/nginx
host: nginx.master.example.com
//host: nginx-myproject.router.default.svc.cluster.local改成 host: nginx.master.example.com
[root@master ~]# echo "192.168.9.155 nginx.master.example.com" >> /etc/hosts
10. 使用域名访问应用
用域名访问应用,如下所示。
[root@master ~]# curl nginx.master.example.com
This is my first project for Openshift Origin

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2083872.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nacos2.4.1安装

Nacos官网| Nacos 配置中心 | Nacos 下载| Nacos 官方社区 | Nacos 官网 下载后解压 进入解压目录/bin window启动命令 startup.cmd -m standalone 用的JDK环境17 遇到报错 第一个办法 退回2.4.0哈哈哈 nacos配置为JDK1.8&#xff0c;而JDK17开始使用按模块引入包语法…

阀控多功能智能水表是什么?

阀控多功能智能水表是一种集成了多种先进技术和功能的新型水表&#xff0c;主要用于精确计量和控制水流量。这类水表不仅能够提供准确的数据记录&#xff0c;还具备远程控制、故障报警、数据分析等多种智能功能&#xff0c;适用于住宅、商业和工业等多种应用场景。本文将深入探…

泽众P-One性能测试平台中的环境管理与施压集群分配

P-One是泽众软件自主研发的一站式性能测试平台&#xff0c;在软件性能测试中发挥着重要作用。其中&#xff0c;环境管理和施压集群分配是P-One的关键功能&#xff0c;对于确保测试的准确性和有效性至关重要。 一、环境部署 P-One可以对已安装的压力机进行集中管理&#xff0c;…

240828-Gradio结合Html+Css+Javascript制作年历

A. 最终效果 需求描述 html javascript css 按年生成2016年至2116年的日历&#xff0c;要求如下&#xff1a; 二行六例&#xff0c;每个单元是一个月&#xff0c;且每个单元包含周次信息通过背景为红色的圆圈高亮显示当前的日期第一页显示今年&#xff0c;鼠标左边或键盘左键…

电梯按钮检测检测系统源码分享 # [一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]

电梯按钮检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

RKNPU入门与实践 ---- 混合量化

目录 前言 一、混合量化 1.1 概念介绍 1.1.1 hybrid_quantization_step1 1.1.2 hybrid_quantization_step2 二、实际编写程序 2.1混合量化第一阶段 2.2 混合量化第二阶段 三、混合量化第一步接口参数proposal 前言 为什么要进行混合量化&#xff1f; 答案&#x…

Zookeeper未授权访问的漏洞处理

echo envi |nc 192.168.0.1 2181 这个命令可以用于获取Zookeepr&#xff08;下面有zk代替&#xff09;目标服务器的环境信息、部署路径、版本等敏感信息。如果这些信息被恶意利用&#xff0c;确实可能导致安全漏洞&#xff0c;进而对网络和服务器安全构成威胁。 1.执行zkCli.…

XSS LABS - Level 17 过关思路

关注这个靶场的其他相关笔记&#xff1a;XSS - LABS —— 靶场笔记合集-CSDN博客 0x01&#xff1a;过关流程 进入靶场&#xff0c;空空如也&#xff0c;右击页面&#xff0c;查看网页源码&#xff0c;找找可疑点&#xff1a; 可以看到&#xff0c;靶场默认传参&#xff0c;都传…

初赛试题-2022年CSP-J2

目录 先言 二、阅读程序&#xff08;判断题1.5分&#xff0c;选择题3分&#xff0c;共40分&#xff09; &#xff08;1&#xff09; 16. 17. 18. 19. 20. 21. &#xff08;2&#xff09; 22. 23. 24. 25. 26. 27. &#xff08;3&#xff09; 28. 29. 30. 3…

18.神经网络 - 非线性激活

神经网络 - 非线性激活 使用到的pytorch网站: Padding Layers&#xff08;对输入图像进行填充的各种方式&#xff09; 几乎用不到&#xff0c;nn.ZeroPad2d&#xff08;在输入tensor数据类型周围用0填充&#xff09; nn.ConstantPad2d&#xff08;用常数填充&#xff09; 在 …

【图像】灰度图与RGB图像的窗宽、窗位的值范围二三问

1. 16位灰度图的窗宽、窗位的值范围&#xff1f; 对于16位的灰度图像&#xff0c;每个像素点可以表示从0到2^16-1&#xff08;即0至65535&#xff09;之间的强度值。在医学影像领域&#xff0c;如CT扫描图像中&#xff0c;窗宽和窗位是用来调整图像对比度和亮度的参数&#xf…

【Spring Boot 3】【Web】自定义过滤器

【Spring Boot 3】【Web】自定义过滤器 背景介绍开发环境开发步骤及源码工程目录结构总结背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总是要花费…

fabricjs 添加图片并实时更新小车位置

需求&#xff1a;添加小车图片到画布中&#xff0c; 后端通过ws实时更新小车位置 实际过程中遇到的问题&#xff1a; 设置中心点&#xff1a;我想把图片的中心设置为后端传来的坐标点&#xff0c;可以通过设置对象的originX和originY属性来改变对象的旋转和定位基点。让小车…

error:0308010C:digital envelope routines::unsupported【超详细图解】

目录 一、报错信息 二、分析原因 三、解决方案 一、报错信息 二、分析原因 node.js 18 不兼容oppsll&#xff0c;node.js v17以上版本中最近发布的OpenSSL3.0, 而OpenSSL3.0对允许算法和密钥大小增加了严格的限制 三、解决方案 方案1&#xff1a;打开终端&#xff0c;直接输入…

Zotero7最新(2024)安装、配置步骤

提醒&#xff1a; 绝大部分插件都已经适配了 Zotero 7&#xff0c;但是 ZotFile 插件已经停止对 Zotero 7 的支持&#xff0c;可以使用 Attanger 插件 替代。如果不适应还是建议装Zotero 6 一、安装 1、进入官网&#xff0c;点击下载进入下载界面 https://www.zotero.org/h…

OpenCV绘图函数(7)从一个椭圆定义中提取出多边形的顶点坐标函数ellipse2Poly()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 近似一个椭圆弧为一个多边形线。 函数 ellipse2Poly 计算近似指定椭圆弧的多边形线的顶点。它被 ellipse 函数所使用。如果 arcStart 大于 arcEn…

[羊城杯 2024] Crypto

文章目录 TH_Curvebaby_CurveRSA_lossTheoremPlus TH_Curve 题目描述&#xff1a; from Crypto.Util.number import * from secret import flagdef add_THcurve(P, Q):if P (0, 0):return Qif Q (0, 0):return Px1, y1 Px2, y2 Qx3 (x1 - y1 ** 2 * x2 * y2) * pow(a * …

使用统计方法在AMD GPU上使用JAX Profiler可靠地比较大型生成AI模型中的算法性能

Using statistical methods to reliably compare algorithm performance in large generative AI models with JAX Profiler on AMD GPUs — ROCm Blogs 摘要 本文提供了一份详细的指南&#xff0c;介绍如何在JAX实现的生成AI模型中测量和比较各种算法的性能。利用JAX Profiler…

Python编码系列—Docker容器的高效使用与实战应用

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

前后端分离项目实战-通用管理系统搭建(前端Vue3+ElementPlus,后端Springboot+Mysql+Redis)第八篇:Tab标签页的实现

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…