magnum

Docker get start

Install Docker (Ubuntu 14.04)

#加入第三方的apt來源
$ sudo apt-get update
$ sudo apt-get install apt-transport-https ca-certificates
$ sudo apt-key adv \ --keyserver hkp://ha.pool.sks-keyservers.net:80 \ --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
$ echo "deb https://apt.dockerproject.org/repo ubuntu-trusty main" | sudo tee /etc/apt/sources.list.d/docker.list
#驗證docker已存在於apt-cache
$ sudo apt-get update
$ apt-cache policy docker-engine
#為了使用aufs storage driver,14.04版應是先安裝linux-image-extra-* kernel packages
$ sudo apt-get install linux-image-extra-$(uname -r) linux-image-extra-virtual
#安裝docker-engine
$ sudo apt-get update
$ sudo apt-get install docker-engine
#啟動docker,作hello-world image測試
$ sudo service docker start

Docker 運作流程

  1. Docker Engine CLI client 連接到 Docker Engine daemon.
  2. Docker Engine daemon 從 Docker Hub pull image(例如:"hello-world" image)
  3. Docker Engine daemon 利用抓下來的image載入到一個新的container並執行其內容
  4. Docker Engine daemon 將運行結果回傳給 Docker Engine CLI client,並送回到原本執行command的terminal

Verify Installation

#hello-world image測試
$ sudo docker run hello-world
#啟動一個ubuntu tty,-t 選項讓Docker分配一個虛擬終端(pseudo-tty)並綁定到容器的標準輸入上, -i 則讓容器的標準輸入保持打開。
$ sudo docker run -it ubuntu bash
#啟動一個whalesay image,
$ docker run docker/whalesay cowsay boo
#docker版本查詢
$ sudo docker version
#docker containers運行清單
$ sudo docker ps -a
#docker image清單
$ sudo docker images

Build image

#寫一個Dockerfile
$ mkdir mydockerbuild
$ cd mydockerbuild
$ touch Dockerfile
$ nano Dockerfile
FROM docker/whalesay:latest
RUN apt-get -y update && apt-get install -y fortunes
CMD /usr/games/fortune -a | cowsay
#利用Dockerfile build一個image
$ docker build -t docker-whale .

Push and pull image

#找出image id
$ sudo docker images
#標記image
$ sudo docker tag [image-id] baddychiang/docker-whale:latest
#登入docker hub
$ sudo docker login
#push image到repository
$ sudo docker push baddychiang/docker-whale
#移除本地端image
$ sudo docker rmi docker-whale
#重新pull image下來執行
$ sudo docker run baddychiang/docker-whale
OpenStack

Basic OpenStack operations

API

透過GUI、CLI下的指令,都會轉換成API來執行,所以任何指令也都能透過API來完成

Debug CLI

CLI加上–debug,便能expose API的行為

Set environmental variables

#bash的completion
$ source /opt/stack/python-novaclient/tools/nova.bash_completion
#從某個demo in demo執行指令
$ source openrc demo demo

Keystone – creating tenants, users and roles

#建立General tenant
$ keystone tenant-create --name General
#建立XXX user
$ keystone user-create \
--name=XXX \
--pass=openstack \
--tenant-id [tenant_id] \
--email=XXX@mail.com
#查看user list, role list
$ keystone user-list
$ keystone role-list
#增加一個role
$ keystone user-role-add \
--tenant-id [tenant_id] \
--user-id [user_id] \
--role-id [role_id]

Neutron – tenant network

inside tenant要建立一個private network、subnet、virtual router再與public(external) network連接

