关于 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地址.

  1. ssh jclouds@${ip_address_of_master_node}

构建 Kubernetes-Mesos

  1. git clone https://github.com/kubernetes-incubator/kube-mesos-framework
  2. cd kube-mesos-framework
  3. make

设置环境变量。Set some environment variables. 使用 hostname -i 命令来获取 master 的内部 IP 地址.

  1. export KUBERNETES_MASTER_IP=$(hostname -i)
  2. export KUBERNETES_MASTER=http://${KUBERNETES_MASTER_IP}:8888

请注意,KUBERNETES_MASTER 被用来作为 api endpoint. 如果您已经定义了这个文件 ~/.kube/config 并且指向了其他终端,您需要在后面步骤中在 kubectl 命令后加上 —server=${KUBERNETES_MASTER} .

部署 etcd

启动 etcd 并验证运行状况:

  1. sudo docker run -d --hostname $(uname -n) --name etcd \
  2. -p 4001:4001 -p 7001:7001 quay.io/coreos/etcd:v2.2.1 \
  3. --listen-client-urls http://0.0.0.0:4001 \
  4. --advertise-client-urls http://${KUBERNETES_MASTER_IP}:4001
  1. $ sudo docker ps
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. fd7bac9e2301 quay.io/coreos/etcd:v2.2.1 "/etcd" 5s ago Up 3s 2379/tcp, 2380/... etcd

同时最好用以下代码测试您的 etcd 实例,保证可达

  1. curl -L http://${KUBERNETES_MASTER_IP}:4001/v2/keys/

如果连接正常,您会看到数据库中的 键 列表(如果有的话)

启动 Kubernetes-Mesos 服务

将 Kubernetes-Mesos 添加到环境变量 PATH 里面

  1. 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 的形式。

  1. export MESOS_MASTER=<host:port or zk:// url>

使用下列语句在当前路径创建一个 cloud 配置文件 mesos-cloud.conf

  1. $ cat <<EOF >mesos-cloud.conf
  2. [mesos-cloud]
  3. mesos-master = ${MESOS_MASTER}
  4. EOF

现在,在 master 节点上启动下列组件 kubernetes-mesos API server, controller manager, 以及 scheduler:

  1. $ km apiserver \
  2. --address=${KUBERNETES_MASTER_IP} \
  3. --etcd-servers=http://${KUBERNETES_MASTER_IP}:4001 \
  4. --service-cluster-ip-range=10.10.10.0/24 \
  5. --port=8888 \
  6. --cloud-provider=mesos \
  7. --cloud-config=mesos-cloud.conf \
  8. --secure-port=0 \
  9. --v=1 >apiserver.log 2>&1 &
  10.  
  11. $ km controller-manager \
  12. --master=${KUBERNETES_MASTER_IP}:8888 \
  13. --cloud-provider=mesos \
  14. --cloud-config=./mesos-cloud.conf \
  15. --v=1 >controller.log 2>&1 &
  16.  
  17. $ km scheduler \
  18. --address=${KUBERNETES_MASTER_IP} \
  19. --mesos-master=${MESOS_MASTER} \
  20. --etcd-servers=http://${KUBERNETES_MASTER_IP}:4001 \
  21. --mesos-user=root \
  22. --api-servers=${KUBERNETES_MASTER_IP}:8888 \
  23. --cluster-dns=10.10.10.10 \
  24. --cluster-domain=cluster.local \
  25. --v=2 >scheduler.log 2>&1 &

运行 disown 命令,保证后台任务在您登出后保持运行.

  1. disown -a

验证 KM 服务

通过 kubectl 与 kubernetes-mesos 框架进行交互:

  1. $ kubectl get pods
  2. NAME READY STATUS RESTARTS AGE
  1. # NOTE: your service IPs will likely differ
  2. $ kubectl get services
  3. NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  4. k8sm-scheduler 10.10.10.113 <none> 10251/TCP 1d
  5. kubernetes 10.10.10.1 <none> 443/TCP 1d

最后,使用浏览器访问 Mesos web GUI 所在地址 http://<mesos-master-ip:port&gt;. 确保您有 VPN 连接正在运行. 在 Frameworks 选项卡中找到运行中的框架 “Kubernetes”.

启动 pod

在本地文件中创建一个 JSON 格式的 pod 描述文件:

  1. $ cat <<EOPOD >nginx.yaml
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: nginx
  5. spec:
  6. containers:
  7. - name: nginx
  8. image: nginx
  9. ports:
  10. - containerPort: 80
  11. EOPOD

使用 kubectl CLI 向 Kubernetes 发送 pod 描述文件:

  1. $ kubectl create -f ./nginx.yaml
  2. pod "nginx" created

耐心等待一到两分钟,dockerd 下载镜像。我们可以用 kubectl 查看 pod 运行状态

  1. $ kubectl get pods
  2. NAME READY STATUS RESTARTS AGE
  3. 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.
    以下是上述操作的自动脚本:

  1. sed -e "s/{{ pillar\['dns_replicas'\] }}/1/g;"\
  2. "s,\(command = \"/kube2sky\"\),\\1\\"$'\n'" - --kube_master_url=${KUBERNETES_MASTER},;"\
  3. "s/{{ pillar\['dns_domain'\] }}/cluster.local/g" \
  4. cluster/addons/dns/kubedns-controller.yaml.in > kubedns-controller.yaml
  5. sed -e "s/{{ pillar\['dns_server'\] }}/10.10.10.10/g" \
  6. cluster/addons/dns/kubedns-svc.yaml.in > kubedns-svc.yaml

现在 kube-dns 的 pod 和 service 已经准备完毕,下面是启动指令

  1. kubectl create -f ./kubedns-controller.yaml
  2. 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 定义文件:

  1. cat <<EOF >busybox.yaml
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: busybox
  5. namespace: default
  6. spec:
  7. containers:
  8. - image: busybox
  9. command:
  10. - sleep
  11. - "3600"
  12. imagePullPolicy: IfNotPresent
  13. name: busybox
  14. restartPolicy: Always
  15. EOF

然后启动 pod:

  1. kubectl create -f ./busybox.yaml

Pod 启动之后,通过以下命令尝试解析 Kubernetes master service,默认返回值应该为 10.10.10.1.

  1. kubectl exec busybox -- nslookup kubernetes

如果一切正常,将会看到如下结果

  1. Server: 10.10.10.10
  2. Address 1: 10.10.10.10
  3.  
  4. Name: kubernetes
  5. 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 实践中的已知问题.

译者:jiaj12 / 原文链接

K8S中文社区微信公众号

原文: http://docs.kubernetes.org.cn/804.html