目前,有多种用于 Linux® 的流行的容器集群系统,比如 Kubernetes、Mesos 等。Google Kubernetes 和 Apache Mesos 可能将容器部署到容器内的两个最常用的工具。二者都被创建为辅助工具,用于管理容器集群。但是,它们的方法有很大区别。
我们的客户始终有一个包含 IBM® Power® 和 x86 的混合架构。所以,本文将提供将 Mesos 和 Kubernetes 应用于混合架构(包括 Power 和 x86)环境上的 Linux 中的参考解决方案。
请参见图 1,以便了解这个参考架构。
现在让我们在混合架构上设置和部署 Mesos 和 Kubernetes 的 Docker 集群。在这里,我们将对主节点中的每个模块使用 Docker 镜像。
我们至少需要 3 个包含 CentOS 7.2 的节点,以便安装 ZooKeeper 集群、Mesos 主集群、etcd 集群和 Kubernetes-Mesos 集群。
我们需要至少两个包含 CentOS 7.2 的节点来安装 Mesos 从属集群。
使用根用户特权执行以下步骤,以便部署 ZooKeeper 集群:
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
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
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 主集群:
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
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
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 集群:
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
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
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 集群:
将 apiserver、controller manager
和 scheduler
部署在 192.168.1.2 中:
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
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 manager
和 scheduler
部署在 192.168.1.3 中:
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
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 manager
和 scheduler
部署在 192.168.1.4 中:
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
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 从属节点的 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
#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
yum -y install mesos-0.22.1 python-mesos
配置 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
service emsos-slave start
用于该混合架构的 Kubernetes 和 Mesos 框架已完成。现在,我们应该部署它的仪表板。对于本例,在 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
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
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
git clone https://github.com/kubernetes/dashboard.git /root/dashboard
nodeSelector
和 apiserver
添加到 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 …
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"
检查服务:
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
现在,我们已成功部署了 Kubernetes 和 Mesos。让我们检查一下 Mesos 的网页和仪表板。
对于 Mesos UI,我们可以通过访问任何 Mesos 主节点的 IP 和端口 5050 来访问主页。
例如, [任何 Mesos 主节点的 IP ] :5050
对于仪表板,我们可以通过访问任何 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"
本文介绍了如何将 kubernetes 和 Mesos 部署在一个混合(Power 和 x86)架构场景中。还介绍了如何使用 label
和 nodeSelector
将该服务部署到 x86 架构上。
请参阅 Mesos 上的 Kubernete 的帮助指南,以了解完整的 x86 架构。