开源PaaS工具CloudFoundry落地阿里云-阿里云开发者社区

开发者社区> 开发与运维> 正文

开源PaaS工具CloudFoundry落地阿里云

简介: 云计算技术的不断成熟和完善,尤其是IaaS平台的不断发展,使得越来越多的企业和用户青睐于将自己的业务和应用不断的从传统IT设施迁移到云上,在灵活、高效管理应用,快速扩展业务的同时不断地降低基础设施的运维和管理成本。

云计算技术的不断成熟和完善,尤其是IaaS平台的不断发展,使得越来越多的企业和用户青睐于将自己的业务和应用不断的从传统IT设施迁移到云上,在灵活、高效管理应用,快速扩展业务的同时不断地降低基础设施的运维和管理成本。然而,随着业务的不断发展和壮大,对IaaS资源管理成本也会不断增加,可否将基础设施的管理成本进一步降低呢?Cloud Foudry就是其中一个非常完美的解决方案,作为工业界标准的 PaaS 平台,它可以随着业务的不断变化实现对应用节点的自动伸缩,降低了应用部署时对配置基础设施的复杂度和成本,让更多的开发人员将更多的时间和精力投入到核心业务的开发上。

Cloud Foundry 作为一个开源 PaaS 平台,不仅支持 Java、Go、Python、Ruby、Node.JS和Scale等多种语言及配套框架,而且提供 MySQL、MongoDB、RabbitMQ、Redis、PostgreSQL等多个后端服务;不仅可以在传统IT基础设施运行上,而且可以部署在多种云计算平台上,如 AWS,Azure,OpenStack等。

power_of_platform

值得欣喜的是,今天 Cloud Foundry 已经在阿里云上成功落地。阿里云将帮助更多的国内和国际用户实现对 Cloud Foundry 快速部署。本文将向大家展示如何在阿里云上基于 Bosh 成功部署 Cloud Foundry。

什么是 Bosh?Bosh 是 Bosh Outter SHell 的缩写。与“Outter Shell”相对,被 BOSH 部署和管理的系统称为Inner Shell。BOSH 起先是在 Cloud Foundry 项目中开发的,不过,它是一个通用的工具,协助大规模分布式服务的部署和生命周期管理。我们使用 BOSH 将Cloud Foundry 的各组件部署到分布的 ECS 节点上。更多 Bosh 内容可查阅 Bosh Docs

infrastructure_2

本文将从以下几个方面想大家详细介绍如何在阿里云上部署 Cloud Foundry:

  • 搭建 Bosh 运行环境
  • 安装和部署 Bosh
  • 搭建 Cloud Foundry 运行环境
  • 安装和部署 Cloud Foundry
  • 部署应用示例 Wordpress

1. 搭建 Bosh 运行环境

从安全性考虑,本文所设计的网络环境是 VPC。为了方便部署 Bosh,首先需要准备一台带有公网 IP 跳板机作为部署命令的执行机器。因此,本节需要准备如下资源:

  • VPC(1个):用作整个 Bosh 和 Cloud Foundry 的网络运行环境
  • VSwitch(1个): 用作跳板机和 Bosh 的网络运行环境
  • Security Group(1个):为网络环境设置访问权限
  • ECS(1台):跳板机,用作执行命令来部署 Bosh 和 Cloud Foundry
  • EIP(2个):与跳板机绑定,提供公网 IP,用于登录跳板机和部署 Bosh;为 Nat 网关设置 SNAT,用于Bosh Director等VPC内部的机器访问公网
  • Nat Gateway(1个):用于为 VPC 内的机器,如Bosh Director,提供访问公网的能力
  • Key Pair(1个):为 Bosh Director 提供访问密钥

注意️:本文默认创建的资源都是按量付费的。购买按量付费ECS资源时,您的阿里云账户余额不得少于100.00元人民币或者等值的代金券或者优惠券。

1.1. 创建 VPC

登录 VPC 控制台,选择一个 Region,如华北2(cn-beijing),点击右上角创建专有网络按钮,输入专有网络名称、描述,选择网段后点击创建VPC按钮即可完成一个新的 VPC 的创建。如下图所示:

create_vpc

1.2. 创建 VSwitch

完成 VPC 的创建后,点击下一步按钮,即可为当前 VPC 创建一个 VSwitch。输入交换机名称、描述,选择一个可用区,输入一个子网网段后,点击创建交换机按钮即可完成一个新的 VSwitch 的创建。如下图所示:

create_vswitch

1.3. 创建 Security Group

登录安全组控制台,点击右上角创建安全组按钮,输入安全组名称、描述,选择专有网络,选择刚刚创建的 VPC,点击确定按钮即可完成一个新的安全组的创建。如下图所示:

create_security_group

完成安全组的创建后,点击立即设置规则,进入安全组规则页面。在创建安全组之前,首先选定一个 IP 地址作为 Bosh Director 的私网 IP,比如 172.16.0.3,然后点击页面右上角的添加安全组规则,输入端口范围 25555/25555,选择授权类型为地址段访问,输入 Director IP,点击确定按钮,即可实现对 25555 规则的添加,如下图所示:

create_security_group_rule

