「 不乱于心,不困于情。不畏将来,不念过往。如此,安好。」
关于OpenShift是什么,你可以用你喜欢的名字叫它。容器云
,Kubernetes的社区发行版
,基于Docker,K8s的PaaS平台
,DevOps平台
等等
虽然是一个企业级的产品,但是类似的云原生解决方案,国内外的一些大厂,或者一些大一点的外包公司都有自己的产品,一般分开源和闭源两种,大都基于开源的容器编排引擎Kubernetes来实现。另,国内好像对这个不太感冒,毕竟可以结合自研,而且整个devops流水线,项目管理,版本控制,审计,CICD等都有开源相对成熟的解决方案借鉴或者直接使用,况且openshift企业版还要订阅,所以相关的资料不是特别多。
关于OpenShift,他首先是一个开源项目,这一点很重要,我们可以基于OpenShift
构建属于自己的容器云平台。OpenShift的开源社区版本叫OpenShift Origin
,现在叫OKD
在OpenShift 的GitHub仓库,这样介绍
:OKD是Kubernetes的社区发行版,针对持续应用程序开发和多租户部署进行了优化。OKD 在 Kubernetes 之上添加了以开发人员和运营为中心的工具,以支持小型和大型团队的快速应用程序开发、轻松部署和扩展以及长期生命周期维护。OKD在 github 和文档中 也称为Origin 。OKD使在任何云或裸机上启动 Kubernetes 变得轻而易举,简化了集群的运行和更新,并提供了使您的容器化应用程序成功的所有工具。
那么他和红帽有什么关系?
Red Hat在OpenShift Origin
的基础上推出了OpenShift的企业版本
,其中包含了公有云服务OpenShift Online
及私有云产品OpenShift Container Platform
(以前也称为OpenShift Enterprise)
OpenShift
基于主流的容器技术Docker
及容器编排引擎Kubernetes
构建。
通过OpenShit,企业可以快速在内部网络中构建出一个多租户的云平台,在这朵云上提供应用开发、测试、部署、运维的各项服务,OpenShit在一个平台上贯通开发、测试、部署、运维的devops流程,实现高度的自动化,满足应用持续集成及持续交付和部署的需求;满足企业及组织对容器管理、容器编排的需求。通过OpenShift的灵活架构,企业可以以Openshift作为核心,在其上搭建一个企业的DevOps引擎,推动企业的DevOps变革和转型。
那么Open Shift与Docker及Kubernetes的关系究竟是什么?
OpenShift是基于容器技术构建的一个应用云平台。这里所指的容器技术即包含Docker及Kubernetes
,
一般我们指K8s,即单单指k8s这种基础设施,k8s本质上只提供一种CD的环境,即用于持续部署,所以对于传统的devops平台或者cicd平台,他缺少版本控制,持续集成CI,以及对于整个devops流程的整合等。
openshift他提供了这样一种整合,这种整合并不是简单的我们下面看到的这样,搭建一个CICD的流水线这样,openshift提供部分k8s所没有的资源对象用于描述运维场景,比如用于部署行为配置文件的DC,用于服务发布的路由控制的router资源对象,自服务,以及一些不同于k8s的安全控制,同时支持一些内置SDK基础镜像组,模板的使用,作为一个paas平台,我们可用通过openshift快速搭建一个中间件或者数据库集群。提供了这个devops的流水线配置,统一的Web UI等等
Docker的优势在于它可以构建一个隔离的、稳定的、安全的、高性能的容器运行环境。目前,OpenShift使用原生的Docker作为平台的容器引擎,为上层组件及用户应用提供可靠安全的运行环境具有十分重要的价值:
Docker有非常大的用户基础。以Docker为基础引擎,降低了用户学习的成本。熟悉Docker的用户可以非常容易地上手。
docker并没有实现CRI,所以在k8s 1.23的版本中彻底的移除了dockershim 组件,默认使用containerd,所以对于使用高版本k8s需要切换容器引擎
为了满足容器集群所需的调度、网络、储存、性能及安全的需求,我们必须有专业的工具和平台。这些关于容器集群管理的问题,其实就是容器编排的问题,即Kubernetes要解决的问题。
Kubernetes是Google十多年容器使用经验的总结,虽然Google使用的容器是Docker时代之前的容器,但是业务应用对安全、性能、隔离、网络、储存及调度方面的需求,在最原始的本质上其实并没有发生变化。
OpenShift集成原生的Kubernetes作为容器编排组件。OpenShift 通过Kubernetes管理容器集群中的机器节点及容器,为业务应用提供:
「OpenShift 在 Docker+Kubernetes 基础结构添加以下功能:」
OpenShift-Kubernetes extensions
:存储在 Etcd 中,由 Kubernetes 管理的额外资源类型
。这些额外的资源类型构成 OpenShift 内部状态和配置,以及由标准 Kubernetes 资源管理的应用资源。比如k8s中没有的router
,DC等资源类型Containerized services
:履行许多基础设施功能,如网络和授权。他们中的部分功能需要一直运行,而另一些则是按需启动的。大多数 OpenShift 内部服务以容器方式运行,由 Kubernetes 管理。Runtimes and xPaas
:是为开发人员准备的基本容器镜像
,每个都预先配置了特定的runtimes语言或数据库
。它们可以用作as-is
或扩展添加不同的框架、库甚至其他中间件产品。xPaas为jboss中间件产品(如 jboss EAP和ActiveMQ)提供了一系列基本镜像。DevOps tools and user experience
: OpenShift 为开发人员和系统管理员提供了Web UI 和CLI管理工具,允许对应用、OpenShift服务和资源进行配置和监视。Web和CLI使用相同的REST APIs,外部工具(例如IDEs和CI平台)也可以通过REST APIs集成 OpenShift。 OpenShift还可以访问外部SCM存储库和容器镜像注册表,并将其整合到OpenShift云中。Etcd
:是一个分布式键-值存储,Kubernetes 使用它存储 OpenShift 群集中容器和其他资源的配置和状态信息
openshift特有的资源对象
OpenShift管理projects和users
。 OpenShift使用project分组Kubernetes资源
(可以直接理解为k8s中命名空间的角色),以便将访问权限分配给用户。针对project也可以分配配额,限制pods、卷、服务和其他资源的数量。OpenShift 客户端提供new-app
命令,用于在项目内创建资源。
开发人员和系统管理员可以直接使用OpenShift中传统Docker和Kubernetes,但是这要求他们知道如何构建容器镜像文件、使用registries和其他低级功能。
OpenShift 允许开发人员使用标准源代码管理(source control management--SCM)
存储库和集成开发环境(integrated development environments--IDE)
。
OpenShift 中 Source-to-Image (S2I)
从 SCM仓库获取代码,自动检测源代码需要哪种类型runtime
(可以理解为语言环境SDK),并且使用具有特定类型runtime的基本image启动pod。
在这个POD中, OpenShift以与开发人员相同的方式构建应用(例如,运行Java应用的Maven)。如果生成成功,则会创建另外一个image,在其运行时将应用二进制文件分层,并将此image推送到OpenShift内的image注册表。之后,可以使用新的image构建POD。 S21可以看作是OpenShift中自带的完整CI/CD管道。
启动装配线的过程称为“持续集成”(CI)。如何完成这项工作的总体设计称为“持续交付”(CD)。
OpenShift 资源,例如 images, containers, pods, services, builders, templates
等等,存储在Etcd
,可通过OpenShift CLI, web console
,或者 REST API
管理。这些资源可以在SCM系统(例如Git或者Subversion)上以JSON或者YAML格式查看和分享。
Docker的网络非常简单。Docker创建虚拟内核网桥
,连接每个容器网络接口。Docker本身不提供host 上 pod连接另外一个host 上 pod(跨主机网络通信),而且不提供分配固定公网IP地址给应用,以便外部用户可以访问。
Kubernetes提供服务和路由资源来管理pods之间网络和pod与外部通信网络。oad-balances
服务接收pods之间网络请求,同时为所有客户端提供单个内部地址。(通常是其他pods)。容器和pods不需要知道其他pods在哪里,他们只需要连接到服务。路由为服务提供固定唯一的DNS名称,以便OpenShift集群之外的客户端可以看到。
可以在任何时候在某个node上停止,然后在其他node上重启。因此临时存储是无法满足这个要求的。Kubernetes提供了一种用于管理容器的外部持久存储的框架。Kubernetes使用PersitentVolume资源,可以定义本地或网络存储。pod资源可以引用PersitentVolumeClaim 资源访问特定大小 PersitentVolume存储。
OpenShift 容器平台集群的HA包括两个方面:
OpenShift 本身就完全支持 master 得HA。对于应用(pods), OpenShift模式也会支持。如果pod因为某个原因丢失, Kubernetes 调度另外一个副本,将它连接到服务层和永久存储。如果整个node丢失, Kubernetes将node上所有pods调度到其他nodes,这些pods继续对外提供服务。但是pods中应用要维护自己的状态,例如http会话, database复制等。
在OpenShift中创建一个新的应用,除了应用源代码
之外,还需要base image,(S21构建的image)
。这两个组件中任一个更新,都会创建一个新的容器image。使用之前容器image创建的pod,都会被重新使用新的image创建的pod替换。所以openshift创建应用可以通过 S2I创建,也可以直接使用image创建,或者使用模板,pipeline的方式
Image Stream包含了通过 tags标识的images
。它代表相关image的单一虚拟视图
。应用可以通过Image Stream构建的。当创建新images时, Image Stream可用于自动执行动作。例如添加了新的image,构建和部署会接受到消息,然后针对新的image进行构建和部署pod。
OpenShift默认提供多个Image Stream,包括许多流行的语言runtime和框架。Image Stream tag是指向image的别名,简写为istag,包含tag曾经指向的image记录。当新的image使用了新的istag标记,那么该标记会放到记录中第一个位置。之前标记的第一位置变更为第二,可以轻松实现回滚,使标签再次指向旧的image
OpenShift支持运行在基础架构之上,同时支持多种安装方式。
┌──[root@vms16.liruilongs.github.io]-[~]
└─$yum -y install docker-ce
┌──[root@vms16.liruilongs.github.io]-[~]
└─$systemctl enable docker.service --now
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
配置Docker加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://2tefyfv7.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
配置docker镜像仓库,需要注意的是这里的registry是给openshift用的
┌──[root@vms16.liruilongs.github.io]-[~]
└─$cat /etc/docker/daemon.json
{
"registry-mirrors": ["https://2tefyfv7.mirror.aliyuncs.com"],
"insecure-registries": [
"172.30.0.0/16"
]
}
配置防火墙
┌──[root@vms16.liruilongs.github.io]-[~]
└─$firewall-cmd --permanent --new-zone dockerc
┌──[root@vms16.liruilongs.github.io]-[~]
└─$firewall-cmd --permanent --zone dockerc --add-source 172.17.0.0/16
success
┌──[root@vms16.liruilongs.github.io]-[~]
└─$firewall-cmd --permanent --zone dockerc --add-port 8443/tcp
success
┌──[root@vms16.liruilongs.github.io]-[~]
└─$firewall-cmd --permanent --zone dockerc --add-port 53/udp
success
┌──[root@vms16.liruilongs.github.io]-[~]
└─$firewall-cmd --permanent --zone dockerc --add-port 8053/udp
success
┌──[root@vms16.liruilongs.github.io]-[~]
└─$firewall-cmd --reload
success
配置Selinux,这里我们默认是关闭的,所以不需要配置
┌──[root@vms16.liruilongs.github.io]-[~]
└─$setenforce 0
setenforce: SELinux is disabled
┌──[root@vms16.liruilongs.github.io]-[~]
└─$getsebool
getsebool: SELinux is disabled
┌──[root@vms16.liruilongs.github.io]-[~]
└─$
┌──[root@vms16.liruilongs.github.io]-[~]
└─$wget http://dl.dawnlab.cn/skrman/openshift-origin-server-v3.11.0-0cbc58b-linux-64bit.tar.gz
--2022-05-28 15:53:17-- http://dl.dawnlab.cn/skrman/openshift-origin-server-v3.11.0-0cbc58b-linux-64bit.tar.gz
正在解析主机 dl.dawnlab.cn (dl.dawnlab.cn)... 81.69.59.74
正在连接 dl.dawnlab.cn (dl.dawnlab.cn)|81.69.59.74|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:228058872 (217M) [application/gzip]
正在保存至: “openshift-origin-server-v3.11.0-0cbc58b-linux-64bit.tar.gz”
100%[==========================================================================>] 228,058,872 1005KB/s 用时 5m 24s
2022-05-28 15:58:42 (687 KB/s) - 已保存 “openshift-origin-server-v3.11.0-0cbc58b-linux-64bit.tar.gz” [228058872/228058872])
┌──[root@vms16.liruilongs.github.io]-[~]
└─$ls
anaconda-ks.cfg calico.yaml openshift-origin-server-v3.11.0-0cbc58b-linux-64bit.tar.gz
calico_3_14.tar one-client-install.sh set.sh
┌──[root@vms16.liruilongs.github.io]-[~]
└─$tar -xzf openshift-origin-server-v3.11.0-0cbc58b-linux-64bit.tar.gz
安装git。涉及CICD,所以需要git
┌──[root@vms16.liruilongs.github.io]-[~]
└─$yum -y install git
┌──[root@vms16.liruilongs.github.io]-[~]
└─$mv openshift-origin-server-v3.11.0-0cbc58b-linux-64bit/o
oadm oc openshift openshift-node-config
┌──[root@vms16.liruilongs.github.io]-[~]
└─$mv openshift-origin-server-v3.11.0-0cbc58b-linux-64bit/oc /usr/local/bin/
┌──[root@vms16.liruilongs.github.io]-[~]
└─$chmod 755 /usr/local/bin/oc
┌──[root@vms16.liruilongs.github.io]-[~]
└─$echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
┌──[root@vms16.liruilongs.github.io]-[~]
└─$which oc
/usr/local/bin/oc
┌──[root@vms16.liruilongs.github.io]-[~]
└─$oc version
oc v3.11.0+0cbc58b
kubernetes v1.11.0+d4cacc0
features: Basic-Auth GSSAPI Kerberos SPNEGO
┌──[root@vms16.liruilongs.github.io]-[~]
└─$
oc cluster up
方式启动项目
┌──[root@vms16.liruilongs.github.io]-[~]
└─$oc cluster up --skip-registry-check=true --public-hostname=192.168.26.16 --no-proxy=172.17.0.0/16,127.0.0.1
.....
Login to server ...
Creating initial project "myproject" ...
Server Information ...
OpenShift server started.
The server is accessible via web console at:
https://192.168.26.16:8443:8443
You are logged in as:
User: developer
Password: <any value>
To login as administrator:
oc login -u system:admin
如果是在虚机部署。希望在本地物理机访问,需要在windows配置域名映射,修改host文件
hostnamectl set-hostname vms$16.liruilongs.github.io
192.168.26.16 vms16.liruilongs.github.io
我是在虚机部署的,在物理机访问,一直受域名解析影响,后来找windows上的host文件配置了ip到域名的映射可以了。如果访问不成功。可以按照下面的方式重新试试
┌──[root@vms16.liruilongs.github.io]-[~]
└─$oc cluster down
┌──[root@vms16.liruilongs.github.io]-[~]
└─$docker images | grep -v IMAGE | awk '{ print $3}' | xargs docker rmi
┌──[root@vms16.liruilongs.github.io]-[~]
└─$oc cluster up --skip-registry-check=true --public-hostname=192.168.26.16 --no-proxy=172.17.0.0/16,127.0.0.1
┌──[root@vms16.liruilongs.github.io]-[~]
└─$cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.26.16 vms16.liruilongs.github.io vms16
┌──[root@vms16.liruilongs.github.io]-[~]
└─$
这里如果无法登录,需要配置ip到域名的映射
在部署应用前,需要创建一个Project对象,即项目。项目是OpenShift中的一种资源组织方式
。类似于k8s中的命名空间,可以做到资源对象隔离,当然部分特殊的除外,比如PV等,
OpenShift是以原生的Docker作为平台的容器引擎,因此只要是有效的Docker镜像,均可以运行于OpenShift容器云平台之上。
Docker默认允许容器以root用户的身份执行容器内的程序。OpenShift对容器的安全比Docker有更谨慎的态度。OpenShift默认在启动容器应用时使用非root用户。这可能会导致一些Docker镜像在OpenShift平台上启动时报出Permission denied的错误。可以通过修改OpenShift的安全配置,在制作自己的Docker镜像时,建议避免使用root用户启动容器内的应用,以降低安全风险。
镜像为:openshift/hello-openshift ,可以在docker仓库直接拉取
hello-openshift容器会成功启动。可以看到项目主页上的圆圈变成了蓝色,容器计数从“0”变成了“1”,说明容器已经成功启动了,当前有“1”个在运行的实例。
┌──[root@vms16.liruilongs.github.io]-[~]
└─$curl 172.17.0.10:8888
Hello OpenShift!
┌──[root@vms16.liruilongs.github.io]-[~]
└─$curl 172.17.0.10:8080
Hello OpenShift!
嗯,关于openshift基本认识就和小伙伴们聊到这里,感兴趣小伙伴可以深入研究下。
《DO280 RED HAT OPENSHIFT ADMINISTRATION》
《开源容器云OpenShift:构建基于Kubernetes的企业应用云平台》