k8s中部署发布应用


1.项目迁移到K8S平台是怎样的流程

image.png

 

制作镜像:

image.png

使用dockerfile制作docker 镜像

镜像分为

基础镜像:centos,ubuntu

服务镜像:openjdk,nginx,mysql

项目镜像:项目代码打包在服务镜像里,最终交付物

java或者go的应用需要编译,php的可以不用编译。

控制器管理pod

  • Deployment:无状态部署,例如Web,微服务,API
  • StatefulSet:有状态部署,例如数据库,ZK,ETCD
  • DaemonSet:守护进程部署,例如监控Agent、日志Agent
  • Job & CronJob:批处理,例如数据库备份,邮件通知

pod数据持久化:

容器部署过程中一般有以下三种数据:

  • 启动时需要的初始数据,可以是配置文件
  • 启动过程中产生的临时数据,该临时数据需要多个容器间共享
  • 启动过程中产生的业务数据

image.png

暴露应用:

使用Service ClusterIP类型暴露集群内部应用访问。

  • Service定义了Pod的逻辑集合和访问这个集合的策略
  • Service引入为了解决Pod的动态变化,提供服务发现和负载均衡
  • 使用CoreDNS解析Service名称

image.png

对外发布应用:

使用Ingress对外暴露你的应用。

  • 通过Service关联Pod
  • 基于域名访问
  • 通过Ingress Controller实现Pod的负载均衡
  • 支持TCP/UDP 4层和HTTP 7层(Nginx)

image.png

日志与监控

使用Prometheus监控集群中资源的状态

使用ELK来收集应用的日志

 

2.传统部署和k8s部署的区别

image.png

 

 

 

image.png

 

区别:

  • 原先的应用包变成了存放在镜像仓库中的镜像
  • 部署从原先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

image.png

安装maven

yum install maven -y

image.png

编译代码

image.png

  • 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 表示忽略测试

image.png

 

编写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仓库是个公共的仓库所以不需要登录

image.png

2.删除镜像中原本的war包

3.将本地构建好的war包复制到镜像的war包目录,并命名为ROOT.war

执行构建

docker build -t java-demo:v1 .

 

image.png

本地运行镜像

docker run -d java-demo:v1

验证应用是否发布成功

docker inspect -f='{{.NetworkSettings.IPAddress}}' f07c85826426 #获取容器的ip

 

image.png

 

创建一个 demo的私有仓库

image.png

image.png

推送镜像到私有仓库

 

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

image.png

创建私有仓库的认证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: apps/v1 kind: Deployment metadata:  name: java-demo spec:  replicas: 3  selector:  matchLabels:  project: www  app: java-demo  template:  metadata:  labels:  project: www  app: java-demo  spec:  imagePullSecrets:  - name: "docker-regsitry-auth"  containers:  - image: 192.168.31.70/demo/java-demo:v1  name: java-demo  imagePullPolicy: Always  ports:  - containerPort: 8080  name: web  protocol: TCP  resources:  requests:  cpu: 0.5  memory: 0.3Gi  limits:  cpu: 1  memory: 0.5Gi  livenessProbe:  httpGet:  path: /  port: 8080  initialDelaySeconds: 60  timeoutSeconds: 20  readinessProbe:  httpGet:  path: /  port: 8080  initialDelaySeconds: 60  timeoutSeconds: 20

image.png

 

创建service暴露服务

apiVersion: v1 kind: Service metadata:  labels:  app: java-demo  name: java-demo spec:  ports:  - port: 80  protocol: TCP  targetPort: 8080  nodePort: 30018  selector:  app: java-demo  type: NodePort

image.png

可以通过 任意节点的ip:30018    访问应用

image.png

image.png

使用ingress对外发布服务

apiVersion: extensions/v1beta1 kind: Ingress metadata:  name: java-demo spec:  rules:  - host: java.ctnrs.com  http:  paths:  - path: /  backend:  serviceName: java-demo  servicePort: 80

image.png

编辑hosts文件

image.png

 

然后访问java.ctnrs.com

image.png

模拟更新应用

在harbor节点 安装mysql数据库

yum install -y mariadb-server systemctl start mariadb mysqladmin -uroot password "123456" 设置密码123456

编辑 java-demo/src/main/resources/application.yml

