OpenShift
相关链接
- Openshift官网:https://www.redhat.com/en/technologies/cloud-computing/openshift
- Openshift官方文档:https://docs.openshift.com/, https://docs.redhat.com/zh_hans
Give it a definition
OpenShift 是由红帽公司开发的容器化平台,为开发人员提供平台即服务(PaaS),用于部署、管理和扩展应用程序
简介
OpenShift 是一种基于 Kubernetes 的开源容器化平台,由 Red Hat 公司开发和维护。它提供了一套完整的容器应用开发、部署和管理解决方案,使开发者可以更轻松地构建、部署和扩展云原生应用。
以下是 OpenShift 的主要特点和功能:
-
容器化应用支持: OpenShift 基于 Docker 和 Kubernetes 技术,支持容器化应用的构建、打包和部署。开发者可以使用 Docker 将应用程序打包成容器镜像,并通过 Kubernetes 进行管理和调度。
-
自动化部署和扩展: OpenShift 提供了自动化部署和扩展的功能,开发者可以通过简单的配置来实现应用程序的自动化部署和水平扩展,以满足不同负载下的需求。
-
多语言支持: OpenShift 支持多种编程语言和开发框架,包括 Java、Python、Node.js 等,使开发者可以使用自己熟悉的语言和框架进行应用开发。
-
持续集成和持续部署(CI/CD): OpenShift 集成了持续集成和持续部署的功能,开发者可以将代码提交到代码仓库后,自动触发构建、测试和部署流程,实现快速迭代和交付。
-
监控和日志管理: OpenShift 提供了监控和日志管理的功能,开发者可以实时监控应用程序的性能指标和运行状态,并收集和分析日志数据,帮助定位和解决问题。
-
多租户和安全性: OpenShift 支持多租户架构,可以为不同的团队或项目提供独立的开发、测试和生产环境,并提供了多层次的安全机制,保障应用程序和数据的安全。
总的来说,OpenShift 是一个功能强大的容器化平台,提供了一系列的工具和功能,帮助开发者更轻松地构建、部署和管理云原生应用。它可以帮助企业加速应用开发和交付,提高应用程序的可靠性、可扩展性和安全性。
Openshift Container常用术语
OpenShift Container Platform 以 Kubernetes 为基础,为大规模电信、流视频、游戏、银行和其他应用提供引擎技术。借助红帽开放技术中的实现,您可以将容器化应用程序从单一云扩展到内部和多云环境。
- Kubernetes
Kubernetes 是一个开源容器编配引擎,用于自动化容器化应用程序的部署、扩展和管理。
容器
容器是 worker 节点上以 OCI 兼容容器中运行的应用程序实例和组件。容器是开放容器项目(OCI)兼容镜像的运行时。镜像是二进制应用。worker 节点可以运行多个容器。节点容量与底层资源的内存和 CPU 功能相关,无论它们是云、硬件还是虚拟化。 - Pod
pod 是共同部署在同一主机上的一个或多个容器。它包含一组有共享资源(如卷和 IP 地址)的容器。pod 也是定义、部署和管理的最小计算单元。
在 OpenShift Container Platform 中,pod 替代了独立的应用程序容器作为最小的可部署单元。
Pod 是 OpenShift Container Platform 中编配的单元。OpenShift Container Platform 在同一个节点上的一个 pod 中调用并运行所有容器。复杂的应用由多个 pod 组成,每个 pod 都有自己的容器。它们与外部进行交互,也在 OpenShift Container Platform 环境中相互交互。
-
副本集和复制控制器
Kubernetes 副本集和 OpenShift Container Platform 复制控制器都可用。此组件的作业是确保在所有时间都有指定数量的 pod 副本在运行。如果 pod 退出或被删除,副本集或复制控制器会启动其他 pod 也保证运行的数量。如果运行的 pod 数量超过了指定值,副本集将根据需要删除以匹配指定的副本数。
部署(Deployment)和部署配置(DeploymentConfig)
OpenShift Container Platform 实施 Kubernetes Deployment 对象和 OpenShift Container Platform DeploymentConfig 对象。用户可以选择其中的一个。 -
Deployment 对象控制应用程序如何作为 pod 推出部署。它们标识要从 registry 中获取的容器镜像的名称,并作为 pod 部署到节点上。它们设置要部署的 pod 的副本数,创建副本集来管理该进程。所示的标签指示要在哪个节点上部署 pod 的调度程序。在 pod 定义中包括一组标签用于实例化副本集。
Deployment 对象可以根据 Deployment 对象版本和各种 rollout 策略来更新部署到 worker 节点上的 pod,以管理应用程序的可用性。OpenShift Container Platform DeploymentConfig 对象添加了更改触发器的额外功能,这些触发器可以在容器镜像的新版本或其他更改时自动创建 Deployment 对象的新版本。
- 服务(Service)
服务定义了一组逻辑的 pod 和访问策略。它为其他应用程序提供永久内部 IP 地址和主机名,供其他用作 pod 的创建和销毁。
服务层将应用程序组件连接在一起。例如,前端 Web 服务通过与其服务通信连接到数据库实例。服务支持跨应用程序组件简单的内部负载平衡。OpenShift Container Platform 会自动将服务信息注入到正在运行的容器中,以简化发现过程。
- 路由(Route)
路由是通过为服务提供一个外部可访问主机名(如 www.example.com)来公开服务的方法。每个路由都包含路由名称、服务选择器和可选的安全配置。路由器可以使用定义的路由和由服务标识的端点,提供允许外部客户端到达应用程序的名称。尽管易于部署完整的多层应用程序,但从 OpenShift Container Platform 环境以外的任何位置的流量在没有路由层的情况下无法访问应用程序。 - Build
构建 (build) 是将输入参数转换为结果对象的过程。此过程最常用于将输入参数或源代码转换为可运行的镜像。BuildConfig 对象是整个构建过程的定义。OpenShift Container Platform 通过从构建镜像创建容器并将它们推送到集成的 registry 来利用 Kubernetes。 - 项目
OpenShift Container Platform 使用项目来允许一组用户或开发人员一起工作,已实现一个隔离单位和协作单位。它定义资源范围,允许项目管理员和协作者管理资源,并使用配额和限制跟踪用户的资源。
项目是带有额外注解的 Kubernetes 命名空间。它是管理常规用户对资源访问的一个中央点。通过项目,一组用户可以在与其他用户隔离的前提下组织和管理其内容。用户需要通过管理员获得项目的访问权限。但是,集群管理员也可以允许开发人员创建自己的项目,在这种情况下,用户会自动获得自己项目的访问权限。
每个项目都有自己的一组对象、策略、约束和服务帐户的集合。
项目也称为命名空间(namespaces)。
- Operator
Operator 是一个 Kubernetes 原生应用程序。Operator 的目标是将相关的知识融入到软件来实现各种操作。之前,这些知识存在于管理员的头脑中,以及各种 shell 脚本或自动化软件(如 Ansible)中。它们都在您的 Kubernetes 集群之外,很难集成。但是,Operators 改变了这个情况。
Operator 是为您的应用程序专门构建的。Operator 是在 Kubernetes 集群内运行的、原生集成了 Kubernetes 概念和 API 的一个软件,可以实施和自动化常见的第 1 天操作,如安装和配置,以及第 2 天活动,如扩展和缩减、重新配置、更新、备份、故障转移以及恢复。这称为 Kubernetes 原生应用程序。
使用 Operator 时,应用程序不能被视为原语的集合,如 pod、部署、服务或配置映射。相反,Operator 应被视为单个对象,它公开了对应用程序有意义的选项。
在 Red Hat OpenShift 中,有一些关键概念对理解和使用该平台至关重要。以下是一些重要的概念和它们的作用:
1. 项目 (Project)
- 项目 是 OpenShift 中用于隔离和组织资源的一个逻辑单元。每个项目通常代表一个独立的应用、环境或团队。项目内的所有资源(如部署、服务、路由等)都相互关联并共享配置。
- 项目与 Kubernetes 中的 Namespace 概念类似,但在 OpenShift 中,项目还包含用户和权限管理等更丰富的功能。
2. Pod
- Pod 是 Kubernetes 中最小的可部署单元,一个 Pod 通常包含一个或多个容器。所有容器共享相同的网络命名空间和存储卷。OpenShift 通过 Pods 来运行和管理容器化应用。
3. 部署配置 (DeploymentConfig)
- 部署配置 是 OpenShift 中用来定义和管理应用程序部署的一个高级对象。它允许用户定义如何构建、部署和更新应用,支持滚动更新、回滚和触发器机制。
- 虽然 Kubernetes 有 Deployment 资源,但 OpenShift 通过 DeploymentConfig 提供了更多功能和控制。
4. 构建 (Build)
- 构建 是 OpenShift 中的一项功能,用于从源代码生成容器镜像。OpenShift 支持多种构建策略,如 Source-to-Image (S2I)、Dockerfile 构建和 Pipeline 构建。
- Source-to-Image (S2I) 是一种独特的构建方法,可以自动将源代码转化为可运行的容器镜像,简化了开发者的构建流程。
5. 服务 (Service)
- 服务 是 Kubernetes 中的一个抽象层,用来定义一组 Pod 的访问策略和负载均衡。它提供了一个稳定的 IP 和 DNS 名称,使得外部客户端和其他 Pods 可以访问应用。
- OpenShift 中的服务还可以与路由配合使用,公开应用给外部用户访问。
6. 路由 (Route)
- 路由 是 OpenShift 中的一个资源,用于将外部流量引导到集群内部的服务。路由通常通过 DNS 名称公开应用,并支持 TLS 加密和路径路由等高级功能。
- 路由使得用户能够轻松地从外部访问部署在 OpenShift 上的应用。
7. 持久卷 (Persistent Volume, PV) 和持久卷声明 (Persistent Volume Claim, PVC)
- 持久卷 (PV) 是 OpenShift 中用于持久化数据的存储资源,可以由集群管理员预先配置。
- 持久卷声明 (PVC) 是用户对持久存储的请求,绑定到一个具体的 PV 上。它允许 Pods 使用持久化存储,即使 Pod 被重新调度或删除,数据仍然保留。
8. Operator
- Operator 是一种 Kubernetes 模式,用于打包、部署和管理复杂的应用程序。OpenShift 中的 Operator Framework 提供了构建、测试和分发 Operators 的工具,使得复杂的应用生命周期管理(如数据库、消息队列)更自动化和可复用。
- Operators 可以自动执行升级、备份、恢复等任务,减少人工干预。
9. 配置映射 (ConfigMap) 和秘密 (Secret)
- ConfigMap 用于存储非机密的配置数据,供 Pods 和应用程序使用。ConfigMap 可以在不重新构建镜像的情况下动态更新应用配置。
- Secret 类似于 ConfigMap,但用于存储敏感数据,如密码、令牌、密钥等。Secret 数据会被加密存储,以确保安全性。
10. 容器注册表 (Image Registry)
- OpenShift 自带一个集成的 容器注册表,用于存储和分发容器镜像。开发者可以将镜像推送到这个注册表,并直接用于 OpenShift 集群中的部署。
- 内置的注册表通常用于存储本地构建的镜像,以及从外部拉取的公共或私有镜像。
11. 安全上下文约束 (Security Context Constraints, SCC)
- SCC 是 OpenShift 中用来控制 Pod 的安全设置的一个机制。它定义了 Pod 运行时的安全上下文,如是否允许特权容器、哪些用户可以运行特定类型的容器等。
- SCC 是 OpenShift 安全模型的一部分,确保容器运行时的隔离性和安全性。
12. Template
- 模板 (Template) 是一种 OpenShift 中的资源,用于定义和重用一组 OpenShift 对象。模板可以包含服务、路由、部署等多个资源,并支持参数化,以便在不同环境中重用。
- 开发者可以使用模板快速创建复杂的应用程序栈,并通过参数化设置自定义应用程序行为。
OpenShift Container Platform CLI 工具(oc)与 kubectl 兼容。虽然 Kubernetes API 100% 可在 OpenShift Container Platform 中使用,但 kubectl 命令行缺少了很多用户友好的功能。
💥💥💥💥💥💥💥💥💥💥💥💥💥💥💥💥💥💥💥💥💥💥💥💥💥💥💥💥💥💥💥💥💥💥💥💥💥💥
OpenShift Container Platform Web
在Openshift Container Platform中以Administrator或Developer创建应用
Openshift CLI
Openshift container Platform command line interface
用户会在Openshift容器平台上进行一系列操作,包括
- 管理集群
- 构建,部署,管理应用程序
- 管理部署流程
- 开发Operators
- 创建和维护Operator catalog
Openshift容器平台提供了一组命令行CLI工具,使用户可以在终端执行开发和管理操作,简化了这些任务,这些工具暴露了简单的命令去管理应用程序并与系统的每个组件进行交互
Openshift常用指令
# 使用用户名和密码登录
$oc login -u <username> -p <password> --server <server> --insecure-skip-tls-verify
# 使用 OAuth 令牌
$oc login <server url> --token <tokenId>
# 使用 Web 浏览器
$oc login <cluster_url> --web
# 创建新项目
$oc new-project user-getting-started --display-name="getting started with openshift"
OpenShift Container Platform 会在每个项目中自动创建一些特殊服务帐户。默认服务帐户负责运行 pod。OpenShift Container Platform 使用并将此服务帐户注入到启动的每个 pod 中。
以下流程为默认 ServiceAccount 对象创建一个 RoleBinding 对象。服务帐户与 OpenShift Container Platform API 通信,以了解项目中的 pod、服务和资源。
先决条件
有访问 OpenShift Container Platform 集群的权限。
已安装 OpenShift CLI(oc)。
您已部署了一个镜像。
您必须具有 cluster-admin 或 project-admin 权限。
流程
要将 view 角色添加到 user-get-started 项目中的 default 服务帐户,请输入以下命令:
$ oc adm policy add-role-to-user view -z default -n user-getting-started
创建路由
复制链接
外部客户端可以通过路由层访问 OpenShift Container Platform 上运行的应用程序,这个路由层后端的数据对象就是一个 路由(route)。默认的 OpenShift Container Platform 路由器(HAProxy)使用传入请求的 HTTP 标头来确定连接的位置。
另外,您可以为路由定义安全性,如 TLS。
# 检索创建的应用程序服务
$ oc get service
# 创建路由
$ oc create route edge parksmap --service=parksmap
检查pod
OpenShift Container Platform 使用 Kubernetes 的 pod 概念,它是共同部署在同一主机上的一个或多个容器,也是可被定义、部署和管理的最小计算单元。对容器而言,Pod 大致相当于一个机器实例(物理或虚拟)。
# 列出带有节点名称的所有 pod
$ oc get pods
# 列出所有 pod 详情
$ oc describe pods
扩展应用程序
在 Kubernetes 中,Deployment 对象定义了应用的部署方式。在大多数情况下,用户会一起使用 Pod, Service, ReplicaSets, 和 Deployment 资源。在大多数情况下,OpenShift Container Platform 会为您创建资源。
# 将应用程序从一个 pod 实例扩展到两个 pod 实例
$ oc scale --current-replicas=1 --replicas=2 deployment/parksmap
# 确保应用程序正确扩展,请输入以下命令
$ oc get pods
# 将应用程序缩减至一个 pod 实例,请输入以下命令
$ oc scale --current-replicas=2 --replicas=1 deployment/parksmap
关于
OpenShift Container Platform开发
- 创建离散的服务,可以连接到其他容器化或非容器化服务
- 具备弹性,服务器停机时容器可以在另一台机器上启动
- 自动获取代码修改,自动启动和部署新版本
- 实例伸缩。扩展,复制,减少
- 实例定时上下线
入门实践
发行版本信息
安全性和合规性
架构
在 OpenShift 中,Workload Deployment
是一种常见的工作负载管理方式,允许用户部署和管理容器化的应用程序。对于一个具体的微服务部署,理解 update strategy
及其相关参数是确保应用程序顺利升级和高可用性的关键。
Update Strategy
Update Strategy
决定了在部署更新时如何处理正在运行的 Pods。最常见的更新策略是 RollingUpdate
。
RollingUpdate Parameters
RollingUpdate
策略在逐步替换旧的 Pods 的同时,确保有一定数量的 Pods 在运行,保持服务的可用性。它的主要参数包括 maxUnavailable
、maxSurge
和 progressDeadlineSeconds
。
-
maxUnavailable
maxUnavailable
指定在更新过程中,允许不可用的 Pod 的最大数量。它可以是绝对数值或百分比。- 绝对数值:例如,
maxUnavailable: 2
表示在更新过程中最多可以有 2 个 Pod 处于不可用状态。 - 百分比:例如,
maxUnavailable: 20%
表示在更新过程中最多可以有 20% 的 Pod 处于不可用状态。
这个参数确保即使在更新过程中,也有足够的 Pods 继续处理请求,从而保持服务的高可用性。
- 绝对数值:例如,
-
maxSurge
maxSurge
指定在更新过程中,允许创建的新 Pod 的最大数量。它也可以是绝对数值或百分比。- 绝对数值:例如,
maxSurge: 3
表示在更新过程中最多可以额外创建 3 个 Pod。 - 百分比:例如,
maxSurge: 25%
表示在更新过程中最多可以额外创建 25% 的 Pod。
这个参数允许在旧的 Pods 还未完全终止之前,预先创建新的 Pods,确保更新过程中的服务容量不降低。
- 绝对数值:例如,
-
progressDeadlineSeconds
progressDeadlineSeconds
是一个超时时间,表示允许 Deployment 在多长时间内更新其所有 Pods。如果在这个时间内更新未完成,则认为更新过程失败。- 数值:例如,
progressDeadlineSeconds: 600
表示如果更新在 600 秒(10 分钟)内未完成,则认为更新失败。
这个参数用于监控和控制更新过程的进度,确保更新不会无限期地进行。
- 数值:例如,
示例配置
以下是一个示例 Deployment 配置,演示了这些参数的使用:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-microservice
spec:
replicas: 10
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 2
maxSurge: 3
progressDeadlineSeconds: 600
template:
metadata:
labels:
app: my-microservice
spec:
containers:
- name: my-microservice-container
image: my-microservice-image:latest
ports:
- containerPort: 8080
参数作用总结
- maxUnavailable:在更新过程中,允许处于不可用状态的 Pod 的最大数量。确保服务在更新过程中保持高可用性。
- maxSurge:在更新过程中,允许额外创建的新 Pod 的最大数量。确保服务在更新过程中保持或提高容量。
- progressDeadlineSeconds:允许 Deployment 在多长时间内完成更新。如果在这个时间内未完成,认为更新失败。确保更新过程不会无限期进行。
理解这些参数并正确配置,可以帮助确保微服务在更新过程中保持高可用性和稳定性,避免服务中断或更新失败。
restart rollout
是 Kubernetes 和 OpenShift 中的一种命令,用于重新启动一个 Deployment 或其他控制器(如 StatefulSet、DaemonSet 等)。这个命令会触发一个滚动更新过程,重新启动所有的 Pods,而不需要更改 Deployment 的配置或镜像版本。下面是详细解释它的作用及其使用场景。