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的介紹的。