一: 传统部署和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 |
检查服务端口 | # netstat -ntlp|grep 3306
# systemctl status mariadb |
创建数据库 | # 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)]> |
将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 |
部署网关服务组件 | # ./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 |
查询商品服务 |
|
查询订单服务 |
|
微服务验证在K8S平台部署成功!