初识Kubernetes(K8s):从一个单机部署实现Java Web应用例子开始

栏目: 编程工具 · 发布时间: 6年前

内容简介:1、关闭Centos自带的防火墙服务

本文是通过yum方式安装Kubernetes,并部署tomcat+mysql实现Jave Web应用。此应用是JSP页面通过JDBC访问 Mysql 数据库,只要程序正确连接到数据库上,就会自动完成对应的Table的创建与初始化数据的准备工作。当我们通过浏览器访问此应用时,就会显示一个表格的页面,数据则来自数据库。

初识Kubernetes(K8s):从一个单机部署实现Java Web应用例子开始

此应用需要启动两个容器:Web App容器和MySQL容器,并且Web App容器需要访问MySQL容器。现在我们就来看看通过Kubernetes是如何实现Java Web应用的。

在继续阅读之前,我们需要对Kubernetes有一个基本的认识,需要了解它的原理、核心架构、核心组件和对象、以及各组件之间的联系等基础概念,可以参考我的上一篇博文《初识Kubernetes(K8s):理论基础》, http://blog.51cto.com/andyxu/2308937

系统环境

操作系统:Centos 7.5 64位

IP地址:192.168.2.238

一、安装部署Kubernetes(K8s)

1、关闭Centos自带的防火墙服务

注:Kubernetes集群之间会有大量的网络通信,在一个安全的内部网络环境中建议关闭防火墙服务

[root@andyxu-test ~]# systemctl disable firewalld
[root@andyxu-test ~]# systemctl stop firewalld

2、安装etcd和Kubernetes软件(会自动安装 Docker 软件)

[root@andyxu-test ~]# yum -y install etcd kubernetes

注:yum方式安装的kubernetes的版本是1.5.2

初识Kubernetes(K8s):从一个单机部署实现Java Web应用例子开始

3、生成rhsm证书文件

[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状态。

4、修改docker和kube-apiserver的配置文件

docker配置文件为/etc/sysconfig/docker,将OPTIONS的内容修改为

OPTIONS='--selinux-enabled=false --insecure-registry gcr.io'

kube-apiserver配置文件为/etc/kubernetes/apiserver,修改KUBE_ADMISSION_CONTROL的内容,将--admission-control参数中的ServiceAccount删除。

KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"

5、按顺序启动所有服务

[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容器

1、创建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日志的目录
  • apiVersion:定义使用apiserver的哪个版本,可通过kubectl api-versions命令查看apiserver有哪些版本;
  • kind:用来表明此资源对象的类型,比如这里的值为“Deployment”,表示这是一个deployment;
  • spec:RS相关属性定义,spec.selector是RS的Pod标签(Label)选择器,即监控和管理拥有这些标签的Pod实例,确保当前集群上始终有且仅有replicas个Pod实例在运行,这里设置replicas=1表示只能运行一个Mysql Pod实例。
  • spec.strategy:定义Pod的升级方案,Recreate表示删除所有已存在的Pod,重新创建新的;RollingUpdate表示滚动升级,逐步替换的策略,滚动升级时支持更多的附加参数,例如设置最大不可用Pod数量,最小升级间隔时间等等。
  • spec.template:当集群中运行的Pod数量小于replicas时,RS会根据spec.template中定义的Pod模板来生成一个新的Pod实例,spec.template.metadata.labels指定了该Pod的标签,需要特别注意的是,这里的labels必须匹配之前的spec.selector。
  • spec.template.spec.containers:容器的定义部分,包括容器的名称、使用的docker镜像、挂载数据卷、服务的端口号、变量等内容。
  • spec.template.spec.volumes:需要挂载到容器里的本地数据卷的定义部分,数据卷的名称要与容器内挂载点的名称一致,path定义本地的数据卷路径。

2、创建deployment、RS、Pod和容器

创建过程需要先下载镜像,时间会比较久,可喝杯茶撩撩旁边的妹子,哈哈,请耐心等待

[root@andyxu-test ~]# kubectl create -f mysql-dep.yaml
deployment "mysql" created

3、查看创建好的deployment运行情况

[root@andyxu-test ~]# kubectl get deployment 
NAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
mysql     1         1         1            1           8s

注:都是1表示运行正常

4、查看ReplicaSet(RS)的运行情况

[root@andyxu-test ~]# kubectl get rs
NAME               DESIRED   CURRENT   READY     AGE
mysql-3238461207   1         1         1         6m

注:都是1表示运行正常

5、查看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命令查看容器运行的情况。

6、查看容器的运行情况

[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

7、查看Pod里容器的时间,检查时间是否与本地时间一致

[root@andyxu-test ~]# kubectl exec mysql-3238461207-vvwt8 date
Thu Oct 25 15:06:15 CST 2018

注:exec后面跟pod的名称

8、创建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的标签
  • metadata.name:Service的服务名称
  • spec.ports:Service提供的服务端口号,对应容器的服务端口号
  • spec.selector:确定哪些Pod副本(实例)对应到此Service

9、创建Service

[root@andyxu-test ~]# kubectl create -f mysql-svc.yaml 
service "mysql" created

10、查看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容器

1、创建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

2、创建tomcat的deployment、RS、Pod和容器

[root@andyxu-test ~]# kubectl create -f myweb-dep.yaml 
deployment "myweb" created

创建过程比较久,请耐心等待,pod的STATUS状态为Running时表示创建成功。

3、创建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端口上。

4、创建Service

[root@andyxu-test ~]# kubectl create -f myweb-svc.yaml 
service "myweb" created

5、查看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

6、可使用curl命令测试tomcat服务是否能正常访问

[root@andyxu-test ~]# curl http://192.168.2.238:30001

四、通过浏览器访问网页

1、如果30001端口不通的话,重新启动、关闭firewalld防火墙

[root@andyxu-test ~]# systemctl start firewalld
[root@andyxu-test ~]# systemctl stop firewalld

注:因为kubernetes会在iptables里添加一些策略,需要再重新开启关闭防火墙才会关闭掉这些策略。

2、通过浏览器访问http://192.168.2.238:30001/demo/

初识Kubernetes(K8s):从一个单机部署实现Java Web应用例子开始

点击“Add...”,添加一条记录并提交

初识Kubernetes(K8s):从一个单机部署实现Java Web应用例子开始

提交以后,数据就被写入mysql数据库里了。

3、登陆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(K8s):从一个单机部署实现Java Web应用例子开始 我们可以继续研究下这个例子,比如:

  • 研究RS、Service等文件的格式。
  • 熟悉kubectl的子命令。
  • 手工停止某个Service对应的容器,观察有什么现象发生。
  • 修改Deployment文件,改变pod副本的数量,重新创建,观察结果。

此例子来源于《Kubernetes权威指南(第2版)》,我做了一些修改,以及报错的处理,并且使用了Deployment来创建。


以上所述就是小编给大家介绍的《初识Kubernetes(K8s):从一个单机部署实现Java Web应用例子开始》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Ordering Disorder

Ordering Disorder

Khoi Vinh / New Riders Press / 2010-12-03 / USD 29.99

The grid has long been an invaluable tool for creating order out of chaos for designers of all kinds—from city planners to architects to typesetters and graphic artists. In recent years, web designers......一起来看看 《Ordering Disorder》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具