1、在kubernetes中部署应用程序流程

准备项目源码-->编译构建-->产出war包,打包到镜像中-->推送到镜像仓库

获取源代码是开发人员提交代码的代码托管地址,有Git、SVN、Gitlab等

镜像分类

1、基础镜像:如centos、Ubuntu等
2、环境镜像:如JDK、Python、go
3、项目镜像:是将项目打包到里面,基于环境镜像去打包

为什么自己构建镜像?

1、特殊环境配置
2、容易排查故障
3、标准化
4、更安全一些

制作Java镜像

1、安装编译基础环境

yum install -y java-1.8.0-openjdk maven

修改加速下载位置(更换下载源)添加如下内容

vim /etc/maven/settings.xml

152     <mirror>
153 <id>mirrorId</id>
154 <mirrorOf>repositoryId</mirrorOf>
155 <name>Human Readable Name for this Mirror.</name>
156 <url>http://my.repository.com/repo/path</url>
157 </mirror>
158 -->
159 <mirror>
160 <id>aliyun</id>
161 <name>aliyun</name>
162 <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
163 <mirrorOf>central</mirrorOf>
164 </mirror>165 </mirrors>

2、编译构建

首先在其他机器上安装数据库,

yum install -y mariadb-server
systemctl start mariadb.service && systemctl enable mariadb.service
mysql_secure_installation 初始化数据库信息

在创建镜像这台机器上拷贝数据库文件到数据库机器上

scp /root/tomcat-java-demo-master/db/tables_ly_tomcat.sql root@192.168.10.112:/

登录数据库创建数据库、导入数据、创建用户授权可以连接的用户

mysql -uroot -p123456
create database test;
use test;
source /tables_ly_tomcat.sql;
create user `test`@'%' identified by '123456';
grant all privileges on test.* to 'test'@'%';
flush privileges;
select host,user from mysql.user;

开始构建产出war包

yum install -y git
git clone https://github.com/lizhenliang/tomcat-java-demo.git
cd tomcat-java-demo-master/ #进入项目目录
vim /root/tomcat-java-demo-master/src/main/resources/application.yml #编辑数据库连接地址
mvn clean package -D maven.skip.test=true #开始构建
ls /root/tomcat-java-demo-master/target/ly-simple-tomcat-0.0.1-SNAPSHOT.war #查看构建好的镜像

编写Dockerfile

vim /root/tomcat-java-demo-master/Dockerfile

