内容


一个混合(IBM Power 和 x86)架构场景中的 Mesos 和 Kubernetes

Comments

关于 Mesos 和 Kubernetes

目前,有多种用于 Linux® 的流行的容器集群系统,比如 Kubernetes、Mesos 等。Google Kubernetes 和 Apache Mesos 可能将容器部署到容器内的两个最常用的工具。二者都被创建为辅助工具,用于管理容器集群。但是,它们的方法有很大区别。

我们的客户始终有一个包含 IBM® Power® 和 x86 的混合架构。所以,本文将提供将 Mesos 和 Kubernetes 应用于混合架构(包括 Power 和 x86)环境上的 Linux 中的参考解决方案。

请参见图 1,以便了解这个参考架构。

图 1. 混合(Power 和 x86)架构上的 Kubernetes 和 Mesos 的架构图

部署

现在让我们在混合架构上设置和部署 Mesos 和 Kubernetes 的 Docker 集群。在这里,我们将对主节点中的每个模块使用 Docker 镜像。

前提条件

  • 了解 Mesos、Kubernetes 和 Docker
  • 一个混合架构集群,其中包含:
    • Linux 终端、Docker 和 git
    • 至少 4 个 x86 节点和 1 个 IBM Power 节点
  • 禁用每个节点中的防火墙

环境

我们至少需要 3 个包含 CentOS 7.2 的节点,以便安装 ZooKeeper 集群、Mesos 主集群、etcd 集群和 Kubernetes-Mesos 集群。

  • 192.168.1.2 (x86)
  • 192.168.1.3 (x86)
  • 192.168.1.4 (x86)

我们需要至少两个包含 CentOS 7.2 的节点来安装 Mesos 从属集群。

  • 192.168.1.5 (x86)
  • 192.168.1.6 (IBM Power)

部署 ZooKeeper 集群

使用根用户特权执行以下步骤,以便部署 ZooKeeper 集群:

在 192.168.1.2 中:

				docker run -d \ 
				-e MYID=1 \ 
				-e SERVERS=192.168.1.2,192.168.1.3,192.168.1.4 \ 
				--name=zookeeper --net=host --restart always powerkvm/zookeeper-x86

在 192.168.1.3 中:

					docker run -d \
					-e MYID=2 \
					-e SERVERS=192.168.1.2,192.168.1.3,192.168.1.4 \ 
					--name=zookeeper --net=host --restart always powerkvm/zookeeper-x86

在 192.168.1.4 中:

					docker run -d \
					-e MYID=3 \ 
					-e SERVERS=192.168.1.2,192.168.1.3,192.168.1.4 \
					--name=zookeeper --net=host --restart always powerkvm/zookeeper-x86

部署 Mesos 主集群

使用根用户特权执行以下步骤,以便部署 Mesos 主集群:

在 192.168.1.2 中:

					docker run -d -e MESOS_HOSTNAME=192.168.1.2 -e MESOS_IP=192.168.1.2 -e MESOS_QUORUM=2 \ 
					-e MESOS_ZK=zk://192.168.1.2:2181,192.168.1.3:2181,192.168.1.4:2181/mesos \ 
					--name mesos-master --net host --restart always powerkvm/mesos-master-x86

在 192.168.1.3 中:

					docker run -d -e MESOS_HOSTNAME=192.168.1.3 -e MESOS_IP=192.168.1.3 -e MESOS_QUORUM=2 \
					-e MESOS_ZK=zk://192.168.1.2:2181,192.168.1.3:2181,192.168.1.4:2181/mesos \ 
					--name mesos-master --net host --restart always powerkvm/mesos-master-x86

在 192.168.1.4 中:

					docker run -d -e MESOS_HOSTNAME=192.168.1.4 -e MESOS_IP=192.168.1.4 -e MESOS_QUORUM=2 \
					-e MESOS_ZK=zk://192.168.1.2:2181,192.168.1.3:2181,192.168.1.4:2181/mesos \
					--name mesos-master --net host --restart always powerkvm/mesos-master-x86

部署 etcd 集群

使用根用户特权执行以下步骤,以便部署 etcd 集群:

