一、概述

本文介绍如何将一个较复杂的应用部署到Kubernetes容器服务上,下面将从基础设施和应用部署的不同组合方式,来部署一个复杂的SpringCloud应用。

PiggyMetrics

PiggyMetrics是github上的一个SpringCloud应用项目,Star数目3400多。这个项目主体采用Docker Compose部署,包含了完整的源代码以及构建好的容器镜像,是非常不错的SpringCloud容器化示例。

 

 

 

这个项目包含了3个业务微服务,分别是统计服务(Statistics Service)、账户服务(Account Service)和通知服务(Notification Service)。每个服务分别对应一个独立的MongoDB。微服务架构图示(采用作者原图)如下:

 

 

 

 

SpringCloud基础组件负责服务注册和registry服务(Eureka服务注册),config服务(配置管理),gateway(API网关,同时也是JavaScript Web界面),monitor服务(Hystrix Dashboard/Turbine)等。

 

二、用helm一键部署所有服务

修改docker-compose

1. 修改PiggyMetrics应用程序的Docker编写文件切换配置文件版本。PiggyMetrics的部署采用docker-compose YAML部署到单机,如果要部署到Kubernetes环境中 ,需要转换成为Kubernetes deployment YAML。

说明 PiggyMetrics中的docker compose模版为2.1,kompose不支持该版本,所以需要把compose文件改为版本2。

 

2. 在docker-compose.yml文件中。

去除kompose不支持的语法。

depends_on:

config:

condition: service_healthy # 不支持 condition

增加Kubernetes server type annotation。

depends_on:

- config

labels:

kompose.service.type: loadbalancer

在docker-compose.dev.yml文件中,将PiggyMetrics应用程序使用的四个MongoDB数据库的外部端口更改为27017。

说明 PiggyMetrics应用包含四个MongoDB数据库,分别由 auth-mongodb, 、account-mongodb、statistics-mongodb和 notification-mongodb这四个字段定义。

完整的YAML文件示例如下:

version: '2'

services:

rabbitmq:

image: rabbitmq:3-management

restart: always

labels:

kompose.service.type: nodeport

ports:

- 5672

- 15672:15672

logging:

options:

max-size: "10m"

max-file: "10"

config:

environment:

CONFIG_SERVICE_PASSWORD: $CONFIG_SERVICE_PASSWORD

image: sqshq/piggymetrics-config

restart: always

ports:

- 8888

logging:

options:

max-size: "10m"

max-file: "10"

registry:

environment:

CONFIG_SERVICE_PASSWORD: $CONFIG_SERVICE_PASSWORD

image: sqshq/piggymetrics-registry

restart: always

depends_on:

- config

labels:

kompose.service.type: loadbalancer

ports:

- 8761:8761

logging:

options:

max-size: "10m"

max-file: "10"

gateway:

environment:

CONFIG_SERVICE_PASSWORD: $CONFIG_SERVICE_PASSWORD

image: sqshq/piggymetrics-gateway

restart: always

depends_on:

- config

labels:

kompose.service.type: loadbalancer

ports:

- 4000:4000

logging:

options:

max-size: "10m"

max-file: "10"

auth-service:

environment:

CONFIG_SERVICE_PASSWORD: $CONFIG_SERVICE_PASSWORD

NOTIFICATION_SERVICE_PASSWORD: $NOTIFICATION_SERVICE_PASSWORD

STATISTICS_SERVICE_PASSWORD: $STATISTICS_SERVICE_PASSWORD

ACCOUNT_SERVICE_PASSWORD: $ACCOUNT_SERVICE_PASSWORD

MONGODB_PASSWORD: $MONGODB_PASSWORD

image: sqshq/piggymetrics-auth-service

restart: always

ports:

- 5000

depends_on:

- config

logging:

options:

max-size: "10m"

max-file: "10"

auth-mongodb:

environment:

MONGODB_PASSWORD: $MONGODB_PASSWORD

image: sqshq/piggymetrics-mongodb

restart: always

ports:

- 27017

logging:

options:

max-size: "10m"

max-file: "10"

account-service:

environment:

CONFIG_SERVICE_PASSWORD: $CONFIG_SERVICE_PASSWORD

ACCOUNT_SERVICE_PASSWORD: $ACCOUNT_SERVICE_PASSWORD

MONGODB_PASSWORD: $MONGODB_PASSWORD

image: sqshq/piggymetrics-account-service

restart: always

ports:

- 6000

depends_on:

- config

logging:

options:

max-size: "10m"

max-file: "10"

account-mongodb:

environment:

INIT_DUMP: account-service-dump.js

MONGODB_PASSWORD: $MONGODB_PASSWORD

image: sqshq/piggymetrics-mongodb

restart: always

ports:

- 27017

logging:

options:

max-size: "10m"

max-file: "10"

statistics-service:

environment:

CONFIG_SERVICE_PASSWORD: $CONFIG_SERVICE_PASSWORD

MONGODB_PASSWORD: $MONGODB_PASSWORD

STATISTICS_SERVICE_PASSWORD: $STATISTICS_SERVICE_PASSWORD

image: sqshq/piggymetrics-statistics-service

restart: always

ports:

- 8888

depends_on:

- config

logging:

options:

max-size: "10m"

max-file: "10"

statistics-mongodb:

environment:

MONGODB_PASSWORD: $MONGODB_PASSWORD

image: sqshq/piggymetrics-mongodb

restart: always

ports:

- 27017

logging:

options:

max-size: "10m"

max-file: "10"

notification-service:

environment:

CONFIG_SERVICE_PASSWORD: $CONFIG_SERVICE_PASSWORD

MONGODB_PASSWORD: $MONGODB_PASSWORD

NOTIFICATION_SERVICE_PASSWORD: $NOTIFICATION_SERVICE_PASSWORD

image: sqshq/piggymetrics-notification-service

restart: always

ports:

- 8000

depends_on:

- config

logging:

options:

max-size: "10m"

max-file: "10"

notification-mongodb:

image: sqshq/piggymetrics-mongodb

restart: always

environment:

MONGODB_PASSWORD: $MONGODB_PASSWORD

ports:

- 27017

logging:

options:

max-size: "10m"

max-file: "10"

monitoring:

environment:

CONFIG_SERVICE_PASSWORD: $CONFIG_SERVICE_PASSWORD

image: sqshq/piggymetrics-monitoring

restart: always

depends_on:

- config

labels:

kompose.service.type: loadbalancer

ports:

- 9000:8080

- 8989:8989

logging:

options:

max-size: "10m"

max-file: "10"

---

View Code

 

使用Kompose生成Kubernetes配置文件

2. 使用Kompose生成Kubernetes配置文件来部署PiggyMetrics应用。

设定PiggyMetrics部署所需的环境变量。

export NOTIFICATION_SERVICE_PASSWORD=passw0rd

export CONFIG_SERVICE_PASSWORD=passw0rd

export STATISTICS_SERVICE_PASSWORD=passw0rd

export ACCOUNT_SERVICE_PASSWORD=passw0rd

export MONGODB_PASSWORD=passw0rd

 

运行以下命令将compose文件转换为Kubernetes配置文件。

kompose工具可以一键将compose文件转换为Kubernetes配置文件。

安装kompose

curl -L https://github.com/kubernetes/kompose/releases/download/v1.21.0/kompose-linux-amd64 -o kompose

chmod +x kompose

sudo mv ./kompose /usr/local/bin/kompose

 

转换配置文件

kompose convert -f docker-compose.yml -o piggymetrics -c

注意:原文给的还指定了docker-compose.dev.yml,执行会报错。提示docker-compose版本号不一致。

FATA All Docker Compose files must be of the same version

 

即使将2个yaml文件版本号改为一致,在后面执行helm install 命令时,会报错:

Error: release piggy failed: Service "config" is invalid: spec.ports[1]: Duplicate value: core.ServicePort{Name:"", Protocol:"TCP", AppProtocol:(*string)(nil), Port:8888, TargetPort:intstr.IntOrString{Type:0, IntVal:0, StrVal:""}, NodePort:0}

 