依据相同的操作,按照下面的参数,完成对所有相关规则的设置:

规则方向 协议类型 端口范围 授权对象 优先级 描述
入方向 自定义 TCP 6868/6868 172.16.0.0/12 1 允许 BOSH Agent 访问
入方向 自定义 TCP 25555/25555 172.16.0.3 1 允许 BOSH Director 访问
入方向 自定义 TCP 1/65535 0.0.0.0/0 10 允许其他端口被访问
入方向 自定义 UDP 1/65535 0.0.0.0/0 10 允许其他端口被访问
出方向 全部 -1/-1 0.0.0.0/0 1 允许访问所有数据

有关更多安全组规则设置,参考 bosh-deployment 官方推荐

1.4. 创建跳板机

登录ECS控制台,选择Region为华北2(cn-beijing),点击右上角创建实例按钮进入实例创建页面,在该页面中选择本文中创建的 VPC、VSwitch 和安全组,选择实例类型,操作系统镜像(如 Ubuntu 16.04 64位),输入实例名称以及登录密码,点击立即购买按钮,即可开通一台 ECS 作为跳板机,详情可参见创建 ECS 实例

1.5. 创建弹性 IP

登录 EIP控制台,选择Region为华北2(cn-beijing),点击右上角申请弹性公网IP即可进入弹性 IP 创建页面,选择合适的带宽峰值,点击立即购买按钮,即可创建一条 EIP。

弹性 IP 创建成功后,点击右侧的绑定按钮,选择刚刚创建的跳板机,点击确定,即可实现 EIP 与跳板机的绑定,如下图所示:

bind_eip

1.6. 创建 Nat Gateway

登陆 Nat Gateway 控制台,点击创建Nat网关按钮,进入 Nat 网关购买页面:

_2018_07_05_2_10_20

选择地域信息,VPC ID 以及 Nat 网关的规格后,点击立即购买并选择服务协议后,即可实现对 Nat 网关的快速开通。

Nat 网关开通后,需要为该网关绑定一个 EIP 并配置一个 Snat,用于给VPC内的机器提供公网的访问能力。
在 Nat 网关管理页面,点击更多操作下拉框中的绑定弹性公网IP,选择一个可用的弹性公网IP后,点击确定按钮,实现Nat 网关与 EIP 的绑定:

_2018_07_05_2_26_47

接着,点击设置 SNAT 进入SNAT设置页面:

_2018_07_05_2_31_14

点击添加SNAT条目,选择用户创建 Bosh Director 的交换机和上面添加的弹性公网IP(注:一个 Nat 网关可以绑定多个 EIP),点击确定完成 Snat 的设置:

_2018_07_05_2_34_25

该 SNAT 的设置表示所选交换机下的所有 ECS instance 可以通过所选的EIP访问公网。

1.7. 创建 Key Pair

登录 Key Pair控制台,选择Region为华北2(cn-beijing),点击右上角创建密钥对即可进入密钥对创建页面:

_2018_07_04_5_13_52

点击确定按钮完成 Key Pair 的创建。创建成功后,页面会弹出私钥下载框,由于私钥只能被下载一次,所以下载后一定要保存好。

2. 安装和部署 Bosh

在创建好 Bosh 的运行环境后,即可开始安装和部署 Bosh。Bosh 是一个将分布式系统的部署步骤进行定义和编排的服务器,通过Bosh CLI(指令界面,一个ruby工具)可以与BOSH服务器交互。因此,首先需要在跳板机上安装 Bosh CLI。

2.1. 安装 Bosh CLI

本文所要部署的是 Bosh V2 版本。首先登录跳板机,升级系统并安装 Bosh V2 依赖包。

$ sudo apt update -y
$ sudo apt install build-essential zlibc zlib1g-dev ruby ruby-dev openssl libxslt-dev libxml2-dev libssl-dev libreadline6 libreadline6-dev libyaml-dev libsqlite3-dev libpq-dev libmysqlclient-dev sqlite3 git -y

# 下载 Bosh CLI V2
$ wget -c -P /usr/local/bin/ http://bosh.oss-cn-hangzhou.aliyuncs.com/cli/bosh-cli-2.0.45-linux-amd64
$ mv  /usr/local/bin/bosh-cli-2.0.45-linux-amd64 /usr/local/bin/bosh
$ chmod 0755 /usr/local/bin/bosh
    
# 验证 Bosh CLI 安装成功
$ bosh -v

更多 Bosh CLI 安装详情详见 Bosh CLI Install

2.2. 部署 Bosh

Bosh CLI 安装成功之后,就可以部属 Bosh 了。在开始部署 Bosh 之前,首先需要准备好以下四项内容:

  • light stemcell

