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: 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

创建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

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


使用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

编辑hosts文件

然后访问java.ctnrs.com

模拟更新应用
在harbor节点 安装mysql数据库
yum install -y mariadb-server systemctl 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.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

再次访问应用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 #查看发布情况

4.手工模拟k8s发布php应用
测试php-demo 📎php-demo.zip
unzip php-demo.zip && cd php-demo

构建推送镜像
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

kubectl apply -f deployment.yaml

通过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

通过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

验证访问
编辑 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



来源:https://www.cnblogs.com/benjamin77/p/12446781.html