本文是经过yum方式安装Kubernetes,并部署tomcat+mysql实现Jave Web应用。此应用是JSP页面经过JDBC访问Mysql数据库,只要程序正确链接到数据库上,就会自动完成对应的Table的建立与初始化数据的准备工做。当咱们经过浏览器访问此应用时,就会显示一个表格的页面,数据则来自数据库。
此应用须要启动两个容器:Web App容器和MySQL容器,而且Web App容器须要访问MySQL容器。如今咱们就来看看经过Kubernetes是如何实现Java Web应用的。
在继续阅读以前,咱们须要对Kubernetes有一个基本的认识,须要了解它的原理、核心架构、核心组件和对象、以及各组件之间的联系等基础概念,能够参考个人上一篇博文《初识Kubernetes(K8s):理论基础》,https://blog.51cto.com/andyxu/2308937
系统环境
操做系统:Centos 7.5 64位
IP地址:192.168.2.238node
一、关闭Centos自带的防火墙服务
注:Kubernetes集群之间会有大量的网络通讯,在一个安全的内部网络环境中建议关闭防火墙服务python
[root@andyxu-test ~]# systemctl disable firewalld [root@andyxu-test ~]# systemctl stop firewalld
二、安装etcd和Kubernetes软件(会自动安装Docker软件)mysql
[root@andyxu-test ~]# yum -y install etcd kubernetes
注:yum方式安装的kubernetes的版本是1.5.2
三、生成rhsm证书文件linux
[root@andyxu-test ~]# wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm [root@andyxu-test ~]# rpm2cpio python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm | cpio -iv --to-stdout ./etc/rhsm/ca/redhat-uep.pem | tee /etc/rhsm/ca/redhat-uep.pem
注:建立容器时须要从redhat站点下载pod-infrastructure:latest镜像,若是没有此证书文件会报错,Pod会一直显示ContainerCreating状态。
四、修改docker和kube-apiserver的配置文件
docker配置文件为/etc/sysconfig/docker,将OPTIONS的内容修改成web
OPTIONS='--selinux-enabled=false --insecure-registry gcr.io'
kube-apiserver配置文件为/etc/kubernetes/apiserver,修改KUBE_ADMISSION_CONTROL的内容,将--admission-control参数中的ServiceAccount删除。sql
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"
五、按顺序启动全部服务docker
[root@andyxu-test ~]# systemctl start etcd [root@andyxu-test ~]# systemctl start docker [root@andyxu-test ~]# systemctl start kube-apiserver [root@andyxu-test ~]# systemctl start kube-controller-manager [root@andyxu-test ~]# systemctl start kube-scheduler [root@andyxu-test ~]# systemctl start kubelet [root@andyxu-test ~]# systemctl start kube-proxy
一、建立mysql的Deployment定义文件
mysql-dep.yaml文件内容以下:数据库
apiVersion: extensions/v1beta1 #apiserver的版本 kind: Deployment #副本控制器deployment,管理pod和RS metadata: name: mysql #deployment的名称,全局惟一 spec: replicas: 1 #Pod副本期待数量 selector: matchLabels: #定义RS的标签 app: mysql #符合目标的Pod拥有此标签 strategy: #定义升级的策略 type: RollingUpdate #滚动升级,逐步替换的策略 template: #根据此模板建立Pod的副本(实例) metadata: labels: app: mysql #Pod副本的标签,对应RS的Selector spec: containers: #Pod里容器的定义部分 - name: mysql #容器的名称 image: mysql:5.7 #容器对应的docker镜像 volumeMounts: #容器内挂载点的定义部分 - name: time-zone #容器内挂载点名称 mountPath: /etc/localtime #容器内挂载点路径,能够是文件或目录 - name: mysql-data mountPath: /var/lib/mysql #容器内mysql的数据目录 - name: mysql-logs mountPath: /var/log/mysql #容器内mysql的日志目录 ports: - containerPort: 3306 #容器暴露的端口号 env: #写入到容器内的环境容量 - name: MYSQL_ROOT_PASSWORD #定义了一个mysql的root密码的变量 value: "123456" volumes: #本地须要挂载到容器里的数据卷定义部分 - name: time-zone #数据卷名称,须要与容器内挂载点名称一致 hostPath: path: /etc/localtime #挂载到容器里的路径,将localtime文件挂载到容器里,可以让容器使用本地的时区 - name: mysql-data hostPath: path: /data/mysql/data #本地存放mysql数据的目录 - name: mysql-logs hostPath: path: /data/mysql/logs #本地存入mysql日志的目录
二、建立deployment、RS、Pod和容器
建立过程须要先下载镜像,时间会比较久,可喝杯茶撩撩旁边的妹子,哈哈,请耐心等待centos
[root@andyxu-test ~]# kubectl create -f mysql-dep.yaml deployment "mysql" created
三、查看建立好的deployment运行状况api
[root@andyxu-test ~]# kubectl get deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE mysql 1 1 1 1 8s
注:都是1表示运行正常
四、查看ReplicaSet(RS)的运行状况
[root@andyxu-test ~]# kubectl get rs NAME DESIRED CURRENT READY AGE mysql-3238461207 1 1 1 6m
注:都是1表示运行正常
五、查看Pod的运行状况
[root@andyxu-test ~]# kubectl get pod NAME READY STATUS RESTARTS AGE mysql-3238461207-vvwt8 1/1 Running 0 56m
注:READY的值是1/1,而且STATUS的值是Running,表示运行正常
因为Pod的建立须要花费一些时间,在尚未建立好容器时,STATUS的状态会是ContainerCreating,表示正在建立容器,这时只须要等待。Pod建立好后,STATUS的状态会是Running,这时能够经过docker ps命令查看容器运行的状况。
六、查看容器的运行状况
[root@andyxu-test ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5252cd76009a mysql:5.7 "docker-entrypoint..." 55 minutes ago Up 55 minutes k8s_mysql.23f88726_mysql-3238461207-vvwt8_default_72d7bff7-d81c-11e8-a729-000c29dabb02_6b15dcfc f026e79ddad9 registry.access.redhat.com/rhel7/pod-infrastructure:latest "/usr/bin/pod" 55 minutes ago Up 55 minutes k8s_POD.1d520ba5_mysql-3238461207-vvwt8_default_72d7bff7-d81c-11e8-a729-000c29dabb02_668a091e
七、查看Pod里容器的时间,检查时间是否与本地时间一致
[root@andyxu-test ~]# kubectl exec mysql-3238461207-vvwt8 date Thu Oct 25 15:06:15 CST 2018
注:exec后面跟pod的名称
八、建立mysql的service定义文件
mysql-svc.yaml文件内容以下:
apiVersion: v1 kind: Service #表示Kubernetes Service metadata: name: mysql #Service的名称 spec: ports: - port: 3306 #Service提供服务的端口号 selector: app: mysql #Service对应的Pod的标签
九、建立Service
[root@andyxu-test ~]# kubectl create -f mysql-svc.yaml service "mysql" created
十、查看Service的运行状况
[root@andyxu-test ~]# kubectl get svc NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes 10.254.0.1 <none> 443/TCP 4h mysql 10.254.144.64 <none> 3306/TCP 57s
kubernetes会给Service分配一个Cluster IP,这是个虚拟IP地址,此后集群中的其余新建立的Pod就能够经过此Cluster IP+端口号的方式来链接和访问mysql服务了。
一、建立tomcat的Deployment定义文件
myweb-dep.yaml文件的内容以下:
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: myweb spec: replicas: 1 selector: matchLabels: app: myweb strategy: type: RollingUpdate template: metadata: labels: app: myweb spec: containers: - name: myweb image: kubeguide/tomcat-app:v1 volumeMounts: - name: time-zone mountPath: /etc/localtime - name: tomcat-logs mountPath: /usr/local/tomcat/logs ports: - containerPort: 8080 env: - name: MYSQL_SERVICE_HOST value: '10.254.144.64' #此处为mysql服务的Cluster IP - name: MYSQL_SERVICE_PORT value: '3306' volumes: - name: time-zone hostPath: path: /etc/localtime - name: tomcat-logs hostPath: path: /data/tomcat/logs
二、建立tomcat的deployment、RS、Pod和容器
[root@andyxu-test ~]# kubectl create -f myweb-dep.yaml deployment "myweb" created
建立过程比较久,请耐心等待,pod的STATUS状态为Running时表示建立成功。
三、建立tomcat的Service定义文件
myweb-svc.yaml文件的内容以下:
apiVersion: v1 kind: Service metadata: name: myweb spec: type: NodePort ports: - port: 8080 nodePort: 30001 selector: app: myweb
此Service开启了NodePort方式的外网访问模式,端口为30001,此端口会映射到tomcat容器的8080端口上。
四、建立Service
[root@andyxu-test ~]# kubectl create -f myweb-svc.yaml service "myweb" created
五、查看Service的运行状况
[root@andyxu-test ~]# kubectl get svc NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes 10.254.0.1 <none> 443/TCP 5h mysql 10.254.144.64 <none> 3306/TCP 24m myweb 10.254.246.56 <nodes> 8080:30001/TCP 39s
六、可以使用curl命令测试tomcat服务是否能正常访问
[root@andyxu-test ~]# curl http://192.168.2.238:30001
一、若是30001端口不通的话,从新启动、关闭firewalld防火墙
[root@andyxu-test ~]# systemctl start firewalld [root@andyxu-test ~]# systemctl stop firewalld
注:由于kubernetes会在iptables里添加一些策略,须要再从新开启关闭防火墙才会关闭掉这些策略。
二、经过浏览器访问http://192.168.2.238:30001/demo/
点击“Add...”,添加一条记录并提交
提交之后,数据就被写入mysql数据库里了。
三、登录mysql数据库验证
[root@andyxu-test ~]# docker exec -it 5252cd76009a /bin/bash root@mysql-3238461207-vvwt8:/# mysql -uroot -p123456 mysql> use HPE_APP mysql> select * from T_USERS;
咱们能够继续研究下这个例子,好比:
此例子来源于《Kubernetes权威指南(第2版)》,我作了一些修改,以及报错的处理,而且使用了Deployment来建立。