美文网首页JAVAk8sK8s
k8s-实际项目部署案例

k8s-实际项目部署案例

作者: 小李飞刀_lql | 来源:发表于2021-11-26 09:56 被阅读0次

    实际项目部署案例

    容器交付流程

    1637847968726.png

    在K8s平台部署项目流程

    1637848043959.png

    在K8s平台部署Java网站项目

    构建项目镜像

    001 解压缩tomcat-java-demo-master项目
    [root@es3 file]# yum install -y unzip zip
    [root@es3 file]# unzip tomcat-java-demo-master.zip
    [root@es3 file]# cd tomcat-java-demo-master
    002 Dockerfile
    --------------------------------------------------------------------------
    FROM lizhenliang/tomcat 
    LABEL maintainer www.ctnrs.com
    RUN rm -rf /usr/local/tomcat/webapps/*
    ADD target/ROOT /usr/local/tomcat/webapps/ROOT 
    
    --------------------------------------------------------------------------
    003 将Dockerfile复制到项目pom.xml的同级目录下
    [root@k8s-master javademo]# cp Dockerfile tomcat-java-demo-master
    
    004 将Dockerfile复制到项目pom.xml的同级目录下
    [root@es3 file]# cp Dockerfile tomcat-java-demo-master
    
    005 安装相关环境
    [root@es3 tomcat-java-demo-master]# yum install java-1.8.0-openjdk maven git -y
    
    006 编译项目,生产target目录
    [root@es3 tomcat-java-demo-master]# mvn clean package -Dmaven.test.skip=true 
    
    007 解压缩war到相关目录
    [root@es3 tomcat-java-demo-master]# unzip target/*.war -d target/ROOT
    
    008 构建镜像
    [root@es3 tomcat-java-demo-master]# docker build -t java-demo:v1 .
    Successfully tagged java-demo:v1
    
    009 推送镜像
    [root@es3 tomcat-java-demo-master]# docker tag java-demo:v1 192.168.153.27/demo/java-demo:v1
    
    [root@es3 tomcat-java-demo-master]# docker push 192.168.153.27/demo/java-demo:v1
    
    010 测试镜像
    [root@es3 tomcat-java-demo-master]# docker run -d -p 8088:8080 192.168.153.27/demo/java-demo:v1
     
    http://192.168.153.27:8088/
     
    011 删除镜像
    [root@es3 tomcat-java-demo-master]# docker ps
    CONTAINER ID   IMAGE                                COMMAND                  CREATED         STATUS                 PORTS                                       NAMES
    8980665a5081   192.168.153.27/demo/java-demo:v1     "catalina.sh run"              0.0.0.0:8088->8080/tcp, :::8088->8080/tcp   cranky_chatelet
    
    [root@es3 tomcat-java-demo-master]# docker rm -f  8980665a5081
    8980665a5081
    
    
    1637852062475.png

    数据库搭建

    配置文件

    apiVersion: v1
    kind: Secret
    metadata:
      name: java-demo-db 
      namespace: default
    type: Opaque
    data:
      mysql-root-password: "MTIzNDU2"
      mysql-password: "MTIzNDU2"
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: java-demo-db 
      namespace: default
    spec:
      selector:
        matchLabels:
          project: www
          app: mysql
      template:
        metadata:
          labels:
            project: www
            app: mysql
        spec:
          containers:
          - name: db
            image: mysql:5.7.30
            resources:
              requests:
                cpu: 500m
                memory: 512Mi
              limits: 
                cpu: 500m
                memory: 512Mi
            env:
            - name: MYSQL_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: java-demo-db
                  key: mysql-root-password
            - name: MYSQL_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: java-demo-db
                  key: mysql-password
            - name: MYSQL_USER
              value: "aliang"
            - name: MYSQL_DATABASE
              value: "k8s"
            ports:
            - name: mysql
              containerPort: 3306
            livenessProbe:
              exec:
                command:
                - sh
                - -c
                - "mysqladmin ping -u root -p${MYSQL_ROOT_PASSWORD}"
              initialDelaySeconds: 30
              periodSeconds: 10
            readinessProbe:
              exec:
                command:
                - sh
                - -c
                - "mysqladmin ping -u root -p${MYSQL_ROOT_PASSWORD}"
              initialDelaySeconds: 5
              periodSeconds: 10
            volumeMounts:
            - name: data
              mountPath: /var/lib/mysql
            
          volumes:
          - name: data
            persistentVolumeClaim:
              claimName: java-demo-db
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: java-demo-db 
      namespace: default
    spec:
      storageClassName: "managed-nfs-storage"
      accessModes:
        - "ReadWriteOnce"
      resources:
        requests:
          storage: "8Gi"
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: java-demo-db
      namespace: default
    spec:
      type: ClusterIP
      ports:
      - name: mysql
        port: 3306
        targetPort: mysql
      selector:
        project: www
        app: mysql 
    ------------------------------------------------------------------------------
    
    [root@k8smaster javademo]# kubectl get pod,svc
    NAME                                          READY   STATUS    RESTARTS   AGE
    pod/java-demo-db-6c775c4d4b-wtb4j             1/1     Running   0          3m18s
    pod/nfs-client-provisioner-5f98b5cdfb-rm7dd   1/1     Running   4          47h
    
    NAME                   TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
    service/java-demo-db   ClusterIP   10.104.14.222   <none>        3306/TCP   3m18s
    service/kubernetes     ClusterIP   10.96.0.1       <none>        443/TCP    26d
    

    初始化MYSQL

    001 编辑脚本tables_ly_tomcat.sql
    -------------------------------------------------------------------
    CREATE DATABASE IF NOT EXISTS `k8s`  DEFAULT CHARACTER SET utf8 ;
    USE `k8s`;
    
    CREATE TABLE `user` (
      `id` INT(11) NOT NULL AUTO_INCREMENT,
      `name` VARCHAR(100) NOT NULL COMMENT '名字',
      `age` INT(3) NOT NULL COMMENT '年龄',
      `sex` CHAR(1) DEFAULT NULL COMMENT '性别',
      PRIMARY KEY (`id`)
    ) ENGINE=INNODB DEFAULT CHARSET=utf8;
    
    COMMIT;
    ---------------------------------------------------------------------------
    
    002 将sql脚本复制到容器中
    [root@k8smaster javademo]# kubectl cp tables_ly_tomcat.sql java-demo-db-6c775c4d4b-wtb4j:/
    
    003 进入容器,登录mysql,初始化脚本
    [root@k8smaster javademo]# kubectl exec -it java-demo-db-6c775c4d4b-wtb4j -- bash
    root@java-demo-db-6c775c4d4b-wtb4j:/# mysql -ualiang -p123456   
    mysql> source /tables_ly_tomcat.sql
    mysql> use k8s
    mysql> select * from user;
    
    

    部署服务

    配置文件

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: java-demo-config
    data:
        application.yml: |
            server:
              port: 8080
            spring:
              datasource:
                url: jdbc:mysql://java-demo-db:3306/k8s?characterEncoding=utf-8
                username: aliang
                password: 123456
                driver-class-name: com.mysql.jdbc.Driver
              freemarker:
                allow-request-override: false
                cache: true
                check-template-location: true
                charset: UTF-8
                content-type: text/html; charset=utf-8
                expose-request-attributes: false
                expose-session-attributes: false
                expose-spring-macro-helpers: false
                suffix: .ftl
                template-loader-path:
                  - classpath:/templates/
    

    使用镜像仓库

    001 配置可信任(如果仓库是HTTPS访问不用配置)
    --------------------------------------------------------------------------
    [root@es3 harbor]# vi /etc/docker/daemon.json 
    {
      "registry-mirrors": ["......"],
      "insecure-registries":["192.168.153.27"]
    }
    
    systemctl restart docker
    systemctl daemon-reload
    docker login 192.168.153.27
    --------------------------------------------------------------------------
    
    002 将镜像仓库认证凭据保存在K8s Secret中
    [root@k8smaster javademo]# kubectl create secret docker-registry registry-auth --docker-username=admin --docker-password=Harbor12345 --docker-server=192.168.153.27
    
    secret/registry-auth created
    
    [root@k8smaster javademo]# kubectl get secret
    NAME                                 TYPE                                  DATA   AGE
    registry-auth                        kubernetes.io/dockerconfigjson        1      55s
    
    003 在yaml中使用这个认证凭据
    imagePullSecrets:
    - name: registry-auth
    

    Deployment

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: java-demo
    spec:
      replicas: 1
      selector:
        matchLabels:
          project: www
          app: java-demo
      template:
        metadata:
          labels:
            project: www
            app: java-demo
        spec:
          imagePullSecrets:
          - name: registry-auth
          containers:
          - image: 192.168.153.27/demo/java-demo:v1
            name: java-demo
            volumeMounts:
            - name: config
              mountPath: "/usr/local/tomcat/webapps/ROOT/WEB-INF/classes/application.yml"
              subPath: application.yml
            resources:
              requests:
                cpu: 0.5
                memory: 500Mi
              limits:
                cpu: 1
                memory: 1Gi
            livenessProbe:
              httpGet:
                path: /
                port: 8080
              initialDelaySeconds: 50
              periodSeconds: 10
            readinessProbe:
              httpGet:
                path: /
                port: 8080
              initialDelaySeconds: 50
              periodSeconds: 10
          volumes:
          - name: config
            configMap:
              name: java-demo-config
              items:
              - key: "application.yml"
                path: "application.yml"
                
                
     ----------------------------------------------------------------------
     [root@k8smaster javademo]# kubectl get pod
    NAME                                      READY   STATUS    RESTARTS   AGE
    java-demo-6dfb768958-9j2t6                1/1     Running   0          94s
    java-demo-db-6c775c4d4b-wtb4j             1/1     Running   1          53m
    nfs-client-provisioner-5f98b5cdfb-rm7dd   1/1     Running   6          2d
    

    Service

    apiVersion: v1
    kind: Service
    metadata:
      name: java-demo
    spec:
      selector:
        project: www
        app: java-demo
      ports:
        - protocol: TCP
          port: 80
          targetPort: 8080
          
    ------------------------------------------------------------------------
    [root@k8smaster javademo]# kubectl get svc
    NAME           TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
    java-demo      ClusterIP   10.105.252.26   <none>        80/TCP     5s
    java-demo-db   ClusterIP   10.104.14.222   <none>        3306/TCP   57m
    

    Ingress

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: java-demo
    spec:
      rules:
      - host: javademo.ctnrs.com
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: java-demo
                port:
                  number: 80
                  
    -----------------------------------------------------------------------------
    001 启动ingress
    [root@k8smaster ingress]#  kubectl apply -f ingress-controller.yaml 
    002 启动项目的ingress
    [root@k8smaster javademo]# kubectl apply -f ingress.yaml 
    ingress.networking.k8s.io/java-demo created
    
    #Hosts
    192.168.153.22 javademo.ctnrs.com
    #访问
    http://javademo.ctnrs.com/
    
    1637882823286.png

    增加公网负载均衡器

    1637891154015.png
    001 安装nginx
    yum install -y nginx
    
    002 修改配置文件/etc/nginx/nginx.conf   
    ----------------------------------------------------------------
    
        #include /etc/nginx/conf.d/*.conf;
    
    
        upstream java-demo {
             server 192.168.153.22:80;
        }
        server {
             listen 81;
             server_name javademo.ctnrs.com;
             location / {
               proxy_pass http://java-demo;
               proxy_set_header Host $Host;
             }
    
        }
    --------------------------------------------------------------------
    
    003 重启nginx
    [root@es3 nginx]# systemctl daemon-reload        
    [root@es3 nginx]# systemctl restart nginx.service
    
    
    004 hosts
    192.168.153.27 javademo.ctnrs.com
    
    005 访问网站
    http://javademo.ctnrs.com:81/
    

    相关文章

      网友评论

        本文标题:k8s-实际项目部署案例

        本文链接:https://www.haomeiwen.com/subject/lxmtxrtx.html