一、简介
想来想去还是写个简介吧…
1.1 CloudFoundry
Cloud Foundry是VMware公司推出的一个开源PaaS云平台,似乎号称业界第一个。它支持多种框架、语言、运行时环境、云平台及应用服务,可以用于应用程序的部署和扩展。
它本身是基于Ruby on Rails编写的,有多个相对独立的子系统。系统之间通过消息机制(nats)通信,使平台在各层级都可水平扩展,既能在大型数据中心里运行,也能运行在一台桌面电脑中,二者使用相同的代码库。
1.2 PaaS
PaaS是Platform-as-a-Service的缩写,意思是平台即服务。区别语于传统IT架构和IaaS。盗一张图来区别他们,应该很好理解他们的区别了:
二、安装
说起来,其实安装很简单,只需要执行一条命令就可以:
bash < <(curl -s -k -B https://raw.githubusercontent.com/yudai/cf_nise_installer/${INSTALLER_BRANCH:-master}/scripts/bootstrap.sh) |
但是别高兴的太早,这只是你苦逼路程的开始。好了,咱们从头说。
2.1 系统
我们使用的cf_nise_installer脚本进行安装,该脚本只支持Ubuntu10.04 and 12.04 64bit server。综合大部分资料,目前推荐的系统是Ubuntu 10.04 Server,但是我用的Ubuntu12.04桌面版也安装成功了,并可以正常运行,所有系统方面大家随意。
本文默认使用系统:Ubuntu12.04桌面版
2.2 cf_nise_installer
本文的安装使用的是cf_nise_installer的脚本进行安装,正常情况下,该脚本是全自动与运行的。CloudFoundry所安装过程中涉及的所有安装及环境需要的包他都会下载安装并配置好。
参考:https://github.com/yudai/cf_nise_installer
一定要科学上网,一定要科学上网,一定要科学上网,重要的事情要说三遍,然而并没有卵用......
整个过程中只需要执行两句命令:
sudo apt-get install curl
bash <<(curl -s -k -B https://raw.githubusercontent.com/yudai/cf_nise_installer/${INSTALLER_BRANCH:-master}/scripts/bootstrap.sh)
过程中会各种断,尤其是下载buildpack包的时候,每个包都好几百兆,断了只能从头下载,尤其是buildpack_ruby接近1G的大小,下载过程中自求多福吧,个中辛苦谁下谁知道。
既然说到了cf_nise_installer,就简单分析一下他的脚本,跟句命令来看,我们执行的是工程下scripts文件夹下的bootstrap.sh脚本,其中的内容是:
#!/bin/bash -ex if [ ! -f /etc/lsb-release ] || \ [ `uname -m` != "x86_64" ]; then echo "This installer supports only Ubuntu 10.04 and 12.04 64bit server" exit 1; fi # Git bootstrap if ! (which git); then sudo apt-get update sudo apt-get install -y git-core fi INSTALLER_URL=${INSTALLER_URL:-https://github.com/yudai/cf_nise_installer.git} INSTALLER_BRANCH=${INSTALLER_BRANCH:-master} if [ ! -d cf_nise_installer ]; then git clone ${INSTALLER_URL} cf_nise_installer fi ( cd cf_nise_installer git checkout ${INSTALLER_BRANCH} ./scripts/install.sh ) |
脚本中可以看出,cf_nise_installer只支持Ubuntu10.04 and 12.04 64bit server,所以使用过程中请注意。接下来下载了cf_nise_installer工程之后调用了install.sh脚本,继续查看install.sh脚本:
#!/bin/bash -ex # Detect RVM if (rvm >/dev/null 2>&1); then echo "Found RVM is installed! RVM is not supported by this installer. Remove it and rerun this script." exit 1 fi sudo apt-get update ./scripts/install_ruby.sh source ~/.profile ./scripts/clone_nise_bosh.sh ./scripts/clone_cf_release.sh ./scripts/install_environemnt.sh ./scripts/install_cf_release.sh set +x echo "Done!" echo "You can launch Cloud Foundry with ‘./scripts/start.sh‘" echo "Restart your server before starting processes if you are using Ubuntu 10.04" |
看到这脚本估计你会很高兴,因为主要你看到了一下几行字就代表你安装完成了:
set +x echo "Done!" echo "You can launch Cloud Foundry with ‘./scripts/start.sh‘" echo "Restart your server before starting processes if you are using Ubuntu 10.04" |
然而别高兴的太早,你的安装过程一定对的起苦逼二字的。
言归正传,继续看脚本,脚本先对RVM进行了判断,cf_nise_installer使用的是rbenv这个ruby安装工具,没有选择使用rvm。这个脚本照样没做啥正事,判断了一下rvm,然后又是调用了一堆脚本:
./scripts/install_ruby.sh source ~/.profile ./scripts/clone_nise_bosh.sh ./scripts/clone_cf_release.sh ./scripts/install_environemnt.sh ./scripts/install_cf_release.sh |
别着急,一个一个的看,./scripts/install_ruby.sh:
#!/bin/bash -ex if [ ! -d ~/.rbenv ]; then sudo apt-get -y install build-essential libreadline-dev libssl-dev zlib1g-dev git-core git clone https://github.com/sstephenson/rbenv.git ~/.rbenv git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build echo ‘export PATH="$HOME/.rbenv/bin:$PATH"‘ >> ~/.profile echo ‘eval "$(rbenv init -)"‘ >> ~/.profile fi source ~/.profile if ! (rbenv versions | grep -q 1.9.3-p484); then rbenv install 1.9.3-p484 fi rbenv local 1.9.3-p484 gem install bundler --no-rdoc --no-ri rbenv rehash |
很简单,这个脚本就是在装ruby及相关的包,继续看clone_nise_bosh.sh
#!/bin/bash -ex if [ ! "$(ls -A nise_bosh)" ]; then git submodule update --init --recursive nise_bosh ( cd nise_bosh if [ "" != "$NISE_BOSH_REV" ]; then git checkout $NISE_BOSH_REV fi echo "Using Nise BOSH revision: `git rev-list --max-count=1 HEAD`" ) else echo "‘nise_bosh‘ directory is not empty. Skipping cloning..." fi |
就像名字所说,下载nise_bosh项目。其实cf_nise_installer本来就是基于nise_bosh的一个脚本,真正执行安装的就是nise_bosh这个项目。nise_bosh本身是一个基于bosh的项目,把bosh关于IaaS层的内容去除,保留了虚拟机上组建安装的内容。所以使用nisebosh无需IaaS层的API支持,只需要虚拟机即可安装。继续看下边的脚本,clone_cf_release.sh:
#!/bin/bash -ex CF_RELEASE_USE_HEAD=${CF_RELEASE_USE_HEAD:-no} ruby_version=`rbenv version | cut -f1 -d" "` # to overwrite .ruby-version if [ ! "$(ls -A cf-release)" ]; then if [ -z "${CF_RELEASE_URL}" ]; then git submodule update --init cf-release else rmdir cf-release git clone ${CF_RELEASE_URL} cf-release fi ( cd cf-release if [ -n "${CF_RELEASE_BRANCH}" ]; then git checkout -f ${CF_RELEASE_BRANCH} fi if [ $CF_RELEASE_USE_HEAD != "no" ]; then # required to compile a gem native extension of CCNG sudo apt-get -y install git-core libmysqlclient-dev libpq-dev libsqlite3-dev libxml2-dev libxslt-dev gem install rake -v 0.9.2.2 --no-rdoc --no-ri # hack for collector git submodule update --init --recursive RBENV_VERSION=$ruby_version bundle install RBENV_VERSION=$ruby_version bundle exec bosh -n create release --force fi ) else echo "‘cf-release‘ directory is not empty. Skipping cloning..." fi |
下载cf_release,如果存在则升级。cf_release是cf源码经过编译后的内容。源码下载下来之后,执行git submodule update --init --recursive把子模块submodule下载下来,再执行boshcreate release命令,就可以得到一个完整的cf_release。。在内网可以下载肉备好了,下边就开始调作料了,install_environemnt.sh:
#!/bin/bash -ex ( cd nise_bosh sudo ./bin/init sudo apt-get install -y libmysqlclient-dev libpq-dev ) |
这个脚本里又调用了一个新的脚本,nise_bosh/bin里的init脚本:
#!/bin/bash -ex bosh_app_dir=/var/vcap bosh_dir=${bosh_app_dir}/bosh apt-get update # emulating stemcell_builder/stages/image_install_grub/apply.sh if [ `lsb_release -cs` == "trusty" ]; then if (sed -i -e ‘s/GRUB_CMDLINE_LINUX=""/GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"/‘ /etc/default/grub); then update-grub else echo Your /etc/default/grub is modified from the default exit 1 fi fi # stemcell_builder/stages/base_apt/apply.sh DEBIAN_FRONTEND=noninteractive apt-get install -o Dpkg::Options::="--force-confnew" -f -y \ --force-yes --no-install-recommends \ build-essential libssl-dev lsof \ strace bind9-host dnsutils tcpdump iputils-arping \ curl wget libcurl3 libcurl3-dev bison libreadline6-dev \ libxml2 libxml2-dev libxslt1.1 libxslt1-dev zip unzip \ nfs-common flex psmisc apparmor-utils iptables sysstat \ rsync openssh-server traceroute libncurses5-dev quota \ libaio1 gdb tripwire libcap2-bin libyaml-dev # stemcell_builder/stages/bosh_monit/apply.sh DEBIAN_FRONTEND=noninteractive apt-get install -o Dpkg::Options::="--force-confnew" -f -y \ --force-yes --no-install-recommends runit # installed somewhere else DEBIAN_FRONTEND=noninteractive apt-get install -o Dpkg::Options::="--force-confnew" -f -y \ --force-yes --no-install-recommends gettext # bosh_agent/lib/bosh_agent/platform/ubuntu/templates/logrotate.erb cat <<EOF > /etc/logrotate.d/nise_bosh /var/vcap/sys/log/*.log /var/vcap/sys/log/*/*.log /var/vcap/sys/log/*/*/*.log { missingok rotate 7 compress delaycompress copytruncate size=100M } EOF # stemcell_builder/stages/bosh_users/apply.sh if [ `cat /etc/passwd | cut -f1 -d ":" | grep "^vcap$" -c` -eq 0 ]; then addgroup --system admin adduser --disabled-password --gecos Ubuntu vcap for grp in admin adm audio cdrom dialout floppy video plugdev dip do adduser vcap $grp done else echo "User vcap exists already, skippking adduser..." fi # stemcell_builder/stages/system_kernel/apply.sh if [ -d /boot/grub ]; then if [ `lsb_release -cs` == "lucid" ]; then variant="lts-backport-oneiric" # Headers are needed for open-vm-tools DEBIAN_FRONTEND=noninteractive apt-get install -o Dpkg::Options::="--force-confnew" -y -f \ linux-image-virtual-${variant} linux-headers-virtual-${variant} else DEBIAN_FRONTEND=noninteractive apt-get install -o Dpkg::Options::="--force-confnew" -y -f \ linux-image-virtual linux-image-extra-virtual fi fi # stemcell_builder/stages/bosh_monit/apply.sh monit_basename=monit-5.2.4 ( cd /tmp wget "http://mmonit.com/monit/dist/${monit_basename}.tar.gz" -O ${monit_basename}.tar.gz tar xvzf ${monit_basename}.tar.gz cd ${monit_basename} ./configure --prefix=$bosh_dir --without-ssl make -j4 && make install ) mkdir -p $bosh_dir/etc cat <<EOF > /$bosh_dir/etc/monitrc set daemon 10 set logfile /var/vcap/monit/monit.log set httpd port 2822 and use address 127.0.0.1 allow cleartext /var/vcap/monit/monit.user include /var/vcap/monit/*.monitrc include /var/vcap/monit/job/*.monitrc EOF chmod 0700 $bosh_dir/etc/monitrc mkdir -p $bosh_app_dir/monit touch $bosh_app_dir/monit/empty.monitrc echo Done. if [ ! -d /sys/fs/cgroup ]; then echo "Restart may be required" fi |
下载了茫茫多的东西…作料撒上了,接着开始炖了install_cf_release.sh:
#!/bin/bash -ex NISE_IP_ADDRESS=${NISE_IP_ADDRESS:-`ip addr | grep ‘inet .*global‘ | cut -f 6 -d ‘ ‘ | cut -f1 -d ‘/‘ | head -n 1`} ./scripts/generate_deploy_manifest.sh ( cd nise_bosh bundle install # Old spec format sudo env PATH=$PATH bundle exec ./bin/nise-bosh -y ../cf-release ../manifests/deploy.yml micro -n ${NISE_IP_ADDRESS} # New spec format, keeping the monit files installed in the previous run sudo env PATH=$PATH bundle exec ./bin/nise-bosh --keep-monit-files -y ../cf-release ../manifests/deploy.yml micro_ng -n ${NISE_IP_ADDRESS} ) |
这里边又出现了一个脚本generate_deploy_manifest.sh:
#!/bin/bash -ex NISE_IP_ADDRESS=${NISE_IP_ADDRESS:-`ip addr | grep ‘inet .*global‘ | cut -f 6 -d ‘ ‘ | cut -f1 -d ‘/‘ | head -n 1`} sed "s/192.168.10.10/${NISE_IP_ADDRESS}/g" manifests/template.yml > manifests/deploy.yml if [ "${NISE_DOMAIN}" != "" ]; then if (! sed --version 1>/dev/null 2>&1); then # not a GNU sed sed -i ‘‘ "s/${NISE_IP_ADDRESS}.xip.io/${NISE_DOMAIN}/g" manifests/deploy.yml else sed -i "s/${NISE_IP_ADDRESS}.xip.io/${NISE_DOMAIN}/g" manifests/deploy.yml fi fi if [ "${NISE_PASSWORD}" != "" ]; then if (! sed --version 1>/dev/null 2>&1); then # not a GNU sed sed -i ‘‘ "s/c1oudc0w/${NISE_PASSWORD}/g" manifests/deploy.yml else sed -i "s/c1oudc0w/${NISE_PASSWORD}/g" manifests/deploy.yml fi fi |
这个脚本的主要作用就是新建一个deploy.yml并修改ip等一些东西。
所有脚本执行完毕,安装也完毕了,重启机器。后,执行~/cf_nise_installer/script/start即可启动服务。
2.3启动
重启后,在~/cf_nise_installer/script下执行./start.sh,程序会自动启动。
#!/bin/bash -ex path=`dirname $0` cd "$path"/../ sudo /var/vcap/bosh/bin/monit sleep 5 for process in \ postgres \ nats do sudo /var/vcap/bosh/bin/monit start $process sleep 30 done; sudo /var/vcap/bosh/bin/monit start all echo "Waiting for all processes to start" for ((i=0; i < 120; i++)); do if ! (sudo /var/vcap/bosh/bin/monit summary | tail -n +3 | grep -v -E "running$"); then break fi sleep 10 done if (sudo /var/vcap/bosh/bin/monit summary | tail -n +3 | grep -v -E "running$"); then echo "Found process failed to start" exit 1 fi set +x echo "All processes have been started!" api_url=`grep srv_api_uri: ./manifests/deploy.yml | awk ‘{ print $2 }‘` password=`grep ‘ - admin‘ ./manifests/deploy.yml | cut -f 2 -d ‘|‘ ` echo "Login : ‘cf login -a ${api_url} -u admin -p ${password} --skip-ssl-validation‘" echo "Download CF CLI from https://github.com/cloudfoundry/cli" |
其实就是使用/var/vcap/bosh/bin/monit进行启动,手动执行效果也是一样的。
可能会出现warden无法启动的情况,如果无法启动,执行下边三天命令:
$umount /home/yourname/.gvfs $find . -inum 554009 -exec rm{} \; $rm -rf .gvfs |
删除后执行sudo /var/vcap/bosh/bin/monitrestart warden 重启warden服务。同时也可以使用sudo /var/vcap/bosh/bin/monit summary来监控服务状态。全部启动如下图:
版权声明:本文为博主原创文章,未经博主允许不得转载。