掌握kubernetes中应用的部署及综合操作方法。

设备名称 软件环境(镜像) 硬件环境
主机 Kubernetes 1.13.2桌面版 CPU:2核 内存:4G 磁盘:20G

原理:

一、使用Kubernetes部署应用的意义
Kubernetes是一个全新的基于容器技术的分布式架构方案。Kubernetes作为容器集群管理系统,在Docker技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性。Kubernetes是一个完备的分布式系统支撑平台,具有完备的集群管理能力,具体包括多层次的安全防护能力、多租户应用支撑能力、透明的服务注册和发现能力、內建智能负载均衡能力、强大的故障发现和自我修复能力、服务滚动升级和在线扩容能力、可扩展的资源自动调度能力以及多粒度的资源配额管理能力。同时Kubernetes提供了完善的管理工具,涵盖了包括开发、部署测试、运维监控在内的各个环节。使用Kubernetes部署应用可以提高应用的可靠性、并发性和可扩展性,并实现自动化部署、运维监控、服务滚动升级、负载均衡、数据库高可用集群、日志统一管理等功能。

二、应用实例架构
基于Kubernetes部署Tomcat+Mysql的系统架构如下图所示:
在这里插入图片描述

1、Master节点
Master是Kubernetes Cluster的大脑,运行的Daemon服务包括:kube-apiserver、kube-scheduler、kube-controller-manager、etcd和Pod网络(例如flannel)。

API Server(kube-apiserver)
API Server提供HTTP/HTTPS RESTful API,即Kubernetes API。API Server是Kubernetes Cluster的前端接口,各种客户端工具(CLI或UI)以及Kubernetes其他组件可以通过它管理Cluster的各种资源。
Scheduler(kube-scheduler)
Scheduler负责决定将Pod放在哪个Node上运行。Scheduler在调度时会充分考虑Cluster的拓扑结构,当前各个节点的负载,以及应用对高可用、性能、数据亲和性的需求。
Controller Manager(kube-controller-manager)
Controller Manager负责管理Cluster各种资源,保证资源处于预期的状态。Controller Manager 由多种controller组成,包括replication controller、endpoints controller、namespace controller、serviceaccounts controller等。不同的controller管理不同的资源。例如replication controller管理Deployment、StatefulSet、DaemonSet的生命周期,namespace controller管理Namespace资源。
etcd
etcd负责保存 Kubernetes Cluster的配置信息和各种资源的状态信息。当数据发生变化时,etcd会快速地通知Kubernetes相关组件。
Pod网络
Pod要能够相互通信,Kubernetes Cluster必须部署Pod网络,flannel是其中一个可选方案。
2、Node节点
Node是Pod运行的地方,Kubernetes支持Docker、rkt等容器Runtime。Node上运行的Kubernetes组件有kubelet、kube-proxy和Pod网络(例如flannel)

kubelet
kubelet是Node的agent,当Scheduler确定在某个Node上运行Pod后,会将Pod的具体配置信息(image、volume等)发送给该节点的kubelet,kubelet根据这些信息创建和运行容器,并向Master报告运行状态。
kube-proxy
service在逻辑上代表了后端的多个Pod,外界通过service访问Pod。service接收到的请求是如何转发到Pod的呢?这就是kube-proxy要完成的工作。每个Node都会运行kube-proxy服务,它负责将访问service的TCP/UPD数据流转发到后端的容器。如果有多个副本,kube-proxy可以实现负载均衡。
Pod网络
Pod要能够相互通信,Kubernetes Cluster必须部署Pod网络,flannel是其中一个可选方案。
本实验将部署一个基于Tomcat的Java Web应用,此应用是JSP页面通过JDBC访问Mysql数据库,并展示在页面上。为了演示和简化,只要程序正确连接到了数据库上,就会自动完成对应table的创建与初始化数据的准备工作。通过浏览器访问此应用时,会显示一个表格页面,表格数据来自Mysql数据库。Tomcat服务器和Mysql采用分离部署方式,分别放到不同的Pod中。

三、Tomcat
Tomcat是由Apache软件基金会下属的Jakarta项目开发的一个开源的Servlet容器,按照Sun Microsystems提供的技术规范,使用JAVA语言编写。实现了对Servlet和JavaServer Page(JSP)的支持,并提供了作为Web服务器的一些特有功能,如Tomcat管理和控制平台、安全局管理和Tomcat阀等。由于Tomcat本身也内含了一个HTTP服务器,它也可以被视作一个单独的Web服务器。但是,不能将Tomcat和Apache Web服务器混淆,Apache Web Server是一个用C语言实现的HTTP web server;这两个HTTP web server不是捆绑在一起的。Apache Tomcat包含了一个配置管理工具,也可以通过编辑XML格式的配置文件来进行配置。因为Tomcat技术先进、性能稳定以及免费使用,因而深受Java爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的轻量级Web应用服务器。Tomcat不仅可以用于处理动态资源,也能处理静态资源,而Apache只能处理静态资源。Tomcat服务器接收客户请求并作出响应过程如下:
在这里插入图片描述

