1. 程式人生 > >Kubernetes(k8s)中文文件 Mesos部署Kubernetes叢集_Kubernetes中文社群

Kubernetes(k8s)中文文件 Mesos部署Kubernetes叢集_Kubernetes中文社群

譯者:王樂

關於在Mesos上執行Kubernetes

Mesos允許Kubernetes和其他Mesos構架,例如:Hadoop,Spark和Chronos來動態分享叢集資源。

Mesos確保同一叢集上的執行的不同架構上的應用之間相互隔離,和較公平資源的分配。

Mesos叢集幾乎可以部署在任何IaaS雲服務上或是你自己的資料中心。當Kubernetes執行在Mesos上,你可以輕鬆將Kubernetes上執行的任務在任意雲平臺之間轉移。

本指南將具體介紹如何架設在Mesos叢集上執行Kubernetes。我們一步一步指導你怎麼在Mesos叢集上新增Kubernetes和如何啟動你的第一個pod來執行nginx網站伺服器。

注意: 現有實現上的已知問題,集中式的監控和日誌功能尚不支援。如果你發現以下步驟有什麼問題,請在kubernetes-mesos專案報告這個問題。

前提條件

  • 理解Apache Mesos
  • 一個執行在Google Compute Engine的Mesos叢集
  • 一個連線到這個叢集VPN連線
  • 一臺在叢集裡並可以作為Kubernetes主節點的主機,這個主機需安裝一下軟體:
    GoLang > 1.2
    make (i.e. build-essential)
    Docker

注意: 你可以, 但是你不要在執行Mesos master的主機上部署Kubernetes-Mesos。

部署Kubernetes-Mesos

用SSH登入Kubernetes主節點。參考以下命令列時需要替換其中的地址為正確的IP地址。

ssh [email protected]${ip_address_of_master_node}

編譯Kubernetes-Mesos。

git clone https://github.com/kubernetes/kubernetes
cd kubernetes
export KUBERNETES_CONTRIB=mesos
make

設定環境變數。 可以用 hostname -i 來獲得主節點的內部IP地址。

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

請注意KUBERNETES_MASTER用來定義API的endpoint的。 如果 ~/.kube/config 已存在並指向其他endpoint, 你需要在最後一步使用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.0.12 \
--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.0.12 "/etcd" 5s ago Up 3s 2379/tcp, 2380/... etcd

最好檢測一下你可以連線到你的etcd服務

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

如果連線沒有問題,你可以看見所顯示的etcd祕鑰(如果有的話)。

啟動Kubernetes-Mesos服務

設定正確的環境變數 PATH 以便訪問Kubernetes-Mesos中的二進位制執行檔案:

export PATH="$(pwd)/_output/local/go/bin:$PATH"

確認你的Mesos master:根據具體Mesos的安裝,Mesos master的地址可能會是 host:port 的樣子,比如 mesos-master:5050 的 host:port , 也可能是ZooKeeper的URL,比如 zk://zookeeper:2181/mesos 。在生產環境中,推薦使用ZooKeeper的URL,這樣可避免Kubernetes在Mesos master的地址有變化的時候出現問題。

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

在當前目錄下新建一個雲配置檔案 mesos-cloud.conf ,檔案內寫入一下內容:

$ cat <mesos-cloud.conf
[mesos-cloud]
mesos-master = ${MESOS_MASTER}
EOF

現在啟動kubernetes-mesos的API服務和主節點上的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服務

設定正確的環境變數 PATH 以便訪問kubectl:

export PATH=<path/to/kubernetes-directory>/platforms/linux/amd64:$PATH

使用 kubectl 和kubernetes-mesos互動:

$ kubectl get pods
NAME READY STATUS RESTARTS AGE
# 注意: 顯示的service IP有可能不同
$ kubectl get services
NAME LABELS SELECTOR IP(S) PORT(S)
k8sm-scheduler component=scheduler,provider=k8sm 10.10.10.113 10251/TCP
kubernetes component=apiserver,provider=kubernetes 10.10.10.1 443/TCP

最後, 登陸地址 http://<mesos-master-ip:port> 訪問Kubernetes服務網頁。確定你有有效的VPN連線。點選 `Frameworks`標籤並尋找一個名叫”Kubernetes”的啟用framework。

啟動一個pod

在本地檔案裡寫入描述pod的JSON:

$ cat <<EOPOD >nginx.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
EOPOD

用 kubectl CLI把這個pod的描述傳送到Kubernetes:

$ kubectl create -f ./nginx.yaml
pods/nginx

dockerd 會從Internet下載相對應的映象,這個過程大概持續一到兩分鐘的時間。 我們可以用 kubectl CLI去觀察pod的狀態:

$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 14s

在Mesos的網頁上確認每一個pod都正常執行。點選Kubernetes的framework選項後,會顯示在Kubernetes啟動pod的Mesos任務。

啟動kube-dns

Kube-dns是為Kubernetes叢集提供基於DNS的發現服務的外掛。參見Kubernetes裡的DNS以獲得更多資訊。

kube-dns 外掛執行在叢集內的pod上。這個pod包涵三個執行在一起的容器:

  • 一個本地etc例項
  • DNS伺服器skydns
  • 完成Kubernetes叢集狀態到skydns互動的kube2sky程序

skydns容器通過53埠向叢集提供DNS服務。 etcd communication works via local 127.0.0.1communication

我們假設 kube-dns會使用

  • service IP 10.10.10.10
  • 和 cluster.local 域名。

注意這兩個值已經在設定apiserver時使用了。

在cluster/addons/dns/skydns-rc.yaml.in目錄下可以找到用一個replication controller建立一個有3個容器的pod的模版。為了獲得一個正確的replication controller的yaml檔案,以下這幾步是必須的:

  • 將 `替換為 1`
  • 將 `替換為 cluster.local.`
  • 將引數 –kube_master_url=${KUBERNETES_MASTER} 新增到kube2sky容器的命令列中

除此之外service模版cluster/addons/dns/skydns-svc.yaml.in需要一下變動:

  • 將 `替換為 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/skydns-rc.yaml.in > skydns-rc.yaml
sed -e "s/{{ pillar\['dns_server'\] }}/10.10.10.10/g" \
cluster/addons/dns/skydns-svc.yaml.in > skydns-svc.yaml

現在kube-dns pod和service已經啟動了:

kubectl create -f ./skydns-rc.yaml
kubectl create -f ./skydns-svc.yaml

使用 kubectl get pods –namespace=kube-system 來檢查pod上3個容器正常執行。請注意執行kube-dns的pod是在 kube-system 的名稱空間下,不是在 default 下面。

為了監測新的DNS服務正常,我們啟動一個pod執行busybox來查詢DNS。第一步新建一個 busybox.yaml 檔案:

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主節點的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

下一步?

試著執行一下Kubernetes examples.

注意: 一些示例需要在叢集上安裝Kubernetes DNS。我們未來會在本指南里加入如何支援Kubernetes DNS的介紹的。

K8S中文社群微信公眾號