Openshift PaaS云平台部署通俗讲解一(介绍概念)
Posted 风水月
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Openshift PaaS云平台部署通俗讲解一(介绍概念)相关的知识,希望对你有一定的参考价值。
一提到Openshift PaaS云,必然需要先了解Pod、Container这些概念,以及创建Pod、部署应用等涉及到的Deployment、Service、Router等等概念,官方文档、网上教程都对这些专业术语进行了专业的解释,但是不进行一次Openshift部署还是无法深刻体会这些概念,本人针对近期在项目上亲自部署的感受,简单解释下这些概念,可能不是特别恰当,但是本人认为好理解。
一、Openshift PaaS相关概念
1.Pod:类似一台物理机(即一台电脑)
2.Container:类似操作系统.
3.镜像 :类似在操作系统上安装的应用
- 3.1 基础镜像:类似tomcat、was等程序运行必要的环境软件
- 3.2 程序镜像:包含基础镜像和自己的程序
4.一个Pod中可以有多个Container:即一台电脑可以装多个操作系统(操作系统可以是Linux不同版本、Windows不同版本等)
5.一个Container可以部署多个应用:类似一个操作系统可以安装不同的软件
6.多个Pod部署一个应用:即分布式部署(即一个应用部署在多台物理机服务器上)
二、部署相关概念
下面介绍的概念是发布一个PaaS应用多数用到的一些部署配置相关的概念
1.Deployment
顾名思义即部署,即告诉Openshift如何进行部署,即部署几个Container,从哪儿获取镜像、分配几个Pod、部署用到的端口是哪个等。
下面是一个部署示例,从中即可懂得Deployment如何编写
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-deployment
namespace:myfirstpaasproject #project名称
spec:
selector:
matchLabels:
app: hello
replicas: 2 #分配2个Pod
template:
metadata:
labels:
app: hello
spec:
imagePullSecrets:
- name: hello-pull #自己创建的名为hello-pull的secret,用于镜像下载的身份认证
containers:
- name: hello #容器名称,自定义
image: 'base_url/hello.1.0.1' #镜像路径
command: #部署进行时用到的指令
- java
args:
- '-Dfile.encoding=utf-8'
- '-DJAVA_FONTS=/myfolder'
- '-jar'
- '-Xms512m'
- '-Xmx2048m'
- /myfolder/hello.jar
- '--spring.profiles.active=dev'
- '--log.path=/myfolder/logs'
- '--server.port=8080'
env:
- name: TZ
value: Asia/Beijing
- name: JAVA_OPTS
value: >-
-Dfile.encoding=UTF-8 -DJAVA_FONTS=/myfolder
-Ddefault.client.encoding=UTF-8 -Dspring.profiles.active=dev
-Dlog.path=/myfolder/logs
ports: #hello程序用到的端口
- containerPort: 8080
protocol: TCP
resources: #container用到的资源,一个CPU、2G内存
limits:
cpu: '1'
memory: 2Gi
requests:
cpu: 500m
memory: 1Gi
readinessProbe:
httpGet:
path: /login
port: 8080
scheme: HTTP
volumeMounts: #将hello-pv存储挂载到/hello目录下(即通过/hello 即可访问该存储)
- name: hello-pv
mountPath: /hello
volumes: #hello-pv 对应的实际storage的名称是 hello-pvc
- name: hello-pv
persistentVolumeClaim:
claimName: hello-pvc
2.Service
即创建了Service,即可以通过ip:port访问部署的应用
apiVersion: v1
kind: Service
metadata:
name: hello-service
spec:
ports:
- protocol: TCP
port: 8080
targetPort: 8080
selector: #选择器,该service用于 app名为 hello的应用
app: hello
上述既是一个serivce的定义,通过创建service,我们即可通过Pod的ip:8080访问到我们的hello应用了
3.Router
路由,顾名思义即含有域名解析的功能,创建了serivce虽然可以让我们通过ip:port访问我们的应用,但是不方面,Router即可自定义一个URL,我们即可通过该URL访问到我们的应用。
apiVersion: v1
kind: Route
metadata:
name: hello-route
namespace: myfirstpaasproject
spec:
host: hello.com
to:
kind: Service
name: hello-service #自己刚才定义的service name
ports:
targetPort: 8080
通过创建Deployment、Service、Route后,我们的程序即可运行访问了。
从Deployments的yaml文件中,我们看到部署还使用了secret、storage,这两个可以通过Openshift自带的web控制台进行创建,从web页面创建很方便。
1.secret
从镜像库下载进行,需要用到用户名、密码,从web页面创建。
2.storage
用于Pod挂载外置存储
kind: PersistentVolumeclaim
apiVersion: v1
metadata:
name: hello-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 50Gi
volumeMode: Filesystem
三、构建相关概念
上述Deployment用到了hello.1.0.1的程序镜像,该镜像如何生成呢?
我们有两种方式
1.编写BuildConfig,来完成程序的编译构建(由于本人没有具体实施过,故本篇不讨论)
#简单展示下build Conifg yaml文件的内容
apiVersion: v1
kind: BuildConfig
metadata:
name: hello
namespace: myfirstpaasproject
spec:
source:
git:
ref: master
uri: 'http://github.com/xxx'
type: Git
strategy:
type: Source
sourceStrategy:
from:
kind: ImageStreamTag
name: 'openjdk-11-el7'
namespace: openshift
env:
triggers:
- type: ImageChange
imageChanges:
- type: ConfigChange
2.我们可以使用Openshift自带的Jenkins工具来进行程序的编译、构建,生成程序镜像。
(Jenkins工具除了可以构建镜像外,也可以完成程序部署,即Jenkins可以实现一键部署。)
Jenkins需要首先创建pipeline(流水线),在编辑pipeline的script,点击立即构建即可。
pipeline script如下:
def project_name='myfirstpaasproject'
def service_name='hello'
def storage_folder='example'
def base_image='openjdk18-openshift:simsunv02'
def tfs_credential='tfs-credential-hello'
def tfs_branch='master'
def tfs_url='http://github.com/xxx'
def user_name=xxxx
def password=xxxx
pipeline
agent
label 'maven'
stages
#编译程序
stage('Compile Package')
steps
git branch:tfs_branch,credentialsId:"$tfs_credential",url:"$tfs_url"
script
def pom=readMavenPom file:"./pom.xml"
def version=pom.version
echo "version:$version
sh "mvn clean compile -s /home/jenkins/.m2/settings_maven_test_public.xml"
#打包程序
stage('Build Intall')
steps
sh "mvn install -DskipTests=true -s /home/jenkins/.m2/settings_maven_test_public.xml"
#创建程序镜像,并上传至xxxx程序库
stage('Create Image Builder')
steps
script
openshift.withCluster()
openshift.withProject("$project_name")
if(openshift.selector("bc","$service_name").exists()
openshift.selector("bc","$service_name").delete()
openshift.newBuild("--name=$service_name","--binary=true","--to=xxxx/$service_name.1.0.BUILD_ID"
,"--to-docker=true","--push-secret=hello-pull","--image-stream=$base_image")
#将hello的jar包放入oc-build/myfirstdeployment下,开始构建镜像
stage('Build Image')
steps
sh "rm -rf oc-build && mkdir -p oc-build/myfirstdeployment"
sh "cp ./hello/target/*.jar oc-build/myfirstdeployment/"
script
openshift.withcluster()
openshift.withProject("$project_name")
openshift.selector("bc","$service_name".startBuild("--from-dir=oc-build","--wait=true")
#部署阶段
stage("Deploy DEV")
steps
script
openshift.withCluster()
openshift.withProject("$project_name")
if(!openshift.selector("bc","service_name").exists())
#将hello-template.xml文件中的BUILD_ID修改为构建号
sh "sed -i 's/BUILD_ID/'$BUILD_ID'/g' hello-template.yaml"
#将修改后的yaml文件上传至自定义的镜像仓库
sh "curl -u $user_name:$password -T hello-template.yam http://xxxx/$service_name.1.0.BUILD_ID"
#上传模板至myfirstpaasproject项目
sh "oc process -f hello-template.yaml | oc apply -n $project_name -f -"
else
openshift.selector("bc","$service_name").rollout().latest()
四、项目Template
在hello项目的根目录下,有hello-template.yaml文件,该文件用于Jenkins自动部署时,自动调用创建Pod,该文件的内容,既是将 Deployment、Serivce、Route合并到一个文件中。
apiVersion: v1
kind: Template
metadata:
name: hello-template
objects:
- apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-deployment
namespace:myfirstpaasproject #project名称
spec:
selector:
matchLabels:
app: hello
replicas: 2 #分配2个Pod
template:
metadata:
labels:
app: hello
spec:
imagePullSecrets:
- name: hello-pull #自己创建的名为hello-pull的secret,用于镜像下载的身份认证
containers:
- name: hello #容器名称,自定义
image: 'base_url/hello.1.0.1' #镜像路径
command: ["java"]
args: ["-Dfile.encoding=utf-8","-DJAVA_FONTS=/myfolder","-jar","-Xms512m","-Xmx2048m","/myfolder/hello.jar","--spring.profiles.active=jktest","--log.path=/myfolder/logs","--server.port=8080"]
env:
- name: TZ
value: Asia/Beijing
- name: JAVA_OPTS
value: '-Dfile.encoding=UTF-8 -DJAVA_FONTS=/myfolder -Ddefault.client.encoding=UTF-8 -Dspring.profiles.active=dev -Dlog.path=/myfolder/logs'
ports: #hello程序用到的端口
- containerPort: 8080
protocol: TCP
resources: #container用到的资源,一个CPU、2G内存
limits:
cpu: '1'
memory: 2Gi
requests:
cpu: 500m
memory: 1Gi
readinessProbe:
httpGet:
path: /login
port: 8080
scheme: HTTP
volumeMounts: #将hello-pv存储挂载到/hello目录下(即通过/hello 即可访问该存储)
- name: hello-pv
mountPath: /hello
volumes: #hello-pv 对应的实际storage的名称是 hello-pvc
- name: hello-pv
persistentVolumeClaim:
claimName: hello-pvc
- apiVersion: v1
kind: Service
metadata:
name: hello-service
spec:
ports:
- protocol: TCP
port: 8080
targetPort: 8080
selector: #选择器,该service用于 app名为 hello的应用
app: hello
- apiVersion: v1
kind: Route
metadata:
name: hello-route
namespace: myfirstpaasproject
spec:
host: hello.com
to:
kind: Service
name: hello-service #自己刚才定义的service name
ports:
targetPort: 8080
以上是关于Openshift PaaS云平台部署通俗讲解一(介绍概念)的主要内容,如果未能解决你的问题,请参考以下文章
Openshift PaaS云平台部署通俗讲解一(介绍概念)
Openshift PaaS云平台部署通俗讲解一(介绍概念)
Openshift PaaS云平台部署通俗讲解一(介绍概念)