|  | 
 
| </p>Magnum的架构图 
 图中是Magnum的架构图,首先介绍Magnum的主要概念,在图的右上角,主要有Bay、 Baymodel、 Node、Pod、 Service、 RC、 Container。
 
 Bay: Bay在Magnum主要表示一个集群,现在通过Magnum可以创建Kubernetes和Swarm的Bay,也就是Kubernetes和Swarm集群。
 Baymodel: Baymodel是Flavor的一个扩展, Flavor主要是定义虚拟机或者物理机的规格, Baymodel主要是定义一个Docker集群的一些规格,例如这个集群的管理节点的Flavor、计算节点的Flavor、集群使用的Image等等,都可以通过Baymodel来定义。
 Node:主要是指Bay中的某个节点。
 Container:就是具体的某个Docker容器。
 Pod、 Replication Controller和Service这三个概念的意思和他们在Kubernetes中的意思是一样的,这里简单介绍如下。
 Pod是Kubernetes最基本的部署调度单元,可以包含多个Container,逻辑上表示某种应用的一个实例。比如一个web站点应用由前端、后端及数据库构建而成,这三个组件将运行在各自的容器中,那么我们可以创建三个Pod,每个Pod运行一个服务。或者也可以将三个服务创建在一个Pod,这取决于用户的应用需求。一个Pod会包含n+1个Container,多出来的那一个Container是Net Container,专门做路由的。
 Service:可以理解为Pod的一个路由,因为Pod在运行中可能被删除或者IP发生变化, Service可以保证Pod的动态变化对访问端是透明的。
 Replication Controller:是Pod的复制抽象,用于解决Pod的扩容缩容问题。通常,分布式应用为了性能或高可用性的考虑,需要复制多份资源,并且根据负载情况动态伸缩。通过Replication Controller,用户可以指定一个应用需要几份复制, Kubernetes将为每份复制创建一个Pod,并且保证实际运行的Pod数量总是与预先定义的数量是一致的 (例如,当前某个Pod宕机时,自动创建新的Pod来替换) 。
 看了架构图之后,可能对Magnum的具体部署还是存在疑惑。那我画一张Visio图解释一下。具体的部署手册敬请期待。
 
 
 bay-template-example
 
 Bay模板中包含三个重要组成部分:
 1.Heat template --OpenStack Heat的模板
 2.Template definition -- Magnum的接口,用于和heat template进行交互
 3.Definition Entry Point --用于进入Template definition
 Template definition中主要是包含了Magnum object属性和Heat tmplate属性的map表
 Definition Entry Point是一个标准的接口,用于进入Template definition,为Python objects引入mechanism的插件。每一个Template definition都必须在magnum.template_definitions group中有Entry Point
 设置python的环境并运行Magnum
 $ virtualenv .venv
 $ source .venv/bin/active
 (.venv)$ git clone https://github.com/openstack/magnum.git
 (.venv)$ cd magnum
 (.venv)$ python setup.py install
 查看安装好的template,检查template是否enable
 (.venv)$ magnum-template-manage list-templates
 Enabled Templates
 magnum_vm_atomic_k8s: /home/example/.venv/local/lib/python2.7/site-packages/magnum/templates/kubernetes/kubecluster.yaml
 magnum_vm_coreos_k8s: /home/example/.venv/local/lib/python2.7/site-packages/magnum/templates/kubernetes/kubecluster-coreos.yaml
 Disabled Templates
 安装example template
 (.venv)$ cd contrib/templates/example
 (.venv)$ python setup.py install
 查看安装好的template,检查template是否disenable
 example_template: /home/example/.venv/local/lib/python2.7/site-packages/ExampleTemplate-0.1-py2.7.egg/example_template/example.yaml
 通过在magnum.conf中设置enabled_definitions来enable example template
 (.venv)$ sudo mkdir /etc/magnum
 (.venv)$ sudo bash -c "cat &gt; /etc/magnum/magnum.conf &lt;&lt; END_CONF
 [bay]
 enabled_definitions=magnum_vm_atomic_k8s,magnum_vm_coreos_k8s,example_template
 END_CONF"
 重新观察example template是否被enable了
 通过命令中加上 --details argument来获取每个template的详细参数
 (.venv)$ magnum-template-manage list-templates --details
 Server_Type OS CoE
 vm example example_coe
 vm fedora-atomic kubernetes
 vm coreos kubernetes
 Disabled Templates
 
 bulid-atomic-image
 
 在Magnum开发项目中。使用的是Fedora Atomic image来部署Docker, Kubernetes, etcd和Flannel。这一节是介绍build image和在针对这个image做一些改变的update
 主要分为4个部分
 1.选择packages和build packages repo
 2.在Fedora 21上跑docker并build rpm-ostree repo
 3.为docker container建立新的glance image
 4.从rpm-ostree repo更新container
 创建一个package repo,并进行安装
 Find the package version that you want from::
 https://kojipkgs.fedoraproject.org/packages/
 比如:
 https://kojipkgs.fedoraproject.org/packages/kubernetes/0.20.0/0.3.git835eded.fc23/src/kubernetes-0.20.0-0.3.git835eded.fc23.src.rpm
 https://kojipkgs.fedoraproject.org/packages/etcd/2.0.13/2.fc23/src/etcd-2.0.13-2.fc23.src.rpm
 https://kojipkgs.fedoraproject.org/packages/flannel/0.5.0/1.fc23/src/flannel-0.5.0-1.fc23.src.rpm
 创建完成之后需要build package repo
 接下来需要build rpm-ostree repo
 git clone https://github.com/jasonbrooks/byo-atomic.git
 需要httpd进程关闭。因为docker需要使用80端口关联apache服务。如果80端口被占用的话,在开启docker instance的时候就会出错
 检查80端口
 sudo netstat -antp | grep :80
 应该是没有任何输出的,如果输入如下信息,那么说明80端口被占用,kill进程就可以了
 tcp6 0 0 :::80 :::* LISTEN 26981/apache2
 在两个repo都安装完成之后,安装一个增强工具
 yum install -y rpm-ostree-toolbox nss-altfiles yum-plugin-protectbase
 创建一个新的镜像
 export LIBGUESTFS_BACKEND=direct
 rpm-ostree-toolbox create-vm-disk /srv/rpm-ostree/repo fedora-atomic-host fedora-atomic/f21/x86_64/docker-host my-new-f21-atomic.qcow2
 更新Fedora Atomic server
 #编辑文件
 sudo vi /etc/ostree/remotes.d/fedora-atomic.conf
 #加上下面的content
 [remote "fedora-atomic-host"]
 url=http:///repo
 #ip为Docker instance的ip
 branches=fedora-atomic/21/x86_64/docker-host;
 gpg-verify=false
 重启生效
 sudo rpm-ostree upgrade
 sudo systemctl reboot
 在你修改完server之后,建议做一个snapshot,然后用新的image作为Magnum的bay。
 
 container-volume-integration
 
 对于Magnum用户来说,我们在Kubernetes,Swarm,Mesos中使用container-volume-integration。这一节主要是介绍如何使用container-volume-integration。
 环境:kubernetes version >= 1.1.1 and docker version >= 1.8.3
 1.在glance中存放Fedora Atomic micro-OS
 cd ~
 wget https://fedorapeople.org/groups/magnum/fedora-23-atomic-7.qcow2
 glance image-create --name fedora-23-atomic-7 \
 --visibility public \
 --disk-format qcow2 \
 --os-distro fedora-atomic \
 --container-format bare &lt; fedora-23-atomic-7.qcow2
 2.修改文件
 将kube_version参数从&#39;v1.0.6&#39;改为&#39;v1.1.8&#39;,重启magnum-conduct 服务
 sudo vi /opt/stack/magnum/magnum/templates/kubernetes/kubecluster.yaml
 3.创建一个baymodel(需要cinder组件)
 magnum baymodel-create --name k8sbaymodel \
 --image-id fedora-23-atomic-7 \
 --keypair-id testkey \
 --external-network-id public \
 --dns-nameserver 8.8.8.8 \
 --flavor-id m1.small \
 --docker-volume-size 5 \
 --network-driver flannel \
 --coe kubernetes \
 --volume-driver cinder
 4.创建一个bay
 magnum bay-create --name k8sbay --baymodel k8sbaymodel --node-count 1
 5.配置kubelet
 sudo vi /etc/kubernetes/kubelet
 Comment out the line::
 #KUBELET_ARGS=--config=/etc/kubernetes/manifests --cadvisor-port=4194
 Uncomment the line::
 #KUBELET_ARGS="--config=/etc/kubernetes/manifests --cadvisor-port=4194 --cloud-provider=openstack --cloud-config=/etc/kubernetes/kube_openstack_config"
 6.输入OpenStack用户认证信息
 sudo vi /etc/kubernetes/kube_openstack_config
 修改配置文件中的密码
 password=ChangeMe
 重启服务
 sudo systemctl restart kubelet
 启动docker
 sudo docker run -v /usr/local/bin:/target jpetazzo/nsenter
 这样Kubernetes container volume intergration就配置完成了,可以使用kubernetes container volume了。接下来是container volume integration with kubernetes bay的一个实践例子
 1.创建cinder volume
 cinder create --display-name=test-repo 1
 ID=$(cinder create --display-name=test-repo 1 | awk -F&#39;|&#39; &#39;$2~/^[[:space:]]*id/ {print $3}&#39;)
 这个命令会输出一个volume ID,在step 2上会用到
 2.创建container在这个bay上
 创建一个配置文件
 | 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 
 | cat &gt; nginx-cinder.yaml &lt;&lt; END
 apiVersion: v1
 kind: Pod
 metadata:
 name: aws-web
 spec:
 containers:
 - name: web
 image: nginx
 ports:
 - name: web
 containerPort: 80
 hostPort: 8081
 protocol: TCP
 volumeMounts:
 - name: html-volume
 mountPath: "/usr/share/nginx/html"
 volumes:
 - name: html-volume
 cinder:
 # Enter the volume ID below
 volumeID: $ID
 fsType: ext4
 END
 
 | 
 使用这个pod创建container
 magnum pod-create --manifest ./nginx-cinder.yaml --bay k8sbay
 
 functional-test
 
 这一节是介绍开发者如何在自己的机器上进行功能测试
 1.在devstack上测试
 | 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 
 | cd /opt/stack/magnum
 cp /opt/stack/tempest/etc/tempest.conf /opt/stack/magnum/etc/tempest.conf
 cp functional_creds.conf.sample functional_creds.conf
 # update the IP address
 HOST=$(cat /etc/magnum/magnum.conf | awk &#39;/^host = /{print $3}&#39;)
 sed -i "s/127.0.0.1/$HOST/" functional_creds.conf
 # update admin password
 source /opt/stack/devstack/openrc admin admin
 iniset functional_creds.conf admin pass $OS_PASSWORD
 # update demo password
 source /opt/stack/devstack/openrc demo demo
 iniset functional_creds.conf auth password $OS_PASSWORD
 Set the DNS name server to be used in your bay nodes (e.g. 8.8.8.8)::
 # update DNS name server
 source /opt/stack/devstack/openrc demo demo
 iniset functional_creds.conf magnum dns_nameserver
 Create the necessary keypair and flavor::
 source /opt/stack/devstack/openrc admin admin
 nova keypair-add --pub-key ~/.ssh/id_rsa.pub default
 nova flavor-create m1.magnum 100 1024 10 1
 nova flavor-create s1.magnum 200 512 10 1
 source /opt/stack/devstack/openrc demo demo
 nova keypair-add --pub-key ~/.ssh/id_rsa.pub default
 Upgrade packages::
 UPPER_CONSTRAINTS=/opt/stack/requirements/upper-constraints.txt
 sudo pip install -c $UPPER_CONSTRAINTS -U -r test-requirements.txt
 
 | 
 2.非DevStack
 需要创建一个配置文件 /etc/tempest.conf
 | 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 
 | [auth]
 use_dynamic_credentials=False
 test_accounts_file=/tmp/etc/magnum/accounts.yaml
 admin_username=admin
 admin_password=password
 admin_project_name=admin
 [identity]
 disable_ssl_certificate_validation=True
 uri=https://identity.example.com/v2.0
 auth_version=v2
 region=EAST
 [identity-feature-enabled]
 api_v2 = true
 api_v3 = false
 trust = false
 [oslo_concurrency]
 lock_path = /tmp/
 [magnum]
 image_id=22222222-2222-2222-2222-222222222222
 nic_id=11111111-1111-1111-1111-111111111111
 keypair_id=default
 flavor_id=small
 magnum_url=https://magnum.example.com/v1
 [debug]
 trace_requests=true
 
 | 
 在运行tox时,确保系统知道tempest的配置文件
 export TEMPEST_CONFIG_DIR=/tmp/etc/magnum/
 tox -e functional-api
 运行test
 运行所有test
 tox -e functional-k8s
 运行选择好的test
 tox -e functional-k8s -- magnum.tests.functional.k8s.v1.test_k8s_python_client.TestBayModelResource
 
 Kubernetes-load-balance
 
 在Kubernetes cluster中,所有master和minion都需要连接到Neutron的subnet上,这样所有的nodes都可以进行相互之间的通信或者连接到Internet了。
 所有Kubernetes pods和service连接到一个私有的container网络中,默认是Flannel,一种Overlay的网络形式,跑在Neutron subnet之上。Pods和services从这个container网络中获取IP地址,从而进行三层的网络访问。但是,这里的IP地址是不能从一个Neutron外部网络中获取的。
 需要将service的endpoint publish到外部网络,这样才能使得外部网络能够访问container的服务,Kubernetes提供了这样的外部Load-balance机制。当一个服务被创建的时候,Kubernetes就会给这个服务加上一个外部的load balancer,这样这个服务就会得到一个外部的IP地址。使得外部网络能够访问container的服务。
 这一节主要是介绍如何使用这个Kubernetes-load-balance功能
 Kubernetes的master节点需要通过OpenStack的接口来管理Neutron的load balancer,因此,Kubernetes需要获取该接口的认证,Kubernetes默认不开启load balance的功能
 如果需要手动开启load balance的功能就需要进行以下配置:
 1.配置 kube-apiserver:
 sudo vi /etc/kubernetes/apiserver
 Comment out the line::
 #KUBE_API_ARGS="--runtime_config=api/all=true"
 Uncomment the line::
 KUBE_API_ARGS="--runtime_config=api/all=true --cloud_config=/etc/sysconfig/kube_openstack_config --cloud_provider=openstack"""
 2.配置 kube-controller-manager:
 sudo vi /etc/kubernetes/controller-manager
 Uncomment the line::
 KUBE_CONTROLLER_MANAGER_ARGS="--cloud_config=/etc/sysconfig/kube_openstack_config --cloud_provider=openstack"
 3.输入OpenStack用户认证:
 sudo vi /etc/sysconfig/kube_openstack_config
 密码设置为Keystone的用户密码
 password=ChangeMe
 4.重启相关服务:
 sudo service kube-apiserver restart
 sudo service kube-controller-manager restart
 service kube-apiserver status
 service kube-controller-manager status
 注意点:在删除Kubernets cluster之前。必须先要删除所有load balance所创建的服务,因为Kubernets所创建的Neutron obejects不是被heat所管理的,所以heat不能删除这个load balancer,如果不事先把这些neutron objects(lb-pool, lb-vip, lb-member,lb-healthmonitor)手动删除的话,再运行bay-delete的时候会提示失败。
 对用用户来说,把服务的endpoint发布需要以下几个步骤(以nginx为例)
 1.创建配置文件
 | 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 
 | Create a file (e.g nginx.yaml) describing a pod running nginx::
 apiVersion: v1
 kind: Pod
 metadata:
 name: nginx
 labels:
 app: nginx
 spec:
 containers:
 - name: nginx
 image: nginx
 ports:
 - containerPort: 80
 Create a file (e.g nginx-service.yaml) describing a service for the nginx pod::
 apiVersion: v1
 kind: Service
 metadata:
 name: nginxservice
 labels:
 app: nginx
 spec:
 ports:
 - port: 80
 targetPort: 80
 protocol: TCP
 selector:
 app: nginx
 type: LoadBalancer
 
 | 
 2.在Kubernets的bay创建完成之后,就在pod上发布服务
 magnum pod-create --manifest nginx.yaml --bay k8sbayv1
 magnum coe-service-create --manifest nginx-service.yaml --bay k8sbayv1
 3.在Neutron外部接口上创建floating ip
 | 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 
 | neutron floatingip-create public
 Created a new floatingip:
 +---------------------+--------------------------------------+
 | Field | Value |
 +---------------------+--------------------------------------+
 | fixed_ip_address | |
 | floating_ip_address | 172.24.4.78 |
 | floating_network_id | 4808eacb-e1a0-40aa-97b6-ecb745af2a4d |
 | id | b170eb7a-41d0-4c00-9207-18ad1c30fecf |
 | port_id | |
 | router_id | |
 | status | DOWN |
 | tenant_id | 012722667dc64de6bf161556f49b8a62 |
 +---------------------+--------------------------------------+
 //查询floating ip
 FLOATING_ID=$(neutron floatingip-list | grep "172.24.4.78" | awk &#39;{print $2}&#39;)
 //在load-balancer上查询VIP
 VIP_ID=$(neutron lb-vip-list | grep TCP | grep -v pool | awk &#39;{print $2}&#39;)
 //在VIP上找到port
 PORT_ID=$(neutron lb-vip-show $VIP_ID | grep port_id | awk &#39;{print $4}&#39;)
 //绑定floating ip到VIP的port上
 neutron floatingip-associate $FLOATING_ID $PORT_ID
 //这样ngnix就可以通过下面地址被访问了
 http://172.24.4.78:80
 
 | 
 Kubernets一开始就是被设计用来运行在不同的云环境上的,比如Google Compute Engine (GCE), Amazon Web Services (AWS), 和OpenStack。所以在不同的特定的云环境上,需要使用插件来跟不同的云环境打交道。
 这里是每个不同的云环境的插件
 https://github.com/kubernetes/kubernetes/blob/release-1.0/pkg/cloudprovider/openstack/openstack.go
 在Kubernets的kube-apiserver and kube-controller-manager启动之后,需要通过OpenStack(keystone)的认证,这样之后,load balancer服务才能启动,load balancer启动之后会使得OpenStack Neutron进行以下几个操作:
 1. Create lb-pool for the Kubernetes service
 2. Create lb-member for the minions
 3. Create lb-healthmonitor
 4. Create lb-vip on the private network of the Kubernetes cluster
 最后通过以下几个命令进行检查
 neutron lb-pool-list
 +--------------------------------------+----------------------------------------------+----------+-------------+----------+----------------+--------+
 | id | name | provider | lb_method | protocol | admin_state_up | status |
 | 241357b3-2a8f-442e-b534-bde7cd6ba7e4 | a1f03e40f634011e59c9efa163eae8ab | haproxy | ROUND_ROBIN | TCP | True | ACTIVE |
 | 82b39251-1455-4eb6-a81e-802b54c2df29 | k8sbayv1-iypacicrskib-api_pool-fydshw7uvr7h | haproxy | ROUND_ROBIN | HTTP | True | ACTIVE |
 | e59ea983-c6e8-4cec-975d-89ade6b59e50 | k8sbayv1-iypacicrskib-etcd_pool-qbpo43ew2m3x | haproxy | ROUND_ROBIN | HTTP | True | ACTIVE |
 neutron lb-member-list
 +--------------------------------------+----------+---------------+--------+----------------+--------+
 | id | address | protocol_port | weight | admin_state_up | status |
 | 9ab7dcd7-6e10-4d9f-ba66-861f4d4d627c | 10.0.0.5 | 8080 | 1 | True | ACTIVE |
 | b179c1ad-456d-44b2-bf83-9cdc127c2b27 | 10.0.0.5 | 2379 | 1 | True | ACTIVE |
 | f222b60e-e4a9-4767-bc44-ffa66ec22afe | 10.0.0.6 | 31157 | 1 | True | ACTIVE |
 neutron lb-healthmonitor-list
 +--------------------------------------+------+----------------+
 | id | type | admin_state_up |
 +--------------------------------------+------+----------------+
 | 381d3d35-7912-40da-9dc9-b2322d5dda47 | TCP | True |
 | 67f2ae8f-ffc6-4f86-ba5f-1a135f4af85c | TCP | True |
 | d55ff0f3-9149-44e7-9b52-2e055c27d1d3 | TCP | True |
 +--------------------------------------+------+----------------+
 neutron lb-vip-list
 +--------------------------------------+----------------------------------+----------+----------+----------------+--------+
 | id | name | address | protocol | admin_state_up | status |
 | 9ae2ebfb-b409-4167-9583-4a3588d2ff42 | api_pool.vip | 10.0.0.3 | HTTP | True | ACTIVE |
 | c318aec6-8b7b-485c-a419-1285a7561152 | a1f03e40f634011e59c9efa163eae8ab | 10.0.0.7 | TCP | True | ACTIVE |
 | fc62cf40-46ad-47bd-aa1e-48339b95b011 | etcd_pool.vip | 10.0.0.4 | HTTP | True | ACTIVE |
 通过kubectl command也可以进行检查
 kubectl get services
 NAME LABELS SELECTOR IP(S) PORT(S)
 kubernetes component=apiserver,provider=kubernetes 10.254.0.1 443/TCP
 nginxservice app=nginx app=nginx 10.254.122.191 80/TCP
 10.0.0.7
 
 manual-devstack
 
 这一节请参考这篇文章
 
 mesos
 
 mesos也是通过heat来进行创建的
 目前制作镜像有两种方式
 1.通过Disk Image Builder
 制作一个Ubuntu的镜像(目前只支持14.04)
 | 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 
 | $ sudo apt-get update
 $ sudo apt-get install git qemu-utils python-pip
 $ git clone https://git.openstack.org/openstack/magnum
 $ git clone https://git.openstack.org/openstack/diskimage-builder.git
 $ git clone https://git.openstack.org/openstack/dib-utils.git
 $ git clone https://git.openstack.org/openstack/tripleo-image-elements.git
 $ git clone https://git.openstack.org/openstack/heat-templates.git
 $ export PATH="${PWD}/dib-utils/bin:$PATH"
 $ export ELEMENTS_PATH=tripleo-image-elements/elements:heat-templates/hot/software-config/elements:magnum/magnum/templates/mesos/elements
 $ export DIB_RELEASE=trusty
 $ diskimage-builder/bin/disk-image-create ubuntu vm docker mesos \
 os-collect-config os-refresh-config os-apply-config \
 heat-config heat-config-script \
 -o ubuntu-mesos.qcow2
 $ glance image-create --name ubuntu-mesos --visibility public \
 --disk-format=qcow2 --container-format=bare \
 --os-distro=ubuntu --file=ubuntu-mesos.qcow2
 
 | 
 2.通过Docker制作
 $ sudo docker build -t magnum/mesos-builder .
 $ sudo docker run -v /tmp:/output --rm -ti --privileged magnum/mesos-builder
 ...
 Image file /output/ubuntu-mesos.qcow2 created...
 $ glance image-create --name ubuntu-mesos --visibility public \
 --disk-format=qcow2 --container-format=bare \
 --os-distro=ubuntu --file=/tmp/ubuntu-mesos.qcow2
 创建一个stack
 //创建local.yaml,生成一个master节点
 parameters:
 ssh_key_name: testkey
 external_network: public
 dns_nameserver: 8.8.8.8
 server_image: ubuntu-mesos
 //创建local.yaml,生成多个master节点(HA)
 number_of_masters: 3
 然后通过命令创建stack
 heat stack-create -f mesoscluster.yaml -e local.yaml my-mesos-cluster
 //查看mesos master的ip地址
 $ heat output-show my-mesos-cluster mesos_master
 [
 "192.168.200.86"
 ]
 //通过ubuntu用户登录master节点
 $ ssh ubuntu@192.168.200.86
 //同样也可以登录slave节点
 $ heat output-show my-mesos-cluster mesos_slaves
 [
 "192.168.200.182"
 ]
 通过Marathon&#39;s REST API部署docker container,Marathon是mesos的应用服务框架。
 你可以post一个json app到 http://${MASTER_IP}:8080/apps来部署一个Docker container。在上面的例子中${MASTER_IP}是192.168.200.86。
 $ cat &gt; app.json &lt;&lt; END
 {
 "container": {
 "type": "DOCKER",
 "docker": {
 "image": "libmesos/ubuntu"
 }
 },
 "id": "ubuntu",
 "instances": 1,
 "cpus": 0.5,
 "mem": 512,
 "uris": ,
 "cmd": "while sleep 10; do date -u +%T; done"
 }
 END
 $ MASTER_IP=$(heat output-show my-mesos-cluster api_address | tr -d &#39;"&#39;)
 $ curl -X POST -H "Content-Type: application/json" \
 http://${MASTER_IP}:8080/v2/apps -d@app.json
 通过Marathon web console界面http://${MASTER_IP}:8080/,你可以看到你创建的application
 
 quickstart
 
 这一节介绍一些实用的命令
 | 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 
 | //查看glance image
 glance -v image-list
 //查看container的service
 magnum service-list
 //创建一个keypair
 test -f ~/.ssh/id_rsa.pub || ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa
 nova keypair-add --pub-key ~/.ssh/id_rsa.pub testkey
 //创建一个baymodel
 magnum baymodel-create --name k8sbaymodel \
 --image-id fedora-atomic-latest \
 --keypair-id testkey \
 --external-network-id public \
 --dns-nameserver 8.8.8.8 \
 --flavor-id m1.small \
 --docker-volume-size 5 \
 --network-driver flannel \
 --coe kubernetes
 //创建bay
 magnum bay-create --name k8sbay --baymodel k8sbaymodel --node-count 1
 //只有创建完bay之后,状态为CREATE_IN_PROGRESS,只有在状态变为CREATE_COMPLETE才能创建containers, pods, services, replication controllers,否则magnum的数据库则会混乱。
 //查看bay
 magnum bay-list
 //查看bay的detail
 magnum bay-show k8sbay
 //在bay创建完成之后,可以动态的增加或减少nodes,例如增加一个node
 magnum bay-update k8sbay replace node_count=2
 //注意:减少一个node数量会把该node上的所有pod全部删除,但是magnum会首先删除空的node,即没有pod跑在上面的node。magnum建议使用一个replication controller再删除node之前,这样在误删之后可以进行恢复。
 //heat的stack就是magnum的bay
 //查看bay
 heat stack-list
 //查看特定的bay
 heat stack-show
 
 | 
 创建一个Kubernets的bay(CoreOS)
 | 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 
 | //wget镜像
 wget http://beta.release.core-os.net/amd64-usr/current/coreos_production_openstack_image.img.bz2
 bunzip2 coreos_production_openstack_image.img.bz2
 //上传镜像到glance::
 glance image-create --name CoreOS \
 --visibility public \
 --disk-format=qcow2 \
 --container-format=bare \
 --os-distro=coreos \
 --file=coreos_production_openstack_image.img
 //创建CoreOS Kubernetes baymodel,跟Atomic Kubernetes baymodel的创建是一样的
 magnum baymodel-create --name k8sbaymodel-coreos \
 --image-id CoreOS \
 --keypair-id testkey \
 --external-network-id public \
 --dns-nameserver 8.8.8.8 \
 --flavor-id m1.small \
 --network-driver flannel \
 --coe kubernetes \
 --tls-disabled
 //创建CoreOS Kubernetes bay
 magnum bay-create --name k8sbay \
 --baymodel k8sbaymodel-coreos \
 --node-count 2
 
 | 
 创建redis数据库服务
 //安装Kubernets
 wget https://github.com/kubernetes/kubernetes/releases/download/v1.0.1/kubernetes.tar.gz
 tar -xvzf kubernetes.tar.gz
 //创建pod
 cd kubernetes/examples/redis
 magnum pod-create --manifest ./redis-master.yaml --bay k8sbay
 //创建服务
 magnum coe-service-create --manifest ./redis-sentinel-service.yaml --bay k8sbay
 //为了进行备份。建立一个controller。
 sed -i &#39;s/\(replicas: \)1/\1 2/&#39; redis-controller.yaml
 magnum rc-create --manifest ./redis-controller.yaml --bay k8sbay
 sed -i &#39;s/\(replicas: \)1/\1 2/&#39; redis-sentinel-controller.yaml
 magnum rc-create --manifest ./redis-sentinel-controller.yaml --bay k8sbay
 //这样就有4个redis的instance了,一个master,3个slave在bay上运行
 //可以SSH到这个minion上
 另外一些对minion的命令
 sudo docker ps # View Docker containers on this minion
 kubectl get pods # Get pods
 kubectl get rc # Get replication controllers
 kubectl get svc # Get services
 kubectl get nodes # Get nodes
 如果需要在Firewall下使用magnum的话可以参考这个
 .. _Using_Magnum_Behind_Firewall:
 http://docs.openstack.org/developer/magnum/magnum-proxy.html
 //在bay上创建一个container
 magnum container-create --name test-container \
 --image docker.io/cirros:latest \
 --bay swarmbay \
 --command "ping -c 4 8.8.8.8"
 //启动这个container
 magnum container-start test-container
 magnum container-logs test-container
 //删除container
 magnum container-delete test-container
 *使用mesos的bay也是类似的操作
 
 tls
 
 
 Transport Layer Security 参考文章:
 http://kubernetes.io/docs/user-guide/services/#external-services
 作者简介:
 蒋暕青@上海宽带技术及应用工程研究中心:SDN技术实践者,大四北上思博伦实习半年,现工作地点上海
 --------------华丽的分割线------------------
 本文系《SDNLAB原创文章奖励计划》投稿文章,该计划旨在鼓励广大从业人员在SDN/NFV/Cloud网络领域创新技术、开源项目、产业动态等方面进行经验和成果的文字传播、分享、交流。有意向投稿的同学请通过官方唯一指定投稿通道进行文章投递,投稿细则请参考《SDNLAB原创文章奖励计划》
 声明:本文转载自网络。版权归原作者所有,如有侵权请联系删除。
 | 
 扫描并关注51学通信微信公众号,获取更多精彩通信课程分享。
x本帖子中包含更多资源您需要 登录 才可以下载或查看,没有帐号?立即注册  |