51学通信论坛2017新版

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1238|回复: 0
打印 上一主题 下一主题

OpenStack Magnum全方位详解

[复制链接]

 成长值: 15613

  • TA的每日心情
    开心
    2022-7-17 17:50
  • 2444

    主题

    2544

    帖子

    7万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    74104
    跳转到指定楼层
    楼主
    发表于 2017-9-17 15:54:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    </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 > /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学通信微信公众号,获取更多精彩通信课程分享。

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    Archiver|手机版|小黑屋|51学通信技术论坛

    GMT+8, 2025-1-31 19:53 , Processed in 0.066492 second(s), 33 queries .

    Powered by Discuz! X3

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表