在K8S平台部署Spring cloud微服务项目

22 篇文章 1 订阅

一: 传统部署和K8S部署的区别
传统部署-整体框架


K8S部署-整体框架


二: 安装Maria db并导入数据库
安装Maria db

# yum install mariadb-server mariadb -y

# systemctl start mariadb

# systemctl enable mariadb

# ps -ef|grep mariadb

mysql     14449  14287  0 Jun01 ?        00:01:34 /usr/libexec/mysqld --basedir=

/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --log-error=

/var/log/mariadb/mariadb.log --pid-file=/var/run/mariadb/mariadb.pid --socket=/var/lib/mysql/mysql.sock
root      41610  41561  0 13:30 pts/1    00:00:00 grep --color=auto mariadb

检查服务端口    
# netstat -ntlp|grep 3306
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      14449/mysqld        

# systemctl status mariadb
● mariadb.service - MariaDB database server
   Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2020-06-01 16:01:48 CST; 1 day 21h ago

创建数据库    
# mysql -uroot

Welcome to the MariaDB monitor.  Commands end with ; or \g.

Your MariaDB connection id is 2

Server version: 5.5.65-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

MariaDB [(none)]>

MariaDB [(none)]> create database tb_order;

Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> create database tb_product;

Query OK, 1 row aff

MariaDB [(none)]> create database tb_order;

Query OK, 1 row aff

MariaDB [(none)]> 
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| tb_order           |
| tb_product         |
| tb_stock           |
+--------------------+
6 rows in set (0.01 sec)

MariaDB [(none)]> 

将SQL导入到 数据库中

MariaDB [(none)]>

MariaDB [(none)]>

#将订单服务微服务组件数据导入到tb_order数据库中

MariaDB [(none)]> use tb_order;

Database changed

MariaDB [tb_order]> source /root/software/springcloud/simple-microservice-dev3/db/order.sql;

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 1 row affected (0.00 sec)

