okd 安装
开始使用Kubernetes和OKD (以前称为OpenShift Origin的Kubernetes发行版)可能会令人生畏。 有很多概念和组件需要接受和理解。 本教程将逐步创建一个示例Kubernetes cron作业,该作业使用服务帐户和Python脚本列出当前项目/命名空间中的所有Pod。 这项工作本身是没有用的,但是本教程介绍了Kubernetes和OKD基础架构的许多部分。 同样,Python脚本是将OKD REST API用于与群集相关的任务的一个很好的例子。
本教程涵盖了Kubernetes / OKD基础架构的几个部分,包括:
- 服务帐户和令牌
- 基于角色的访问控制(RBAC)
- 图像流
- BuildConfigs
- 源到图像(S2I)
- 职位和Cron职位(主要是后者)
- Kubernetes的向下API
本教程的Python脚本和示例OKD YAML文件可以在GitHub上找到 ; 要使用它们,只需将cronJob.yml中的值https://okd.host:port替换为您的OKD实例的主机名。
先决条件
所需软件
- 已安装默认S2I图像流的OKD或MiniShift群集
- 集成映像注册表
可选软件(用于播放Python脚本)
要安装模块,请运行:
pip3 install --user openshift kubernetes
认证方式
Python脚本将使用服务帐户API令牌对OKD进行身份验证。 该脚本需要一个环境变量,该环境变量指向它将连接的OKD主机:
主机:要连接的OKD主机(例如https://okd.host:port )
OKD也将需要将运行cron作业荚服务帐户自动创建令牌(请参阅“如何设置环境变量和标记使用” 下面 )。
处理
设置此同步是一种很好的学习体验-由于您需要设置许多Kubernetes和OKD任务,因此可以很好地了解其各种功能。
一般过程是:
- 创建一个新项目
- 使用Python脚本创建一个Git存储库
- 创建服务帐号
- 向服务帐户授予RBAC权限
- 设置如何使用环境变量和令牌
- 创建一个图像流以接受BuildConfig创建的图像
- 创建一个BuildConfig以将Python脚本转换为图像/图像流
- 建立形象
- 创建cron作业
1.创建一个新项目
在OKD中为此练习创建一个新项目:
oc new-project py-cron
根据群集的设置方式,您可能需要请群集管理员为您创建一个新项目。
2.使用Python脚本创建一个Git存储库
克隆或分叉此仓库:
https://github.com/clcollins/openshift-cronjob-example.git
您也可以在下面的代码示例中直接引用它。 这将用作将Python脚本提取并构建到最终运行映像中的存储库。
3.创建一个服务帐户
服务帐户是非用户帐户,可以与OKD中的资源,权限等相关联。 在本练习中,您必须创建一个服务帐户来运行其中带有Python脚本的Pod,通过令牌auth向OKD API进行身份验证,并进行REST API调用以列出所有Pod。
由于Python脚本将查询OKD REST API以获得名称空间中的Pod列表,因此服务帐户将需要具有列出Pod和命名空间的权限。 从技术上讲,在项目中自动创建的默认服务帐户之一-system :serviceaccount:default:deployer-已具有这些权限。 但是,此练习将创建一个新的服务帐户,以解释服务帐户的创建和RBAC权限。
通过输入以下内容来创建新的服务帐户:
oc create serviceaccount py-cron
这将创建一个名为py-cron的服务帐户。 (从技术上讲,它是system:serviceaccounts:py-cron:py-cron或“ py-cron”名称空间中的“ py-cron”服务帐户)。 该帐户自动接收两个机密:OKD API令牌和OKD容器注册表的凭据。 API令牌将在Python脚本中使用,以标识OKD的服务帐户以进行REST API调用。
可以使用以下命令查看与服务帐户关联的令牌:
oc describe serviceaccount py-cron
4.授予服务帐户的RBAC权限
OKD和Kubernetes使用RBAC( 基于角色的访问控制 )来精细控制谁可以在复杂集群中做什么。 在RBAC中:
- 权限基于动词和资源 (例如,创建组,删除窗格等)
- 权限集分为角色或ClusterRoles ,可以预见的是,它们在群集范围内。
- 角色和ClusterRoles通过创建RoleBindings或ClusterRoleBindings与(和绑定到) 组和服务帐户 (或者,如果您做错了,则是单个用户 )相关联。
- 组,服务帐户和用户可以绑定到多个角色。
在本练习中,请在项目中创建一个角色,授予该角色列出窗格和项目的权限,并将py-cron服务帐户绑定到该角色:
oc create role pod-lister --verb=list --resource=pods,namespaces
oc policy add-role-to-user pod-lister --role-namespace=py-cron system:serviceaccounts:py-cron:py-cron
请注意,必须添加--role-namespace = py-cron以防止OKD查找ClusterRoles。
验证服务帐户是否已绑定到角色:
oc get rolebinding | awk 'NR==1 || /^pod-lister/'
NAME ROLE USERS GROUPS SERVICE ACCOUNTS SUBJECTS
pod-lister py-cron/pod-lister py-cron
5.设置如何使用环境变量和令牌
与服务帐户和各种环境变量相关联的令牌在Python脚本中被称为py-cron API令牌 。
OKD将为py-cron服务帐户自动创建的API令牌安装到该服务帐户正在运行的任何pod中。 此令牌安装到容器中每个容器中的特定路径:
/var/run/secrets/kubernetes.io/serviceaccount/token
Python脚本读取此文件,并使用它向OKD API进行身份验证以管理组。
HOST环境变量 :HOST环境变量在cron作业定义中指定,并且包含OKD API主机名,格式为: https ://okd.host: port 。
NAMESPACE环境变量 :cron作业定义中引用了NAMESPACE环境变量,并使用Kubernetes Downward API使用运行cron作业pod的项目的名称动态填充该变量。
6.创建一个图像流
在这种情况下,图像流是由BuildConfig构建创建的图像集合,以及图像和Kubernetes对象之间的抽象层,该抽象层允许它们引用图像流而不是直接引用图像。
在将新生成的图像推入图像流之前,该流必须已经存在。 创建新的空流的最简单方法是使用oc命令行命令:
oc create imagestream py-cron
7.创建一个BuildConfig
BuildConfig是整个构建过程的定义,即获取输入参数和代码并将其转换为映像的动作。
本练习的BuildConfig将使用源到映像(S2I)生成策略 ,使用Red Hat提供的Python S2I映像,并将Python脚本添加到该脚本中,在该文件中解析了requirements.txt并安装了这些模块。 这将产生一个最终的基于Python的图像,其中包含该脚本和运行该脚本所需的Python模块。
BuildConfig的重要部分包括: .spec.output , .spec.source和.spec.strategy 。
.spec。输出
BuildConfig的输出部分描述了如何处理构建的输出。 在这种情况下,BuildConfig将生成的图像作为图像流标签(例如py -cron:1.0 )输出,可以在deploymentConfig中使用它来引用该图像。
这些可能是不言自明的。
spec:
output:
to:
kind: ImageStreamTag
name: py-cron:1.0
.spec.source
BuildConfig的源代码部分描述了构建内容的来源。 在这种情况下,它引用了保存Python脚本及其支持文件的Git存储库。
其中大多数也是不言自明的。
spec:
source:
type: Git
git:
ref: master
uri: https://github.com/clcollins/openshift-cronjob-example.git
.spec.strategy
BuildConfig的“策略”部分描述了要使用的生成策略,在这种情况下,将使用源(即S2I)策略。 .spec.strategy.sourceStrategy.from部分定义了默认的OpenShift命名空间中存在的公共Python 3.6图像流,任何人都可以使用。 该图像流包含S2I构建器图像,这些图像以Python代码作为输入,安装所有requirements.txt文件中列出的依赖项,然后输出带有已安装的代码和需求的最终图像。
strategy:
type: Source
sourceStrategy:
from:
kind: ImageStreamTag
name: python:3.6
namespace: openshift
此示例的完整BuildConfig类似于下面的YAML。 替换您的Git存储库,并使用oc命令创建BuildConfig:
oc create -f <path.to.buildconfig.yaml>
YAML:
---
apiVersion
: build.openshift.io/v1
kind
: BuildConfig
metadata :
labels :
app
: py-cron
name
: py-cron
spec :
output :
to :
kind
: ImageStreamTag
name
: py-cron:1.0
runPolicy
: Serial
source :
type
: Git
git :
ref
: master
uri
: https://github.com/clcollins/openshift-cronjob-example.git
strategy :
type
: Source
sourceStrategy :
from :
kind
: ImageStreamTag
name
: python:3.6
namespace
: openshift
8.建立映像
在大多数情况下,将Webhook触发器添加到BuildConfig以便每次提交代码并将其推送到存储库时都可以自动重建映像会更加有效。 但是,对于本练习,每当需要更新映像时,将手动启动映像构建。
可以通过运行以下命令触发新的构建:
oc start-build BuildConfig/py-cron
运行此命令将输出构建名称。 例如:
build.build.openshift.io/py-cron-1 started
可以通过查看日志来跟踪构建的进度:
oc logs -f build.build.openshift.io/py-cron-1
构建完成后,图像将被推送到BuildConfig的.spec.output部分中列出的图像流。
9.创建cron作业
Kubernetes cron作业对象定义了cron时间表和行为以及为运行实际同步而创建的Kubernetes作业 。
Cron作业定义的重要部分包括: .spec.concurrencyPolicy , .spec.schedule和.spec.JobTemplate.spec.template.spec.containers 。
.spec.concurrencyPolicy
cron作业规范的concurrencyPolicy字段是一个可选字段,用于指定如何处理由该cron作业创建的作业的并发执行。 在本练习中,如果cron作业创建了新作业,它将替换可能仍在运行的现有作业。
注意:其他选项是允许并发 (一次运行多个作业)或禁止并发 (跳过新作业,直到正在运行的作业完成)。
.spec.schedule
cron作业规范的Schedule字段是(毫无疑问) Vixie cron格式的时间表。 在指定的时间,Kubernetes将创建一个作业,如以下JobTemplate规范中所定义。
spec:
schedule: "*/5 * * * *"
.spec.JobTemplate.spec.template.spec.containers
cron作业规范包含JobTemplate规范和模板规范,而模板规范又包含容器规范。 所有这些都遵循其类型的标准规范,即.spec.containers部分只是您在任何其他pod定义中可能会发现的普通容器定义。
此示例的容器定义是使用上面讨论的环境变量的简单容器定义。
唯一重要的部分是:
.spec.JobTemplate.spec.template.spec.containers.ServiceAccountName
本部分将先前创建的服务帐户py -cron设置为运行容器的帐户。 这将覆盖默认的部署者服务帐户。
py-cron的完整OKD cron作业类似于下面的YAML。 使用以下oc命令替换OKD群集API的URL并创建cron作业:
oc create -f <path.to.cronjob.yaml>
YAML:
---
apiVersion
: batch/v1beta1
kind
: CronJob
metadata :
labels :
app
: py-cron
name
: py-cron
spec :
concurrencyPolicy
: Replace
failedJobsHistoryLimit
: 1
JobTemplate :
metadata :
annotations :
alpha.image.policy.openshift.io/resolve-names
: '*'
spec :
template :
spec :
containers :
- env :
- name
: NAMESPACE
valueFrom :
fieldRef :
fieldPath
: metadata.namespace
- name
: HOST
value
: https://okd.host:port
image
: py-cron/py-cron:1.0
imagePullPolicy
: Always
name
: py-cron
ServiceAccountName
: py-cron
restartPolicy
: Never
schedule
:
"*/5 * * * *"
startingDeadlineSeconds
: 600
successfulJobsHistoryLimit
: 3
suspend
: false
环顾四周
创建了cron作业后,可以使用oc get cronjob命令查看其组件。 这显示了有关cron作业,其计划和上次运行以及它是处于活动状态还是已暂停的简要说明:
oc get cronjob py-cron
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
py-cron */5 * * * * False 0 1m 7d
如前所述,cron作业会创建Kubernetes作业以在计划的时间过去时执行该工作。 oc get jobs命令列出了由cron作业创建的作业,所需作业的数量(在这种情况下,每次运行仅一个作业)以及该作业是否成功:
oc get jobs
NAME DESIRED SUCCESSFUL AGE
py-cron-1544489700 1 1 10m
py-cron-1544489760 1 1 5m
py-cron-1544489820 1 1 30s
作业是pod,可以通过oc get pods命令看到。 在此示例中,您可以看到两个作业窗格(以创建它们的作业命名,例如Job“ py -cron-1544489760”创建的窗格“ py -cron-1544489760-xl4vt” )。 也有构建容器,或构建容器映像的容器,如上面的BuildConfig中所述。
oc get pods
NAME READY STATUS RESTARTS AGE
py-cron-1-build 0/1 Completed 0 7d
py-cron-1544489760-xl4vt 0/1 Completed 0 10m
py-cron-1544489820-zgfg8 0/1 Completed 0 5m
py-cron-1544489880-xvmsn 0/1 Completed 0 44s
py-cron-2-build 0/1 Completed 0 7d
py-cron-3-build 0/1 Completed 0 7d
最后,由于该示例只是连接到OKD的REST API的Python脚本,以获取有关项目中Pod的信息,因此可以使用oc get日志 ,通过从Pod获取日志以查看脚本的输出来验证脚本是否正常运行脚本写入标准输出:
oc logs py-cron-1544489880-xvmsn
---> Running application from Python script (app.py) ...
ResourceInstance[PodList]:
apiVersion: v1
items:
- metadata:
annotations: {openshift.io/build.name: py-cron-1, openshift.io/scc: privileged}
creationTimestamp: '2018-12-03T18:48:39Z'
labels: {openshift.io/build.name: py-cron-1}
name: py-cron-1-build
namespace: py-cron
ownerReferences:
- {apiVersion: build.openshift.io/v1, controller: true, kind: Build, name: py-cron-1,
uid: 0c9cf9a8-f72c-11e8-b217-005056a1038c}
<snip>
综上所述
本教程介绍了如何使用OKD创建Kubernetes cron作业,OKD是Kubernetes的发行版,以前称为OpenShift Origin。 BuildConfig描述了如何构建包含调用OKD REST API的Python脚本的容器映像,并创建了一个映像流来描述构建所生成映像的不同版本。 创建了一个服务帐户来运行容器,并创建了一个角色,以允许该服务帐户从OKD的REST API获取pod信息。 RoleBinding将角色与服务帐户关联。 最后,创建了一个cron作业以按指定的时间表运行作业(带有Python脚本的容器)。
接下来要读什么
翻译自: https://opensource.com/article/19/1/create-build-and-deploy-cron-job-okd
okd 安装