宜信開源|手把手教你安裝第一個LAIN應用
擴充閱讀: 宜信開源|詳解PaaS平臺LAIN的功能和架構
一、安裝 LAIN 叢集
本節包含三種場景下安裝LAIN叢集
- 本地啟動虛擬機器安裝LAIN叢集,可供本地測試開發
- 物理伺服器/虛擬機器安裝LAIN叢集
- 雲伺服器安裝LAIN叢集
三者都需要從 GitHub 獲取已經發布的 LAIN 版本原始碼: https://github.com/laincloud/lain/releases
下載原始碼後在目標機器上解壓即可。
tar xf lain-VERSION.tar.gz
1、本地安裝LAIN叢集
1)環境依賴
- Linux / MacOS
- 能夠連線到網際網路
- VirtualBox 5.1.22 r115126 (Qt5.6.2)
- Vagrant 1.9.4
- 最少 2G 剩餘記憶體(如果需要拉起多個節點,最少 3G)
2)初始化
啟動並初始化第一個節點
cd lain-VERSION vagrant up --provision
啟動耗時取決於 vagrant box 下載時間, 啟動完成後 vagrant 會自動 執行bootstrap進行初始化, 初始化需要至少20分鐘,取決於網路速度。 初始化過程為叢集預設配置vip=192.168.77.201
如果出現以下錯誤:
Vagrant was unable to mount VirtualBox shared folders. This is usually because the filesystem "vboxsf" is not available. This filesystem is made available via the VirtualBox Guest Additions and kernel module. Please verify that these guest additions are properly installed in the guest. This is not a bug in Vagrant and is usually caused by a faulty Vagrant box. For context, the command attempted was: mount -t vboxsf -o uid=1000,gid=1000 vagrant /vagrant The error output from the command was: /sbin/mount.vboxsf: mounting failed with the error: No such device
這個錯誤是因為宿主機的 Virtual Box 的 Guest Additions 與 laincloud/centos-lain box 已安裝的 Guest Additions 版本不一致引起的,導致無法建立 /vagrant 這個同步 目錄。請修改工程根目錄下的 Vagrantfile,禁止宿主機強行安裝新版本的 Guest Additions, 即新增如下配置:
config.vbguest.auto_update = false
3)新增更多節點
vagrant up node2 # 待 node2 啟動後 [vagrant@node1 ~]$ cd /vagrant [vagrant@node1 ~]$ sudo lainctl node add -p playbooks node2:192.168.77.22 # root 密碼為 vagrant
4)同理可以如此新增
node3
2、物理伺服器/虛擬機器安裝LAIN叢集
1)環境依賴
- CentOS 7.2
- NTP 服務保證節點間時間一致
- 需要能訪問到可用的 yum 源(包括 epel)
- 能夠連線到網際網路
- 各節點之間能夠互相 ssh
- 各節點 hostname 不同
- 各個節點位於同一個路由器之內
2)初始化
第一個節點
cd lain-VERSION # 選擇一個同網段的未被使用的 IP 地址作為 VIP sudo ./bootstrap -r docker.io/laincloud --vip={{ vip }}
國內使用者建議通過 -m 引數使用 aliyun 的加速器下載映象,使用方式為
sudo ./bootstrap -m https://l2ohopf9.mirror.aliyuncs.com \ -r docker.io/laincloud --vip=192.168.77.201
新增更多節點
# 需要輸入 root 密碼 sudo lainctl node add -p playbooks {{ hostname }}:{{ ip }}
3、雲伺服器安裝LAIN叢集
1)環境依賴
- CentOS 7.2
- NTP 服務保證節點間時間一致
- 需要能訪問到可用的 yum 源(包括 epel)
- 能夠連線到網際網路
- 各節點之間能夠互相 ssh
- 各節點 hostname 不同
- 各個節點位於同一個 VPC (或虛擬路由器)之內
3) 初始化
第一個節點
cd lain-VERSION # 如果 VPC 不對資料包進行來源 IP 限制(如青雲) sudo ./bootstrap -r docker.io/laincloud # 如果 VPC 限制了資料包的來源 IP(如阿里雲) sudo ./bootstrap -r docker.io/laincloud --ipip
新增更多節點
# 需要輸入 root 密碼 sudo lainctl node add -p playbooks {{ hostname }}:{{ ip }}
4、配置LAIN Console 的域名解析
LAIN Console 元件是 LAIN 叢集的控制檯,配置域名解析後即可在瀏覽器訪問 http://console.lain.local
echo "IP/VIP console.lain.local" >> /etc/hosts
5、常見問題
add-node ssh-copy-id 失敗
如果出現 ssh-copy-id 失敗,可能需要把
node1:/root/.ssh/lain.pub
內容放到
node2:/root/.ssh/authorized_keys
裡,新增一行。當然原因可能是多樣的,最有可能就是 lain-02 的
/root/.ssh
目錄或者目錄中的檔案許可權不對
二、安裝 LAIN 客戶端
開發 LAIN 應用時,需要安裝 LAIN 客戶端。LAIN 客戶端依賴於: - docker - python
只要支援 docker 和 python 的系統,就可以使用 LAIN 客戶端,比如 Linux 和 macOS。
以下均假設 LAIN 叢集的 domain 為 lain.local,對於其他 domain,將下文中的 lain.local 替換即可。
1、安裝與配置 docker
1)安裝
請參考 https://docs.docker.com/engine/installation/ 安裝 docker >= 1.12。
2)配置
Insecure Registries
安裝好之後,請參考 https://docs.docker.com/registry/insecure/ 將
registry.lain.local
新增進 docker daemon 的
insecure-registries
選項。
例如,在 Linux 上,如下的
/etc/docker/daemon.json
表示將
registry.lain.local
加入了
insecure-registries
:
{ "insecure-registries" : ["registry.lain.local"] }
macOS 上的 insecure registries 配置如下圖所示:
配置
insecure-registries
是因為 LAIN 叢集的映象倉庫只提供了 HTTP 服務,沒有提供 HTTPS 服務。
2、安裝與配置 lain-cli
pip install lain-cli
推薦使用 virtualenv 安裝這個 python 包,即:
pip install virtualenv # 安裝 virtualenv virtualenv lain # lain 是虛擬環境的名字,也可以取其他名字 source lain/bin/activate # 啟用 lain 虛擬環境 pip install lain-cli deactivate # 退出 lain 虛擬環境
以後需要使用 lain-cli 的時候,用
source ${lain-virtualenv-path}/bin/activate
啟用 lain 虛擬環境; 不使用 lain-cli 的時候,用
deactivate
退出 lain 虛擬環境
安裝好之後,需要配置 lain-cli,讓 lain-cli 知道 LAIN 叢集的 Domain 等資訊:
lain config show # 顯示當前配置 lain config save-global private_docker_registry registry.lain.local # 配置 docker 私有倉庫 lain config save local domain lain.local # 儲存 lain.local 叢集,並取名為 local
假如 LAIN 叢集開啟了 sso 驗證(預設未開啟),請配置 sso:
lain config save local sso_url https://sso.lain.local
3、配置 LAIN 元件的域名解析
如果 LAIN 叢集不能在公網上解析(比如本地啟動的叢集),請配置 /etc/hosts。
如果啟動叢集時,使用了
vip
模式,即使用了
/vagrant/bootstrap -r docker.io/laincloud --vip=192.168.77.201
啟動,請執行:
echo "192.168.77.201 registry.lain.local console.lain.local entry.lain.local lvault.lain.local ipaddr-client.lain.local ipaddr-service.lain.local ipaddr-client.ipaddr-resource.resource.lain.local" >> /etc/hosts
192.168.77.201
是啟動叢集時的 vip 引數
如果啟動叢集時,沒有使用
vip
模式,即使用了
/vagrant/bootstrap -r docker.io/laincloud
啟動,請執行:
echo "192.168.77.21 registry.lain.local console.lain.local entry.lain.local lvault.lain.local ipaddr-client.lain.local ipaddr-service.lain.local ipaddr-client.ipaddr-resource.resource.lain.local" >> /etc/hosts
192.168.77.21
是叢集的主節點的 IP,即啟動叢集的節點的 IP。
三、第一個 LAIN 應用
本節會演示如何基於 LAIN 叢集建立一個 LAIN 應用,它提供 HTTP 服務,當使用者訪問
/
時,返回
Hello, LAIN.
。
1、前置條件
- 首先需要一個 LAIN 叢集,建議由 2 個節點組成
- 其次需要本地的開發環境。具體步驟見安裝 LAIN 客戶端。
LAIN 是基於 docker 的 PaaS 系統,建議先了解下 docker 的基本概念: - Docker 官方文件 :https://docs.docker.com/ - Docker 從入門到實踐 :https://yeasy.gitbooks.io/docker_practice/content/
2、業務程式碼
package main import ( "net/http" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Hello, LAIN.")) }) http.ListenAndServe(":8080", nil) }
程式碼的邏輯為:
-
監聽
0.0.0.0:8080
埠 -
收到
/
的 HTTP 請求時,返回Hello, LAIN.
3、lain.yaml
lain.yaml
是 LAIN 應用的配置檔案,如下例所示:
appname: hello-world # 應用名,在叢集內唯一,由小寫字母、數字和 `-` 組成,且開頭不能為數字,不能有連續的 `-` build: # 描述如何構建 hello-world:build-${git-committer-date}-${git-commit-hash} 映象 base: golang:1.8 # 基礎映象,類似於 Dockerfile 裡的 FROM script: - go build -o hello-world # 編譯指令,類似於 Dockerfile 裡的 RUN,WORKDIR 為 /lain/app proc.web: # 定義一個 proc,名字為 web type: web # proc 型別為 web(LAIN 會為 web 型別的 proc 配置 ${appname}.${LAIN-domain} 的域名,對外提供 HTTP 服務) cmd: /lain/app/hello-world # 因為 WORKDIR 為 /lain/app,所以編譯好的程式在 /lain/app 目錄下 port: 8080 # hello-world 監聽的埠
因為我們需要提供 HTTP 服務,所以定義一個
web
型別的 proc,LAIN 叢集會為 web 型別的 proc 自動分配 ${appname}.${LAIN-domain} 的域名。
proc.type 為
web
時,其名字也必須為 web,即一個 app 只能有一個 web 型別的 proc,且其名字為 web。
laincloud/hello-world@basic 的完整程式碼在這裡:https://github.com/laincloud/hello-world/tree/basic
4、本地執行
[vagrant@lain ~]$ cd ${hello-world-project} # 進入工程目錄 [vagrant@lain hello-world]$ lain build # 構建 hello-world:build-${git-committer-date}-${git-commit-hash} 映象,生成編譯結果 >>> Building meta and release images ... >>> found shared prepare image at remote and local, sync ... >>> generating dockerfile to /Users/bibaijin/Projects/go/src/github.com/laincloud/hello-world/Dockerfile >>> building image hello-world:build-1496631978-a46ef7afcbbc18c1c1248bcbb84fa770d0758005 ... Sending build context to Docker daemon 6.656 kB Step 1/4 : FROM registry.lain.local/hello-world:prepare-0-1494908044 ---> 7406706a7f21 Step 2/4 : COPY . /lain/app/ ---> 45f6215362ad Removing intermediate container 41e822d3b086 Step 3/4 : WORKDIR /lain/app/ ---> 75c0f3094b6e Removing intermediate container 24065cf1d7de Step 4/4 : RUN ( go build -o hello-world ) ---> Running in 43cefd489608 ---> 644f596f83c8 Removing intermediate container 43cefd489608 Successfully built 644f596f83c8 >>> build succeeded: hello-world:build-1496631978-a46ef7afcbbc18c1c1248bcbb84fa770d0758005 >>> tag hello-world:build-1496631978-a46ef7afcbbc18c1c1248bcbb84fa770d0758005 as hello-world:release-1496631978-a46ef7afcbbc18c1c1248bcbb84fa770d0758005 >>> generating dockerfile to /Users/bibaijin/Projects/go/src/github.com/laincloud/hello-world/Dockerfile >>> building image hello-world:meta-1496631978-a46ef7afcbbc18c1c1248bcbb84fa770d0758005 ... Sending build context to Docker daemon 6.656 kB Step 1/2 : FROM scratch ---> Step 2/2 : COPY lain.yaml /lain.yaml ---> cfdb9c518f0d Removing intermediate container ab94a3603b8a Successfully built cfdb9c518f0d >>> build succeeded: hello-world:meta-1496631978-a46ef7afcbbc18c1c1248bcbb84fa770d0758005 >>> Done lain build. [vagrant@lain hello-world]$ lain run web # 在本地執行 >>> run proc hello-world.web.web with image hello-world:release-1496631978-a46ef7afcbbc18c1c1248bcbb84fa770d0758005 59f7fe4b1a7c6214361ecd5e06b19023ab7e02058888aa625749028af7b92954 >>> container name: hello-world.web.web >>> port mapping: >>> 8080/tcp -> 0.0.0.0:32769
- lain-cli 的所有命令均需要在包含 lain.yaml 檔案的目錄下執行。
-
lain-cli 依賴於 git 管理版本,所以要先安裝 git,而且在
lain build
之前進行git commit
docker ps
時,可以看到:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 59f7fe4b1a7c hello-world:release-1496631978-a46ef7afcbbc18c1c1248bcbb84fa770d0758005 "/lain/app/hello-w..." 27 seconds ago Up 31 seconds 0.0.0.0:32769->8080/tcp hello-world.web.web
上面的輸出表示 lain 通過 docker 把 hello-world.web.web 容器裡的 8080 埠對映到了主機的 32769,所以,可以在主機上訪問:
[vagrant@lain hello-world]$ curl http://localhost:32769 Hello, LAIN.
得到了預期的結果。
5、部署到 LAIN 叢集
從上一小節可以看到,本地執行沒有問題,現在可以部署到 LAIN 叢集了:
[vagrant@lain ~]$ cd ${hello-world-project} # 進入工程目錄 [vagrant@lain hello-world]$ lain build # 構建 hello-world:build-${git-committer-date}-${git-commit-hash} 映象,生成編譯結果 [vagrant@lain hello-world]$ lain tag local # 類似於 docker tag,為 hello-world:(meta/release)-${git-committer-date}-${git-commit-hash} 映象新增倉庫字首 >>> Taging meta and relese image ... >>> tag hello-world:meta-1496631978-a46ef7afcbbc18c1c1248bcbb84fa770d0758005 as registry.lain.local/hello-world:meta-1496631978-a46ef7afcbbc18c1c1248bcbb84fa770d0758005 >>> tag hello-world:release-1496631978-a46ef7afcbbc18c1c1248bcbb84fa770d0758005 as registry.lain.local/hello-world:release-1496631978-a46ef7afcbbc18c1c1248bcbb84fa770d0758005 >>> Done lain tag. [vagrant@lain hello-world]$ lain push local # 類似於 docker push,將映象推送到 LAIN 叢集 >>> Pushing meta and release images ... >>> pushing image registry.lain.local/hello-world:meta-1496631978-a46ef7afcbbc18c1c1248bcbb84fa770d0758005 ... The push refers to a repository [registry.lain.local/hello-world] 1a4886bd9611: Layer already exists meta-1496631978-a46ef7afcbbc18c1c1248bcbb84fa770d0758005: digest: sha256:daed70190af5fa980d6963fd3a6350591708c1568e180fe85e7eb6cfdd12d998 size: 524 >>> pushing image registry.lain.local/hello-world:release-1496631978-a46ef7afcbbc18c1c1248bcbb84fa770d0758005 ... The push refers to a repository [registry.lain.local/hello-world] 1a2245680fe1: Layer already exists dfe083dd50ba: Layer already exists edac683c8e67: Layer already exists 0372f18510d4: Layer already exists c0b53d6ac422: Layer already exists bcf20a0a17f3: Layer already exists 9d039e60afe3: Layer already exists a172d29265f3: Layer already exists e6562eb04a92: Layer already exists 596280599f68: Layer already exists 5d6cbe0dbcf9: Layer already exists release-1496631978-a46ef7afcbbc18c1c1248bcbb84fa770d0758005: digest: sha256:1cea69b6ed882fcc16f1f5661b3830a8b3f20263264c51d0610b8ec09e72a439 size: 2626 >>> Done lain push. [vagrant@lain hello-world]$ lain deploy local # 將應用部署到 LAIN 叢集 >>> Begin deploy app hello-world to local ... upgrading... Done. >>> app hello-world deploy operation: >>> last version: 1496631978-a46ef7afcbbc18c1c1248bcbb84fa770d0758005 >>> this version: 1496631978-a46ef7afcbbc18c1c1248bcbb84fa770d0758005 >>> if shit happened, rollback your app by: >>> lain deploy -v 1496631978-a46ef7afcbbc18c1c1248bcbb84fa770d0758005
- local 為 LAIN 叢集的名字,請參考安裝 LAIN 客戶端中的設定
-
lain tag
為映象新增倉庫字首,之後才能進行lain push
-
release
映象包含了編譯成果,將來會以這個映象為基礎執行容器 -
meta
映象包含lain.yaml
檔案,用於 LAIN 叢集解析,使用者不需要關心 -
部署的過程是一個非同步的過程,在
lain deploy local
之後可以使用lain ps local
查詢部署結果。
此時,可以通過以下命令訪問
hello-world
:
[vagrant@lain hello-world]$ curl -H "Host: hello-world.lain.local" http://192.168.77.201 Hello, LAIN.
或者可以先更改
/etc/hosts
檔案,然後直接使用域名訪問:
[vagrant@lain hello-world]$ echo "192.168.77.201 hello-world.lain.local" >> /etc/hosts [vagrant@lain hello-world]$ curl http://hello-world.lain.local Hello, LAIN.
上面的
192.168.77.201
是本地 LAIN 叢集的虛擬 IP,沒有以
vip
方式啟動,請使用
192.168.77.21
得到了
Hello, LAIN.
的響應,符合我們的預期。
GitHub地址 :https://github.com/laincloud
白皮書 :https://laincloud.gitbooks.io/white-paper/content/
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69918724/viewspace-2649201/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 宜信開源|手把手教你建立第一個Davinci應用
- 宜信開源|大資料可視洞察Davinci的安裝與配置攻略大資料
- 手把手教你安裝Faiss(Linux)AILinux
- 小白指南:手把手教你用低程式碼開發一個應用頁面
- 教你0 程式碼,搭應用,宜搭開發手冊告訴你
- Flutter筆記-安裝及開發第一Flutter應用Flutter筆記
- 手把手教你在本機安裝sparkSpark
- 手把手教你快應用接入微信H5網頁支付H5網頁
- PWA入門:手把手教你製作一個PWA應用
- 手把手教你安裝Jupyter Notebook(保姆級教程)
- 手把手教你SonarQube入門安裝與使用
- 手把手教你玩轉HarmonyOS版地圖應用開發地圖
- 手把手教你封裝一個Modal元件封裝元件
- 開發第一個Flink應用
- 微信親屬卡開通教程 手把手教你怎麼用開通微信親屬卡
- 新手指南: 手把手教你安裝 Ubuntu 和 FedoraUbuntu
- 手把手教你安裝Linux效能監控工具——pydashLinux
- 手把手教你在各大平臺上安裝SQLiteSQLite
- 手把手教你如何安裝Pycharm——靠譜的Pycharm安裝詳細教程PyCharm
- 自己寫個網盤系列:③ 開源這個網盤編碼,手把手教你windows linux 直接部署,docker本地打包部署網盤應用WindowsLinuxDocker
- 手把手教你接入微信支付
- 手把手教你用vue搭建個人站Vue
- 手把手教你如何在Ubuntu系統中安裝PycharmUbuntuPyCharm
- 手把手教你HDFS基礎配置安裝及命令使用!
- 微信直播、看點直播,手把手教你如何開通
- 開源OA:手把手教你搭建OA辦公系統(1)伺服器安裝和資料初始化伺服器
- 手把手教你用Taro框架寫一個影象處理類微信小程式框架微信小程式
- 手把手教你寫一個微信小程式日曆元件微信小程式元件
- 從0開始,手把手教你用Vue開發一個答題AppVueAPP
- 手把手教你釋出自己的開源庫到 Jcenter
- 宜信開源微服務任務排程平臺(SIA-TASK)微服務
- 手把手教你用 Go 實現一個 mTLSGoTLS
- 5 個開源的速讀應用
- 手把手教你開發微信小程式中的外掛微信小程式
- 安裝用於 Windows 應用開發的工具Windows
- 全球首個開放應用模型 OAM 開源模型
- 宜信開源|漏洞管理平臺『洞察』的設計理念和平臺功能
- 安信實驗室教你如何實現Windows自動安裝!Windows