关于 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 贡献目录.
先决条件
- 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) |
查看解决方法,请参阅 解决方法
延伸阅读
试试标准例子 Kubernetes examples.
看看 Kubernetes on Mesos 架构 contrib directory.
注意: 有些例子需要在集群中预先安装 Kubernetes DNS . 以后会在本指南中加入 Kubernetes DNS 的激活方法.
注意: 以下是一些 当前 Kubernetes-Mesos 实践中的已知问题.