将连接数据库的地址换成 harbor节点的地址

image.png

创建demo用户并授权

MariaDB [test]> grant all on test.* to 'demo'@'192.168.31.%' identified by '123.com'; MariaDB [test]> grant all on test.* to 'demo'@'localhost' identified by '123.com';

将修改后的配置重新编译成war包

mvn clean package -Dmaven.skip.test docker build -t java-demo:v2 . docker tag java-demo:v2 192.168.31.70/demo/java-demo:v2 docker push 192.168.31.70/demo/java-demo:v2 

将deployment.yaml 中镜像版本v1改成v2

- image: 192.168.31.70/demo/java-demo:v2

重新应用配置后会触发滚动更新

kubectl apply -f deployment.yaml

image.png

 

再次访问应用http://java.ctnrs.com/就是升级后(更改过配置)的应用 

 

回滚应用

 

kubectl rollout history deployment/java-demo #查看应用历史版本 kubectl rollout undo deployment/java-demo #回滚到之前的版本 kubectl rollout undo deployment/java-demo --to-revision=1 #回到指定的历史版本 kubectl rollout status deploy/java-demo #查看发布情况

image.png

 

4.手工模拟k8s发布php应用

测试php-demo  📎php-demo.zip

unzip php-demo.zip  && cd php-demo

image.png

构建推送镜像

FROM registry.cn-hangzhou.aliyuncs.com/benjamin-public/nginx-php:latest MAINTAINER BenjaminYang ADD . /usr/local/nginx/html 

 

docker build -t 192.168.31.70/demo/php-demo:v1 . docker push 192.168.31.70/demo/php-demo:v1 #demo是私有仓库需要登录

通过deployment发布应用

deployment.yaml

apiVersion: apps/v1 kind: Deployment metadata:  name: php-demo  namespace: test spec:  replicas: 3  selector:  matchLabels:  project: www  app: php-demo  template:  metadata:  labels:  project: www  app: php-demo  spec:  imagePullSecrets:  - name: docker-regsitry-auth  containers:  - name: nginx  image: 192.168.31.70/demo/php-demo:v2  ports:  - containerPort: 80  name: web  protocol: TCP  resources:  requests:  cpu: 0.5  memory: 200Mi  limits:  cpu: 1  memory: 0.3Gi  livenessProbe:  httpGet:  path: /status.php  port: 80  initialDelaySeconds: 6  timeoutSeconds: 20  readinessProbe:  httpGet:  path: /status.php  port: 80  initialDelaySeconds: 6  timeoutSeconds: 20

 

由于是在 test 名称空间下操作 所以需要在创建test 名称空间,并且在该名称空间下创建 secret

namespace.yaml

apiVersion: v1 kind: Namespace metadata:  name: test

image.png

kubectl  apply -f deployment.yaml

image.png

通过service暴露服务

service.yaml

apiVersion: v1 kind: Service metadata:  name: php-demo  namespace: test spec:  selector:  project: www  app: php-demo  ports:  - name: web  port: 80  targetPort: 80  type: NodePort

image.png

通过ingress来对外发布服务

ingress.yaml

apiVersion: extensions/v1beta1 kind: Ingress metadata:  name: php-demo  namespace: test spec:  rules:  - host: php.ctnrs.com  http:  paths:  - path: /  backend:  serviceName: php-demo  servicePort: 80

image.png

 

验证访问

编辑 hosts文件 

image.png

 

访问域名提示  数据库连接出错,由于配置文件中的数据库连接信息是错的

image.png

模拟应用更新

数据库添加用户并授权

 

MariaDB [(none)]> grant all on wp.* to 'wp'@'192.168.31.%' identified by '123.com'; MariaDB [(none)]> grant all on wp.* to 'wp'@'localhost' identified by '123.com';

 

编辑 php-demo/wp-config.php

image.png

 

更新当前镜像 打tag为v2

docker build -t 192.168.31.70/demo/php-demo:v2 . docker push 192.168.31.70/demo/php-demo:v2

将 deployment.yaml 中的 镜像版本指定为 php-demo:v2

 

重新应用配置

kubectl apply -f deployment.yaml  

 

再次验证访问

成功访问wp

image.png

image.png

image.png

 
 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM