51学通信论坛2017新版

标题: OpenStack Magnum全方位详解 [打印本页]

作者: admin    时间: 2017-9-17 15:54
标题: OpenStack Magnum全方位详解
</p>Magnum的架构图

图中是Magnum的架构图,首先介绍Magnum的主要概念,在图的右上角,主要有Bay、 Baymodel、 Node、Pod、 Service、 RC、 Container。

[attach]1483[/attach]

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图解释一下。具体的部署手册敬请期待。

[attach]1484[/attach]


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 > /etc/magnum/magnum.conf << 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 < fedora-23-atomic-7.qcow2
2.修改文件
将kube_version参数从'v1.0.6'改为'v1.1.8',重启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'|' '$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
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的配置文件
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 '{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。所以在不同的特定的云环境上,需要使用插件来跟不同的云环境打交道。
这里是每个不同的云环境的插件
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's REST API部署docker container,Marathon是mesos的应用服务框架。
你可以post一个json app到 http://${MASTER_IP}:8080/apps来部署一个Docker container。在上面的例子中${MASTER_IP}是192.168.200.86。
$ 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数据库服务
//安装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的命令
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学通信论坛2017新版 (http://bbs.51xuetongxin.com/) Powered by Discuz! X3