#建立一個internal network
$ neutron net-create \
--tenant-id [tenant_id] \
[NETWORK_NAME]
#在network中建立一個subnet
$ neutron subnet-create \
--tenant-id [tenant_id] \
[NETWORK_NAME] \
[SUBNET_RANGE CIDR  ex:172.24.220/24]
#建立一個virtual router
$ neutron router-create \
--tenant-id [tenant_id] \
[ROUTER_NAME]
#把router加入到internal subnet
$ neutron router-interface-add \
[ROUTER_ID] \
[SUBNET_ID]
#秀出external network list
$ neutron net-external-list
#[已經有external network]指定外部的external network作為internal router的gateway
$ neutron router-gateway-set \
[ROUTER_ID] \
[EXT_NETWORK_ID]
#[尚未有external network]若外部沒有external network,則必須建立一個,預設是由admin tenant來建立
$ neutron net-create \
[EXT_NETWORK_NAME] \
--router:external=True
#[尚未有external network]在external network中建立一個subnet
$ neutron subnet-create \
--gateway [GATEWAY_IP ex:192.168.2.1] \
--allocation-pool start=[IP_START ex:192.168.2.2] ,end=[IP_END ex:192.168.2.254] \
[NETWORK_NAME ex:new_public] \
[SUBNET_RANGE CIDR  ex:192.168.2.0/24] \
--enable_dhcp=False
#秀出router list
$ neutron router-list
#切換router gateway,從已有的external network切換到新建立的external network
$ neutron router-gateway-clear \
[ROUTER_ID]
$ neutron router-gateway-set \
[ROUTER_ID] \
[NEW_EXT_NETWORK_ID]
#秀出特定router的info
$ neutron router-show

 Keystone、Nova、Cinder Quotas management

每個tenant建立時就會帶入預設的quota,每個tenant中的user也會配置tenant的預設quota,但是每個user的quota都可以被調整,當增加quotas超過tenant的quota時,tenant quota也會被調升。

#秀出tenant id
$ keystone tenant-list
#秀出目前tenant內的nova(Compute) quotas information
$ nova quota-show \
--tenant [TENANT_ID]
#秀出目前tenant預設quotas (不加TENANT_ID)
$ nova quota-show
#修改某個tenant的quota限制
$ nova quota-update \
--[QUOTA_KEY ex:cores] [QUOTA_VALUE ex:20] \
[TENANT_ID]
#查詢某個tenant內的user quotas information (預設user quota會等同預設的tenant quota,不受修改的tenant quota影響)
$ nova quota-show \
--user [USER_ID] \
--tenant [TENANT_ID]
#修改某個tenant的user quota限制
$ nova quota-update \
--user [USER_ID] \
--[QUOTA_KEY ex:instance] [QUOTA_VALUE ex:1] \
[TENANT_ID]
#秀出目前tenant內的cinder(Storage) quotas information
$ cinder quota-show \
--tenant [TENANT_ID]
#秀出目前tenant內的neutron(Networking) quotas information
$ neutron quota-show \
--tenant [TENANT_ID]

文章參考資料

  • OpenStack IN ACTION (ISBN:9781617292163)
OpenStack

DevStack testing

安裝DevStack流程

建議使用Ubuntu 14.04版

#更新packages
$ sudo apt-get -y update
$ sudo apt-get -y upgrade
#安裝git,以clone DevStack
$ sudo apt-get -y install git
#clone DevStack至/opt/devstack/
$ sudo git clone https://github.com/openstack-dev/devstack.git /opt/devstack/
#創建devstack專用用戶stack
$ cd /opt/devstack/
$ sudo chmod u+x tools/create-stack-user.sh
$ sudo tools/create-stack-user.sh
$ sudo chown -R stack:stack /opt/devstack/
#切換到stack以執行安裝
$ sudo -iu stack
$ cd /opt/devstack/
#配置所需的local.conf
$ nano local.conf
#進行安裝./stack.sh
$ ./stack.sh
#-----------------------------------------------
#中途若遇到失敗,可透過unstack以及clean的動作進行重新安裝
$ ./unstack.sh
$ ./clean.sh
$ sudo rm -rf /opt/stack
$ sudo reboot
$ sudo mkdir /opt/stack
#接著再從 上述 [#創建devstack專用用戶stack] 重新進行
#-----------------------------------------------


文章參考資料

  • OpenStack IN ACTION (ISBN:9781617292163)
magnumOpenStack

Openstack magnum overview

Magnum

