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云平台部署通俗讲解一(介绍概念)

Openshift PaaS云平台部署通俗讲解一(介绍概念)

Openshift PaaS云平台部署通俗讲解三(Container启动时运行多条命令)

Openshift PaaS云平台部署通俗讲解三(Container启动时运行多条命令)