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

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

此应用需要启动两个容器: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集群之间会有大量的网络通信,在一个安全的内部网络环境中建议关闭防火墙服务

[[email protected] ~]# systemctl disable firewalld
[[email protected] ~]# systemctl stop firewalld

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

[[email protected] ~]# yum -y install etcd kubernetes

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

3、生成rhsm证书文件

[[email protected] ~]# wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm
[[email protected] ~]# 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、按顺序启动所有服务

[[email protected] ~]# systemctl start etcd
[[email protected] ~]# systemctl start docker
[[email protected] ~]# systemctl start kube-apiserver
[[email protected] ~]# systemctl start kube-controller-manager
[[email protected] ~]# systemctl start kube-scheduler
[[email protected] ~]# systemctl start kubelet
[[email protected] ~]# 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和容器
创建过程需要先下载镜像,时间会比较久,可喝杯茶撩撩旁边的妹子,哈哈,请耐心等待

[[email protected] ~]# kubectl create -f mysql-dep.yaml
deployment "mysql" created

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

[[email protected] ~]# kubectl get deployment
NAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
mysql     1         1         1            1           8s

注:都是1表示运行正常
4、查看ReplicaSet(RS)的运行情况

[[email protected] ~]# kubectl get rs
NAME               DESIRED   CURRENT   READY     AGE
mysql-3238461207   1         1         1         6m

注:都是1表示运行正常
5、查看Pod的运行情况

[[email protected] ~]# 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、查看容器的运行情况

[[email protected] ~]# 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里容器的时间,检查时间是否与本地时间一致

[[email protected] ~]# 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

[[email protected] ~]# kubectl create -f mysql-svc.yaml
service "mysql" created

10、查看Service的运行情况

[[email protected] ~]# 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和容器

[[email protected] ~]# 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

[[email protected] ~]# kubectl create -f myweb-svc.yaml
service "myweb" created

5、查看Service的运行情况

[[email protected] ~]# 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服务是否能正常访问

[[email protected] ~]# curl http://192.168.2.238:30001

四、通过浏览器访问网页

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

[[email protected] ~]# systemctl start firewalld
[[email protected] ~]# systemctl stop firewalld

注:因为kubernetes会在iptables里添加一些策略,需要再重新开启关闭防火墙才会关闭掉这些策略。
2、通过浏览器访问http://192.168.2.238:30001/demo/

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

提交以后,数据就被写入mysql数据库里了。
3、登陆mysql数据库验证

[[email protected] ~]# docker exec -it 5252cd76009a /bin/bash
[email protected]:/# mysql -uroot -p123456
mysql> use HPE_APP
mysql> select * from T_USERS;


我们可以继续研究下这个例子,比如:

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

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

原文地址:http://blog.51cto.com/andyxu/2309187

时间: 2024-11-05 05:02:25

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

Ubuntu 18.04 环境下 kubernetes v1.16.2 单机部署说明

一.安装环境 本次部署使用阿里云ECS 操作系统: Ubuntu  18.04 64位 实例规格: ecs.c6.large 2U4G 二.kubernetes 版本 k8s.gcr.io/kube-apiserver:v1.16.2 k8s.gcr.io/kube-controller-manager:v1.16.2 k8s.gcr.io/kube-scheduler:v1.16.2 k8s.gcr.io/kube-proxy:v1.16.2 k8s.gcr.io/pause:3.1 k8s.

将一个应用部署到java web应用上面,报下面的错误!

java.lang.ClassCastException: org.apache.xerces.parsers.XML11Configuration cannot be cast to org.apache.xerces.xni.parser.XMLParserConfiguration at org.apache.axis.AxisFault.makeFault(AxisFault.java:101) at org.apache.axis.client.AxisClient.invoke(Ax

IDEA创建一个Spring MVC 框架Java Web项目,Gradle构建

注:此篇有些细节没写出,此文主要写重要的环节和需要注意的地方,轻喷 新建项目 选择Gradle , 勾选java 和 web.之后就是设定项目路径和名称,这里就不啰嗦了. build.gradle文件下导入所需要的包,刷新一下. 1 group 'com.benjious.createTest' 2 version '1.0-SNAPSHOT' 3 4 apply plugin: 'java' 5 apply plugin: 'war' 6 7 sourceCompatibility = 1.8

在Azure Cloud Service中部署Java Web App(1)

Microsoft Azure是一个开放的,灵活的云平台,除了对自家的.Net平台有良好的支持外,对于各种开源的软件,语言,工具,框架都有着良好的支持,比如Java,Php,Python等等,你可以使用自己喜欢的语言开发任何应用部署在Azure的web site或者云服务中. Azure的云服务是Azure的一个PAAS平台,同样支持多种不同的语言和框架,并且可以基于多种不同的阈值如CPU负载,队列,定时等等实现Auto scaling等高级功能,如下图所示: 本文简单介绍如何使用Azure所提

纯手工搭建kubernetes(k8s)1.9集群 - (二)核心模块部署

1. 部署ETCD(主节点) 1.1 简介 ??kubernetes需要存储很多东西,像它本身的节点信息,组件信息,还有通过kubernetes运行的pod,deployment,service等等.都需要持久化.etcd就是它的数据中心.生产环境中为了保证数据中心的高可用和数据的一致性,一般会部署最少三个节点.我们这里以学习为主就只在主节点部署一个实例. 如果你的环境已经有了etcd服务(不管是单点还是集群),可以忽略这一步.前提是你在生成配置的时候填写了自己的etcd endpoint哦~

初识Kubernetes(K8s):理论基础

Kubernetes是什么?Kubernetes,简称K8s,是用8代替8个字符"ubernete"而成的缩写.Kubernetes是Google开源的一个容器编排引擎,同时也是一个开源的容器集群管理系统,可以实现容器应用的自动化部署.自动扩缩容.监控和维护等功能. 一.Kubernetes架构 Kubernetes最初源于谷歌内部的Borg,提供了面向应用的容器集群部署和管理系统.Kubernetes的目标旨在消除编排物理/虚拟计算.网络和存储基础设施的负担,并使应用程序运营商和开发

K8s(Kubernetes)简介及安装部署

前言: k8s是Kubernetes的简称,因为K和S之间有8个字母,所以才会被称为k8s. k8s最初是在Google公司内部使用了10多年的技术,它的前身是叫做Borg(博格),直到2015年才被Google公司捐赠为开源项目. 如果之前我们有接触过OpenStack,那么应该知道管理VM虚拟机资源可以用OpenStack.那么管理容器所对应的开源平台是什么呢?k8s就是其中之一,在k8s之前也有很多容器管理平台,有docker自身的docker swarm,也有apache推出的Mesos

(二)搭建一个完成的Kubernetes/K8s集群v.1.16

单节点集群多节点集群 注意node通过连接loadbalancer 转发到mateter 的apiserver来进行运作的 集群规划: 角色 ip 组件 K8S-master1 192.168.0.101 kube-apiserver kube-controller-manager kube-scheduleretcd K8S-master2 192.168.0.102 kube-apiserver kube-controller-manager kube-scheduleretcd K8S-n

Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列之部署master/node节点组件(四)

0.前言 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 1.部署master组件 master 服务器的组件有:kube-apiserver.kube-controller-manager.kube-scheduler 因此需要下载k8s master,下载地址:https://github.com/kubernetes/kubernetes/blob/master/CHANGE