極客時間雲原生訓練營

愛共享 愛生活 加油 2021

百度網盤mysql

提取碼:qhhv 

nginx

什麼是容器雲(CAAS)

以容器爲資源分割和調度的基本單位,封裝整個軟件運行時環境,爲開發者和系統管理員提供用於構建,發佈和運行分佈式應用的平臺git

  • 兼具IaaS的靈活和PaaS的便利github

  • 容器化運行,一切都封裝在鏡像裏spring

  • 實現更快速的交付和部署sql

  • 更易於微服務架構的實現docker

  • 更高效的虛擬化數據庫

  • 像搭積木同樣的進行資源編排json

  • 易於擴展和遷移瀏覽器

以容器爲載體,編排爲核心的第二代雲計算技術

傳統雲 vs 容器雲

  傳統雲 容器雲
維度 資源維度 服務維度
服務 IAAS CAAS
關注 物理資源(計算,網絡,存儲)的池化,實現資源與業務的解耦 底層環境(構架,運行時,中間件)服務對象化,實現業務與基礎設施解耦
目標 提升資源利用率,下降硬件成本 支撐產品可以快速迭代 提高研發效率,保障高可用性,實現彈性伸縮應對業務爆發等
產品 OpenStack
CloudStack
VMware
Swarm
Mesos
Kubernetes

雲原生

一套技術體系和一套方法論,包括DevOps、持續交付、微服務、敏捷基礎設施等,是一系列雲技術和企業管理方法的集合,經過實踐及與其餘工具相結合更好地幫助用戶實現數字化轉型

CNCF(雲原生計算基金會)的理解:

  • 容器化封裝
  • 自動化管理
  • 面向微服務

雲原生的本質就是雲和原生,雲是指容器雲生態,原生是說開箱即用,不用開發定製

雲原生的概念怎麼來的?如今這麼流行!

我的見解:

  • 噱頭,起個新名詞,提個新概念,利於宣傳 ---- 動機
  • CNCF的成立,Cloud Native 就是雲原生 ---- 來源
  • 區分早期容器雲概念,專指以 Kubernetes 爲核心的容器雲生態體系 ---- 潛臺詞
  • 原生自己的意思,全部的 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架構下,用戶關心的對象是業務邏輯相關函數,非業務邏輯好比數據的讀取、登陸的驗證等等無需用戶關心。從這裏咱們能夠看出一個趨勢,愈來愈多的服務下沉到基礎設施層,用戶僅需關心本身的業務邏輯。
1.引言

Apollo(阿波羅)是攜程框架部門研發的分佈式配置中心,可以集中化管理應用不一樣環境、不一樣集羣的配置,配置修改後可以實時推送到應用端,而且具有規範的權限、流程治理等特性,適用於微服務配置管理場景。

如官網所述:Apollo 是攜程打造的開源配置中心,GitHub的星星也快點滿22K,所以足見它的成熟度和社區活躍度。所以最近在作配置中心選型的時候,通過一番預演,最終敲定Apollo。

Apollo做爲微服務體系中必不可少的基礎服務,其架構設計和基本使用咱們不得不有所瞭解。

所以本文接下來將主要來介紹如何基於Helm快速部署Apollo集羣至K8S,並與.NET Core應用進行集成,同時介紹下如何平滑遷移配置到Apollo。

本文具備詳細的部署步驟,建議動手實操。
部署Chart包和Demo已上傳至GitHub:K8S.NET.Apollo,可收藏備用。

2. Apollo 架構一覽

在部署以前,須要瞭解Apollo的基礎架構,以便在後續部署工做的展開。

 
1cc1c684bd4c104d49504b7d810fcc8e.png
Apollo 整體設計

關於其的解讀,我這裏就再也不詳細展開,但如下幾點仍是要有所瞭解,感興趣的能夠直接看官網詳細介紹:Apollo配置中心設計

  1. Config Service提供配置的讀取、推送等功能,服務對象是Apollo客戶端
  2. Admin Service提供配置的修改、發佈等功能,服務對象是Apollo Portal(管理界面)
  3. Config Service和Admin Service都是多實例、無狀態部署,須要經過註冊中心進行服務註冊和發現
  4. 註冊中心默認採用的是Eureka,在K8S中由Service充當
  5. Apollo客戶端經過註冊中心獲取Config Service服務列表進行配置讀取
  6. Apollo Portal經過註冊中心獲取Admin Service服務列表進行配置管理

基於上面對Apollo的介紹,其物理架構總結起來就是:

  1. 每一套環境都必須擁有本身獨立的Config Service 和 Admin Service 以及獨立ConfigDB。
  2. 多套環境能夠公用一套Apollo Portal 進行管理,Portal擁有獨立PortalDB。
3. 基於Helm部署到K8S

由於Apollo 1.7.0版本增長了基於Kubernetes原生服務發現的部署模式,來替換內置的Eureka,因此在總體部署上有很大簡化,同時官方也提供了Helm Charts,讓Apollo更加易於開箱即用。下面就以部署一套測試環境爲例講解一下Apollo的部署要點。(部署至本機Docker Desktop Local K8S環境)。

環境要求: Kubernetes 1.10+,Helm 3

 
0c40d9ca182ae7dca4bb39129d651f63.png
 

3.1 搭建 Apollo Config&Portal DB

從上圖的物理架構上來看,首先要部署好Config DB和PortalDB。關於DB的搭建,建議直接使用bitnami/mysqlchart搭建。搭建步驟以下:

> 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的初始化腳本用來分別建立ApolloConfigDBApolloPortalDB。所以能夠直接將以上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。而後修改核心配置:

  1. global.storageClass=hostpath
    可經過kubectl get sc查看集羣支持的storageClass,我這邊選擇默認的hostpath。其建立的pv的默認回收策略爲delete,也就意味着卸載mysql,數據直接刪除,這點須要注意!!!若是須要保留測試數據,請更新storageClass。
  2. root.password=root
    修改默認root用戶的密碼

修改完畢後,執行如下腳本進行安裝:

> 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搭建成功。

3.2 搭建 Apollo Config Service

搭建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。主要修改如下配置:

  1. configdb.host=mysql-apollo.db
    指定configdb的主機,由於是在集羣內部,直接使用服務名便可
  2. configdb.password=root
    指定configdb的祕密

修改後的配置以下:

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 搭建成功。

3.3 搭建 Apollo Portal 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。主要修改如下配置:

  1. ingress.enabled=true
    啓用ingress,並經過註解設置ingress controller,由於portal是個有狀態服務,因此要關注Sessiion狀態維持。如下主要是針對nginx-ingress-controller的配置,若是使用的其餘的ingress-controller請注意更改。(nginx-ingress-controller的安裝,這裏就不具體展開了,能夠簡單執行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: []
  1. 指定配置源 ,主要是envs和metaServers兩個配置項:
    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: {}
  1. portaldb.host=mysql-apollo.db & portaldb.password=root
    指定portaldb的主機和密碼
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]。

相關文章
相關標籤/搜索