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
1 2 3 4 5 |
$ 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
1 2 3 4 5 |
(.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
1 2 |
(.venv)$ cd contrib/templates/example (.venv)$ python setup.py install |
查看安装好的template,检查template是否disenable
1 2 3 4 5 6 |
(.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: /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
1 2 3 4 5 |
(.venv)$ sudo mkdir /etc/magnum (.venv)$ sudo bash -c "cat > /etc/magnum/magnum.conf << END_CONF [bay] enabled_definitions=magnum_vm_atomic_k8s,magnum_vm_coreos_k8s,example_template END_CONF" |
重新观察example template是否被enable了
1 2 3 4 5 6 |
(.venv)$ magnum-template-manage list-templates Enabled Templates example_template: /home/example/.venv/local/lib/python2.7/site-packages/ExampleTemplate-0.1-py2.7.egg/example_template/example.yaml 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 |
通过命令中加上 --details argument来获取每个template的详细参数
1 2 3 4 5 6 7 8 9 10 11 12 |
(.venv)$ magnum-template-manage list-templates --details Enabled Templates example_template: /home/example/.venv/local/lib/python2.7/site-packages/ExampleTemplate-0.1-py2.7.egg/example_template/example.yaml Server_Type OS CoE vm example example_coe magnum_vm_atomic_k8s: /home/example/.venv/local/lib/python2.7/site-packages/magnum/templates/kubernetes/kubecluster.yaml Server_Type OS CoE vm fedora-atomic kubernetes magnum_vm_coreos_k8s: /home/example/.venv/local/lib/python2.7/site-packages/magnum/templates/kubernetes/kubecluster-coreos.yaml Server_Type OS CoE 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,并进行安装
1 2 3 4 5 6 7 |
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
1 |
git clone https://github.com/jasonbrooks/byo-atomic.git |
需要httpd进程关闭。因为docker需要使用80端口关联apache服务。如果80端口被占用的话,在开启docker instance的时候就会出错
检查80端口
1 2 3 |
sudo netstat -antp | grep :80 应该是没有任何输出的,如果输入如下信息,那么说明80端口被占用,kill进程就可以了 tcp6 0 0 :::80 :::* LISTEN 26981/apache2 |
在两个repo都安装完成之后,安装一个增强工具
1 |
yum install -y rpm-ostree-toolbox nss-altfiles yum-plugin-protectbase |
创建一个新的镜像
1 2 |
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
1 2 3 4 5 6 7 8 |
#编辑文件 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 |
重启生效
1 2 |
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
1 2 3 4 5 6 7 |
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 < fedora-23-atomic-7.qcow2 |
2.修改文件
1 2 |
将kube_version参数从'v1.0.6'改为'v1.1.8',重启magnum-conduct 服务 sudo vi /opt/stack/magnum/magnum/templates/kubernetes/kubecluster.yaml |
3.创建一个baymodel(需要cinder组件)
1 2 3 4 5 6 7 8 9 10 |
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
1 |
magnum bay-create --name k8sbay --baymodel k8sbaymodel --node-count 1 |
5.配置kubelet
1 2 3 4 5 |
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用户认证信息
1 2 3 4 5 6 7 |
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
1 2 |
cinder create --display-name=test-repo 1 ID=$(cinder create --display-name=test-repo 1 | awk -F'|' '$2~/^[[:space:]]*id/ {print $3}') |
这个命令会输出一个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 > nginx-cinder.yaml << 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
1 |
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 '/^host = /{print $3}') 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的配置文件
1 2 |
export TEMPEST_CONFIG_DIR=/tmp/etc/magnum/ tox -e functional-api |
运行test
1 2 3 4 |
运行所有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:
1 2 3 4 5 |
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:
1 2 3 |
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用户认证:
1 2 3 |
sudo vi /etc/sysconfig/kube_openstack_config 密码设置为Keystone的用户密码 password=ChangeMe |
4.重启相关服务:
1 2 3 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上发布服务
1 2 |
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 '{print $2}') //在load-balancer上查询VIP VIP_ID=$(neutron lb-vip-list | grep TCP | grep -v pool | awk '{print $2}') //在VIP上找到port PORT_ID=$(neutron lb-vip-show $VIP_ID | grep port_id | awk '{print $4}') //绑定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。所以在不同的特定的云环境上,需要使用插件来跟不同的云环境打交道。
这里是每个不同的云环境的插件
1 |
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 2 3 4 |
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 |
最后通过以下几个命令进行检查
1 2 3 4 5 6 7 8 |
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 | +--------------------------------------+----------------------------------------------+----------+-------------+----------+----------------+--------+ |
1 2 3 4 5 6 7 8 |
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 | +--------------------------------------+----------+---------------+--------+----------------+--------+ |
1 2 3 4 5 6 7 8 |
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 | +--------------------------------------+------+----------------+ |
1 2 3 4 5 6 7 8 |
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也可以进行检查
1 2 3 4 5 |
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制作
1 2 3 4 5 6 7 |
$ 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
1 2 3 4 5 6 7 8 9 10 11 12 13 |
//创建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) parameters: ssh_key_name: testkey external_network: public dns_nameserver: 8.8.8.8 server_image: ubuntu-mesos number_of_masters: 3 |
然后通过命令创建stack
1 |
heat stack-create -f mesoscluster.yaml -e local.yaml my-mesos-cluster |
1 2 3 4 5 6 7 8 9 10 11 12 |
//查看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's REST API部署docker container,Marathon是mesos的应用服务框架。
你可以post一个json app到 http://${MASTER_IP}:8080/apps
来部署一个Docker container。在上面的例子中 ${MASTER_IP}
是192.168.200.86。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
$ cat > app.json << 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 '"') $ 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数据库服务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
//安装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 's/\(replicas: \)1/\1 2/' redis-controller.yaml magnum rc-create --manifest ./redis-controller.yaml --bay k8sbay sed -i 's/\(replicas: \)1/\1 2/' redis-sentinel-controller.yaml magnum rc-create --manifest ./redis-sentinel-controller.yaml --bay k8sbay //这样就有4个redis的instance了,一个master,3个slave在bay上运行 //可以SSH到这个minion上 |
另外一些对minion的命令
1 2 3 4 5 |
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的话可以参考这个
1 2 |
.. _Using_Magnum_Behind_Firewall: http://docs.openstack.org/developer/magnum/magnum-proxy.html |
1 2 3 4 5 6 7 8 9 10 |
//在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原创文章奖励计划》