在 192.168.1.2 中:

					docker run -d -v /usr/share/ca-certificates/:/etc/ssl/certs -p 4001:4001 -p 2380:2380 -p 2379:2379 \ 
				    --name etcd --restart always quay.io/coreos/etcd:v2.2.1 \ 
				    -name etcd0 \ 
				    -advertise-client-urls http://192.168.1.2:2379,http://192.168.1.2:4001 \ 
				    -listen-client-urls http://0.0.0.0:2379,http://0.0.0.0:4001 \ 
				    -initial-advertise-peer-urls http://192.168.1.2:2380 \ 
				    -listen-peer-urls http://0.0.0.0:2380 \
				    -initial-cluster-token etcd-cluster-1 \ 
				    -initial-cluster etcd0=http://192.168.1.2:2380,etcd1=http://192.168.1.3:2380,etcd2=http://192.168.1.4:2380\
				    -initial-cluster-state new

在 192.168.1.3 中:

					docker run -d -v /usr/share/ca-certificates/:/etc/ssl/certs -p 4001:4001 -p 2380:2380 -p 2379:2379 \ 
					--name etcd --restart always quay.io/coreos/etcd:v2.2.1 \ 
					-name etcd0 \
					-advertise-client-urls http://192.168.1.3:2379,http://192.168.1.3:4001 \ 
					-listen-client-urls http://0.0.0.0:2379,http://0.0.0.0:4001 \ 
					-initial-advertise-peer-urls http://192.168.1.3:2380 \ 
					-listen-peer-urls http://0.0.0.0:2380 \
					-initial-cluster-token etcd-cluster-1 \ 
					-initial-cluster etcd0=http://192.168.1.2:2380,etcd1=http://192.168.1.3:2380,etcd2=http://192.168.1.4:2380\
					-initial-cluster-state new

在 192.168.1.4 中:

					docker run -d -v /usr/share/ca-certificates/:/etc/ssl/certs -p 4001:4001 -p 2380:2380 -p 2379:2379 \
					--name etcd --restart always quay.io/coreos/etcd:v2.2.1 \
					-name etcd0 \ 
					-advertise-client-urls http://192.168.1.4:2379,http://192.168.1.4:4001 \ 
					-listen-client-urls http://0.0.0.0:2379,http://0.0.0.0:4001 \ 
					-initial-advertise-peer-urls http://192.168.1.4:2380 \ 
					-listen-peer-urls http://0.0.0.0:2380 \
					-initial-cluster-token etcd-cluster-1 \ 
					-initial-cluster etcd0=http://192.168.1.2:2380,etcd1=http://192.168.1.3:2380,etcd2=http://192.168.1.4:2380\
					-initial-cluster-state new

部署 Kubernetes-Mesos 集群

使用根用户特权执行以下步骤,以便部署 Kubernetes-Mesos 集群:

apiserver、controller managerscheduler部署在 192.168.1.2 中:

  1. mesos-cloud.conf 添加到 /mnt/k8s 中:
    					cat /mnt/k8s/mesos-cloud.conf
    					[mesos-cloud]
    					mesos-master = zk://192.168.1.2:2181,192.168.1.3:2181,192.168.1.4:2181/mesos
  2. 运行每个 Docker 镜像。
    					docker run -d --privileged -v /mnt/k8s:/mnt/k8s --name apiserver --net=host --restart always powerkvm/k8s-mesos-x86:v1.4.0-alpha km apiserver \
    					--address=192.168.1.2 \
    					--etcd-servers=http://192.168.1.2:4001,http://192.168.1.3:4001,http://192.168.1.4:4001\
    					--service-cluster-ip-range=10.10.10.0/24 \ 
    					--port=8888 \ 
    					--cloud-provider=mesos \
    					--cloud-config=/mnt/k8s/mesos-cloud.conf \ 
    					--secure-port=0 \ 
    					--v=1 
    					
    					docker run -d --privileged -v /mnt/k8s:/mnt/k8s --name controller-manager --net=host --restart always powerkvm/k8s-mesos-x86:v1.4.0-alpha km controller-manager \
    					--master=192.168.1.2:8888 \ 
    					--cloud-provider=mesos \
    					--cloud-config=/mnt/k8s/mesos-cloud.conf \
    					--v=1
    					
    					docker run -d --privileged --name scheduler --net=host --restart always powerkvm/k8s-mesos-x86:v1.4.0-alpha kmscheduler \
    					--address=192.168.1.2 \
    					--mesos-master=zk://192.168.1.2:2181,192.168.1.3:2181,192.168.1.4:2181/mesos \
    					--etcd-servers=http://192.168.1.2:4001,http://192.168.1.3:4001,http://192.168.1.4:4001\
    					--mesos-user=root \
    					--api-servers=192.168.1.2:8888 \
    					--cluster-dns=10.10.10.10 \
    					--cluster-domain=cluster.local \
    					--v=2

apiserver、controller managerscheduler部署在 192.168.1.3 中:

  1. mesos-cloud.conf 添加到 /mnt/k8s 中:
    					cat /mnt/k8s/mesos-cloud.conf
    					[mesos-cloud]
    					mesos-master = zk://192.168.1.2:2181,192.168.1.3:2181,192.168.1.4:2181/mesos
  2. 运行每个 Docker 镜像:
    					docker run -d --privileged -v /mnt/k8s:/mnt/k8s --name apiserver --net=host --restart always powerkvm/k8s-mesos-x86:v1.4.0-alpha km apiserver \
    					--address=192.168.1.3 \
    					--etcd-servers=http://192.168.1.2:4001,http://192.168.1.3:4001,http://192.168.1.4:4001\
    					--service-cluster-ip-range=10.10.10.0/24 \
    					--port=8888 \
    					--cloud-provider=mesos \
    					--cloud-config=/mnt/k8s/mesos-cloud.conf \
    					--secure-port=0 \
    					--v=1
    					
    					docker run -d --privileged -v /mnt/k8s:/mnt/k8s --name controller-manager --net=host --restart always powerkvm/k8s-mesos-x86:v1.4.0-alpha km controller-manager \
    					--master=192.168.1.3:8888 \
    					--cloud-provider=mesos \
    					--cloud-config=/mnt/k8s/mesos-cloud.conf \
    					--v=1
    					
    					docker run -d --privileged --name scheduler --net=host --restart always powerkvm/k8s-mesos-x86:v1.4.0-alpha km scheduler \
    					--address=192.168.1.3 \
    					--mesos-master=zk://192.168.1.2:2181,192.168.1.3:2181,192.168.1.4:2181/mesos \
    					--etcd-servers=http://192.168.1.2:4001,http://192.168.1.3:4001,http://192.168.1.4:4001\
    					--mesos-user=root \
    					--api-servers=192.168.1.3:8888 \
    					--cluster-dns=10.10.10.10 \
    					--cluster-domain=cluster.local \ 
    					--v=2

apiserver、controller managerscheduler部署在 192.168.1.4 中:

  1. mesos-cloud.conf 添加到 /mnt/k8s 中:
    					cat /mnt/k8s/mesos-cloud.conf
    					[mesos-cloud]
    					mesos-master = zk://192.168.1.2:2181,192.168.1.3:2181,192.168.1.4:2181/mesos
  2. 运行每个 Docker 镜像:
    					docker run -d --privileged -v /mnt/k8s:/mnt/k8s --name apiserver --net=host --restart always powerkvm/k8s-mesos-x86:v1.4.0-alpha km apiserver \
    					--address=192.168.1.4 \
    					--etcd-servers=http://192.168.1.2:4001,http://192.168.1.3:4001,http://192.168.1.4:4001\
    					--service-cluster-ip-range=10.10.10.0/24 \
    					--port=8888 \
    					--cloud-provider=mesos \
    					--cloud-config=/mnt/k8s/mesos-cloud.conf \
    					--secure-port=0 \ 
    					--v=1
    					
    					docker run -d --privileged -v /mnt/k8s:/mnt/k8s --name controller-manager --net=host --restart always powerkvm/k8s-mesos-x86:v1.4.0-alpha km controller-manager \
    					--master=192.168.1.4:8888 \
    					--cloud-provider=mesos \
    					--cloud-config=/mnt/k8s/mesos-cloud.conf \
    					--v=1 
    					
    					docker run -d --privileged --name scheduler --net=host --restart always powerkvm/k8s-mesos-x86:v1.4.0-alpha km scheduler \
    					--address=192.168.1.4 \
    					--mesos-master=zk://192.168.1.2:2181,192.168.1.3:2181,192.168.1.4:2181/mesos \
    					--etcd-servers=http://192.168.1.2:4001,http://192.168.1.3:4001,http://192.168.1.4:4001\
    					--mesos-user=root \
    					--api-servers=192.168.1.4:8888 \
    					--cluster-dns=10.10.10.10 \
    					--cluster-domain=cluster.local \
    					--v=2

部署 Mesos 从属集群

用于 Mesos 从属节点的 Docker 镜像仍在测试中。所以,我们可以使用包来安装它。

将 Mesos 从属节点部署到 192.168.1.5(x86) 中:

1. 安装 Mesos 从属节点。

					rpm -Uvh http://repos.mesosphere.io/el/7/noarch/RPMS/mesosphere-el-repo-7-2.noarch.rpm && \
					yum -y install mesos

2. 配置 Mesos 从属节点。

					#cat > /etc/mesos/zk <<EOF
					     zk://192.168.1.2:2181,192.168.1.3:2181,192.168.1.4:2181/mesos 
					EOF 
					
					echo 192.168.1.5 | sudo tee /etc/mesos-slave/ip
					cp /etc/mesos-slave/ip /etc/mesos-slave/hostname

3.启动 mesos-slave 服务。

 systemctl restart mesos-slave

将 Mesos 从属节点部署到 192.168.1.6(Power) 中:

  1. 添加存储库。
    					#cat > /etc/yum.repos.d/cluster.repo <<EOF 
    					[cluster]
    					name=cluster baseurl=http://ftp.unicamp.br/pub/ppc64el/rhel/7_1/misc_ppc64el/
    					enabled=1
    					gpgcheck=0
    					priority=10
    					sslverify=1
    					EOF
  2. 安装 Mesos 从属节点。
     yum -y install mesos-0.22.1 python-mesos
  3. 配置 Mesos 从属节点。

    编辑 /etc/sysconfig/mesos-slave 中的变量(下面已突出显示):

    					# This file contains environment variables that are passed to mesos-slave. 
    					# To get a description of all options run mesos-slave --help; any option 
    					# supported as a command-line option is also supported as an environment 
    					    # variable.
    					    
    					# The mesos master URL to contact. Should be host:port for
    					# non-ZooKeeper based masters, otherwise a zk:// or file:// URL.
    					MESOS_master=zk://192.168.1.2:2181,192.168.1.3:2181,192.168.1.4:2181/mesos
    					MESOS_EXECUTOR_REGISTRATION_TIMEOUT=10mins 
    					MESOS_IP=192.168.1.6 
    					
    					# For isolated sandbox testing 
    					# MESOS_master=127.0.0.1:5050
    					
    					# For a complete listing of options execute 'mesos-slave --help' 
    					MESOS_log_dir=/var/log/mesos
    					MESOS_work_dir=/var/run/mesos
    					MESOS_containerizers=docker,mesos 
    					
    					# systemd cgroup integration 
    					MESOS_isolation='cgroups/cpu,cgroups/mem'
    					MESOS_cgroups_root='system.slice/mesos-slave.service'
    					MESOS_cgroups_hierarchy=/sys/fs/cgroup
  4. 启动 mesos-slave 服务。
     service emsos-slave start

部署 Kubernetes 仪表板

用于该混合架构的 Kubernetes 和 Mesos 框架已完成。现在,我们应该部署它的仪表板。对于本例,在 x86 架构的从属节点中运行该仪表板。

