🎹 个人简介:大家好,我是 金鱼哥,CSDN运维领域新星创作者,华为云·云享专家,阿里云社区·专家博主
📚个人资质: CCNA、HCNP、CSNA(网络分析师),软考初级、中级网络工程师、RHCSA、RHCE、RHCA、RHCI、ITIL😜
💬格言:努力不一定成功,但要想成功就必须努力🔥🎈支持我:可点赞👍、可收藏⭐️、可留言📝
📜管理image 、IS、Templates
📑image介绍
在OpenShift中,image是一个可部署的runtime模板,它包含运行单个容器的所有需求,还包括imag功能的元数据。image可以通过多种方式管理,如tag、import、pull和update。
image可以跨多个主机部署在多个容器中。开发人员可以使用Docker构建image,也可以使用OpenShift构建工具。
OpenShift实现了灵活的image管理机制。一个image名称实际上可以引用同一image的许多不同版本。唯一的image由它的sha256哈希引用,Docker不使用版本号。相反,它使用tag来管理image,例如v1、v2或默认的latest tag。
📑IS
IS包括由tags标识的任意数量的容器images。它是相关image的统一虚拟视图,类似于Docker image仓库。开发人员有许多与image和IS交互的方法。例如,当添加或修改新image时,build和deployment可以接收通知,并通过运行新build或新deployment做出相应的动作。
📑标记image
OCP提供了oc tag命令,它类似于docker tag命令,但是,它是对IS而不是image进行操作。
可以向image添加tag,以便更容易地确定它们包含什么。tag是指定image版本的标识符。
示例:将Apache web服务器2.4版本的映像,可将该image执行以下标记。
apache: 2.4
如果仓库包含Apache web服务器的最新版本,他们可以使用latest标签来表示这是仓库中可用的最新image。
apache:latest
oc tag命令用于标签image:
[user@demo ~]$ oc tag source destination
- source:现有tag或图像流中的图像。
- destination:标签在一个或多个IS中的最新image。
示例:将ruby image的现有latest标记修改为当前版本v2.0标识,
[user@demo ~]$ oc tag ruby:latest ruby:2.0
📑删除tag
若要从image中删除标记,可使用-d参数。
[user@demo ~]$ oc tag -d ruby:latest
可以使用不同类型的标签,默认行为使用permanent tag,即源文件发生更改,该tag也会及时指向image,与目标tag无关。
tracking tag指示在导入image期间导入目标tag的元数据。要确保目标tag在源tag更改时得到更新,需使用--alias=true标识。
[user@demo ~]$ oc tag --alias=true source destination
要重新导入tag,可使用--scheduled=true标识。
[user@demo ~]$ oc tag --scheduled=true source destination
要配置Docker始终从内部仓库中获取image,可使用--reference-policy=local标志。默认情况下,image指向本地仓库。从而实现在之后调用image的时候可以快速pull。
[user@demo ~]$ oc tag --reference-policy=local source destination
📑建议的tag形式
在管理tag时,开发人员应该考虑镜像的生命周期,参考下表开发人员用来管理镜像的可能的标记命名约定。
描述 | 示例 |
---|---|
Revision | myimage:v2.0.1 |
Architecture | myimage:v2.0-x86_64 |
Base Image | myimage:v1.2-rhel7 |
Latest Image | myimage:latest |
Latest Stable | Image myimage:stable |
📑Templates介绍
模板描述一组对象,其中包含处理后生成对象列表的参数。可以处理模板来创建开发人员有权在项目中创建的任何内容,例如service、build、configuration和dc。
模板还可以定义一组标签,应用于它定义的每个对象。开发人员可以使用命令行界面或web控制台从模板创建对象列表。
📑Templates管理
开发人员可以用JSON或YAML格式编写模板,并使用命令行界面或web控制台导入它们。模板被保存到项目中,以供对该特定项目具有适当访问权限的任何用户重复使用。
示例:导入模板。
[user@demo ~]$ oc create -f filename
还可以在导入模板时分配标签,这意味着模板定义的所有对象都将被标记。
[user@demo ~]$ oc create -f filename -l name=mylabel
①将文件定义为模板。
②指定模板的名称。
③将标签应用到模板。标签可以用于搜索和分组。
④将pod声明为此模板的资源。
⑤为模板中定义的pod定义环境变量。
⑥设置模板参数。参数允许一个值由用户提供或在模板实例化时生成。
📑使用模板
OCP提供了许多默认的instant app和QuickStart模板,允许开发人员为不同的语言快速创建新的应用程序。为Rails (Ruby)、Django (Python)、Node.js、CakePHP (PHP)和Dancer (Perl)提供了模板。
要列出集群中的可用模板,请运行oc get templates命令。参数-n指定要使用的项目。
[user@demo ~]$ oc get templates -n openshift
开发人员还可以使用web控制台浏览模板,当您选择模板时,可以调整可用的参数来自定义模板定义的资源。
📜课本练习
📑环境准备
[student@workstation ~]$ lab install-prepare setup
[student@workstation ~]$ cd /home/student/do280-ansible
[student@workstation do280-ansible]$ ./install.sh
提示:若已经拥有一个完整环境,可不执行。
📑本练习准备
[student@workstation ~]$ lab schedule-is setup
📑创建项目
[student@workstation ~]$ oc login -u developer -p redhat https://master.lab.example.com
[student@workstation ~]$ oc new-project schedule-is
📑创建应用
[student@workstation ~]$ oc new-app --name=phpmyadmin --docker-image=registry.lab.example.com/phpmyadmin/phpmyadmin:4.7
📑创建服务账户
[student@workstation ~]$ oc login -u admin -p redhat
[student@workstation ~]$ oc project schedule-is
[student@workstation ~]$ oc create serviceaccount phpmyadmin-account
📑授权特权运行
[student@workstation ~]$ oc adm policy add-scc-to-user anyuid -z phpmyadmin-account
📑更新pod
[student@workstation ~]$ oc login -u developer
[student@workstation ~]$ oc patch dc/phpmyadmin --patch '{"spec":{"template":{"spec":{"serviceAccountName": "phpmyadmin-account"}}}}'
\# 更新负责管理phpmyadmin部署的dc资源,以便使用新创建的服务帐户。可以使用oc patch或oc edit命令。此命令可以从/home/student/DO280/labs/secure-review文件夹中的patch-dc.sh脚本中复制。
[student@workstation ~]$ oc get pods
NAME READY STATUS RESTARTS AGE
phpmyadmin-2-q8b48 1/1 Running 0 54s
# name后的2表示这个pod是第二次部署,即进行过迭代。
📑更新内部仓库image
[student@workstation ~]$ cd /home/student/DO280/labs/schedule-is/
[student@workstation schedule-is]$ ls
phpmyadmin-latest.tar trust_internal_registry.sh
[student@workstation schedule-is]$ docker load -i phpmyadmin-latest.tar
#使用docker load命令加载新的image。
[student@workstation schedule-is]$ docker images
[student@workstation schedule-is]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 93d0d7db5ce2 2 years ago 166 MB
📑tag镜像
[student@workstation schedule-is]$ docker tag 93d0d7db5ce2 docker-registry-default.apps.lab.example.com/schedule-is/phpmyadmin:4.7
[student@workstation schedule-is]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker-registry-default.apps.lab.example.com/schedule-is/phpmyadmin 4.7 93d0d7db5ce2 2 years ago 166 MB
📑登录docker仓库
[student@workstation schedule-is]$ TOKEN=$(oc whoami -t)
[student@workstation schedule-is]$ echo $TOKEN
VdZV4A6ySzwTVDn-rR717O4Je1mT7jEbHtjeNnuy8nQ
[student@workstation schedule-is]$ docker login -u developer -p ${TOKEN} docker-registry-default.apps.lab.example.com
Error response from daemon: Get https://docker-registry-default.apps.lab.example.com/v1/users/: x509: certificate signed by unknown authority
# docker仓库会提示因为是自签名证书,因此判定为不安全的方式。
📑修改信任
本环境使用/home/student/DO280/labs/schedule-is文件夹中的trust_internal_registry.sh脚本,配置docker仓库信任OpenShift内部仓库。
[student@workstation schedule-is]$ ./trust_internal_registry.sh
Fetching the OpenShift internal registry certificate.
done.
Copying certificate to the correct directory.
done.
System trust updated.
Restarting docker.
done.
📑登录并推送image
[student@workstation schedule-is]$ docker login -u developer -p ${TOKEN} docker-registry-default.apps.lab.example.com
Login Succeeded
[student@workstation schedule-is]$ docker push docker-registry-default.apps.lab.example.com/schedule-is/phpmyadmin
…………
730b09e0430c: Pushed
f06b58790eeb: Pushed
cd7100a72410: Pushed
4.7: digest: sha256:b003fa5555dcb0a305d26aec3935b3a1127179ea8ad9d57685df4e4eab912ca8 size: 3874
[student@workstation schedule-is]$
📑确认更新
验证当源image更新后,是否能自动触发OpenShift进行pod更新。
[student@workstation schedule-is]$ oc get pod
NAME READY STATUS RESTARTS AGE
phpmyadmin-3-gp5sw 1/1 Running 0 51s
📜章节实验
📑环境准备
[student@workstation ~]$ lab install-prepare setup
[student@workstation ~]$ cd /home/student/do280-ansible
[student@workstation do280-ansible]$ ./install.sh
提示:若已经拥有一个完整环境,可不执行。
📑本练习准备
[student@workstation ~]$ lab manage-review setup
📑确认region
[student@workstation ~]$ oc login -uadmin -predhat https://master.lab.example.com
[student@workstation ~]$ oc get nodes -L region
NAME STATUS ROLES AGE VERSION REGION
master.lab.example.com Ready master 16d v1.9.1+a0ce1bc657
node1.lab.example.com Ready compute 16d v1.9.1+a0ce1bc657 infra
node2.lab.example.com Ready compute 16d v1.9.1+a0ce1bc657 infra
📑修改region标签
[student@workstation ~]$ oc label node node1.lab.example.com \
region=services --overwrite=true
node "node1.lab.example.com" labeled
[student@workstation ~]$ oc label node node2.lab.example.com \
region=applications --overwrite=true
node "node2.lab.example.com" labeled
[student@workstation ~]$ oc get nodes -L region
NAME STATUS ROLES AGE VERSION REGION
master.lab.example.com Ready master 18d v1.9.1+a0ce1bc657
node1.lab.example.com Ready compute 18d v1.9.1+a0ce1bc657 services
node2.lab.example.com Ready compute 18d v1.9.1+a0ce1bc657 applications
📑创建项目
[student@workstation ~]$ oc new-project manage-review
📑创建应用
[student@workstation ~]$ oc new-app -i php:7.0 http://registry.lab.example.com/version
📑扩展应用
[student@workstation ~]$ oc scale dc/version --replicas=3
deploymentconfig "version" scaled
[student@workstation ~]$ oc get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
version-1-94ptg 1/1 Running 0 4m 10.129.1.20 node2.lab.example.com
version-1-build 0/1 Completed 0 5m 10.129.1.18 node2.lab.example.com
version-1-jt2tj 1/1 Running 0 9s 10.129.1.21 node2.lab.example.com
version-1-zrzcm 1/1 Running 0 9s 10.129.1.22 node2.lab.example.com
结论:应用程序pod并没有均分在两个集群node节点之间,因为每个节点属于不同的region,并且默认的OpenShift调度器配置打开了区域粘性。
📑调度pod
[student@workstation ~]$ oc export dc version -o yaml > version-dc.yml #导出yaml
[student@workstation ~]$ vim version-dc.yml
……
template:
metadata:
……
spec:
nodeSelector: #添加节点选择器
region: applications
……
📑迭代部署
[student@workstation ~]$ oc replace -f version-dc.yml
deploymentconfig "version" replaced
📑确认验证
[student@workstation ~]$ oc get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
version-1-94ptg 0/1 Terminating 0 15m 10.129.1.20 node2.lab.example.com
version-1-build 0/1 Completed 0 16m 10.129.1.18 node2.lab.example.com
version-2-dhvmq 1/1 Running 0 13s 10.129.1.24 node2.lab.example.com
version-2-fnsvh 1/1 Running 0 6s 10.129.1.26 node2.lab.example.com
version-2-jgpll 1/1 Running 0 9s 10.129.1.25 node2.lab.example.com
验证是否启动了新的部署,并且在node2节点上运行了一组新的版本pod。等待所有三个新的应用程序pod都准备好并运行
📑修改region
[student@workstation ~]$ oc label node node1.lab.example.com \
region=applications --overwrite=true
[student@workstation ~]$ oc get nodes -L region
NAME STATUS ROLES AGE VERSION REGION
master.lab.example.com Ready master 18d v1.9.1+a0ce1bc657
node1.lab.example.com Ready compute 18d v1.9.1+a0ce1bc657 applications
node2.lab.example.com Ready compute 18d v1.9.1+a0ce1bc657 applications
📑终止node2
[student@workstation ~]$ oc adm manage-node --schedulable=false node2.lab.example.com
NAME STATUS ROLES AGE VERSION
node2.lab.example.com Ready,SchedulingDisabled compute 18d v1.9.1+a0ce1bc657
[student@workstation ~]$ oc get nodes -L region2
NAME STATUS ROLES AGE VERSION REGION2
master.lab.example.com Ready master 18d v1.9.1+a0ce1bc657
node1.lab.example.com Ready compute 18d v1.9.1+a0ce1bc657
node2.lab.example.com Ready,SchedulingDisabled compute 18d v1.9.1+a0ce1bc657
📑删除pod
删除node2的pod,并使用node1创建的pod替换。
[student@workstation ~]$ oc adm drain node2.lab.example.com --delete-local-data
node "node2.lab.example.com" already cordoned
WARNING: Deleting pods with local storage: version-1-build
pod "version-1-build" evicted
pod "router-1-gns92" evicted
pod "version-2-dhvmq" evicted
pod "version-2-jgpll" evicted
pod "version-2-fnsvh" evicted
node "node2.lab.example.com" drained
📑查看pod
[student@workstation ~]$ oc get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
version-2-85489 1/1 Running 0 42s 10.128.0.213 node1.lab.example.com
version-2-l7qbn 1/1 Running 0 42s 10.128.0.214 node1.lab.example.com
version-2-m2zbr 1/1 Running 0 41s 10.128.0.215 node1.lab.example.com
📑暴露服务并验证
[student@workstation ~]$ oc expose service version --hostname=version.apps.lab.example.com
[student@workstation ~]$ curl http://version.apps.lab.example.com #确认测试
<html>
<head>
<title>PHP Test</title>
</head>
<body>
<p>Version v1</p>
</body>
</html>
📑评分并还原环境
[student@workstation ~]$ lab manage-review grade
[student@workstation ~]$ oc adm manage-node --schedulable=true node2.lab.example.com
[student@workstation ~]$ oc label node node1.lab.example.com region=infra --overwrite=true
[student@workstation ~]$ oc label node node2.lab.example.com region=infra --overwrite=true
[student@workstation ~]$ oc get node -L region
NAME STATUS ROLES AGE VERSION REGION
master.lab.example.com Ready master 18d v1.9.1+a0ce1bc657
node1.lab.example.com Ready compute 18d v1.9.1+a0ce1bc657 infra
node2.lab.example.com Ready compute 18d v1.9.1+a0ce1bc657 infra
[student@workstation ~]$ oc delete project manage-review
💡总结
RHCA认证需要经历5门的学习与考试,还是需要花不少时间去学习与备考的,好好加油,可以噶🤪。
以上就是【金鱼哥】对 第七章 DO280管理应用部署--管理image 、IS、Templates与章节实验 的简述和讲解。希望能对看到此文章的小伙伴有所帮助。
💾 红帽认证专栏系列:
RHCSA专栏: 戏说 RHCSA 认证
RHCE专栏: 戏说 RHCE 认证
此文章收录在RHCA专栏: RHCA 回忆录
如果这篇【文章】有帮助到你,希望可以给【金鱼哥】点个赞👍,创作不易,相比官方的陈述,我更喜欢用【通俗易懂】的文笔去讲解每一个知识点。
如果有对【运维技术】感兴趣,也欢迎关注❤️❤️❤️ 【金鱼哥】❤️❤️❤️,我将会给你带来巨大的【收获与惊喜】💕💕!