stemcell来源于生物学的“干细胞”,指的是可以生长成为不同类型细胞的原始细胞。对于 Bosh 而言,stemcell 指的是可以在 ECS VM 创建时具有相同原始软件配置,启动后,根据不同的实例规格具有不同的配置,如CPU、Memory、Storage 和 Network等。
Stemcell 有 heavy stemcell 和 light stemcell 之分。严格意义上来说,stemcell 就是 heavy stemcell,定义了 VM 的原始软件配置及操作系统等,而 light stemcell 可以看做是 heavy stemcell 的引用,里面定义了 heavy stemcell 的名称,版本,文件格式,操作系统类型,镜像与 region 的映射关系等多种配置。
目前阿里云提供了基于ubuntu-trusty和ubuntu-xenial两种可用于安装bosh和cloudfoundry的stemcell。鉴于目前社区已经将 Ubuntu Xenial 作为了默认的 Ubuntu 发行版,并且在未来的版本中不再支持 Ubuntu Trusty,因此建议大家优先使用 ubuntu-xenial stemcell。如果你仍然想使用 ubuntu-xenial stemcell,下文中也提供了兼容支持介绍。

  • Bosh Release

Bosh Release 定义了一系列 Bosh 所依赖的配置属性,配置模板,启动脚本,源代码,二进制文件以及其他安装和部署软件的依赖。Bosh Release 安装在目标机器上,配置通常包含 IP 地址、商品号、用户名、密码、域名等,这些参数可根据部署文件 Manifest 中的属性来定义。

  • Manifest

Manifest 一种遵循 YMAL 语法,定义了部属 Bosh 时所需的实际参数值的文件,如创建 VM 所用到的实例类型,实例名称,磁盘类型,磁盘大小,可用区,VSwitch 以及 安全组等。部属过程中,Bosh 使用这些值替换 Release 中的参数,进而配置软件。

  • CPI

CPI是Bosh调用IaaS云服务的接口程序,可参考build-cpi.html,目前阿里云的研发人员已经完成了CPI的适配,并实现了在Github上的开源,目前正在被Cloud Foundry社区接纳中,参见https://github.com/cloudfoundry-incubator/bosh-alicloud-cpi-release

为了方便 Bosh 的部署,以上部分阿里云已经为大家准备好了,大家只需要运行一下几个简单的步骤,即可实现对 Bosh 的部署:

# 下载 Bosh deployment
$ git clone https://github.com/aliyun/bosh-deployment.git
$ cd bosh-deployment

# 将前文中选定的 Director IP 设置为环境变量
$ export BOSH_ENVIRONMENT=172.16.0.3

# 运行 Bosh 部署命令
$ bosh create-env bosh-deployment/bosh.yml --state=state.json \
    --vars-store=creds.yml \
    -o bosh-deployment/alicloud/cpi.yml \
    -o bosh-deployment/jumpbox-user.yml \
    -o bosh-deployment/misc/powerdns.yml \
    -o bosh-deployment/uaa.yml \
    -o bosh-deployment/credhub.yml \
    -v dns_recursor_ip=8.8.8.8 \
    -v director_name=my-bosh \
    -v internal_cidr=172.16.0.0/24 \
    -v internal_gw=172.16.0.1 \
    -v internal_ip=$BOSH_ENVIRONMENT \
    -v vswitch_id=... \
    -v security_group_id=... \
    -v access_key_id=... \
    -v access_key_secret=... \
    -v region=... \
    -v zone=... \
    -v key_pair_name=... \
    -v private_key=aaa.pem

参数说明:

  • internal_cidr:对应前文中所创建的 VSwitch 的网段,如 172.16.0.0/24
  • internal_gw: 对应前文中所创建的 VSwitch 所对应的网关, 如 172.16.0.1
  • vswitch_id: 对应前文中所创建的 VSwitch 的 ID,如 vsw-2zeipivdxgnhf4wsay8t9
  • security_group_id: 对应前文中所创建的安全组的 ID, 如 sg-2zecizlui4a387u8zju4
  • region:对应前文中所创建的 VPC 所在的 Region ID,如 cn-beijing
  • zone: 对应前文中所创建的 VSwitch 所在的可用区 ID,如 cn-beijing-a
  • access_key_id 和 access_key_secret 是在调用阿里云 Open API 时用于鉴权认证的密钥对,可通过以下方法产生:

登录 AK 管理控制台,如果页面弹出安全风险警告页面:

create_pre_ak

直接点击“继续使用AccessKey”按钮,进入 Access Key 管理页面,点击页面右上角的创建Access Key按钮,

crate_ak

阅读并同意《API使用规范》,然后点击同意并创建 按钮后,即可获得一个新的 Access Key,进而可获取页面中的 Access Key IDAccess Key Secret

整个 Bosh 的部署过程需要花费大概10-20分钟,请耐心等待。

对于国内用户,国区 Region 下的 ECS 下载 bosh-release 可能会比较慢,可以考虑先去官网 bosh.io下载bosh-deployment/bosh.yml 中指定的 bosh-release,并上传到跳板机上(如/root/bosh-263.2.0.tgz),然后修改bosh.yml中url字段来实现bosh的加速安装,参考如下

releases:
- name: bosh
  version: "263.2.0"
# url: https://s3.amazonaws.com/bosh-compiled-release-tarballs/bosh-263.2.0-ubuntu-trusty-3445.7-20170915-052445-759948783-20170915052451.tgz?versionId=3kjVQuRK7JyrnbKEbKhLRi7qyo0wBXZJ
  url: file:///root/bosh-263.2.0.tgz
  sha1: 37630c636a030454d55703cfdd495d733525353f