Query OK, 0 rows affected (0.02 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

MariaDB [tb_order]>

#将产品服务微服务组件数据导入到tb_product数据库中

MariaDB [tb_order]>

MariaDB [tb_order]> use tb_product ;

Database changed

MariaDB [tb_product]> source /root/software/springcloud/simple-microservice-dev3/db/product.sql

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 1 row affected (0.00 sec)

Query OK, 0 rows affected (0.02 sec)

Query OK, 4 rows affected (0.00 sec)

Records: 4  Duplicates: 0  Warnings: 0

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

MariaDB [tb_product]>

#将库存服务 微服务组件数据导入到 tb_stock数据库中

MariaDB [tb_product]> use tb_stock ;

Database changed

MariaDB [tb_stock]> source /root/software/springcloud/simple-microservice-dev3/db/stock.sql

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 1 row affected (0.00 sec)

Query OK, 0 rows affected (0.01 sec)

Query OK, 4 rows affected (0.00 sec)

Records: 4  Duplicates: 0  Warnings: 0

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

MariaDB [tb_stock]>

MariaDB [tb_stock]>  flush privileges;

Query OK, 0 rows affected (0.00 sec)

MariaDB [tb_stock]>

检查导入的数据    
MariaDB [tb_stock]> show tables;

+--------------------+

| Tables_in_tb_stock |

+--------------------+

| stock              |

+--------------------+

1 row in set (0.00 sec)

MariaDB [tb_stock]>

MariaDB [tb_stock]> use tb_product;

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

Database changed

MariaDB [tb_product]> show tables;

+----------------------+

| Tables_in_tb_product |

+----------------------+

| product              |

+----------------------+

1 row in set (0.00 sec)

MariaDB [tb_product]> use tb_order;

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

Database changed

MariaDB [tb_order]> show tables;

+--------------------+

| Tables_in_tb_order |

+--------------------+

| orders             |

+--------------------+

1 row in set (0.01 sec)

MariaDB [tb_order]>

三: 修改源代码连接数据的地址
修改连接数据库的配置文件    
 xxx-service/src/main/resources/application-fat.yml

例如 产品服务组件,其它

组件方法是一样的

# product-service/product-service-biz/src/main/resources

# cat application-dev.yml

spring:

  datasource:

    url: jdbc:mysql://100.100.100.16:3306/tb_product?characterEncoding=utf-8

    username: root

    password: 123456

    driver-class-name: com.mysql.jdbc.Driver

eureka:

  instance:

    prefer-ip-address: false

  client:

    register-with-eureka: true

    fetch-registry: true

    service-url:

      defaultZone: http://localhost:8888/eureka

# cat application-fat.yml

spring:

  datasource:

    url: jdbc:mysql://100.100.100.16:3306/tb_product?characterEncoding=utf-8

    username: root

    password: 123456

    driver-class-name: com.mysql.jdbc.Driver

eureka:

  instance:

    prefer-ip-address: true

  client:

    register-with-eureka: true

    fetch-registry: true

    service-url:

#

四: 构建环境并将镜像打包到镜像仓库
需要具备 MVN 和jdk 环境

安装JDK    
#

#

# yum install java-1.8.0-openjdk  -y

# rpm -qa|grep openjdk

java-1.8.0-openjdk-headless-1.8.0.252.b09-2.el7_8.x86_64

java-1.8.0-openjdk-1.8.0.252.b09-2.el7_8.x86_64

java-1.8.0-openjdk-devel-1.8.0.252.b09-2.el7_8.x86_64

安装MVN    
#yum install -y maven

# rpm -qa|grep maven

maven-wagon-2.4-3.el7.noarch

maven-3.0.5-17.el7.noarch

#

使用mvn 命令进行打包镜像;

微服务组件打包成镜像

mvn clean(清除上次打包的结果)

package(打包,打成java包)  

-D maven.test.skip=true(跳过单元测试,好多单元测试是有问题的,导致过不去)

# mvn clean package -Dmaven.test.skip=true

Reactor Summary:

[INFO]

[INFO] simple-microservice ............................... SUCCESS [0.105s]

[INFO] basic-common ...................................... SUCCESS [0.002s]

[INFO] basic-common-core ................................. SUCCESS [2.515s]

[INFO] gateway-service ................................... SUCCESS [1.335s]

[INFO] eureka-service .................................... SUCCESS [0.557s]

[INFO] product-service ................................... SUCCESS [0.001s]

[INFO] product-service-api ............................... SUCCESS [0.410s]

[INFO] stock-service ..................................... SUCCESS [0.001s]

[INFO] stock-service-api ................................. SUCCESS [0.414s]

[INFO] product-service-biz ............................... SUCCESS [0.543s]

[INFO] stock-service-biz ................................. SUCCESS [0.459s]

[INFO] order-service ..................................... SUCCESS [0.001s]

[INFO] order-service-api ................................. SUCCESS [0.689s]

[INFO] order-service-biz ................................. SUCCESS [0.485s]

[INFO] basic-common-bom .................................. SUCCESS [0.001s]

[INFO] portal-service .................................... SUCCESS [0.972s]

[INFO] ------------------------------------------------------------------------

[INFO] BUILD SUCCESS

[INFO] ------------------------------------------------------------------------

[INFO] Total time: 9.060s

[INFO] Finished at: Wed Jun 03 10:03:58 CST 2020

[INFO] Final Memory: 80M/661M

[INFO] ------------------------------------------------------------------------

#

打包成功后,会在每个微服务组件的目录产生一个target目录 产生一个jar 文件

打包镜像并推送到镜像仓库

# cat docker_build.sh

#!/bin/bash

docker_registry=100.100.100.11   //镜像仓库

service_list="eureka-service gateway-service order-service product-service stock-service portal-service"

service_list=${1:-${service_list}}

work_dir=$(dirname $PWD)

current_dir=$PWD

cd $work_dir

mvn clean package -Dmaven.test.skip=true

for service in $service_list; do

   cd $work_dir/$service

   if ls |grep biz &>/dev/null; then

      cd ${service}-biz

   fi

   service=${service%-*}

   image_name=$docker_registry/microservice/${service}:$(date +%F-%H-%M-%S)

   docker build -t ${image_name} .

   docker push ${image_name}

done

#

执行 打包镜像角本

#

# docker login 100.100.100.11

Authenticating with existing credentials...

WARNING! Your password will be stored unencrypted in /root/.docker/config.json.

Configure a credential helper to remove this warning. See

https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

#

# ./docker_build.sh

-----------------------------------------------------------------------

--------------------------------------------------------------------

#

已推送到镜像仓库

# docker images

REPOSITORY                                        TAG                   IMAGE ID            CREATED              SIZE

100.100.100.11/microservice/portal       2020-06-03-10-16-07   80b8138d66a0        About a minute ago   209MB

100.100.100.11/microservice/stock        2020-06-03-10-15-57   f76961fdf409        About a minute ago   212MB

100.100.100.11/microservice/product   2020-06-03-10-15-49   52a23d278a40        About a minute ago   212MB

100.100.100.11/microservice/order       2020-06-03-10-15-42   4954a674cd38        About a minute ago   212MB

100.100.100.11/microservice/gateway  2020-06-03-10-15-35   e28dc69a7e8c        About a minute ago   209MB

100.100.100.11/microservice/eureka     2020-06-03-10-15-19   3d6507548335        2 minutes ago        213MB

五: 在K8S平台部署 eureka集群
Eureka 注册中心代码    
# cat eureka.yaml

---

apiVersion: extensions/v1beta1

kind: Ingress

metadata:

  name: eureka

  namespace: ms

spec:

  rules:

    - host: eureka.ctnrs.com

      http:

        paths:

        - path: /

          backend:

            serviceName: eureka

            servicePort: 8888

---

apiVersion: v1

kind: Service

metadata:

  name: eureka

  namespace: ms

spec:

  clusterIP: None

  ports:

  - port: 8888

    name: eureka

  selector:

    project: ms

    app: eureka

---

apiVersion: apps/v1

kind: StatefulSet

metadata:

  name: eureka

  namespace: ms

spec:

  replicas: 3

  selector:

    matchLabels:

      project: ms

      app: eureka

  serviceName: "eureka"

  template:

    metadata:

      labels:

        project: ms

        app: eureka

    spec:

      imagePullSecrets:

      - name: registry-pull-secret

      containers:

      - name: eureka

        image: 100.100.100.11/microservice/eureka:2020-06-01-15-03-49

        ports:

          - protocol: TCP

            containerPort: 8888

        env:

          - name: MY_POD_NAME

            valueFrom:

              fieldRef:

                fieldPath: metadata.name

        resources:

          requests:

            cpu: 0.5

            memory: 256Mi

          limits:

            cpu: 1

            memory: 1Gi

        readinessProbe:

          tcpSocket:

            port: 8888

          initialDelaySeconds: 60

          periodSeconds: 10

        livenessProbe:

          tcpSocket:

            port: 8888

          initialDelaySeconds: 60

          periodSeconds: 10

[root@node-16 k8s]#

创建一个namespace    
#

# kubectl create ns ms;

namespace/ms created

#

# kubectl get ns|grep ms

ms                     Active   57s

#

[root@node-16 k8s]#

创建secret认证    
# kubectl create secret docker-registry registry-pull-secret --docker-server=100.100.100.11 /

--docker-username=admin --docker-password=123456 --docker-email=admin@test.com -n ms

secret/registry-pull-secret created

部署eruka集群    
# kubectl apply -f eureka.yaml

ingress.extensions/eureka created

service/eureka created

statefulset.apps/eureka created

#

Eureka 是有状态的部署的,会一个个启用,先启用 eureka-0

# kubectl get pod -n ms

NAME       READY   STATUS    RESTARTS   AGE

eureka-0   1/1     Running   0          86s

eureka-1   0/1     Running   0          11s

# kubectl get pod -n ms -o wide

NAME       READY   STATUS    RESTARTS   AGE     IP            NODE      NOMINATED NODE   READINESS GATES

eureka-0   1/1     Running   0          2m32s   10.244.1.51   node-17   <none>           <none>

eureka-1   1/1     Running   0          77s     10.244.0.35   node-18   <none>           <none>

eureka-2   0/1     Running   0          5s      10.244.2.57   node-16   <none>           <none>#

验证Eureka解析    
# kubectl exec -it eureka-0 sh -n ms

/ # nslookup eureka

nslookup: can't resolve '(null)': Name does not resolve

Name:      eureka

Address 1: 10.244.1.51 eureka-0.eureka.ms.svc.cluster.local

Address 2: 10.244.0.35 eureka-1.eureka.ms.svc.cluster.local

Address 3: 10.244.2.57 eureka-2.eureka.ms.svc.cluster.local

/ #

/ #

/ # nslookup kubernetes.default

nslookup: can't resolve '(null)': Name does not resolve

Name:      kubernetes.default

Address 1: 10.0.0.1 kubernetes.default.svc.cluster.local

/ #

访问Eureka管理界面    
六: 部署网关gateway
yaml程序

#

# ls

docker_build.sh 

docker_build.sh.bak 

eureka.yaml              //注册 中心

gateway.yaml           //网关

order.yaml                //订单服务

portal.yaml              //前端

product.yaml          //产品服务

stock.yaml             //库存服务

#

# cat gateway.yaml 
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: gateway 
  namespace: ms 
spec:
  rules:
    - host: gateway.ctnrs.com 
      http:
        paths:
        - path: /
          backend:
            serviceName: gateway
            servicePort: 9999
---
apiVersion: v1
kind: Service
metadata:
  name: gateway
  namespace: ms
spec:
  ports:
  - port: 9999 
    name: gateway
  selector:
    project: ms
    app: gateway
---
apiVersion: apps/v1
kind: Deployment 
metadata:
  name: gateway
  namespace: ms 
spec:
  replicas: 1
  selector:
    matchLabels:
      project: ms
      app: gateway
  template:
    metadata:
      labels:
        project: ms 
        app: gateway
    spec:
      imagePullSecrets:
      - name: registry-pull-secret
      containers:
      - name: gateway
        image: 100.100.100.11/microservice/gateway:2020-06-03-11-52-10
        imagePullPolicy: Always
        ports:
          - protocol: TCP
            containerPort: 9999 
        env:
          - name: JAVA_OPTS
            value: "-Xmx1g"
        resources:
          requests:
            cpu: 0.5
            memory: 256Mi
          limits:
            cpu: 1
            memory: 1Gi
        readinessProbe:
          tcpSocket:
            port: 9999
          initialDelaySeconds: 60
          periodSeconds: 10
        livenessProbe:
          tcpSocket:
            port: 9999
          initialDelaySeconds: 60
          periodSeconds: 10

部署网关服务组件

# ./docker_build.sh gateway-service

ingress.extensions/gateway created

service/gateway created

deployment.apps/gateway created

#

七: 部署微服务业务程序
部署微服务业务程序与前端

#部署产品服务

# ./docker_build.sh product-service

Successfully built 8aedd0a0168d

Successfully tagged 10.83.35.11/microservice/product:2020-06-02-16-31-33

The push refers to repository [10.83.35.11/microservice/product]

a040b55736bc: Pushed

2767a363d982: Layer already exists

a1e7033f082e: Layer already exists

78075328e0da: Layer already exists

9f8566ee5135: Layer already exists

2020-06-02-16-31-33: digest: sha256:cbdba1c25bf29b129dc7de77f4cf62f5bf7efb72419ed625f88a6ae9c0f24376 size: 1370

deployment.apps/product created

#

部署库存服务

# ./docker_build.sh stock-service

…………………………………………………………………..

The push refers to repository [10.83.35.11/microservice/stock]

850505111769: Pushed

2767a363d982: Layer already exists

a1e7033f082e: Layer already exists

78075328e0da: Layer already exists

9f8566ee5135: Layer already exists

2020-06-02-16-32-55: digest: sha256:40d71b8cc74b6faae91ff45a562ddb75d22f673fc810c2a60e4a043be21f87f5 size: 1370

deployment.apps/stock created

[root@node-16 k8s]#

部署订单服务

# ./docker_build.sh order-service

---------

The push refers to repository [10.83.35.11/microservice/order]

2030ae40a392: Pushed

2767a363d982: Layer already exists

a1e7033f082e: Layer already exists

78075328e0da: Layer already exists

9f8566ee5135: Layer already exists

2020-06-02-16-34-48: digest: sha256:463b3e27a4ed4b5f70bc01a9f5877326938f82d2ca2c24befabd61ac0b840315 size: 1370

deployment.apps/order created

[root@node-16 k8s]#

部署前端服务

 ./docker_build.sh portal-service

------------------------------------------------------

2767a363d982: Layer already exists

a1e7033f082e: Layer already exists

78075328e0da: Layer already exists

9f8566ee5135: Layer already exists

2020-06-02-16-35-32: digest: sha256:d10679e18a1eb15b0e8751e74de6b1ff2fd3e574da210454d080e3c28836d19c size: 1370

ingress.extensions/portal created

service/portal created

deployment.apps/portal created

[root@node-16 k8s]#

查看我们的微服务正常运行,这个根据自己的业务量启动副本数

# kubectl get pod,svc,ing -n ms

NAME                           READY   STATUS    RESTARTS   AGE

pod/eureka-0                   1/1     Running   0          20h

pod/eureka-1                   1/1     Running   0          20h

pod/eureka-2                   1/1     Running   0          20h

pod/gateway-89d85fdfb-bqbg9    1/1     Running   0          13m

pod/order-94dfb7c77-6fl27      1/1     Running   0          119s

pod/portal-664f5bd797-k2zjd    1/1     Running   0          74s

pod/product-7b7554fb8b-z4gtd   1/1     Running   0          5m12s

pod/stock-5558d8ddbb-wh4rg     1/1     Running   0          3m50s

NAME              TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE

service/eureka    ClusterIP   None         <none>        8888/TCP   20h

service/gateway   ClusterIP   10.0.0.183   <none>        9999/TCP   13m

service/portal    ClusterIP   10.0.0.87    <none>        8080/TCP   74s

NAME                         HOSTS               ADDRESS   PORTS   AGE

ingress.extensions/eureka    eureka.ctnrs.com              80      20h

ingress.extensions/gateway   gateway.ctnrs.com             80      13m

ingress.extensions/portal    portal.ctnrs.com              80      74s

[root@node-16 k8s]#

八: 注册中心检查服务组件
Eureka 有三台pod组成分别分配在

三个node上面,三台数据同步

实现Node高冗余


微服务组件自动注册到ureka中

微服务组件是以ip +端口的方式

注册到Ureka中


九: 前端应用访问
前端域名

portal.ctnrs.com

# kubectl get ing -n ms

NAME                         HOSTS               ADDRESS   PORTS   AGE
ingress.extensions/eureka    eureka.ctnrs.com              80      42h
ingress.extensions/gateway   gateway.ctnrs.com             80      141m
ingress.extensions/portal    portal.ctnrs.com              80      141m

查询商品服务    


 

查询订单服务    


 

微服务验证在K8S平台部署成功!

 
————————————————
版权声明:本文为CSDN博主「wx_doitroot」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_40017427/article/details/106521729

#########################################

k8s部署校园网系统、学生成绩查询、论坛、springboot项目、java项目
https://blog.csdn.net/yanggd1987/article/details/107628001讲了k8s部署springboot的几个需要注意的地方(存储、资源限制、健康检查)
https://blog.csdn.net/weixin_44729138/article/details/106023274讲了springboot的打包
https://blog.csdn.net/u010948569/article/details/107125243
https://blog.csdn.net/qq_34125999/article/details/108722892
https://blog.csdn.net/beijie1930/article/details/100953275
https://blog.csdn.net/yanggd1987/article/details/109635821
https://blog.csdn.net/weixin_39132936/article/details/103260481
https://blog.csdn.net/mryang125/article/details/108456272
https://www.cnblogs.com/cannel/p/11104250.html
https://blog.csdn.net/mryang125/article/details/108456272打包jar包
https://blog.csdn.net/ciqingloveless/article/details/82467077
https://blog.csdn.net/qq_40017427/article/details/106521729打包mvn包
https://blog.csdn.net/m0_50180963/article/details/113646027

https://www.jianshu.com/p/d6835a121bae?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值