k8s中部署发布应用
1.项目迁移到K8S平台是怎样的流程
制作镜像:
使用dockerfile制作docker 镜像
镜像分为
基础镜像:centos,ubuntu
服务镜像:openjdk,nginx,mysql
项目镜像:项目代码打包在服务镜像里,最终交付物
java或者go的应用需要编译,php的可以不用编译。
控制器管理pod
- Deployment:无状态部署,例如Web,微服务,API
- StatefulSet:有状态部署,例如数据库,ZK,ETCD
- DaemonSet:守护进程部署,例如监控Agent、日志Agent
- Job & CronJob:批处理,例如数据库备份,邮件通知
pod数据持久化:
容器部署过程中一般有以下三种数据:
- 启动时需要的初始数据,可以是配置文件
- 启动过程中产生的临时数据,该临时数据需要多个容器间共享
- 启动过程中产生的业务数据
暴露应用:
使用Service ClusterIP类型暴露集群内部应用访问。
- Service定义了Pod的逻辑集合和访问这个集合的策略
- Service引入为了解决Pod的动态变化,提供服务发现和负载均衡
- 使用CoreDNS解析Service名称
对外发布应用:
使用Ingress对外暴露你的应用。
- 通过Service关联Pod
- 基于域名访问
- 通过Ingress Controller实现Pod的负载均衡
- 支持TCP/UDP 4层和HTTP 7层(Nginx)
日志与监控
使用Prometheus监控集群中资源的状态
使用ELK来收集应用的日志
2.传统部署和k8s部署的区别
区别:
- 原先的应用包变成了存放在镜像仓库中的镜像
- 部署从原先ansible部署,变成k8s使用控制器部署,部署的节点直接是由物理机变成部署在pod内
- 暴露服务由原先的自建负载均衡nginx,haproxy等 变成通过k8s 的service,ingress来暴露服务
3.手工模拟k8s发布java应用
测试java-demo 📎java-demo.zip
unzip java-demo.zip && cd java-demo
安装jdk
yum install -y java-1.8.0-openjdk
安装maven
yum install maven -y
编译代码
- db目录 ,数据库表的初始化sql
- pom.xml 项目依赖的jar包说明文件
- src 源代码目录
由于maven默认使用的国外的maven源 所以改成国内阿里云的源这样下载依赖包会很快
/etc/maven/settings.xml
在159行加入
在<mirrors> </mirros>内
<mirror>
<id>aliyunmaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>https://maven.aliyun.com/repository/public </url>
</mirror>
构建war包
mvn clean package -Dmaven.test.skip
clean package 会删掉之前存在构建好的文件目录
maven.test.skip 表示忽略测试
编写Dockerfile
配置对私有仓库的可信任,并配置默认的镜像仓库为阿里云仓库
/etc/docker/daemon.json
{
"registry-mirrors": ["https://yyk0qnca.mirror.aliyuncs.com"],
"insecure-registries": ["192.168.31.70"]
}
Dockerfile
FROM 192.168.31.70/library/tomcat:v1
RUN rm -rf /usr/local/tomcat/webapps/*
COPY target/*.war /usr/local/tomcat/webapps/ROOT.war
1.从镜像仓库拉取旧版本的应用镜像,其中library仓库是个公共的仓库所以不需要登录
2.删除镜像中原本的war包
3.将本地构建好的war包复制到镜像的war包目录,并命名为ROOT.war
执行构建
docker build -t java-demo:v1 .
本地运行镜像
docker run -d java-demo:v1
验证应用是否发布成功
docker inspect -f='{{.NetworkSettings.IPAddress}}' f07c85826426 #获取容器的ip
创建一个 demo的私有仓库
推送镜像到私有仓库
docker login 192.168.31.70 --username=admin
docker tag 182f52a26eb0 192.168.31.70/demo/java-demo:v1
docker push 192.168.31.70/demo/java-demo:v1
创建私有仓库的认证secret
由于demo仓库设置的是私有类型所以pull镜像需要登录认证。
kubectl create secret docker-registry docker-regsitry-auth --docker-username=admin --docker-password=Harbor1
345 --docker-server=192.168.31.70
使用deployment发布应用
apiVersion