执行成功后,会生成文件夹piggymetrics,目录结构如下:

./

├── Chart.yaml

├── README.md

└── templates

├── account-mongodb-deployment.yaml

├── account-mongodb-service.yaml

├── account-service-deployment.yaml

├── account-service-service.yaml

├── auth-mongodb-deployment.yaml

├── auth-mongodb-service.yaml

├── auth-service-deployment.yaml

├── auth-service-service.yaml

├── config-deployment.yaml

├── config-service.yaml

├── gateway-deployment.yaml

├── gateway-service.yaml

├── monitoring-deployment.yaml

├── monitoring-service.yaml

├── notification-mongodb-deployment.yaml

├── notification-mongodb-service.yaml

├── notification-service-deployment.yaml

├── notification-service-service.yaml

├── rabbitmq-deployment.yaml

├── rabbitmq-service.yaml

├── registry-deployment.yaml

├── registry-service.yaml

├── statistics-mongodb-deployment.yaml

├── statistics-mongodb-service.yaml

├── statistics-service-deployment.yaml

└── statistics-service-service.yaml

 

运行helm install命令

运行helm install命令,在Kubernetes集群中部署PiggyMetrics应用。

例如,您可以运行以下命令,在命名空间pm中部署名为piggy的应用。

helm install --namespace pm --name piggy piggymetrics/

输出如下:

NAME: piggy

LAST DEPLOYED: Sun Apr 26 13:30:46 2020

NAMESPACE: pm

STATUS: DEPLOYED

RESOURCES:

==> v1/Deployment

NAME READY UP-TO-DATE AVAILABLE AGE

account-mongodb 0/1 0 0 0s

account-service 0/1 0 0 0s

auth-mongodb 0/1 0 0 0s

auth-service 0/1 0 0 0s

config 0/1 0 0 0s

gateway 0/1 0 0 0s

monitoring 0/1 0 0 0s

notification-mongodb 0/1 0 0 0s

notification-service 0/1 0 0 0s

rabbitmq 0/1 0 0 0s

registry 0/1 0 0 0s

statistics-mongodb 0/1 0 0 0s

statistics-service 0/1 0 0 0s

==> v1/Pod(related)

NAME READY STATUS RESTARTS AGE

statistics-mongodb-655997cb95-jlfrf 0/1 ContainerCreating 0 1s

statistics-mongodb-655997cb95-jlfrf 0/1 ContainerCreating 0 1s

statistics-mongodb-655997cb95-jlfrf 0/1 ContainerCreating 0 1s

statistics-mongodb-655997cb95-jlfrf 0/1 ContainerCreating 0 1s

statistics-mongodb-655997cb95-jlfrf 0/1 ContainerCreating 0 1s

statistics-mongodb-655997cb95-jlfrf 0/1 ContainerCreating 0 1s

statistics-mongodb-655997cb95-jlfrf 0/1 ContainerCreating 0 1s

statistics-mongodb-655997cb95-jlfrf 0/1 ContainerCreating 0 1s

statistics-mongodb-655997cb95-jlfrf 0/1 ContainerCreating 0 1s

statistics-mongodb-655997cb95-jlfrf 0/1 ContainerCreating 0 1s

statistics-mongodb-655997cb95-jlfrf 0/1 ContainerCreating 0 1s

statistics-mongodb-655997cb95-jlfrf 0/1 ContainerCreating 0 1s

statistics-mongodb-655997cb95-jlfrf 0/1 ContainerCreating 0 1s

==> v1/Service

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

account-mongodb ClusterIP 10.1.186.96 27017/TCP 0s

account-service ClusterIP 10.1.79.137 6000/TCP 0s

auth-mongodb ClusterIP 10.1.37.220 27017/TCP 0s

auth-service ClusterIP 10.1.241.143 5000/TCP 0s

config ClusterIP 10.1.104.247 8888/TCP 0s

