# Kubernetes on Mesos
# 关于 Kubernetes on Mesos
Mesos 支持 Kubernetes 和其他 Mesos 一级框架如 HDFS, Spark, 和 Chronos 的集群资源动态共享。 同时 Mesos 保证了集群中不同框架中应用间合理的资源分配与隔离。
Mesos 集群可以部署在几乎所有 IaaS 云供应商的基础设施上或您自己的物理数据中心中。Kubernetes on Mesos 可以让您可以更容易地把 Kubernetes 的工作负载从其中一个环境迁移至其他环境中。
本教程将带您在 Mesos 集群上安装 Kubernetes。将会告诉您如何一步一步地添加 Kubernetes 到 Mesos 集群并启动第一个 nginx web 服务器 pod。
注意: 当前步骤中的已知问题 以及不支持集中日志和监控. 如果您在以下步骤中遇到问题,请 在 kubernetes-mesos 提出 issue .
更多信息请参阅 Kubernetes on Mesos 贡献目录.
# 先决条件
了解 Apache Mesos
运行的 谷歌计算引擎 GCE 上面的 Mesos 集群
VPN 连接 到集群
集群中的一台机器作为 Kubernetes 的 * master 节点* 具有如下特性:
支持 Go 语言 (点击 这里 查看版本要求)
make (i.e. build-essential)
Docker
注意: 您 可以, 但是您不一定要 将 Kubernetes-Mesos 和 Mesos 的 Master 节点部署在同一台机器上.
# 部署 Kubernetes-Mesos
使用 SSH 登录到 Kubernetes 的 master 节点 , 将以下占位符替换为相应的 IP 地址.
ssh jclouds@${ip_address_of_master_node}
构建 Kubernetes-Mesos
git clone https://github.com/kubernetes-incubator/kube-mesos-framework
cd kube-mesos-framework
make
设置环境变量。Set some environment variables. 使用 hostname -i 命令来获取 master 的内部 IP 地址.
export KUBERNETES_MASTER_IP=$(hostname -i)
export KUBERNETES_MASTER=http://${KUBERNETES_MASTER_IP}:8888
请注意,KUBERNETES_MASTER 被用来作为 api endpoint. 如果您已经定义了这个文件 ~/.kube/config
并且指向了其他终端,您需要在后面步骤中在 kubectl 命令后加上 --server=${KUBERNETES_MASTER}
.
# 部署 etcd
启动 etcd 并验证运行状况:
sudo docker run -d --hostname $(uname -n) --name etcd \
-p 4001:4001 -p 7001:7001 quay.io/coreos/etcd:v2.2.1 \
--listen-client-urls http://0.0.0.0:4001 \
--advertise-client-urls http://${KUBERNETES_MASTER_IP}:4001
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fd7bac9e2301 quay.io/coreos/etcd:v2.2.1 "/etcd" 5s ago Up 3s 2379/tcp, 2380/... etcd
同时最好用以下代码测试您的 etcd 实例,保证可达
curl -L http://${KUBERNETES_MASTER_IP}:4001/v2/keys/
如果连接正常,您会看到数据库中的 键 列表(如果有的话)
启动 Kubernetes-Mesos 服务
将 Kubernetes-Mesos 添加到环境变量 PATH 里面
export PATH="$(pwd)/_output/local/go/bin:$PATH"
确认您的 Mesos master 节点:取决于您的安装方式,可能是 host:port
形式,就像 mesos-master:5050
;或者是 ZooKeeper URL 的形式,就像 zk://zookeeper:2181/mesos
。为了让 Kubernetes 在 Mesos master 节点的更改时运行良好,在生产环境中推荐使用 ZooKeeper URL 的形式。
export MESOS_MASTER=<host:port or zk:// url>
使用下列语句在当前路径创建一个 cloud 配置文件 mesos-cloud.conf
$ cat <<EOF >mesos-cloud.conf
[mesos-cloud]
mesos-master = ${MESOS_MASTER}
EOF
现在,在 master 节点上启动下列组件 kubernetes-mesos API server, controller manager, 以及 scheduler:
$ km apiserver \
--address=${KUBERNETES_MASTER_IP} \
--etcd-servers=http://${KUBERNETES_MASTER_IP}:4001 \
--service-cluster-ip-range=10.10.10.0/24 \
--port=8888 \
--cloud-provider=mesos \
--cloud-config=mesos-cloud.conf \
--secure-port=0 \
--v=1 >apiserver.log 2>&1 &
$ km controller-manager \
--master=${KUBERNETES_MASTER_IP}:8888 \
--cloud-provider=mesos \
--cloud-config=./mesos-cloud.conf \
--v=1 >controller.log 2>&1 &
$ km scheduler \
--address=${KUBERNETES_MASTER_IP} \
--mesos-master=${MESOS_MASTER} \
--etcd-servers=http://${KUBERNETES_MASTER_IP}:4001 \
--mesos-user=root \
--api-servers=${KUBERNETES_MASTER_IP}:8888 \
--cluster-dns=10.10.10.10 \
--cluster-domain=cluster.local \
--v=2 >scheduler.log 2>&1 &
运行 disown 命令,保证后台任务在您登出后保持运行.
disown -a
# 验证 KM 服务
通过 kubectl 与 kubernetes-mesos 框架进行交互:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
# NOTE: your service IPs will likely differ
$ kubectl get services
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
k8sm-scheduler 10.10.10.113 <none> 10251/TCP 1d
kubernetes 10.10.10.1 <none> 443/TCP 1d
最后,使用浏览器访问 Mesos web GUI 所在地址 http://mesos-master-ip:port. 确保您有 VPN 连接正在运行. 在 Frameworks 选项卡中找到运行中的框架 “Kubernetes”.
# 启动 pod
在本地文件中创建一个 JSON 格式的 pod 描述文件:
$ cat <<EOPOD >nginx.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
EOPOD
使用 kubectl CLI 向 Kubernetes 发送 pod 描述文件:
$ kubectl create -f ./nginx.yaml
pod "nginx" created
耐心等待一到两分钟,dockerd 下载镜像。我们可以用 kubectl 查看 pod 运行状态
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 14s
通过浏览器访问 Mesos web GUI 检查 pod 运行状态. 点击 Kubernetes 框架. 接下来将会显示启动 Kubernetes pod 的 Mesos 任务.
# 启动 kube-dns 组件
Kube-dns 是一个 Kubernetes 组件,给集群增加了基于 DNS 的服务发现. 详情请见 DNS in Kubernetes.
Kube-dns 组件作为一个 pod 运行在集群中,这个 pod 包含了三个同时运行的容器:
- 一个本地 etcd 实例
- kube-dns DNS 服务器
kube-dns 的默认参数
- service IP 10.10.10.10
- 和 cluster.local domain.
请注意我们已经把以上两个参数传入了上述 apiserver.
我们提供了一个 replication controller 模板,用来启动上述 pod,可以通过这个链接进行下载 cluster/addons/dns/kubedns-controller.yaml.in . 接下来我们来创建可用的 replication controller yaml 文件:
- 将 {{ pillar['dns_replicas'] }} 替换为 1
- 将 {{ pillar['dns_domain'] }} 替换为 cluster.local.
- 向 kube2sky container command 添加 --kube_master_url=${KUBERNETES_MASTER} 参数.
另外,cluster/addons/dns/kubedns-controller.yaml.in 中的 service 模板需要做如下替换:
- {{ pillar['dns_server'] }} with 10.10.10.10.
以下是上述操作的自动脚本:
sed -e "s/{{ pillar\['dns_replicas'\] }}/1/g;"\
"s,\(command = \"/kube2sky\"\),\\1\\"$'\n'" - --kube_master_url=${KUBERNETES_MASTER},;"\
"s/{{ pillar\['dns_domain'\] }}/cluster.local/g" \
cluster/addons/dns/kubedns-controller.yaml.in > kubedns-controller.yaml
sed -e "s/{{ pillar\['dns_server'\] }}/10.10.10.10/g" \
cluster/addons/dns/kubedns-svc.yaml.in > kubedns-svc.yaml
现在 kube-dns 的 pod 和 service 已经准备完毕,下面是启动指令
kubectl create -f ./kubedns-controller.yaml
kubectl create -f ./kubedns-svc.yaml
运行 kubectl get pods --namespace=kube-system
确认 3/3 也就是这个 pod 的所有容器都是 running 状态. 需要注意,kube-dns 的 pod 运行在 kube-system namespace, 而不是 default 下.
为了确认新的 DNS 服务正在运行,我们在集群中启动一个 busybox pod 进行 DNS 检索. 首先创建一个 busybox.yaml pod 定义文件:
cat <<EOF >busybox.yaml
apiVersion: v1
kind: Pod
metadata:
name: busybox
namespace: default
spec:
containers:
- image: busybox
command:
- sleep
- "3600"
imagePullPolicy: IfNotPresent
name: busybox
restartPolicy: Always
EOF
然后启动 pod:
kubectl create -f ./busybox.yaml
Pod 启动之后,通过以下命令尝试解析 Kubernetes master service,默认返回值应该为 10.10.10.1.
kubectl exec busybox -- nslookup kubernetes
如果一切正常,将会看到如下结果
Server: 10.10.10.10
Address 1: 10.10.10.10
Name: kubernetes
Address 1: 10.10.10.1
# 支持
IaaS 层 | Config. Mgmt | OS | Networking 网络 | Docs 文档 | Conforms | 支持 |
---|---|---|---|---|---|---|
Mesos/GCE | docs | Community (Kubernetes-Mesos Authors) |