除此之外,在国内 Region 上部署 Bosh 时,在命令中可通过指定文件 alicloud/releases-in-china.yml 来实现对 CPI 的快速下载,如下所示:

# 在国内 Region 上运行 Bosh 部署命令
$ bosh create-env bosh-deployment/bosh.yml --state=state.json \
    --vars-store=creds.yml \
    -o bosh-deployment/alicloud/cpi.yml \
    -o bosh-deployment/alicloud/releases-in-china.yml \
    -o bosh-deployment/jumpbox-user.yml \
    -o bosh-deployment/misc/powerdns.yml \
    -o bosh-deployment/uaa.yml \
    -o bosh-deployment/credhub.yml \
    -v dns_recursor_ip=8.8.8.8 \
    -v director_name=my-bosh \
    -v internal_cidr=172.16.0.0/24 \
    -v internal_gw=172.16.0.1 \
    -v internal_ip=$BOSH_ENVIRONMENT \
    -v vswitch_id=... \
    -v security_group_id=... \
    -v access_key_id=... \
    -v access_key_secret=... \
    -v region=... \
    -v zone=... \
    -v key_pair_name=... \
    -v private_key=...

注意:正如上文所说,如果你想继续使用 ubuntu-trusty 部署 Bosh,我们也提供了将 ubuntu-xenial 转换为 ubuntu-trusty 的 manifest “bosh-deployment/alicloud/use-ubuntu-trusty.yml”,在如上的部署命令中的使用 “-o bosh-deployment/alicloud/use-ubuntu-trusty.yml” 自行指定即可。

2.3. 登录 Bosh

Bosh 成功部署后,需要登录 Bosh,以便为后续部署 Cloud Foundry 做准备。Bosh 的登录很简单,运行以下命令:

$ bosh int ./creds.yml --path /director_ssl/ca > ca-cert
$ bosh alias-env my-bosh -e $BOSH_ENVIRONMENT --ca-cert ca-cert
$ export BOSH_CLIENT=admin
$ export BOSH_CLIENT_SECRET=`bosh int ./creds.yml --path /admin_password`
$ export BOSH_CA_CERT=`bosh int ./creds.yml --path /director_ssl/ca`
$ bosh -e my-bosh login

其中,“my-bosh” 是为本文中所部属的 Bosh 设置的别名,可自定义。下同。

Bosh 成功登录后,即可开始 Bosh 的操作和使用之旅,Bosh 的使用命令及详情可参见 Bosh CLI V2

Bosh 部署成功后,在跳板机通过简单的 SSH 命令已经无法实现对 Bosh Director 机器的远程登录了,如果想登录机器查看 Bosh 的运行日志或者进行其他操作,可使用 jump box 的方式:

$ bosh int creds.yml --path /jumpbox_ssh/private_key > jumpbox.key
$ chmod 600 jumpbox.key
$ ssh jumpbox@$BOSH_ENVIRONMENT -i jumpbox.key    

到此,整个 Bosh 的安装,部署以及登录的过程已经全部结束。下面开始 Cloud Foundry 的部署和安装。

关于更多的bosh安装、以及cpi的配置信息,请参考bosh.io官方文档,及bosh-alicloud-cpi-release开源项目

3. 搭建 Cloud Foundry 运行环境

和 Bosh 一样,在部署 Cloud Foundry 之前,首先需要准备 Cloud Foundry 的网络运行环境。

3.1. 创建多可用区网络环境

目前,阿里云不仅支持单可用区部署 Cloud Foundry,而且支持多可用区部署,本文将以多可用区部署为例,向大家介绍如何在三个可用区上部署 Cloud Foundry。

多可用区落在网络环境上体现为多个 VSwitch,因此,选择三个可用区(可以相同),按照前文中创建 VSwitch 的操作,创建三个 VSwitch,如172.16.10.0/24,172.16.11.0/24,172.16.12.0/24。创建成功后记录可用区 ID 以及 VSwitch ID。

VSwitch 创建成功后,需要按照上文提到的设置SNAT的方法,为每个 VSwitch 添加对应的 SNAT 条目,以保证后面部署过程的顺利进行。

3.2. 创建负载均衡 SLB

负载均衡(Server Load Balancer)是将访问流量根据转发策略分发到后端多台云服务器(ECS)的流量分发控制服务。

为了保证访问流量可以分发到多个服务节点上以及多个服务节点可以对外提供稳定的服务,在部署 Cloud Foundry 之前,需要创建一个可以公网访问的 SLB,并为其配置 HTTP “80-80” 和 TCP “443-443” 的服务监听。

登录 SLB 控制台,选择Region为华北2(cn-beijing),点击右上角创建负载均衡按钮,进入负载均衡创建页面,选择可用区,实例规格,实例类型(公网,如果选择私网,需要选择前文创建的其中任意一台 VSwitch,并为其分配 EIP),计费方式等配置后,点击立即购买按钮,即可创建一台负载均衡器。

接着,点击管理按钮,选择监听页面,点击右上角的添加监听按钮,选择前端协议为 HTTP,并输入前端端口:80,后段端口:80:

create_listener_80