1、客户端(一般是浏览器)访问Web服务器,发出HTTP请求;
2、Web服务器接收到请求之后传递给Servlet容器;
3、Servlet容器加载Servlet,产生Servlet实例后,向其传递表示请求和响应的对象;
4、Servlet实例使用请求对象得到客户端的请求信息,然后进行相应的处理;
5、Servlet实例将处理结果通过响应对象发送回客户端,容器负责确保响应正确送出,同时将控制返回给Web服务器。

四、Mysql
数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它产生于距今六十多年前,随着信息技术和应用市场的发展,特别是二十世纪九十年代以后,数据管理不再仅仅是简单的存储和管理数据,而转变成数据、数据关系以及数据处理为一体的管理系统。数据库有很多种类型,从最简单的存储各种数据的表格到能够进行海量数据存储的大型数据库系统都在各个方面得到了广泛的应用。主流的数据库有sqlserver,Mysql,Oracle、SQLite、Access、MS SQL Server等,本实验使用的是Mysql。Mysql是一种开放源代码的关系型数据库管理系统(RDBMS),Mysql数据库系统使用最常用的数据库管理语言–结构化查询语言(SQL)进行数据库管理。在WEB应用方面Mysql是最好的RDBMS (Relational Database Management System,关系数据库管理系统)之一。

步骤

一、实验环境检查
步骤1 以root用户登录主机,执行命令ifconfig ens3查看主机的IP地址,如下所示。
在这里插入图片描述

步骤2 执行命令source start.sh启动kubernets。

二、部署Mysql
步骤1 执行命令vim mysql.yml创建文件mysql.yml。mysql.yml的内容为:

apiVersion: extensions/v1beta1 # apiserver的版本
kind: Deployment # kind指明此资源对象的类型
metadata:
name: mysql # 元数据,此资源对象的名称,全局唯一
spec:
replicas: 1 # Pod 副本期待的数量
template: # 定义创建 Pod 实例的模板
metadata:
labels:
app: mysql # Pod的label,对应上面rc的selector
spec:
containers: # 定义 Pod 中的容器
- name: mysql # 容器名称
image: mysql:5.6 # 使用的 docker image
imagePullPolicy: IfNotPresent
ports:
- containerPort: 3306 # 容器暴露的端口号
env: # 注入到容器内的环境变量
- name: MYSQL_ROOT_PASSWORD #注入了一个name为MYSQL_ROOT_PASSWORD的环境变量,给mysql数据库设置密码
value: ‘123456’
步骤2 执行命令kubectl create -f mysql.yml部署应用。

步骤3 执行命令kubectl get deployments -o wide查看mysql的状态,如下所示应用部署成功。

步骤4 执行命令kubectl get pods -o wide查看pod的状态。

步骤5 执行命令vim mysql-svc.yml创建文件mysql-svc.yml,mysql-svc.yml的内容为:

apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
type: NodePort
ports:
- port: 3306
selector:
app: mysql
步骤6 执行命令kubectl create -f mysql-svc.yml创建Service。

步骤7 执行命令kubectl get services查看创建的service。

kubernetes会给Service分配一个Cluster IP,这是个虚拟IP地址,此后集群中的其他新创建的Pod就可以通过此Cluster IP+端口号的方式来连接和访问Mysql服务。
步骤8 通过命令kubectl describe service mysql查看service与Pod的对应关系。

三、部署Tomcat应用
步骤1 执行命令vim myweb.yml创建文件myweb.yml。myweb.yml的内容为:

apiVersion: extensions/v1beta1 # 描述RC对象的版本是v1
kind: Deployment # 声明RC对象
metadata: # metadata中的是对此RC对象描述信息
name: myweb # 此RC对象在default命名空间中名为myweb
spec: # spec中是对RC对象的具体描述
replicas: 2 # 创建2个副本
template: # 描述创建的pod的模版
metadata: # 对pod模版描述的元数据
labels: # 给以下的东西打上标签,以让selector来选择
app: myweb # 给pod模版打上app: myweb这样的标签
spec: # 对pod模版的具体描述
containers: # 以下是要放入pod模版中的容器
- name: myweb # 容器名称
image: kubeguide/tomcat-app:v1 # 选择镜像
imagePullPolicy: IfNotPresent
ports: # 容器端口号
- containerPort: 8080
env: # 给该容器设置环境变量,将mysql与tomcat连接
- name: GET_HOSTS_FROM
value: dns
- name: MYSQL_SERVICE_HOST
value: ‘mysql’
- name: MYSQL_SERVICE_PORT
value: ‘3306’
livenessProbe:
httpGet: # 探测方式为向容器中运行的服务发送HTTP GET请求
path: /demo
port: 8080
initialDelaySeconds: 15 # 延迟等待15秒
periodSeconds: 6 # 每6秒执行一次探测
步骤2 kubectl create -f myweb.yml --record部署应用。

步骤3 执行命令kubectl get deployments -o wide查看myweb的状态,如下图所示应用部署成功。