官方網站、wiki的介紹

Magnum 是Openstack Containers Team所開發的一套API service,允許一些container編制引擎(orchestration engines)能夠做為第一類的資源(first class resource)來使用,例如:Docker Swarm, Kubernetes(K8s), and Apache Mesos,並透過這些資源來管理及佈署container,達成CaaS(container as a service)。
Magnum是透過Heat去編制一個包含了Docker或是K8s的OS image,而這個image允許以VM或裸機(bare metal)的方式運行。

OpenStack和Docker/container的關係

Openstack和Docker可以呈現互補的關係。因為Openstack著重在IaaS的整合及服務,Docker的出現能利用Openstack在IaaS出色的表現,加上container比VM更輕量的特性,將資源更充分利用。
openstack-as-layers

OpenStack中的項目可以按其特性分成4層:
  1. 基礎設施層(Base Compute Infrastructure): 如Nova, Glance, Keystone
  2. 擴展基礎設施層(Extended Infrastructure): 能基於第一層提供延伸性的服務,如Cinder、Swift、Neutron、Designate和Ironic
  3. 可選的增強項目層(Optional Enhancements): 是選用而不是必備的項目,可以提供用戶更高級的服務,如Ceilometer、Horizon和Barbican
  4. 消費型服務層(Consumption Services):消費所指的就是要消耗或使用下方的三層的服務來達成的第四層服務,如Heat、Magnum、Sahara、Solum和Murano,其中Magnum就是屬於這一層的服務。
  5. Kolla不屬於這四層,他主要是將Openstack的所有服務都container化,讓安裝佈署即升級更為方便。

Magnum術語及架構

  • Container: 容器
  • Pod: 是K8s中的基本佈署單元,是一群Containers的集合,可以在同一個host上一起運行
  • Service: 把Container與Network port介接起來,可提供服務是Pod的路由代理抽象,Client端便透過Serive做代理,以運行Pod
  • Replication Controller: 是Pod的複製抽象,用來做Pod的複製、Scale、HA、load balance
  • Bay: 一群Nova instance的群集集合,透過Magnum可創建K8s或Swarm的Bay
  • Baymodel: 用來定義Bay的規格
  • Node: Bay中的節點

6.png

File:Magnum architecture.png

Magnum主要有兩個服務Magnum API及Magnum Conductor:
Magnum API負責處理client的請求。
Magnum Conductor負責做後端的處理,將client的請求轉送到對應的K8s、Swarm等backend

Magnum的角色與Nova有一定的相似程度,Nova透過不同的Hypervisor去管理VM,而Magnum透過不同的orchestration engines去管理container。

Magnum所能改進問題

  • 在Heat之上實做,並無法提供Multi-tenancy的架構
  • Asynchronous API 允許Request提出後,不用持續被block and wait
  • 結合並利用Heat的Orchestartion機制,而不是直接靠Heat實做
  • 利用Keystone提供SSO(Single-sign on)

Magnum 新特色 2015 Oct. Liberty Release

  • 支援Apache Mesos
  • Secure Bay,在Magnum API與Client之間實做TLS(Transport Layer Security)
  • 更多的Load Balancer,更容易做到scale
  • Multi-Master for HA