点击下一步按钮,使用默认的健康检查配置(或者自行设置配置),点击确认按钮,完成 80 端口监听的添加。

按照相同的步骤,添加 TCP 443 的监听:

create_listener_443

3.3. 申请域名

申请域名是为了给 Cloud Foundry 中的应用提供访问地址。如果您还没有域名,可先通过阿里云域名管理控制台进行域名注册。也可以使用 xip.ionip.io 等服务将IP映射为域名,但请注意,这两个都不太稳定,可能会影响测试的体验。

域名申请成功之后,需要为该域名设置解析记录,即将负载均衡的公网 IP 地址绑定到域名上。

进入域名解析控制台,点击右上角的添加域名按钮,输入所申请的域名或者自己的域名,点击确认按钮,完成域名的添加。

接着点击解析设置按钮,进入域名管理页面,点击添加解析按钮,输入主机记录为:*,输入记录值为:<负载均衡公网 IP 或者与其绑定的 EIP 地址>,点击确定按钮,完成解析记录的添加。

add_dns_record

4. 安装和部署 Cloud Foundry

在创建好 Cloud Foundry 的网络环境后,即可开始安装和部署 Cloud Foundry。和 Bosh 一样,Cloud Foundry 通过 CLI 来部署和发布应用的,但Cloud Foundry 的部署依旧依赖于 Bosh CLI。

4.1 准备manifest、stemcell、releases

  • Manifest

目前,Cloud Foundry 已经将官方的支持从 cf-release 替换为了 cf-deployment ,我们首先从 github 上获取这个 repo

# 下载 Cloud Foundry Manifest
$ git clone https://github.com/cloudfoundry/cf-deployment.git
$ cd cf-deployment
  • Stemcell

部署Cloud Foundry前,首先上传特定版本(跟 bosh directior 保持一致)的 stemcell。确定 stemcell 和 Ubuntu 的版本后,运行如下命令,完成对 stemcell 的上传:

$ bosh upload-stemcell http://bosh.oss-cn-hangzhou.aliyuncs.com/light-bosh-stemcell-<stemcell-version>-alicloud-kvm-<ubuntu-version>-go_agent.tgz

如上传 ubuntu-xenial 1018 版本的 Stemcell,命令如下:

$ bosh upload-stemcell http://bosh.oss-cn-hangzhou.aliyuncs.com/light-bosh-stemcell-1018-alicloud-kvm-ubuntu-xenial-go_agent.tgz

上传stemcell完成后,需要确定所使用stemcell的版本是否跟stemcell manifest cf-deployment/iaas-support/alicloud/stemcells.yml 中定义的一致,如果不一致,需要进行修改或者重新上传。

  • Cloud Foundry Releases

和 Bosh Release 一样,Cloud Foundry Release 定义了一系列 Cloud Foundry 以及应用运行环境等所依赖的配置属性,配置模板,启动脚本,源代码等。Release 定义的参数通过部署 Cloud Foundry 的 Manifest 获取。

因网络问题,国内Region主机和国外Region主机上传 CF release 方式有所不同。

  • 对国内 ECS主机,因为国内ECS直接从海外源下载release会很慢,可能导致安装失败,这里需要先想办法手工下载releases并通过bosh upload-release上传到bosh上,才能显著提高安装速度和成功率。

    修改方式为:找到cf-deployment.yml结尾处的releases配置节,针对每个release

    1. 手工下载url链接后的文件
    2. 将下载后的文件传到跳板机上去,再通过命令upload-release, 如bosh upload-release binary-buildpack-release.1.0.14.tgz,将各个 Release 上传到bosh
    3. 注释url这一行
      一共有二十多个文件,这里下载和修改起来会比较累
    releases:
    - name: binary-buildpack
    # url: https://bosh.io/d/github.com/cloudfoundry/binary-buildpack-release?v=1.0.14
      version: 1.0.14
      sha1: c5ba6b6d99b972ec34dece478302351d8b4f6bbc
    ...

    针对这个过程,我们提供了个可能提高一些效率的脚本,参考download-releases.shupload-releases.sh.

  • 对于国外 ECS主机,不用单独上传 Release,直接运行 CF 部署命令即可。

4.2 安装 bosh-dns addon

在部署 CF 之前,首先需要安装 bosh-dns addon,以保证 Bosh 与 CF 组件 bbs,silk-controller 和 locket 进行正常的通信。bosh-dns addon 的 manifest 位于 bosh-deployment/runtime-configs/dns.yml,因此运行如下命令完成 bosh-dns addon 的安装:

bosh update-runtime-config bosh-deployment/runtime-configs/dns.yml

如果未能成功安装 bosh-dns addon,将会在 CF 部署过程中遇到如下的问题:

Task 33 | 02:05:31 | Updating instance diego-api: diego-api/75a01101-fd27-4162-b148-b6623a664273 (0) (canary)
 (00:20:49)
                   L Error: 'diego-api/75a01101-fd27-4162-b148-b6623a664273 (0)' is not running after update. Review logs for failed jobs: bbs, silk-controller, locket
