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. 初级知识六——C#事件通知系统实现(观察者模式运用)

    观察者模式,绝对是游戏中十分重要的一种模式,运用这种模式,可以让游戏模块间的通信变得简单,耦合度也会大大降低,下面讲解如何利用C#实现事件通知系统. 补充,首先说下这个系统的实现原理,不然一头扎进去就 ...

  2. 用IDEA一年了,终于敢说自己会用了

    作为Java老兵,我也是用了很多年的eclipse,为了与时俱进,于是切换到了IDEA.刚开始的时候感觉很不适应,感觉这玩意儿不如eclipse好用,影响工作效率,于是又换回eclipse. 但是很多 ...

  3. Python基本

    Python基本规则 1.面向对象的跨平台的编程语言 2.文件类型是.py, 3.一个文件是一个模块module,运行整个文件 4.不支持非英文字符,区分大小写 5.一行是一条语句,多条语句写一行用; ...

  4. sort(桶排序+hash)

    题目链接:https://cn.vjudge.net/problem/HDU-1425 注意是多组输入 代码: #include<cstdio> #include<iostream& ...

  5. Vue中父组件使用子组件的emit事件,获取emit事件传出的值并添加父组件额外的参数进行操作

    需求是这样的,需要输入这样一个列表的数据,可以手动添加行,每一行中客户编号跟客户姓名是自动关联的,就是说选取了客户姓名之后,客户编号是自动填充的,客户姓名是一个独立的组件,每一个下拉项都是一个大的对象 ...

  6. 【BZOJ3453】XLkxc

    http://192.168.102.138/JudgeOnline/problem.php?id=3170 知识点:1.拉格朗日插值(多特殊函数相加) 2.这个式子看似非常复杂,然而只要明白这个式子 ...

  7. Solon详解(三)- Solon的web开发

    Solon详解系列文章: Solon详解(一)- 快速入门 Solon详解(二)- Solon的核心 Solon详解(三)- Solon的web开发 Solon详解(四)- Solon的事务传播机制 ...

  8. 转载:51cto 2019好文精选

    转载地址:https://news.51cto.com/art/202001/609544.htm 01.知识科普 傻瓜都能看懂,30张图彻底理解红黑树! TCP三次握手,四次挥手,你真的懂吗? 面试 ...

  9. .NET实现可交互的WINDOWS服务(转载自CSDN"烈火蜓蜻")

    Windows 服务应用程序在不同于登录用户的交互区域的窗口区域中运行.窗口区域是包含剪贴板.一组全局原子和一组桌面对象的安全对象.由于 Windows 服务的区域不是交互区域,因此 Windows ...

  10. get_started_3dsctf_2016

    题外:这道题不是很难,但是却难住了我很久.主要是在IDA中查看反编译出的伪代码时双击了一下gets()函数,结果进入gets函数内部,我当时就懵了,误以为这是一个自定义函数,但是自定义函数应该应该不能 ...