Magnum FAQ

  1. Magnum於nova有什麼不同?
    Magnum提供API來部署應用容器,與nova-docker部署的容器處於不同的生命週期。事實上,Bay是一群Nova instance的集合
  2. Magnum於Dokcer和K8S有什麼不同?
    與Docker&k8s相比,Magnum提供了一組和Keystone一起工作異步的api,具備多租戶的能力。同時,Magnum不負責編排的工作,編排工作是有heat完成的。在Mangum中,K8S和docker都是Magnum的組件。 Magnum使用它們作為容器後端來管理容器。
  3. 是否與Nova-docker做的事情是相同的?
    Nova-Docker是nova的一個driver,使得用戶可以將容器作為一種輕量的虛擬機來使用。但是,Magum是用來部署用戶的服務容器的。 Magnum提供了一套獨立的ReST API。 Magnum並不會直接調用nova的API創建Bay。 Magnum使用的是heat的API來創建Bay。
  4. 誰需要使用Magnum?
    Magnum為OpenStack雲提供營提供了一種為雲用戶提供容器來託管服務的自助解決方案。 提供了超過現有云資源之外的能力。Magnum支持指定應用實例個數的方式進行應用伸縮,能夠在應用實例失敗的情況下自動重新啟動應用實例,與虛擬機比起來能夠將應用跟更緊的打包一起。
  5. Heat Docker 是否能完成Magnum做的事情?
    Heat Docker沒有提供資源調度的能力及選擇所使用容器技術的能力。 Heat docker並不支持與swarm和k8s的集成。
  6. 多租戶在Magnum中意味著什麼?
    由Mangnum創建出來的容器,服務,Pods,Bays這些資源只對創建他的租戶下的用戶可見。 Bays在不同租戶間不是共享的,不同租戶的容器不會運行在相同的bay裡,這意味這不同租戶的容器不會運行在同一個內核上。將同一個租戶的容器運行在相同的pods和bays裡面,將不通租戶的容器運行在不同的內核上是Magnum的關鍵安全特性。在租戶的隔離性上,使用Mangum創建的容器具有與使用nova創建虛擬機相同的隔離性。

文章參考資料:

  1. Openstack – Magnum
  2. Openstack Wiki – Magnum
  3. [aboutyun論壇]openstack与容器如何深度整合?
  4. [YouTube]OpenStack Magnum – Containers-as-a-Service
  5. OpenStack Magnum简介
  6. DockOne技术分享(八):OpenStack Magnum社区及项目介绍
OpenStack

OpenStack Overview

What is OpenStack?

OpenStack is a cloud operating system that controls large pools of compute, storage, and networking resources throughout a datacenter, all managed through a dashboard that gives administrators control while empowering their users to provision resources through a web interface.


OpenStack core services

  • Keystone → Identity: 身分驗證、Token驗證
  • Nova → Compute: 計算、管理VM
    • Nova-api: 接受與回應user,負責API的呼叫
    • Nova-compute: 一個worker daemon,透過hypervisor的API建立VM,流程如下:
      1. 從Queue接受命令後,啟動KVM,並到DB更新狀態
      2. 與nova-volume及Ceph關係緊密
    • Nova-volume: 管理、增減volume到instance上
      (Cinder is a replacement of nova-volume)
    • Nova-network: 從Queue接收命令後,掌管網路的操作
      (Neutron is a replacement of nova-network)
    • Nova-scheduler: 從Queue接收instance的請求,負責決定要由哪一台host來執行(最佳化)
  • Neutron → Networking: 網路通訊
    • 特色如下:
      1. 可以讓user配置自己的網路
      2. pluggable backend
      3. 負責Layer 1-Layer 3的網路部分
      4. 提供HAProxy達到Load Balance as a Service
    • 組成如下:
      1. Neutron-server: 接受API請求,並路由到指定的plugin
      2. Neutron plugins and agents: 負責實際的網路運作
      3. Queue: 訊息傳遞
  • Glance → Image Service: 管理Image metadata
  • Swift → Object Storage: 儲存物件(ex: virtual disks, images, backup archiving),避免SPOF(Single Point Of Failure),自我修復
  • Cinder → Block Storage: 儲存區塊(ex: volumn, snapshot),但較缺乏scaling的部分
  • Queue → Message: 提供daemon之間的訊息傳遞,優點是可以buffer large workload
  • Database → State: 記錄各種狀態、時間資訊

OpenStack optional services

  • Horizon → Dashboard: 儀表板(Web UI),stateless,init API calls
  • Ceilometer → Telemetry: 收費、benchmark、擴充性、統計
  • Heat → Orchestration: 透過一些模板做查詢等

文章參考資料

  1. OpenStack 官方Overview
  2. aboutyun論壇 – 一分钟快速入门openstack
  3. Mastering Openstack – Omar Khedher (ISBN:978-1-78439-564-3)