Task 33 | 02:26:20 | Error: 'diego-api/75a01101-fd27-4162-b148-b6623a664273 (0)' is not running after update. Review logs for failed jobs: bbs, silk-controller, locket

4.3 配置cloud-config.yml

cloud-config.yml 是一个用于描述你的IaaS云环境的文件,需要我们在安装Cloud Foundry前完成编辑,这个模板可以从bosh-deployment工程的/alicloud/cloud-config.yml路径获取,这个文件内容如下:

azs:
- name: z1
  cloud_properties:
    availability_zone: cn-beijing-a
- name: z2
  cloud_properties:
    availability_zone: cn-beijing-d
- name: z3
  cloud_properties:
    availability_zone: cn-beijing-e

vm_types:
- name: minimal
  cloud_properties:
    instance_type: ecs.mn4.small
    ephemeral_disk: {size: "51_200"}
- name: small
  cloud_properties:
    instance_type: ecs.sn2.medium
    ephemeral_disk: {size: "51_200"}
- name: default
  cloud_properties:
    instance_type: ecs.sn2.medium
    ephemeral_disk: {size: "51_200"}
- name: small-highmem
  cloud_properties:
    instance_type: ecs.sn2ne.xlarge
    ephemeral_disk: {size: "51_200"}
- name: compiler
  cloud_properties:
    instance_type: ecs.sn1.large
    ephemeral_disk: {size: "51_200"}

disk_types:
- name: 5GB
  disk_size: 20_480
- name: 10GB
  disk_size: 20_480
- name: 100GB
  disk_size: 102_400

vm_extensions:
- name: 5GB_ephemeral_disk
  cloud_properties:
    ephemeral_disk: {size: "20_480"}
- name: 10GB_ephemeral_disk
  cloud_properties:
    ephemeral_disk: {size: "20_480"}
- name: 50GB_ephemeral_disk
  cloud_properties:
    ephemeral_disk: {size: "50_120"}
- name: 100GB_ephemeral_disk
  cloud_properties:
    ephemeral_disk: {size: "102_400"}
- name: 500GB_ephemeral_disk
  cloud_properties:
    ephemeral_disk: {size: "512_000"}
- name: 1TB_ephemeral_disk
  cloud_properties:
    ephemeral_disk: {size: "1024_000"}
- name: cf-router-network-properties
  cloud_properties:
    slbs: ((http_slb_id_array))
- name: cf-tcp-router-network-properties
  cloud_properties:
    slbs: ((tcp_slb_id_array))
- name: diego-ssh-proxy-network-properties

networks:
- name: default
  type: manual
  subnets:
  - range: ((az1_vswitch_range))
    gateway: ((az1_vswitch_gateway))
    az: z1
    dns: [8.8.8.8]
    cloud_properties:
      vswitch_id: ((az1_vswitch_id))
      security_group_ids:
        - ((security_group_id_1))
        - ((security_group_id_2))
  - range: ((az2_vswitch_range))
    gateway: ((az2_vswitch_gateway))
    az: z2
    dns: [8.8.8.8]
    cloud_properties:
      vswitch_id: ((az2_vswitch_id))
      security_group_ids:
        - ((security_group_id_1))
        - ((security_group_id_2))
  - range: ((az3_vswitch_range))
    gateway: ((az3_vswitch_gateway))
    az: z3
    dns: [8.8.8.8]
    cloud_properties:
      vswitch_id: ((az3_vswitch_id))
      security_group_ids: [((security_group_id_3))]
- name: vip
  type: vip

compilation:
  workers: 5
  reuse_compilation_vms: true
  az: z1
  vm_type: compiler
  network: default

在这个文件需要根据你在第三章节中创建的云环境来填写以下内容:

  • 可用区azs

    • azs 块下的 availability_zone 设置为前文中设置的可用区ID,如果你只有一个可用区,也是可以的,就保留一个可用区
  • 服务器类型vm_types

    • 定制cf可能会用到的不同规格的服务器类型,服务器类型请参考实例规格
    • cloud_properties用于指定机器的属性,可参考alicloud_cpi.md
  • 网络networks

    • 请仔细修改每个zone的子网、网关、vswitch_id、security_group_ids确保与前文操作的实际创建的相符, 其中安全组可支持多个
  • 负载均衡器ID
    vm_extensions 块下的 http_slb_id_array 是一个List,里面的值修改为前文中创建的负载均衡器的 ID,如 ["lb-abc12345"]
  • compilation节点用于设置有多少台机器用于编译,编译的机器是临时创建的,机器越好越多,装的越快

配置文件修改结束后,运行如下命令,将cloud-config.yml更新到bosh

$ bosh update-cloud-config cloud-config.yml

当然,你也可以以直接传参的形式实现对 cloud-config 的配置,如下所示:

bosh update-cloud-config cf-deployment/iaas-support/alicloud/cloud-config.yml \
  -v az1_zone=... \
  -v az2_zone=... \
  -v az3_zone=... \
  -v az1_vswitch_id=vsw-t***l \
  -v az2_vswitch_id=vsw-t***w \
  -v az3_vswitch_id=vsw-t***a \
  -v az1_vswitch_range=172.16.10.0/24 \
  -v az2_vswitch_range=172.16.11.0/24 \
  -v az3_vswitch_range=172.16.12.0/24 \
  -v az1_vswitch_gateway=172.16.10.1 \
  -v az2_vswitch_gateway=172.16.11.1 \
  -v az3_vswitch_gateway=172.16.12.1 \
  -v security_group_id_1=sg-t***q \
  -v security_group_id_2=sg-t***k \
  -v security_group_id_3=sg-t***a \
  -v tcp_slb_id_array=[] \
  -v http_slb_id_array=[lb-t4***]

4.4 部署 Cloud Foundry

在最后部署CF前,你还可以打开cf-deployment.yml,定制一下每个角色的机器数量,参考instance_groups下面每个角色的azsinstances属性
一切就绪后,开始部署 Cloud Foundry

  • 设置Cloud Foundry 域名,比如SLB IP 为 123.123.123.123,绑定的域名为 hello-cf.com,则可进行如下设置:
$ export CF_DOMAIN=hello-cf.com

运行以下命令开始部署CF:

$ bosh -e my-bosh -d cf deploy cf-deployment/cf-deployment.yml \
  -o cf-deployment/iaas-support/alicloud/stemcells.yml \
  -v region=... \
  -v system_domain=$CF_DOMAIN

整个部署过程大概需要 20-40 分钟,请耐心等待。如果不进行裁剪,本文部署的 Cloud Foundry 需要创建 27 台 ECS 服务器,请在运行上述命令前优先确认当前账号具有创建 27 台 ECS 的额度。如果希望只在单可用区,如z1,上部署,可运行如下命令:

$ bosh -e my-bosh -d cf deploy cf-deployment/cf-deployment.yml \
  -o cf-deployment/iaas-support/alicloud/stemcells.yml \
  -o cf-deployment/operations/scale-to-one-az.yml \
  -v region=... \
  -v system_domain=$CF_DOMAIN \
  -v az-name=z1

注意:和 Bosh 一样,如果你想继续使用 ubuntu-trusty 部署 CF,可以使用我们提供的将 ubuntu-xenial 转换为 ubuntu-trusty 的 manifest “cf-deployment/iaas-support/alicloud/use-ubuntu-trusty.yml”,在如上的部署命令中的使用 “-o cf-deployment/iaas-support/alicloud/use-ubuntu-trusty.yml” 自行指定即可。

4.5 安装 Cloud Foundry CLI

Cloud Foundry 部署成功后,使用 Cloud Foundry CLI 来登录 Cloud Foundry 并部署应用。

# 下载 Cloud Foundry CLI 并解压
$ wget -O cf-cli.tgz https://cli.run.pivotal.io/stable?release=linux64-binary&source=github
$ tar -xzvf cf-cli.tgz -C /usr/local/bin
$ sudo curl -o /usr/share/bash-completion/completions/cf https://raw.githubusercontent.com/cloudfoundry/cli/master/ci/installers/completion/cf

# 验证 Cloud Foundry CLI 安装成功
$ cf -v

Cloud Foundry CLI 的使用文档可详见Cloud Foundry CLI Guide

4.6 登录 Cloud Foundry

Cloud Foundry 成功部署后,需要登录后才可继续部署应用。那么如何登录 CF 呢?这里就要一个工具 Credhub-CLI。Credhub是一个用来存储 Bosh Director 所管理的 Deployment 的密钥的组件,在登录 CF 前,需要通过 credhub 来获取 CF 的密钥。

首先,在跳板机上安装 Credhub-CLI。运行以下命令:

# 进入Release列表,下载 credhub-cli Package:
$ wget https://github.com/cloudfoundry-incubator/credhub-cli/releases/download/1.7.6/credhub-linux-1.7.6.tgz

# 解压后放在制定目录即可,如 /usr/local/bin
$ tar -zxvf credhub-linux-1.7.6.tgz -C /usr/local/bin

# 验证
$ credhub --version

CLI Version: 1.7.6
Server Version: Not Found. Have you targeted and authenticated against a CredHub server?

接下来,要登录 Credhub 来获取 CF 的登录密钥:

# 设置 target
$ credhub api --server=https://$BOSH_ENVIRONMENT:8844/api --skip-tls-validation

Setting the target url: https://172.16.0.3:8844/api
Warning: The targeted TLS certificate has not been verified for this connection.
Warning: The --skip-tls-validation flag is deprecated. Please use --ca-cert instead.

# 借助上文中 Bosh Director 的密钥文件 creds.yml,登录 Credhub
$ credhub login --client-name=director_to_credhub --client-secret=`bosh int creds.yml --path /uaa_clients_director_to_credhub`

Login Successful

# 获取 Deployment cf 的 Full Name
$ credhub find -n cf_admin_password

credentials:
- name: /my-bosh/cf/cf_admin_password
  version_created_at: "2018-07-05T07:58:07Z"

# 获取 Deployment cf 的 admin 的password
$ credhub get -n /my-bosh/cf/cf_admin_password

id: f51fb44b-9965-44cc-b136-fb8593930f3f
name: /my-bosh/cf/cf_admin_password
type: password
value: JV9XhZ5FHx6H**********
version_created_at: "2018-07-05T07:58:07Z"

