您好,欢迎来到划驼旅游。
搜索
您的当前位置:首页k8s中部署发布应用

k8s中部署发布应用

来源:划驼旅游
k8s中部署发布应⽤

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

制作镜像:

使⽤dockerfile制作docker 镜像镜像分为

基础镜像:centos,ubuntu服务镜像:openjdk,nginx,mysql

项⽬镜像:项⽬代码打包在服务镜像⾥,最终交付物java或者go的应⽤需要编译,php的可以不⽤编译。

控制器管理pod

Deployment:⽆状态部署,例如Web,微服务,APIStatefulSet:有状态部署,例如数据库,ZK,ETCD

DaemonSet:守护进程部署,例如监控Agent、⽇志AgentJob & 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

unzip java-demo.zip && cd java-demo

安装jdk

yum install -y java-1.8.0-openjdk

安装maven

yum install maven -y

编译代码

db⽬录 ,数据库表的初始化sqlpom.xml 项⽬依赖的jar包说明⽂件src 源代码⽬录

由于maven默认使⽤的国外的maven源 所以改成国内阿⾥云的源这样下载依赖包会很快/etc/maven/settings.xml在159⾏加⼊

aliyunmaven

central aliyun maven

https://maven.aliyun.com/repository/public

构建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:v1RUN 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}}' f07c858226 #获取容器的ip

创建⼀个 demo的私有仓库

推送镜像到私有仓库

docker login 192.168.31.70 --username=admin

docker tag 182f52a26eb0 192.168.31.70/demo/java-demo:v1docker 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=Harbor1345 --docker-server=192.168.31.70

使⽤deployment发布应⽤

apiVersion: apps/v1kind: Deploymentmetadata:

name: java-demospec:

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

创建service暴露服务

apiVersion: v1kind: Servicemetadata: labels:

app: java-demo name: java-demospec: ports: - port: 80

protocol: TCP targetPort: 8080 nodePort: 30018 selector:

app: java-demo type: NodePort

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

使⽤ingress对外发布服务

apiVersion: extensions/v1beta1kind: Ingressmetadata:

name: java-demospec: rules:

- host: java.ctnrs.com http: paths: - path: / backend:

serviceName: java-demo servicePort: 80

编辑hosts⽂件

然后访问java.ctnrs.com

模拟更新应⽤

在harbor节点 安装mysql数据库

yum install -y mariadb-serversystemctl start mariadb

mysqladmin -uroot password \"123456\" 设置密码123456

编辑 java-demo/src/main/resources/application.yml将连接数据库的地址换成 harbor节点的地址

创建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.testdocker build -t java-demo:v2 .

docker tag java-demo:v2 192.168.31.70/demo/java-demo:v2docker 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

再次访问应⽤就是升级后(更改过配置)的应⽤ 回滚应⽤

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 #查看发布情况

4.⼿⼯模拟k8s发布php应⽤

测试php-demo

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

构建推送镜像

FROM registry.cn-hangzhou.aliyuncs.com/benjamin-public/nginx-php:latestMAINTAINER BenjaminYangADD . /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/v1kind: Deploymentmetadata:

name: php-demo namespace: testspec:

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 名称空间,并且在该名称空间下创建 secretnamespace.yaml

apiVersion: v1kind: Namespacemetadata: name: test

kubectl apply -f deployment.yaml

通过service暴露服务

service.yaml

apiVersion: v1kind: Servicemetadata:

name: php-demo namespace: testspec:

selector:

project: www app: php-demo ports:

- name: web port: 80

targetPort: 80 type: NodePort

通过ingress来对外发布服务

ingress.yaml

apiVersion: extensions/v1beta1kind: Ingressmetadata:

name: php-demo namespace: testspec: rules:

- host: php.ctnrs.com http: paths: - path: / backend:

serviceName: php-demo servicePort: 80

验证访问

编辑 hosts⽂件

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

模拟应⽤更新

数据库添加⽤户并授权

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

更新当前镜像 打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

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo6.com 版权所有 湘ICP备2023023988号-11

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务