gateway LoadBalancer 10.1.186.147 4000:30023/TCP 0s

monitoring LoadBalancer 10.1.180.30 9000:32101/TCP,8989:30052/TCP 0s

notification-mongodb ClusterIP 10.1.7.3 27017/TCP 0s

notification-service ClusterIP 10.1.109.117 8000/TCP 0s

rabbitmq NodePort 10.1.245.70 5672:31239/TCP,15672:31437/TCP 0s

registry LoadBalancer 10.1.250.187 8761:31604/TCP 0s

statistics-mongodb ClusterIP 10.1.81.216 27017/TCP 0s

statistics-service ClusterIP 10.1.133.191 8888/TCP 0s

View Code

 

查看pod

# kubectl get pods -n pm

NAME READY STATUS RESTARTS AGE

account-mongodb-7bc77558fb-s8bvk 1/1 Running 0 6m

account-service-85c54b8b7d-cf6mt 1/1 Running 1 6m

auth-mongodb-5655cdc9b5-n5k8l 1/1 Running 0 6m

auth-service-7957d49b5d-vrsxc 1/1 Running 1 6m

config-5ffdb754c6-lxmxs 1/1 Running 0 6m

gateway-6dff676c4c-cvstn 1/1 Running 2 6m

monitoring-857c68fc4f-brc7n 1/1 Running 1 6m

notification-mongodb-74fb57b5b7-298sd 1/1 Running 0 5m59s

notification-service-dffc5c5db-rn2pm 1/1 Running 1 5m59s

rabbitmq-dbff5d4f7-2w2zk 1/1 Running 0 6m

registry-695b4f945b-2kr7k 1/1 Running 1 5m59s

statistics-mongodb-655997cb95-jlfrf 1/1 Running 0 6m

statistics-service-c9b9d5df4-cnz29 1/1 Running 1 6m

注意:PiggyMetrics的所有pod都运行在pm这个命名空间下。

 

查看svc

# kubectl get svc -n pm

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

account-mongodb ClusterIP 10.1.186.96 27017/TCP 6m45s

account-service ClusterIP 10.1.79.137 6000/TCP 6m45s

auth-mongodb ClusterIP 10.1.37.220 27017/TCP 6m45s

auth-service ClusterIP 10.1.241.143 5000/TCP 6m45s

config ClusterIP 10.1.104.247 8888/TCP 6m45s

gateway LoadBalancer 10.1.186.147 4000:30023/TCP 6m45s

monitoring LoadBalancer 10.1.180.30 9000:32101/TCP,8989:30052/TCP 6m45s

notification-mongodb ClusterIP 10.1.7.3 27017/TCP 6m45s

notification-service ClusterIP 10.1.109.117 8000/TCP 6m45s

rabbitmq NodePort 10.1.245.70 5672:31239/TCP,15672:31437/TCP 6m45s

registry LoadBalancer 10.1.250.187 8761:31604/TCP 6m45s

statistics-mongodb ClusterIP 10.1.81.216 27017/TCP 6m45s

statistics-service ClusterIP 10.1.133.191 8888/TCP 6m45s

这里面展示的NAME名称,就是SpringCloud各个组件的通讯地址。解析出的地址,就是cluster ip。

 

查看eureka

http://192.168.128.130:2173/

注意:将上面的ip改为master或者node节点ip

 

效果如下:

 

 

 

访问后台页面

http://192.168.128.130:30023/

 

效果如下:

 

 

 

 由于默认的用户名和密码不知道,这里可以创建一个。注意:密码必须8位以上,符合密码复杂性要求!

 

 

 

出现一段提示,英文翻译如下:

我们建议您输入一个电子邮件地址,以便我们偶尔提醒您有关服务的信息。持续跟踪你的预算统计数据可能特别有效。

这里我选择不输入邮箱,点击跳过

 

 

 

 

 

 

 

 最后就进入首页了

 

 

 

 

本文参考链接:

https://www.alibabacloud.com/help/zh/doc-detail/85935.htm

推荐文章

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。