# 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)
Last Updated: 6/17/2023, 6:57:19 PM