一、概述
本文介紹如何將一個較複雜的應用部署到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" ---
使用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
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命令
例如,您可以運行以下命令,在命名空間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
查看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位以上,符合密碼複雜性要求!
出現一段提示,英文翻譯如下:
我們建議您輸入一個電子郵件地址,以便我們偶爾提醒您有關服務的信息。持續跟蹤你的預算統計數據可能特別有效。
這裏我選擇不輸入郵箱,點擊跳過
最後就進入首頁了
本文參考鏈接: