使用Helm部署微服務應用PiggyMetrics

一、概述

本文介紹如何將一個較複雜的應用部署到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-mongodbstatistics-mongodbnotification-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   <none>       27017/TCP                       0s
account-service       ClusterIP     10.1.79.137   <none>       6000/TCP                        0s
auth-mongodb          ClusterIP     10.1.37.220   <none>       27017/TCP                       0s
auth-service          ClusterIP     10.1.241.143  <none>       5000/TCP                        0s
config                ClusterIP     10.1.104.247  <none>       8888/TCP                        0s
gateway               LoadBalancer  10.1.186.147  <pending>    4000:30023/TCP                  0s
monitoring            LoadBalancer  10.1.180.30   <pending>    9000:32101/TCP,8989:30052/TCP   0s
notification-mongodb  ClusterIP     10.1.7.3      <none>       27017/TCP                       0s
notification-service  ClusterIP     10.1.109.117  <none>       8000/TCP                        0s
rabbitmq              NodePort      10.1.245.70   <none>       5672:31239/TCP,15672:31437/TCP  0s
registry              LoadBalancer  10.1.250.187  <pending>    8761:31604/TCP                  0s
statistics-mongodb    ClusterIP     10.1.81.216   <none>       27017/TCP                       0s
statistics-service    ClusterIP     10.1.133.191  <none>       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    <none>        27017/TCP                        6m45s
account-service        ClusterIP      10.1.79.137    <none>        6000/TCP                         6m45s
auth-mongodb           ClusterIP      10.1.37.220    <none>        27017/TCP                        6m45s
auth-service           ClusterIP      10.1.241.143   <none>        5000/TCP                         6m45s
config                 ClusterIP      10.1.104.247   <none>        8888/TCP                         6m45s
gateway                LoadBalancer   10.1.186.147   <pending>     4000:30023/TCP                   6m45s
monitoring             LoadBalancer   10.1.180.30    <pending>     9000:32101/TCP,8989:30052/TCP    6m45s
notification-mongodb   ClusterIP      10.1.7.3       <none>        27017/TCP                        6m45s
notification-service   ClusterIP      10.1.109.117   <none>        8000/TCP                         6m45s
rabbitmq               NodePort       10.1.245.70    <none>        5672:31239/TCP,15672:31437/TCP   6m45s
registry               LoadBalancer   10.1.250.187   <pending>     8761:31604/TCP                   6m45s
statistics-mongodb     ClusterIP      10.1.81.216    <none>        27017/TCP                        6m45s
statistics-service     ClusterIP      10.1.133.191   <none>        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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章