首先,我们应该为每个从属节点添加标签。

  1. 为每个基于 x86 架构的从属节点添加标签 arch=x86
    					docker run -e KUBERNETES_MASTER_IP=192.168.1.2 -e KUBERNETES_MASTER=192.168.1.2:8888 powerkvm/k8s-mesos-x86:v1.4.0-alpha kubectl label nodes 192.168.1.5 arch=x86
  2. 为每个基于 Power 架构的从属节点添加标签 arch=ppc64le
    					docker run -e KUBERNETES_MASTER_IP=192.168.1.2 -e KUBERNETES_MASTER=192.168.1.2:8888 powerkvm/k8s-mesos-x86:v1.4.0-alpha kubectl label nodes 192.168.1.6 arch=ppc64le
  3. 检查结果。
    					docker run -e KUBERNETES_MASTER_IP=192.168.1.2 -e KUBERNETES_MASTER=192.168.1.2:8888 powerkvm/k8s-mesos-x86:v1.4.0-alpha kubectl get nodes --show-labels
    					NAME                       STATUS         AGE           LABELS 
    					192.168.1.5                Ready          2d            arch=x86,kubernetes.io/hostname=192.168.1.5 
    					192.168.1.6                Ready          2d            arch=ppc64le,kubernetes.io/hostname=192.168.1.6
  4. 下载 Kubernetes 仪表板。
    					git clone https://github.com/kubernetes/dashboard.git /root/dashboard
  5. nodeSelectorapiserver 添加到 kubernetes-dashboard-canary.yaml 中
    					cat /root/dashboard/src/deploy/kubernetes-dashboard-canary.yaml 
    					…
    					  spec: 
    					     containers: 
    					     - name: kubernetes-dashboard-canary 
    					       image:gcr.io/google_containers/kubernetes-dashboard-amd64:canary 
    					     … 
    					       args: 
    					       - --apiserver-host=http://192.168.1.2:8888 
    					     … 
    					     nodeSelector: 
    					       arch: x86 …
  6. 为该仪表板运行 Kubernetes 服务。
    					docker run --privileged -v /root/dashboard:/root/dashboard -e KUBERNETES_MASTER_IP=192.168.1.2 -e KUBERNETES_MASTER=192.168.1.2:8888 powerkvm/k8s-mesos-x86:v1.4.0-alpha kubectl create -f /root/dashboard/src/deploy/kubernetes-
    					dashboard-canary.yaml --namespace="kube-system"
  7. 检查服务和 pod。

    检查服务:

    					docker run -e KUBERNETES_MASTER_IP=192.168.1.2 -e KUBERNETES_MASTER=192.168.1.2:8888 powerkvm/k8s-mesos-x86:v1.4.0-alpha kubectl get services --namespace="kube-system" 
    				    NAME                  CLUSTER-IP       EXTERNAL-IP     PORT(S)     AGE
    				    dashboard-canary      10.10.10.14      <nodes>         80/TCP      21m

    获取仪表板服务的 nodePort

    					docker run -e KUBERNETES_MASTER_IP=192.168.1.2 -e KUBERNETES_MASTER=192.168.1.2:8888 powerkvm/k8s-mesos-x86:v1.4.0-alpha kubectl describe services dashboard-canary --namespace="kube-system"
    					Name: dashboard-canary 
    					Namespace: kube-system 
    					Labels: app=kubernetes-dashboard-canary
    					Selector: app=kubernetes-dashboard-canary 
    					Type: NodePort 
    					IP: 10.10.10.14 
    					Port: <unset> 80/TCP 
    					NodePort: <unset> 31810/TCP 
    					Endpoints: <none>
    					Session Affinity: None

    检查 pod:

    					docker run --privileged -v /root/dashboard:/root/dashboard -e KUBERNETES_MASTER_IP=192.168.1.2 -e KUBERNETES_MASTER=192.168.1.2:8888 powerkvm/k8s-mesos-x86:v1.4.0-alpha kubectl get pods --namespace="kube-system" 
    					NAME                                 READY    STATUS    RESTARTS    AGE
    				    kubernetes-dashboard-canary-x5wqg    1/1      Running   0           1h

Web UI

现在,我们已成功部署了 Kubernetes 和 Mesos。让我们检查一下 Mesos 的网页和仪表板。

对于 Mesos UI,我们可以通过访问任何 Mesos 主节点的 IP 和端口 5050 来访问主页。

例如,[任何 Mesos 主节点的 IP] :5050

图 2. Mesos 主页

对于仪表板,我们可以通过访问任何 Mesos 从属节点的 IP 和 nodePort 来访问主页。

例如:[任何 Mesos 从属节点的 IP] : nodePort.
可以从仪表板服务的描述中获得 nodePort。

也可以使用以下命令获得 nodePort:

					docker run -e KUBERNETES_MASTER_IP=192.168.1.2 -e KUBERNETES_MASTER=192.168.1.2:8888 powerkvm/k8s-mesos-x86:v1.4.0-alpha kubectl describe services dashboard-canary --namespace="kube-system"
图 3. Kubernetes 仪表板

结束语

本文介绍了如何将 kubernetes 和 Mesos 部署在一个混合(Power 和 x86)架构场景中。还介绍了如何使用 labelnodeSelector 将该服务部署到 x86 架构上。

参考资料

请参阅 Mesos 上的 Kubernete 的帮助指南,以了解完整的 x86 架构。


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Linux
ArticleID=1041324
ArticleTitle=一个混合(IBM Power 和 x86)架构场景中的 Mesos 和 Kubernetes
publish-date=12202016