百度网盘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]。