获取到 CF 的密码后,运行如下命令完成 CF 的登录:

$ cf login -a http://api.$CF_DOMAIN --skip-ssl-validation -u admin -p JV9XhZ5FHx6H**********

登录成功后,表明 Cloud Foundry 已经在阿里云上实现了成功部署。

5. 部署应用示例 Wordpress

本文将以部署 Wordpress 为例,基于已经部署好的 Cloud Foundry 向大家展示如何快速部署应用。

在部署应用前,首先需要理解一个“buildpack”的概念。buildpack 可以看作是 Cloud Foundry 用来部署和运行应用的引擎的集合。部署应用时,Cloud Foundry 首先将用户要发布的应用程序与自己所有语言和框架的 buildpack 进行适配,当找到第一个可以运行应用代码的 buildpack 后,将该 buildpack 解压,然后与这些应用代码打进一个新的应用包(即 Cloud Foundry 中的 droplet),接着按照 buildpack 指定的运行环境参数生成一个容器,并将 droplet 扔进容器中,最后按照 buildpack 指定的启动命令,启动应用。

# 罗列当前 Cloud Foundry 的所有 buildpacks
$ cf buildpacks

这是的输出是这样的,

Getting buildpacks...

buildpack               position   enabled   locked   filename
staticfile_buildpack    1          true      false    staticfile-buildpack-v1.4.16.zip
java_buildpack          2          true      false    java-buildpack-v4.6.zip
ruby_buildpack          3          true      false    ruby-buildpack-v1.7.3.zip
dotnet_core_buildpack   4          true      false    dotnet-core-buildpack-v1.0.27.zip
nodejs_buildpack        5          true      false    nodejs-buildpack-v1.6.8.zip
go_buildpack            6          true      false    go-buildpack-v1.8.11.zip
python_buildpack        7          true      false    python-buildpack-v1.5.26.zip
php_buildpack           8          true      false    php-buildpack-v4.3.42.zip
binary_buildpack        9          true      false    binary-buildpack-v1.0.14.zip

对于在国内region部署的CF,由于某些网络问题,可能导致某些buildpack安装失败或者不完整,在这种情况下,可在 Cloud Foundry Buildpack Github 上找到对应语言的Buildpack仓库,下载后可按照README中推荐的方法,完成对应Buildpack的重新打包。

打包完成后,需要使用如下指令将buildpack更新至cf中,-i表示buildpack的序号,这个序号表示buildpack在cf中的调用顺序,这个不要弄乱

$ cf update-buildpack php_buildpack -p php_buildpack-cached-v4.3.46.zip -i 8

当准备好buildpack之后,就可以部署应用了,带manifest的应用会自动判断buildpack的类型,如果需要自行指定或无法判断buildpack,可通过-b参数指定buildpack

# 下载 wordpress 并解压
$ wget https://wordpress.org/latest.zip
$ unzip latest.zip && cd wordpress

# 创建应用空间
$ cf create-space wordpress -o system
    
# 指定目标组织
$ cf target -o "system" -s "wordpress"
    
# 查看已经存在的应用空间
$ cf spaces
    
# 发布 wordpress
$ cf push wordpress -b php_buildpack

应用部署成功后,在浏览器中直接输入:wordpress.<$CF_DOMAIN>,如 wordpress.123.123.123.123.hello-cf.com,即可实现对 Wordpress
的访问。

6. 写在最后

当部署 Wordpress 简化为几条简单的命令后,你会发现,部署 Cloud Foundry 过程中的付出都是值得的。Cloud Foundry 大大降低了开发者对基础设施的管理和运维的成本,他们无需再为每个应用运行环境付出重复的搭建,管理和运维的工作,而将更多的精力投入到应用和核心业务的开发上,大大简化了应用发布的流程,缩短应用发布的进度。

我们将不断地完善 Cloud Foundry 在阿里云上落地,尽可能降低在阿里云上的安装和部署成本,让 Cloud Foundry 在阿里云上开更多的花,结更多的果,也欢迎大家在阿里云上部署,使用和 Cloud Foundry。

7. 参考资料

Bosh Docs: https://bosh.io/docs
Cloud Foundry Docs: https://docs.cloudfoundry.org/concepts/overview.html
Bosh Alicloud CPI: https://github.com/cloudfoundry-incubator/bosh-alicloud-cpi-release
Bosh Deployment: https://github.com/aliyun/bosh-deployment
Cloud Foundry Deployment: https://github.com/cloudfoundry/cf-deployment
Cloud Foundry 技术解答钉钉群:

1aebcf5f-1f50-4743-bc09-cdc4b29deafd.jpg | center | 270x331

版权声明:本文中所有内容均属于阿里云开发者社区所有,任何媒体、网站或个人未经阿里云开发者社区协议授权不得转载、链接、转贴或以其他方式复制发布/发表。申请授权请邮件developerteam@list.alibaba-inc.com,已获得阿里云开发者社区协议授权的媒体、网站,在转载使用时必须注明"稿件来源:阿里云开发者社区,原文作者姓名",违者本社区将依法追究责任。 如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:developer2020@service.aliyun.com 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章