步骤4 执行命令kubectl get pods -o wide查看pod的状态。

步骤5 执行命令vim myweb-svc.yml创建文件myweb-svc.yml,myweb-svc.yml的内容为:

apiVersion: v1
kind: Service # 申明对象是Service
metadata:
name: myweb
spec:
type: NodePort
ports:
- port: 8080 # Service的端口号
nodePort: 30001 # node的真实端口号
selector:
app: myweb # Service选择了标签为app: myweb的pod
步骤6 执行命令kubectl create -f myweb-svc.yml创建Service。

步骤7 执行命令kubectl get services -o wide查看创建的service。

此Service开启了NodePort方式的外网访问模式,端口为30001,此端口会映射到tomcat容器的8080端口上。
步骤8 通过命令kubectl describe service myweb查看service与Pod的对应关系。

四、应用访问与验证
步骤1 执行如下操作,完成应用的基本访问与操作。
(1)打开浏览器,输入地址192.168.1.6:30001/demo。
在这里插入图片描述

(2)单击Add按钮,添加一条记录,如下所示。
在这里插入图片描述

(3)单击Submit按钮,结果如下所示。
在这里插入图片描述

(4)单击return按钮,可以看到表格中已经成功添加记录。
在这里插入图片描述

步骤2 执行如下操作登录Mysql数据库验证。
(1)执行命令kubectl exec -it mysql-7766f84647-c628s – /bin/bash进入部署Mysql的pod。

(2)执行命令mysql -uroot -p123456登录Mysql数据库。

(3)执行如下命令查找操作记录。

use HPE_APP;
select* from T_USERS;

可知在Web页面新增的记录已经保存在Mysql数据库中。
(4)执行命令如下命令退出数据库。

quit;

exit

五、应用负载均衡
步骤1 执行命令iptables-save |grep 10.68.128.23打印出当前节点的与myweb-svc Cluster IP 10.68.128.23相关的iptables规则。

该规则表示访问myweb-svc,跳转到规则KUBE-SVC-YG65S75AKNCDZRSF。
步骤2 执行命令iptables-save |grep KUBE-SVC-YG65S75AKNCDZRSF查看KUBE-SVC-YG65S75AKNCDZRSF的规则。

1/2的概率跳转到规则KUBE-SEP-NWPPOMD2ODMVC52X,1/2的概率跳转到规则KUBE-SEP-THSXEJXVFB6TCAEQ。
步骤3 执行如下命令查看以上两个跳转的规则,如下所示。

iptables-save |grep KUBE-SEP-NWPPOMD2ODMVC52X

iptables-save |grep KUBE-SEP-THSXEJXVFB6TCAEQ

即通过负载均衡将请求分别转发到后端的两个Pod。

六、应用健康检查
步骤1 执行命令vim myweb.yml编辑文件myweb.yml,查看已经添加的健康检查配置。
在这里插入图片描述

步骤2 执行如下命令,进入部署Tomcat的pod。

kubectl exec -it myweb-7594ff5798-5g4b6 – /bin/bash

步骤3 执行如下命令,终止Tocmat服务。

cd bin

./shutdown.sh

步骤4 执行命令kubectl get pods查看pod重启情况。

在容器启动15秒后,kubernet将每6秒执行一次liveness探测,如果连接失败则重启容器。由上可以看出,此容器已经被重启1次。

七、应用升级和回滚
步骤1 执行如下命令将初始镜像tomcat-app:v1升级到tomcat-app:v2。
(1)执行命令cp myweb.yml mywebv2.yml复制文件mywebv2.yml。将mywebv2.yml配置文件中tomcat-app:v1替换为tomcat-app:v2,如下所示。
在这里插入图片描述

(2)执行命令kubectl apply -f mywebv2.yml --record修改应用。

(3)执行命令kubectl get deployment myweb -o wide查看创建的deployment myweb应用状态,如下图所示应用部署成功。

可以看到Deployment myweb的镜像更新为tomcat-app:v2
(4)执行命令kubectl get replicaset -o wide查看创建的ReplicaSet。

可以看到新创建了ReplicaSet myweb-5f7755b6d7,镜像为tomcat-app:v2,并且管理了两个新的Pod,之前的ReplicaSet myweb-7594ff5798里面已经没有任何Pod。
(5)执行命令kubectl get pods查看创建的两个Pod。

ReplicaSet myweb-7594ff5798的两个myweb Pod已经被ReplicaSet myweb-5f7755b6d7的两个myweb Pod替换了。
步骤2 执行如下命令完成镜像tomcat-app:v2到tomcat-app:v1的回滚。
(1)执行命令kubectl rollout history deployment myweb查看revison历史记录。

(2)执行命令kubectl rollout undo deployment myweb --to-revision=1,回滚到版本revision 1。

(3)执行命令kubectl get deployment myweb -o wide查看应用版本。
在这里插入图片描述

可以看到镜像tomcat-app:v2成功回滚到tomcat-app:v1。

  • 20
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值