贾捷(1992-)硕士,毕业于美国纽约大学,中国联通研究院工程师,主要从事容器平台研究、java开发工作。联系方式:[email protected]
DAS平台由统一访问界面(wodp)、数据处理组件(Darwin)、数据挖掘组件(mamp)、数据网关(gateway)、SSPS集成工具(Apache-Guacamole)、后台数据库(Mysql、Oracle)组成,通过CAS服务器实现了SSO单点登录服务,做到一次登录,统一访问,免去了分别登录验证的繁琐步骤。
访问方式:对于用户,DAS平台需要对外暴露四大组件的访问端口;SSO单点登录也需要通过组件的IP进行密钥的分发;组件在集群内部访问数据库,所以使用Kubernetes内部服务名进行服务发现。
▼
访问服务: SSO 客户端发送请求访问应用系统提供的服务资源。
定向认证: SSO 客户端会重定向用户请求到 SSO 服务器。
用户认证:用户身份认证。
发放票据: SSO 服务器会产生一个随机的 Service Ticket 。
验证票据: SSO 服务器验证票据 Service Ticket 的合法性,验证通过后,允许客户端访问服务。
传输用户信息: SSO 服务器验证票据通过后,传输用户认证结果信息给客户端。
用户需要直接访问CAS Server以及Application Server,所有web服务都应该对外暴露端口
同时,SSO server鉴权过程需要IP地址,我们需要在镜像运行时通过yaml文件向镜像的host文件添加SSO server地址,实现访问互通。
▲
● 3.1 中间件基础包制作
DAS平台由多个Web应用组成,需要Tomcat+jdk的运行环境。因为有SSO统一登录机制,所以需要分别制作服务端和客户端基础镜像,并进行互信证书配置。
● 3.1.1 服务端基础镜像制作
使用Dockefile制作镜像
1. # Centos based container with Java and Tomcat
2. FROM centos:centos7
3. MAINTAINER kirillf
4.
5. # Install prepare infrastructure
6. RUN yum -y update && \
7. yum -y install wget && \
8. yum -y install tar
9.
10.# Prepare environment
11.ENV JAVA_HOME /opt/java
12.ENV CATALINA_HOME /opt/tomcat
13.ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin:$CATALINA_HOME/scripts
14.
15.# Install Oracle Java8
16.ENV JAVA_VERSION 8u112
17.ENV JAVA_BUILD 8u112-b15
18.
19.RUN wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" \
20. http://download.oracle.com/otn-pub/java/jdk/${JAVA_BUILD}/jdk-${JAVA_VERSION}-linux-x64.tar.gz && \
21. tar -xvf jdk-${JAVA_VERSION}-linux-x64.tar.gz && \
22. rm jdk*.tar.gz && \
23. mv jdk* ${JAVA_HOME}
24.
25.
26.# Install Tomcat
27.ENV TOMCAT_MAJOR 8
28.ENV TOMCAT_VERSION 8.5.9
29.
30.RUN wget http://ftp.riken.jp/net/apache/tomcat/tomcat-${TOMCAT_MAJOR}/v${TOMCAT_VERSION}/bin/apache-tomcat-${TOMCAT_VERSION}.tar.gz && \
31. tar -xvf apache-tomcat-${TOMCAT_VERSION}.tar.gz && \
32. rm apache-tomcat*.tar.gz && \
33. mv apache-tomcat* ${CATALINA_HOME}
34.
35.RUN chmod +x ${CATALINA_HOME}/bin/*sh
36.
37.# Create Tomcat admin user
38.ADD create_admin_user.sh $CATALINA_HOME/scripts/create_admin_user.sh
39.ADD tomcat.sh $CATALINA_HOME/scripts/tomcat.sh
40.RUN chmod +x $CATALINA_HOME/scripts/*.sh
41.
42.# Create tomcat user
43.RUN groupadd -r tomcat && \
44. useradd -g tomcat -d ${CATALINA_HOME} -s /sbin/nologin -c "Tomcat user" tomcat && \
45. chown -R tomcat:tomcat ${CATALINA_HOME}
46.
47.WORKDIR /opt/tomcat
48.
49.EXPOSE 8080
50.EXPOSE 8009
51.
52.USER root
53.CMD ["tomcat.sh"]
docker build -t ${DOCKER_REGISTRY}/tomcatoraclejdk:server .
docker push ${DOCKER_REGISTRY}/tomcatoraclejdk:server
docker build -t ${DOCKER_REGISTRY}/tomcatoraclejdk:client .
启动镜像
生成密钥库:
1. keytool -genkey -alias ${NAME} -keypass yourpassword -keyalg RSA -keystore server.keystore
注意:红字为密钥的key,密钥文件保存为 server.keystore
目录下多出一个文件server.keystore (第一个名字写localhost或是域名,不能写ip)
1. keytool -export -alias ${NAME} -keypass yourpassword -file server.crt -keystore server.keystore
导出数字证书
C:\Program Files\Java\jdk1.6.0_10\bin>keytool -export-alias ssotest -keypass yourpassword -file server.crt -keystore server.keystore
输入keystore密码:yourpassword
在tomcat的conf/server.xml中添加配置信息
1.
2. disableUploadTimeout="true" enableLookups="false" maxThreads="25"
3. port="8443" keystoreFile="/opt/tomcat/server.keystore" keystorePass="yourpassword"
4. protocol="org.apache.coyote.http11.Http11NioProtocol" scheme="https"
5. secure="true" sslProtocol="TLS" />
docker commit 9e68fcb28748 ${DOCKER_REGISTRY}/das/tomcat:server
docker push ${DOCKER_REGISTRY}/das/tomcat:server
● 3.1.2 客户端基础镜像
将sso服务器生成的server.crt拷贝到客户端,并将数字认证导入jre可信任区
1. keytool -import -alias ${NAME} -file server.crt -keypass yourpassword -keystore "/opt/java/jre/lib/security/cacerts"
这里的jre地址和tomcat使用的jre必须一致
输入密码:yourpassword
1. keytool -delete -alias ${NAME} -keystore "/opt/java/jre/lib/security/cacerts" -storepass yourpassword
docker commit 9e68fcb28748 ${DOCKER_REGISTRY}/das/tomcat:client
docker push ${DOCKER_REGISTRY}/das/tomcat:client
● 4.1 Dockerfile示例
1. FROM ktomcat/jdk/client:0831
2.
3. ADD ROOT /opt/tomcat/webapps/ROOT
4.
5. USER root
6. EXPOSE 8080
● 4.2 Mysql容器化
容器化Mysql是比较普遍也是比较简单的,本项目直接利用了Helm的mysql包来实现,可以从https://kubeapps.com/和https://github.com/kubernetes/charts网站查询和下载chart。由于本环境使用了私有Helm库,下载了chart包发现其中并没有做NodePort供外部用户维护时访问,所以要对其中文件进行改写。
1. 1. 解压缩tgz格式的chart包
2. cd /var/www/html
3. tar -zxvf mysql-0.2.6.tgz
4. 2. mysql/charts.yaml文件中修改name为mysqlnpc
5. 3. 修改mysql/templates/svc.yaml(红色为修改内容):
6. apiVersion: v1
7. kind: Service
8. metadata:
9. name: {{ template "fullname" . }}
10. labels:
11. app: {{ template "fullname" . }}
12. chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
13. release: "{{ .Release.Name }}"
14. heritage: "{{ .Release.Service }}"
15.spec:
16. type: NodePort
17. ports:
18. - name: mysql
19. port: 3306
20. targetPort: mysql
21. nodePort: {{ .Values.nodeport }}
22. selector:
23.app: {{ template "fullname" . }}
24.4. 修改mysql/values.yaml
25.最后位置新增如下一行
26.nodeport:
27.5. 至此我们想要改的地方全改完了,重新打包
28.tar -zcvf mysqlnpc-0.2.7.tgz mysql
29.6. 生成新的index,update repo:
30.helm repo index .
31.helm repo update
32.7. 最终,可以查到新chart,并启动
33.helm search myrepo/
34.helm install --set persistence.enabled=false,nodeport=31028 myrepo/mysqlnpc
35.8. 结果会启动nodeport为31028的mysql,如果不带nodeport=xxx参数就是启用随机端口的nodeport,可以从helm status helmname里面查到。
● 4.3 Oracle 容器化
● 4.3.1 镜像启动配置
1. apiVersion: extensions/v1beta1
2. kind: Deployment
3. metadata:
4. name: oracle12c
5. spec:
6. replicas: 1
7. template:
8. metadata:
9. labels:
10. app: oracle12c
11. spec:
12. containers:
13. - name: oracle12c
14. image: ${DOCKER_REGISTRY}/oracle/database
15. resources:
16. requests:
17. cpu: 2000m
18. memory: 2000Mi
19. env:
20. - name: ORACLE_SID
21. value: CUPOC
22. - name: ORACLE_PWD
23. value: oracle123
24. ports:
25. - containerPort: 1521
26. - containerPort: 5500
27. volumeMounts:
28. - mountPath: /opt/oracle/oradata
29. name: oradata
30. volumes:
31. - name: oradata
32. emptyDir: {}
33.
34.---
35.apiVersion: v1
36.kind: Service
37.metadata:
38. name: database
39. labels:
40. app: database
41.spec:
42. type: NodePort
43. ports:
44. - name: p1
45. port: 1521
46. targetPort: 1521
47. nodePort: 31521
48. - name: p2
49. port: 5500
50. targetPort: 5500
51. nodePort: 30500
52. selector:
53.app: oracle12c
1. 设置了resources.requests,目前设置为2000,没有试出或查到最小值是多少。但是如果不设置该资源值,建库过程到一半会卡住。
2. 设置了环境变量ORACLE_SID和ORACLE_PWD,SID为实例名,PWD为system密码。可PWD设置后不成功密码还是随机的,可在log第一行查到随机密码,可通过kubectl
execoracle12c-2937006895-ndwhr ./setPassword.sh oraclepassword修改密码。另外还有其他变量可增加,在官方github可查到。
3. 把/opt/oracle/oradata挂在到了emptyDir: {}。曾尝试挂载至本地目录,有目录权限问题,修改成oracle用户权限也没有成功,待解决。
4. 启动会持续比较长的一段时间,通过log可以看到是建库过程,所以耗时较长。启动后https://nodeportip:30500/em/可访问。数据库通过31521端口进行维护。
● 4.3.2 Oracle 11g 数据导入 12c
Oracle 12c引入了cdb/pdb机制。简单理解的话cdb相当于之前的实例,pdb是在其之上的多个单独的可插拔数据库。所以,导入数据也有特殊要求,整体过程如下:
1. 1.使用oracle用户,利用exp工具从11g导出:略
2. 2.进入oracle12c容器,在12c中转换环境到默认pdb
3. sqlplus / as sysdba
4. alter session set container=orclpdb1;
5. 3.在12c中新建表空间、用户,要求表空间和用户名与之前一样
6. create tablespace YIJI_TABLESPACE datafile '/opt/oracle/oradata/CUPOC/ORCLPDB1/ORCLPDB1_users02.dbf' size 1000M;
7. create user yijitest identified by yijitest default tablespace YIJI_TABLESPACE;
8. 4.用户授权
9. grant connect to yijitest;
10.grant resource to yijitest;
11.GRANT UNLIMITED TABLESPACE TO yijitest;
12.grant create view to yijitest;
13.5.将导出的dmp文件cp至容器,再导入
14.imp yijitest/yijitest@orclpdb1 file=wajue.dmp
15.6.成功。注意:连接12c的应用的连接串如下:
16.jdbc:oracle:thin:@//127.0.0.1:1521/orclpdb1
17.(11g为jdbc:oracle:thin:@127.0.0.1:1521:CUPOC)
● 4.4 CAS镜像制作
镜像制作
Kubernetes可以通过服务名实现内部访问,将原有mysql的ip+端口替换为服务名。Mysql5.7要求在url后指定&useSSL=false字段
1. jdbc:mysql://das-mysql-mysqlnpc/ssoserver?characterEncoding=utf-8&useSSL=false
2. ${DOCKER_REGISTRY}/das/casCASPORTGATE:v1
使用dockerbuild命令打包并上传镜像
docker build -t ${DOCKER_REGISTRY}/das/cas:v1 .
docker push ${DOCKER_REGISTRY}/das/cas:v1
yaml配置文件
1. apiVersion: extensions/v1beta1
2. kind: Deployment
3. metadata:
4. name: das-cas-deployment
5. spec:
6. template:
7. metadata:
8. labels:
9. app: das-cas
10. spec:
11. containers:
12. - name: das-cas
13. image: ${DOCKER_REGISTRY}/das/cas:v2
14. command: ["/bin/sh","-c","echo \"${CLUSTER_NODE_IP} {sso.site.com}\">>/etc/hosts ;catalina.sh run"]
15.
16. ports:
17. - name: cashome
18. containerPort: 8080
19. - name: casgate
20. containerPort: 8443
1. kind: Service
2. apiVersion: v1
3. metadata:
4. name: das-cas-service
5. spec:
6. type: NodePort
7. ports:
8. - port: 8080
9. name: cashome
10. targetPort: 8080
11. nodePort: CASPORT
12. - port: 8443
13. name: casgate
14. targetPort: 8443
15. nodePort: CASPORTGATE
16. selector:
17. app: das-cas
● 4.5 Darwin 镜像制作
镜像制作
需要修改以下三个配置文件
1. /darwin/ROOT/WEB-INF/web.xml
2.
3.
4.
5.
6.
7. /darwin/ROOT/WEB-INF/classes/c3p0.properties
8.
9. druid.mysql.jdbcUrl=jdbc\:mysql\://das-mysql-mysqlnpc/darwin?useUnicode\=true&characterEncoding\=UTF8&zeroDateTimeBehavior\=convertToNull&useSSL=false
10.druid.mysql.user=darwin
11.druid.mysql.password=darwin
12.
13./darwin/ROOT/WEB-INF/classes/yiji.properties
14.ip=http://${CLUSTER_NODE_IP}:DARWINPORT
15.
使用dockerbuild命令打包并上传镜像
docker build -t ${DOCKER_REGISTRY}/das/darwinDARWINPORT:v1 .
docker push ${DOCKER_REGISTRY}/das/darwinDARWINPORT:v1
yaml配置文件
1. apiVersion: extensions/v1beta1
2. kind: Deployment
3. metadata:
4. name: das-darwin-deployment
5. spec:
6. template:
7. metadata:
8. labels:
9. app: das-darwin
10. spec:
11. containers:
12. - name: das-darwin
13. image: ${DOCKER_REGISTRY}/das/darwin:v4
14. #command: ["/bin/sh","-c","sed -i 's/10.1.131.12:28099/'$NODEPORT_IP'/' /opt/tomcat/webapps/ROOT/WEB-INF/web.xml;catalina.sh run"]
15. command: ["/bin/sh","-c","echo \"${CLUSTER_NODE_IP} {sso.site.com}\">>/etc/hosts ;catalina.sh run"]
16. env:
17. envFrom:
18. - configMapRef:
19. name: das-config
20. ports:
21. - name: darwinhome
22. containerPort: 8080
1. kind: Service
2. apiVersion: v1
3. metadata:
4. name: das-darwin-service
5. spec:
6. type: NodePort
7. ports:
8. - port: 8080
9. targetPort: 8080
10. nodePort: DARWINPORT
11. selector:
12. app: das-darwin
● 4.6 Guacamole 镜像制作
镜像制作
需要修改WEB-INF/web.xml配置文件,添加SSO服务器的跳转及鉴权URL,共三处
1. guacamole/guacamole-0.9.9/WEB-INF/web.xml
2.
3.
4.
5. ${DOCKER_REGISTRY}/das/guacamole:v1
使用dockerbuild命令打包并上传镜像
docker build -t ${DOCKER_REGISTRY}/tomcatoraclejdk:server .
docker push ${DOCKER_REGISTRY}/tomcatoraclejdk:server
yaml配置文件
1. apiVersion: extensions/v1beta1
2. kind: Deployment
3. metadata:
4. name: das-guacamole-deployment
5. spec:
6. template:
7. metadata:
8. labels:
9. app: das-guacamole
10. spec:
11.
12. containers:
13. - name: das-guacamole
14. image: ${DOCKER_REGISTRY}/das/guacamole:v2
15. command: ["/bin/sh","-c","echo \"${CLUSTER_NODE_IP} {sso.site.com}\">>/etc/hosts ;catalina.sh run"]
16. ports:
17. - name: guacamolehome
18. containerPort: 8080
1. kind: Service
2. apiVersion: v1
3. metadata:
4. name: das-guacamole-service
5. spec:
6. type: NodePort
7. ports:
8. - port: 8080
9. name: guacamolehome
10. targetPort: 8080
11. nodePort: 31015
12. selector:
13. app: das-guacamole
● 4.7 mamp镜像制作
镜像制作
1. /root/docker/mamp/mamp/WEB-INF/cfg.db.dev.properties
2. database.url=jdbc:oracle:thin:@//${CLUSTER_NODE_IP}:31521/orclpdb1
3. database.username=yijitest
4. database.password=yijitest
5. /root/docker/mamp/mamp/WEB-INF/web.xml
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19./root/docker/mamp/mamp/WEB-INF/classes/yiji.properties
20.host=http://${CLUSTER_NODE_IP}:MAMP
使用dockerbuild命令打包并上传镜像
docker build -t ${DOCKER_REGISTRY}/tomcatoraclejdk:server .
docker push ${DOCKER_REGISTRY}/tomcatoraclejdk:server
yaml配置文件
1. apiVersion: extensions/v1beta1
2. kind: Deployment
3. metadata:
4. name: das-mamp-deployment
5. spec:
6. template:
7. metadata:
8. labels:
9. app: das-mamp
10. spec:
11. containers:
12. - name: das-mamp
13. image: ${DOCKER_REGISTRY}/das/mamp:v4
14.
15. command: ["/bin/sh","-c","echo \"${CLUSTER_NODE_IP} {sso.site.com}\">>/etc/hosts ;catalina.sh run"]
16. ports:
17. - name: mamphome
18. containerPort: 8080
1. kind: Service
2. apiVersion: v1
3. metadata:
4. name: das-mamp-service
5. spec:
6. type: NodePort
7. ports:
8. - port: 8080
9. name: mamphome
10. targetPort: 8080
11. nodePort: MAMP
12. selector:
13. app: das-mamp
● 4.8 wodp镜像制作
镜像制作
本工程为标准Maven项目,配置信息可以直接从pom.xml修改
1. 修改pom.xml文件
2.
3.
4.
5.
6.
7.
8.
9. 达尔文组件地址-->
10.
11. 数据挖掘组件mamp地址-->
12.
13. 组件地址-->
14.
15.
16.
17.
18.
19.
20.
21.
使用dockerbuild命令打包并上传项目
docker build -t ${DOCKER_REGISTRY}/tomcatoraclejdk:server .
docker push ${DOCKER_REGISTRY}/tomcatoraclejdk:server
yaml配置文件
1. apiVersion: extensions/v1beta1
2. kind: Deployment
3. metadata:
4. name: das-wodp-deployment
5. spec:
6. template:
7. metadata:
8. labels:
9. app: das-wodp
10. spec:
11. containers:
12. - name: das-wodp
13. image: ${DOCKER_REGISTRY}/das/wodp:v2
14. #command: ["/bin/sh","-c","sed -i 's/10.1.131.12:28099/'$NODEPORT_IP'/' /opt/tomcat/webapps/ROOT/WEB-INF/web.xml;catalina.sh run"]
15. command: ["/bin/sh","-c","echo \"${CLUSTER_NODE_IP} {sso.site.com}\">>/etc/hosts ;catalina.sh run"]
16. env:
17.
18. envFrom:
19. - configMapRef:
20. name: das-config
21. ports:
22. - name: wodphome
23. containerPort: 8080
24.kind: Service
25.apiVersion: v1
26.metadata:
27. name: das-wodp-service
28.spec:
29. type: NodePort
30. ports:
31. - port: 8080
32. targetPort: 8080
33. nodePort: WODP
34. selector:
35. app: das-wodp
持续集成(Continuousintegration)简称CI,是一种软件开发的实践,可以让团队在持续集成的基础上收到反馈并加以改进,不必等到开发的后期才寻找和修复缺陷。当然要明白的是持续集成环境的搭建也不是一劳永逸的,随着软件项目复杂度的增加,持续集成的环境同样要加以维护以确保集成环境的可靠性。
我们的项目选择了Jenkins+Gitlab的持续集成方案。
Jenins是现在非常流行的持续集成CI服务器,Jenkins易于安装,不需要数据库的支持,直接通过Web界面进行配置,支持分布式构建,具有丰富的插件,这些都是Jenkins相比其他持续集成服务器的优势所在。
持续构建与发布流程方便开发人员部署、测试整个项目,节省了从代码到上线的时间。
DAS平台容器化改造,将DAS平台及组件从虚拟机迁移到kubernetes容器平台上,同时实现了代码的持续构建与发布流程。
流量增加时,通过调整副本数,横向扩充容器的实例个数,使用负载均衡来进行流量的分导,保证平台的稳定运行。
- END -
更多干货请关注