FROM tomcat:8
LABEL maintainer fage
#RUN rm -rf /usr/local/tomcat/webapps/*
ADD target/*.war /usr/local/tomcat/webapps/ROOT.war

注意修改实际环境的数据库地址,否则无法连接到数据库

构建项目镜像

docker build -t java-demo:v1 .

docker images|grep java

推送到镜像仓库,可以搭建私有仓库和公有仓库harbor、registry、hub公有仓库等

搭建完成登录上传

docker login #输入账号、密码
docker tag java-demo:v1 xxxx/java-demo:v1
docker push xxxx/java-demo:v1 

使用deployment部署Java应用

deployment功能

1、部署无状态应用
2、管理pod和replicaset
3、具有上部署、副本设定、滚动升级、回滚等功能
4、提供声明式更新,例如只更新一个image
应用场景:web服务、微服务

命令行部署方式(直接部署到集群)

1、部署过程

kubectl delete deploy web && kubectl delete svc web
kubectl create deployment web --image=lizhenliang/java-demo
kubectl get pods,svc
kubectl describe pod web-6b9c78c94f-smcdr #可以查看到详细过程和信息

2、发布访问端口(等于创建service)

kubectl expose deployment web --port=80 --target-port=8080 --type=NodePort --name=web     #发布控制器接口,暴露应用服务端口
kubectl get pods,svc -o wide #查看详细信息
kubectl get ep #查看负载均衡

测试访问

Pod与container的关系

container在集群上管理和运行容器的对象
通过label-selector(标签)相关联
Pod通过控制器实现营业的运维、伸缩、滚动升级等

编辑控制器以及控制器中的资源

kubectl create deployment deployment web2 --image=lizhenliang/java-demo --dry-run=client -o yaml > deployment.yaml  #生成yaml文件

vim deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
name: web2
spec:
replicas: 1
selector:
matchLabels:
project: demo #这里的标签必须跟service标签对应上
app: java #这里的标签必须跟service标签对应上
template:
metadata:
labels:
project: demo #这里的标签必须跟service标签对应上
app: java #这里的标签必须跟service标签对应上
spec:
containers:
- name: web
image: lizhenliang/java-demo
ports:
- containerPort: 8080

编辑配置service文件

kubectl expose deployment web2 --port=80 --target-port=8080 --dry-run=client -o yaml > servive.yaml  #生成service的yaml

vim service.yaml 

apiVersion: v1
kind: Service
metadata:
name: web2
spec:
selector:
project: demo #这里的标签必须跟deployment标签对应上
app: java #这里的标签必须跟deployment标签对应上
ports:
- name: default
protocol: TCP
port: 80 #提供给外部访问的接口
targetPort: 8080 #容器内部管控
type: NodePort

生效配置

kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
kubectl get pods,svc

应用升级、弹性伸缩、回滚、删除

应用升级

kubectl set image deployment web nginx=nginx:1.16
kubectl set image deployment web java-demo=tomcat:8 --record=true #记录版本号历史命令(方便回滚) 查看升级状态
kubectl rollout status deployment web

弹性伸缩

kubectl scale deployment web --replicas=10    #设定副本数量为10

kubectl autoscale deployment web --min=10 --max=15 --cpu-percent=80   #当podCPU使用率达到80%自动添加副本数量

kubectl get hpa    #查看到pod资源使用情况

查看hpa前提:

1、部署metrics-server

2、部署pod要设置requests,如下配置

apiVersion: apps/v1
kind: Deployment
metadata:
name: web2
spec:
replicas: 1
selector:
matchLabels:
project: demo
app: java
template:
metadata:
labels:
project: demo
app: java
spec:
containers:
- name: web
image: lizhenliang/java-demo
ports:
- containerPort: 8080
resources:
requests:
cpu: 500m
limits:
cpu: 1

  

回滚

kubectl rollout history deployment web    #查看升级历史版本
kubectl rollout undo deployment web #直接回滚到上个版本
kubectl rollout undo deployment web --to-revision=2 #指定版本进行回滚

删除

kubectl delete deploy web
kubectl delete svc web

应用程序生命周期管理

Pod对象:pod设计思想、应用自修复、init container、静态pod

Pod对象存在的意义: Pod为亲密性应用而存在

亲密性应用场景:

两个应用之间发生文件交互
两个应用需要通过127.0.0.1或者socket通信(典型组合:nginx+php)
两个应用需要发生频繁的调用

Pod基本概念

最小部署单元
一组容器的集合
一个pod中的容器共享网络命名空间
Pod是短暂的

Pod对象:容器分类

Infrastructure Container:基础容器,维护整个pod网络空间
Initcontainers:初始化同期,先于业务容器开始执行
Containers:与业务容器并行启动

Pod对象:应用自修复(重启策略+健康检查)

重启策略:

Always:当容器终止退出后,总是重启容器,默认策略。
适用场景:nginx、mysql等长期运行的程序
配置位置为container同级 OnFailure:当容器异常退出(退出状态码0)时才重启容器。
适用场景:定时任务 Never:当容器终止退出,从不重启容器
适用场景:临时任务

健康检查两种类型

LivenessProbe(存活检查)
如果检测失败,将杀死容器,根据pod的restartPolicy来操作 ReadinessProbe(就绪检查)
如果检查失败,kubernetes会把pod从server endpoints(负载均衡)中剔除
与镜像位置同级 

支持以下三种检测方法

httpGet:发送HTTP请求,返回200-400范围状态码为成功
exec: 执行shell命令返回状态码是0为成功
tcpsocket:发起TCP Socket建立成功

httpGet方式

apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: web
name: web
spec:
replicas: 1
selector:
matchLabels:
app: web
strategy: {}
template:
metadata:
labels:
app: web
spec:
restartPolicy: Always #重启策略,默认Always
containers:
- image: nginx
name: nginx
resources: {}
livenessProbe: #可以同时使用,不同维度的检查
httpGet:
path: /index.html
port: 80
initialDelaySeconds: 5 #第一次启动pod多少秒后执行健康检查
periodSeconds: 5 #健康检查周期(5秒)
readinessProbe: #可以同时使用,不同维度的检查
httpGet:
path: /index.html
port: 80
initialDelaySeconds: 5 #启动pod多少秒后执行健康检查
periodSeconds: 5 #健康检查周期(5秒)

应用生效

kubectl apply -f pods.yaml

演示重启pod过程

kubectl exec -it web4-547f8789f5-vgh4l bash
rm -f /usr/share/nginx/html/index.html

查看pod状态,过10秒左右就会自动重启

kubectl get pods

再次进入到容器中查看

exec方式

apiVersion: apps/v1
。。。跟上面的一样忽略部分
spec:
restartPolicy: Always
containers:
- image: nginx
name: nginx
resources: {}
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5
periodSeconds: 5

tcpSocket 方式

apiVersion: v1
。。。。忽略部分
spec:
restartPolicy: Always
continers:
- Images: lizhenliang/java-demo
name: java-demo
livenessProbe:
tcpSocket:
port: 8080
initiaIDelaySeconds: 30
periodSeconds: 20 

Pod对象:init container

Init container:

1、基本支持所有普通容器特征
2、优先于普通容器执行
不支持健康检查,只用于初始化

应用场景

1、 控制普通容器启动,初始化容器后才会启动业务容器

2、 初始化配置,例如下载应用配置文件(镜像等)、注册信息等

初始化容器让配置文件放到容器中:使用数据卷共享

cat init-conttainers.yaml

apiVersion: v1
kind: Pod
metadata:
name: init-demo
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
volumeMounts:
- name: workdir
mountPath: /usr/share/nginx/html
initContainers: #优先执行
- name: install
image: busybox
command:
- wget
- "-O"
- "/work-dir/index.html"
- http://kubernetes.io
volumeMounts:
- name: workdir
mountPath: "/work-dir"
dnsPolicy: Default #数据共享配置
volumes:
- name: workdir
emptyDir: {}

生效文件

kubectl apply -f init-container.yaml
kubectl get pods

查看分配到那个节点

kubectl get pods -o wide

Pod对象:静态Pod

静态pod:固定在某个node上面,由kubelet管理生成一种pod,无法使用控制器

在kubelet配置文件启用静态pod

vim /var/lib/kubelet/config.yaml
...
staticPodPath: /etc/kunernetes/manifests #指定静态pod位置
...

将部署的pod yaml放到该目录会由kubelet自动创建,默认是启用的

静态Pod特点:

1、yaml只能是pod,不能使用控制器
2、pod是由kubelet拉起的,只管理当前节点上yaml
3、kubelet会定期扫描静态pod目录 /etc/kubernetes/manifests/ 根据目录下的yaml启动或删除pod,删除yaml就等于删除pod

在节点上写好yaml文件即可,在master节点会自动创建pod,由kubelet自动拉起

在master上查看

kubelet会定时扫描/etc/kubernetes/mamfests/目录下的文件

4-K8S 部署Java应用及应用程序生命周期管理的更多相关文章

  1. 从大厂DevOps工具链部署,看现代产品的生命周期管理

    目录 1. 认识DevOps 1.1. DevOps工具链 1.2. CI 持续集成(Continuous Integration) 1.3. CD(持续交付 & 持续部署) 1.4. Agi ...

  2. .net学习笔记----Asp.net的生命周期之一应用程序生命周期

    Http请求刚刚到达服务器的时候 当服务器接收到一个 Http请求的时候,IIS (Internet Information Services,互联网信息服务)首先需要决定如何去处理这个请求. 什么是 ...

  3. Asp.net的生命周期之应用程序生命周期

    参考:http://msdn.microsoft.com/zh-cn/library/ms178473(v=vs.100).aspx 参考:http://www.cnblogs.com/JimmyZh ...

  4. k8s的Pod状态和生命周期管理

    Pod状态和生命周期管理   一.什么是Pod? 二.Pod中如何管理多个容器? 三.使用Pod 四.Pod的持久性和终止 五.Pause容器 六.init容器 七.Pod的生命周期 (1)Pod p ...

  5. Java多线程之线程的生命周期

    Java多线程之线程的生命周期 一.前言 当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态.在线程的生命周期中,它要经过新建(New).就绪(Runnable).运行(R ...

  6. C# MVC 5 - 生命周期(应用程序生命周期&请求生命周期)

    本文是根据网上的文章总结的. 1.介绍 本文讨论ASP.Net MVC框架MVC的请求生命周期. MVC有两个生命周期,一为应用程序生命周期,二为请求生命周期. 2.应用程序生命周期 应用程序生命周期 ...

  7. [转]ASP.NET应用程序生命周期趣谈(五) IIS7瞎说

    Ps:建议初学者在阅读本文之前,先简要了解一下之前的几篇文章,以便于熟悉本文提到的一些关于IIS6的内容,方便理解.仅供参考. PS:为什么叫瞎说呢?我觉得自己理解的并不到位,只能是作为一个传声筒,希 ...

  8. [转]ASP.NET应用程序生命周期趣谈(三) HttpModule

    在之前的文章中,我们提到过P_Module(HttpModule)这个能干的程序员哥们儿,它通过在项目经理HttpApplication那里得到的授权,插手整个应用程序级别的事件处理.所有的HttpM ...

  9. [转]ASP.NET应用程序生命周期趣谈(一)

    这几天一直在看ASP.NET应用程序生命周期,真是太难了,我理解起来费了劲了,但偏偏它又是那么重要,所以我希望能给大家带来一篇容易理解又好用的文章来帮助学习ASP.NET应用程序生命周期.这篇就是了. ...

随机推荐

  1. 在Fragment 中拦截返回键

    代码如下: class XXXFrgmt : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ...

  2. Diophantus of Alexandria(唯一分解定理)

    Diophantus of Alexandria was an Egypt mathematician living in Alexandria. He was one of the first ma ...

  3. 做一名合格的DBA

    Oracle DBA的角色定义 开发型DBA 数据库安装 数据库架构设计(架构和建模) 代码开发(存储过程,SQL) 运维型DBA 数据库日常监控 故障处理 性能优化 数据备份,容灾 数据库安全规划 ...

  4. HashMap源码解析、jdk7和8之后的区别、相关问题分析(多线程扩容带来的死循环)

    一.概览 HashMap<String, Integer> map = new HashMap<>(); 这个语句执行起来,在 jdk1.8 之前,会创建一个长度是 16 的 ...

  5. 12 props 传的是数组处理

    <template> <div>InfoDetailed</div> </template> <script> export default ...

  6. 剑指 Offer 55 - I. 二叉树的深度

    题目描述 输入一棵二叉树的根节点,求该树的深度.从根节点到叶节点依次经过的节点(含根.叶节点)形成树的一条路径,最长路径的长度为树的深度. 例如: 给定二叉树 [3,9,20,null,null,15 ...

  7. Linux:使用SecureCRT来上传和下载文件

    SecureCRT自带的有几种上传下载功能,SecureCRT下的文件传输协议有以下几种:ASCII.Xmodem.Ymodem.Zmodem. ASCII:这是最快的传输协议,但只能传送文本文件.  ...

  8. Springboot中WebMvcConfigurer接口详解

    Springboot 使用越来越多,企业的基本框架,到Springcloud分布式,可以说无论面试还是平常技术学习,一说到spring几乎就就代替了Java,可以说spring,springboot的 ...

  9. 【吴恩达课程使用】pip安装pandas失败-anaconda各种玄学T-T-从新开始搭建环境

    [吴恩达课程使用]安装pandas失败-从新开始搭建环境 在第五课第二周的任务2中,虚拟环境缺少pandas,sklearn依赖,因为用pip比较顺手,就直接使用pip安装,结果各种anaconda环 ...

  10. redis实现计数器

    用redis实现计数器 社交产品业务里有很多统计计数的功能,比如: 用户: 总点赞数,关注数,粉丝数 帖子: 点赞数,评论数,热度 消息: 已读,未读,红点消息数 话题: 阅读数,帖子数,收藏数 统计 ...