百度網盤mysql
提取碼:qhhv
nginx
以容器爲資源分割和調度的基本單位,封裝整個軟件運行時環境,爲開發者和系統管理員提供用於構建,發佈和運行分佈式應用的平臺git
兼具IaaS的靈活和PaaS的便利github
容器化運行,一切都封裝在鏡像裏spring
實現更快速的交付和部署sql
更易於微服務架構的實現docker
更高效的虛擬化數據庫
像搭積木同樣的進行資源編排json
易於擴展和遷移瀏覽器
以容器爲載體,編排爲核心的第二代雲計算技術
傳統雲 | 容器雲 | |
---|---|---|
維度 | 資源維度 | 服務維度 |
服務 | IAAS | CAAS |
關注 | 物理資源(計算,網絡,存儲)的池化,實現資源與業務的解耦 | 底層環境(構架,運行時,中間件)服務對象化,實現業務與基礎設施解耦 |
目標 | 提升資源利用率,下降硬件成本 支撐產品可以快速迭代 | 提高研發效率,保障高可用性,實現彈性伸縮應對業務爆發等 |
產品 | OpenStack CloudStack VMware |
Swarm Mesos Kubernetes |
一套技術體系和一套方法論,包括DevOps、持續交付、微服務、敏捷基礎設施等,是一系列雲技術和企業管理方法的集合,經過實踐及與其餘工具相結合更好地幫助用戶實現數字化轉型
CNCF(雲原生計算基金會)的理解:
雲原生的本質就是雲和原生,雲是指容器雲生態,原生是說開箱即用,不用開發定製
雲原生的概念怎麼來的?如今這麼流行!
我的見解:
思考:CNCF 爲何以 Kubernetes 爲核心構建生態?
編排系統不止一個,理念先進也未必,畢竟Borg系統十幾年前就有
問題:CNCF爲何以Kubernetes爲核心構建生態?
國內某大廠雲公司CTO的見解:
爲 Docker 爲起點的容器技術和微服務架構的興起,攪動了傳統雲市場,也讓某些雲廠商看到了彎道超車的機會,這個雲廠商就是 Google
目前全球雲計算市場的格局是 AWS 領先,微軟,阿里雲,Google 居後,其它雲公司跟隨,對於Google 這家以技術見長的公司來講,現狀是不可接受的
超車的方法就是主導容器生態的發展,屏蔽IaaS的差別,讓容器生態朝本身有利的方向演進,有利於 其它雲廠商的客戶遷移,提升市場份額
具體方法就是以 Borg 爲藍本推出 Kubernetes,聯合 Redhat,CoreOS 等公司成立 CNCF 基金會
實質是商業邏輯,要主導容器生態,先幹 Docker 公司,對有錢有技術有影響力的 Google 來講 So easy
自從雲原生提出以來,雲原生的定義就一直在持續的發展。這也說明了,雲原生的發展隨着技術的發展而不斷的發展。
我的理解,所謂的雲原生,創建在雲計算,容器,微服務的基礎之上,理想的狀況下,用戶只需關心業務邏輯,其餘的都交給雲原生。
近年來,由虛擬機的發展 -> 基於虛擬機發展起來的雲計算&IAAS\PAAS\SAAS -> 容器&容器編排,最終造成了今日的雲形態。
雲上,形態的發展由IAAS -> PAAS -> SAAS,由下圖咱們能夠看到,愈來愈多的組件下沉到基礎設施中,用戶從繁重的非業務邏輯中逐漸的解脫,這裏延伸下FAAS(函數即服務)用戶FAAS架構下,用戶關心的對象是業務邏輯相關函數,非業務邏輯好比數據的讀取、登陸的驗證等等無需用戶關心。從這裏咱們能夠看出一個趨勢,愈來愈多的服務下沉到基礎設施層,用戶僅需關心本身的業務邏輯。
Apollo(阿波羅)是攜程框架部門研發的分佈式配置中心,可以集中化管理應用不一樣環境、不一樣集羣的配置,配置修改後可以實時推送到應用端,而且具有規範的權限、流程治理等特性,適用於微服務配置管理場景。
如官網所述:Apollo 是攜程打造的開源配置中心,GitHub的星星也快點滿22K,所以足見它的成熟度和社區活躍度。所以最近在作配置中心選型的時候,通過一番預演,最終敲定Apollo。
Apollo做爲微服務體系中必不可少的基礎服務,其架構設計和基本使用咱們不得不有所瞭解。
所以本文接下來將主要來介紹如何基於Helm快速部署Apollo集羣至K8S,並與.NET Core應用進行集成,同時介紹下如何平滑遷移配置到Apollo。
本文具備詳細的部署步驟,建議動手實操。
部署Chart包和Demo已上傳至GitHub:K8S.NET.Apollo,可收藏備用。
在部署以前,須要瞭解Apollo的基礎架構,以便在後續部署工做的展開。
關於其的解讀,我這裏就再也不詳細展開,但如下幾點仍是要有所瞭解,感興趣的能夠直接看官網詳細介紹:Apollo配置中心設計。
基於上面對Apollo的介紹,其物理架構總結起來就是:
由於Apollo 1.7.0版本增長了基於Kubernetes原生服務發現的部署模式,來替換內置的Eureka,因此在總體部署上有很大簡化,同時官方也提供了Helm Charts,讓Apollo更加易於開箱即用。下面就以部署一套測試環境爲例講解一下Apollo的部署要點。(部署至本機Docker Desktop Local K8S環境)。
環境要求: Kubernetes 1.10+,Helm 3
從上圖的物理架構上來看,首先要部署好Config DB和PortalDB。關於DB的搭建,建議直接使用bitnami/mysql
chart搭建。搭建步驟以下:
> helm repo add bitnami https://charts.bitnami.com/bitnami > helm repo list > helm repo update > helm search repo bitnami/mysql NAME CHART VERSION APP VERSION DESCRIPTION bitnami/mysql 6.14.8 8.0.21 Chart to create a Highly available MySQL cluster
執行helm包的安裝,須要自定義配置文件,也就是values.yaml
。咱們能夠先行下載 mysql chart包。
之因此選擇將chart包下載到本地,是爲了確保後續維護可以基於一致的chart包版本。避免由於執行
helm repo update
致使chart包版本自動升級,而不自知。
> helm pull bitnami/mysql --untar //下載並解包 mysql ├── Chart.yaml ├── ci │ └── values-production.yaml ├── files │ └── docker-entrypoint-initdb.d │ └── README.md ├── README.md ├── templates │ ├── initialization-configmap.yaml │ ├── master-configmap.yaml │ ├── master-statefulset.yaml │ ├── master-svc.yaml │ ├── NOTES.txt │ ├── secrets.yaml │ ├── serviceaccount.yaml │ ├── servicemonitor.yaml │ ├── slave-configmap.yaml │ ├── slave-statefulset.yaml │ ├── slave-svc.yaml │ └── _helpers.tpl ├── values-production.yaml └── values.yaml
根據官網分佈式部署指南中所示,其提供了DB的初始化腳本用來分別建立ApolloConfigDB
和ApolloPortalDB
。所以能夠直接將以上SQL腳本下載到mysql chart的files/docker-entrypoint-initdb.d
目錄下,這樣在部署mysql實例時就會自動執行腳本建立數據庫。
> cd mysql/files/docker-entrypoint-initdb.d > curl https://raw.githubusercontent.com/ctripcorp/apollo/master/scripts/sql/apolloportaldb.sql > apolloportaldb.sql //下載apolloportaldb.sql > curl https://raw.githubusercontent.com/ctripcorp/apollo/master/scripts/sql/apolloconfigdb.sql > apolloconfigdb.sql 下載apolloconfigdb.sql > ls Directory: C:\Users\Shengjie\k8s\helm\charts\apollo\mysql\files\docker-entrypoint-initdb.d Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 8/12/2020 11:01 PM 21291 apolloconfigdb.sql -a--- 8/12/2020 10:56 PM 16278 apolloportaldb.sql -a--- 8/9/2020 6:26 PM 242 README.md
而後複製values.yaml
並命名爲dev-mysql-values.yaml
。而後修改核心配置:
kubectl get sc
查看集羣支持的storageClass,我這邊選擇默認的hostpath。其建立的pv的默認回收策略爲delete,也就意味着卸載mysql,數據直接刪除,這點須要注意!!!若是須要保留測試數據,請更新storageClass。修改完畢後,執行如下腳本進行安裝:
> kubectl create ns db #建立單獨db命名空間 > helm install mysql-apollo . -f dev-mysql-values.yaml -n db NAME: mysql-apollo LAST DEPLOYED: Sun Aug 16 11:01:18 2020 NAMESPACE: db STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: Please be patient while the chart is being deployed Tip: Watch the deployment status using the command: kubectl get pods -w --namespace db Services: echo Master: mysql-apollo.db.svc.cluster.local:3306 echo Slave: mysql-apollo-slave.db.svc.cluster.local:3306 Administrator credentials: echo Username: root echo Password : $(kubectl get secret --namespace db mysql-apollo -o jsonpath="{.data.mysql-root-password}" | base64 --decode) To connect to your database: 1. Run a pod that you can use as a client: kubectl run mysql-apollo-client --rm --tty -i --restart='Never' --image docker.io/bitnami/mysql:8.0.21-debian-10-r17 --namespace db --command -- bash 2. To connect to master service (read/write): mysql -h mysql-apollo.db.svc.cluster.local -uroot -p my_database 3. To connect to slave service (read-only): mysql -h mysql-apollo-slave.db.svc.cluster.local -uroot -p my_database To upgrade this helm chart: 1. Obtain the password as described on the 'Administrator credentials' section and set the 'root.password' parameter as shown below: ROOT_PASSWORD=$(kubectl get secret --namespace db mysql-apollo -o jsonpath="{.data.mysql-root-password}" | base64 --decode) helm upgrade mysql-apollo bitnami/mysql --set root.password=$ROOT_PASSWORD
按照上面提示,驗證數據庫成功建立:
> kubectl run mysql-apollo-client --rm --tty -i --restart='Never' --image docker.io/bitnami/mysql:8.0.21-debian-10-r17 --namespace db --command -- bash # 建立mysql-client pod I have no name!@mysql-apollo-client:/$ mysql -h mysql-apollo.db.svc.cluster.local -uroot -proot # 鏈接至master 節點 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 61 Server version: 8.0.21 Source distribution Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show databases; # 查看databases; +--------------------+ | Database | +--------------------+ | ApolloConfigDB | | ApolloPortalDB | | information_schema | | my_database | | mysql | | performance_schema | | sys | +--------------------+ 7 rows in set (0.00 sec) mysql> use ApolloConfigDB; # 切換至ApolloConfigDB; 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 mysql> show tables; # 查看數據表; +--------------------------+ | Tables_in_ApolloConfigDB | +--------------------------+ | AccessKey | | App | | AppNamespace | | Audit | | Cluster | | Commit | | GrayReleaseRule | | Instance | | InstanceConfig | | Item | | Namespace | | NamespaceLock | | Release | | ReleaseHistory | | ReleaseMessage | | ServerConfig | +--------------------------+ 16 rows in set (0.01 sec)
至此,確認Apollo ConfigDB和PortalDB搭建成功。
搭建Apollo Service 須要添加攜程官方chart倉庫:
> helm repo add apollo http://ctripcorp.github.io/apollo/charts > helm search repo apollo NAME CHART VERSION APP VERSION DESCRIPTION apollo/apollo-portal 0.1.0 1.7.0 A Helm chart for Apollo Portal apollo/apollo-service 0.1.0 1.7.0 A Helm chart for Apollo Config Service and Apol...
從上可知,主要包含兩個chart,分別用來部署service和portal。下來研究下apollo/apollo-service 這個chart。老規矩,先把chart包下載下來:
> helm pull apollo/apollo-service --untar apollo-service ├── Chart.yaml ├── templates │ ├── deployment-adminservice.yaml │ ├── deployment-configservice.yaml │ ├── NOTES.txt │ ├── service-adminservice.yaml │ ├── service-configdb.yaml │ ├── service-configservice.yaml │ └── _helpers.tpl └── values.yaml
從上面的樹形圖來看,主要就是用來部署config service 和 admin service。緊接着,複製一個values.yaml
,命名爲dev-apollo-svc-values.yaml
。主要修改如下配置:
修改後的配置以下:
configdb: name: apollo-configdb # apolloconfigdb host host: "mysql-apollo.db" port: 3306 dbName: ApolloConfigDB # apolloconfigdb user name userName: "root" # apolloconfigdb password password: "root" ....
其餘配置能夠暫定不動,緊接着執行如下命令進行安裝:
> kubectl create ns apollo # 建立apollo 命名空間 > helm install --dry-run --debug apollo-dev-svc . -f dev-apollo-svc-values.yaml -n apollo # 測試安裝,驗證模板生成的資源文件是否有誤 > helm install apollo-dev-svc . -f dev-apollo-svc-values.yaml -n apollo NAME: apollo-dev-svc LAST DEPLOYED: Sun Aug 16 11:17:38 2020 NAMESPACE: apollo STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: Get meta service url for current release by running these commands: echo http://apollo-dev-svc-apollo-configservice.apollo:8080 For local test use: export POD_NAME=$(kubectl get pods --namespace apollo -l "app=apollo-dev-svc-apollo-configservice" -o jsonpath="{.items[0].metadata.name}") echo http://127.0.0.1:8080 kubectl --namespace apollo port-forward $POD_NAME 8080:8080
這裏要記住上面的meta service url:http://apollo-dev-svc-apollo-configservice.apollo:8080
那如何確認正確部署了呢:
> kubectl get all -n apollo # 查看apollo命名空間下部署的資源 NAME READY STATUS RESTARTS AGE pod/apollo-dev-svc-apollo-adminservice-7d4468ff46-gw6h4 1/1 Running 0 3m26s pod/apollo-dev-svc-apollo-configservice-58d6c44cd4-n4qk9 1/1 Running 0 3m26s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/apollo-dev-svc-apollo-adminservice ClusterIP 10.99.251.14 <none> 8090/TCP 3m26s service/apollo-dev-svc-apollo-configservice ClusterIP 10.108.121.201 <none> 8080/TCP 3m26s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/apollo-dev-svc-apollo-adminservice 1/1 1 1 3m26s deployment.apps/apollo-dev-svc-apollo-configservice 1/1 1 1 3m26s NAME DESIRED CURRENT READY AGE replicaset.apps/apollo-dev-svc-apollo-adminservice-7d4468ff46 1 1 1 3m26s replicaset.apps/apollo-dev-svc-apollo-configservice-58d6c44cd4 1 1 1 3m26s
從上可知暴露了兩個服務configservice和adminservice,來嘗試將configservice進行端口轉發到本地端口來看一下。
> kubectl port-forward service/apollo-dev-svc-apollo-configservice 8080:8080 -n apollo # 轉發configservice到本地服務 Forwarding from 127.0.0.1:8080 -> 8080 Forwarding from [::1]:8080 -> 8080
使用瀏覽器訪問 localhost:8080,能夠看到輸出[{"appName":"apollo-configservice","instanceId":"apollo-configservice:http://apollo.shisheng.wang/config-svc","homepageUrl":"http://apollo.shisheng.wang/config-svc"},{"appName":"apollo-adminservice","instanceId":"apollo-adminservice:http://apollo.shisheng.wang/admin-svc","homepageUrl":"http://apollo.shisheng.wang/admin-svc"}]
。
至此說明,Apollo Service 搭建成功。
一樣,先來下載portal chart包,並研究下目錄結構:
> helm pull apollo/apollo-portal --untar apollo-portal ├── Chart.yaml ├── templates │ ├── deployment-portal.yaml │ ├── ingress-portal.yaml │ ├── NOTES.txt │ ├── service-portal.yaml │ ├── service-portaldb.yaml │ └── _helpers.tpl └── values.yaml
從上可知,portal 相對來講,主要是構建portal服務,並能夠經過ingress暴露服務。複製一個values.yaml
,命名爲dev-apollo-portal-values.yaml
。主要修改如下配置:
ingress.enabled=true
helm install nginx bitnaim/nginx-ingress-controller
安裝就行了。)ingress: enabled: true annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/rewrite-target: / nginx.ingress.kubernetes.io/affinity: "cookie" nginx.ingress.kubernetes.io/session-cookie-name: "route" hosts: - host: "apollo.demo.com" paths: ["/"] tls: []
config.envs=dev
config.metaServers.dev=http://apollo-dev-svc-apollo-configservice.apollo:8080
(上面部署apollo service輸出的apollo service url)若是同時啓用開發、測試和生產環境。能夠配置爲:envs: "dev,uat,prd"
,metaServers 分別指定對應環境的配置便可。config: # spring profiles to activate profiles: "github,auth" # specify the env names, e.g. dev,pro envs: "dev" # specify the meta servers, e.g. # dev: http://apollo-configservice-dev:8080 # pro: http://apollo-configservice-pro:8080 metaServers: dev: http://apollo-svc-dev-apollo-configservice.apollo:8080 # dev: http://apollo.shisheng.wang # specify the context path, e.g. /apollo contextPath: "" # extra config files for apollo-portal, e.g. application-ldap.yml files: {}
portaldb: name: apollo-portaldb # apolloportaldb host host: mysql-apollo.db port: 3306 dbName: ApolloPortalDB # apolloportaldb user name userName: root # apolloportaldb password password: root
其餘配置能夠暫定不動,緊接着執行如下命令進行安裝:
> Helm install --dry-run --debug apollo-dev-portal . -f dev-apollo-portal-values.yaml -n apollo # 測試安裝,驗證模板生成的資源文件是否有誤 > Helm install apollo-dev-portal . -f dev-apollo-portal-values.yaml -n apollo PS C:\Users\Shengjie\k8s\helm\charts\apollo\apollo-portal> Helm install apollo-dev-portal . -f dev-apollo-portal-values.yaml -n apollo NAME: apollo-dev-portal LAST DEPLOYED: Sun Aug 16 11:53:18 2020 NAMESPACE: apollo STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: Get apollo portal url by running these commands: http://apollo.demo.com/
到這一步,若是須要本地能夠訪問,還須要修改本地hosts,添加127.0.0.1 apollo.demo.com
。而後打開你的Browser輸入http://apollo.demo.com/,就能夠訪問了。默認用戶密碼是:[apollo/admin]。