本篇文章摘自 Crawlab 的 Kubernetes 部署文檔。
Kubernetes(K8S) 是很是強大的容器編排工具,能夠管理大型集羣、微服務、分佈式應用等等,是生產環境多節點部署中很是合適的選擇。html
而 Crawlab 做爲分佈式爬蟲管理平臺,一樣也支持 Kubernetes 部署。Kubernetes 部署適合比較大型的分佈式應用,但若是您有幾臺機器,也是能夠實踐的,Kubernetes 將下降您管理分佈式應用的成本。node
若是對 Kubernetes 還不瞭解,能夠在 Kubernetes 中文社區入門課程 中學習相關知識;若是您已經瞭解 Docker,能夠參考另一個比較不錯的免費資源,《從Docker到Kubernetes進階》;同時也推薦掘金的 《Kubernetes 從上手到實踐》 掘金小冊(付費)學習快速入門 K8S 集羣的知識;若是想深刻了解 K8S 的原理,建議學習極客時間上張磊的 《深刻剖析Kubernetes》。注意,因爲 Kubernetes 發展很快,可能不少教程的 K8S 版本已經有些老了,有些命令在新版本不生效,所以爲了保證您使用的命令和配置是最新的版本,請開發者參考 Kubernetes 官方文檔。linux
本篇文章將詳細介紹如何在一個 Kubernetes 集羣上搭建 Crawlab 多節點應用。首先咱們假設您有多臺服務器,操做系統均爲 Ubuntu 16.04。git
推薦人羣:github
推薦配置:redis
若是您已經有一個工做的 K8S 集羣,您能夠略過本節,直接跳到 2. 配置 Crawlab。docker
咱們在 Docker 安裝部署 中已經詳細講述瞭如何安裝 Docker,請參考該小節的安裝教程在每一臺機器上安裝 Docker。shell
⚠️注意:您須要在每一臺機器上安裝 Docker。數據庫
安裝 Kubernetes 的過程比較繁瑣,建議您耐心操做。咱們首先將在主節點上安裝和配置 Kubernetes,主節點名稱叫 master。bootstrap
若是您有比較好的網絡環境(例如在國外),能夠考慮忽略這一步。
這一步是將 Kubernetes 須要的基礎鏡像拉取下來,然而國內網速比較糟糕,咱們須要用國內的阿里雲的鏡像。
生成一個名叫 pull_k8s.sh
的 shell 文件,輸入如下內容。
#!/bin/bash KUBE_VERSION=v1.17.3 KUBE_PAUSE_VERSION=3.1 ETCD_VERSION=3.4.3-0 DNS_VERSION=1.6.5 username=registry.cn-hangzhou.aliyuncs.com/google_containers images=(kube-proxy:${KUBE_VERSION} kube-scheduler:${KUBE_VERSION} kube-controller-manager:${KUBE_VERSION} kube-apiserver:${KUBE_VERSION} pause:${KUBE_PAUSE_VERSION} etcd:${ETCD_VERSION} coredns:${DNS_VERSION} ) for image in ${images[@]} do docker pull ${username}/${image} docker tag ${username}/${image} k8s.gcr.io/${image} docker rmi ${username}/${image} done
而後在 shell 中執行如下命令。
# 改變 pull_k8s.sh 爲可執行文件 chmod +x pull_k8s.sh # 運行 pull_k8s.sh ./pull_k8s.sh
稍等一下子,K8S 的基礎鏡像就拉取下來。接下來就能夠準備啓動 K8S 服務了。
# 獲取 Kubernetes Server 安裝文件 wget -q https://dl.k8s.io/v1.17.3/kubernetes-server-linux-amd64.tar.gz # 解壓縮安裝文件 tar -zxf kubernetes-server-linux-amd64.tar.gz # 拷貝執行文件 cp kubernetes/server/bin/kube{adm,ctl,let} /usr/bin/
下載並解壓 CNI(Container Network Interface)插件的可執行文件。
wget https://github.com/containernetworking/plugins/releases/download/v0.8.5/cni-plugins-linux-amd64-v0.8.5.tgz mkdir /opt/cni/bin -p tar -xf cni-plugins-linux-amd64-v0.8.5.tgz -C /opt/cni/bin
執行如下命令來配置 kubelet 和 kubeadm
# 配置 kubelet.service cat <<'EOF' > /etc/systemd/system/kubelet.service [Unit] Description=kubelet: The Kubernetes Agent Documentation=http://kubernetes.io/docs/ [Service] ExecStart=/usr/bin/kubelet Restart=always StartLimitInterval=0 RestartSec=10 [Install] WantedBy=multi-user.target EOF # 配置 kubeadm.service cat <<'EOF' > /etc/systemd/system/kubelet.service.d/kubeadm.conf [Service] Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf" Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml" EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env EnvironmentFile=-/etc/default/kubelet ExecStart= ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS EOF # 啓動 kubelet systemctl enable kubelet
請在 root 權限下進行下列操做。
# 初始化主節點 kubeadm init --pod-network-cidr=10.244.0.0/16
這裏的 --pod-network-cidr
參數是爲了適配 flannel
,一個網絡解決方案。若是對 flannel
不熟悉的能夠網上自行搜索。
執行完上述操做以後,您在命令行中看到一串輸出,相似以下內容。
... You can now join any number of machines by running the following on each node as root: kubeadm join 192.168.0.1:6443 --token t14kzc.vjurhx5k98dpzqdc --discovery-token-ca-cert-hash sha256:d64f7ce1af9f9c0c73d2d737fd0095456ad98a2816cb5527d55f984c8aa8a762
最後那一串 kubeadm join x.x.x.x:6443 --token xxxx --discovery-token-ca-cert-hash sha256:xxxx...
就是加入從節點的命令,您須要在從節點上執行這個命令。
如今能夠來配置網絡了,咱們採用 flannel
。
執行如下命令來加入 flannel
。
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
節點初始化完畢後,在命令行中輸入如下命令查看節點狀態。
kubectl get nodes
您將會看到相似以下輸出。
NAME STATUS ROLES AGE VERSION master Ready master 5m v1.17.3
狀態 STATUS
爲 Ready
表示節點已經成功初始化了。若是狀態爲 NotReady
,表示節點初始化時遇到了問題,須要排查異常。這時能夠經過如下命令來查看日誌。
journalctl -f -u kubelet.service
如今的任務就是將剩餘的服務器或節點加入到當前的 Kubernetes 集羣來了。
在運行 kubeadm join
加入一個工做節點以前,您須要在這個工做節點上執行 1.2.1-4 的步驟,這些都是安裝和配置 K8S 服務的基礎依賴,須要執行一下。
執行完畢以後,咱們來運行 kubeadm join
命令。在 1.2.5 中初始化後獲取的輸出還記得麼, kubeadm join x.x.x.x:6443 --token xxxx --discovery-token-ca-cert-hash sha256:xxxx...
。複製粘貼這段命令,將其在 shell 中運行。等一下子,您就能夠看到輸出提示已經加入成功了。這時,咱們驗證一下,輸入如下命令。
kubectl get nodes
獲得的輸出相似以下。
NAME STATUS ROLES AGE VERSION master Ready master 10m v1.17.3 worker1 Ready <none> 1m v1.17.3
咱們看到,名叫 worker1
的工做節點已經成功加入進來了,併爲 Ready
狀態。
⚠️注意:若是您關閉了了在以前啓動主節點後須要複製粘貼的 kubeadm join
命令,您能夠經過 這篇文章 來加入工做節點。
K8S是經過 yaml 文件來配置應用的。下面咱們將介紹如何配置 yaml 文件來配置 Crawlab 應用。一樣的,咱們將配置主節點(Master)和工做節點(Node)。這裏介紹兩種部署方式:首先咱們將用一個快速配置的例子來部署 Crawlab 應用,這個只是預覽體驗用,不推薦應用在生產環境中;第二種是生產環境部署,相對來講更安全穩定。
這裏只是讓您快速體驗 K8S 部署 Crawlab 集羣,不建議在生產中使用。在主節點(或主服務器)中執行如下命令。
# 生成 MongoDB PV(Persistent Volume) kubectl apply https://raw.githubusercontent.com/crawlab-team/crawlab/master/k8s/mongo-pv.yaml # 啓動 MongoDB kubectl apply https://raw.githubusercontent.com/crawlab-team/crawlab/master/k8s/mongo.yaml # 啓動 Redis kubectl apply https://raw.githubusercontent.com/crawlab-team/crawlab/master/k8s/redis.yaml # 啓動 Crawlab 主節點 kubectl apply https://raw.githubusercontent.com/crawlab-team/crawlab/master/k8s/crawlab-master.yaml # 啓動 Crawlab 工做節點集羣 kubectl apply https://raw.githubusercontent.com/crawlab-team/crawlab/master/k8s/crawlab-worker.yaml
啓動好上述服務以後,等待一段時間讓 Pod
啓動起來。執行 kubectl get pods -n crawlab
查看 Pod
狀態。對 Pod
不瞭解的開發者能夠參考一下 官方文檔。
而後,咱們打開瀏覽器,在地址欄輸入 http://<master_node_ip>:30088
就能夠看到 Crawlab 的登陸界面。
在 K8S 上作持久化是一個比較繁瑣的事情,所以咱們建議您先經過 Docker 或直接安裝或雲儲存服務的方式來搭建 MongoDB 和 Redis 數據庫。這裏咱們假設您已經有可用的 MongoDB 和 Redis 數據庫。
首先複製一份 crawlab-master.yaml
到本地。
wget https://raw.githubusercontent.com/crawlab-team/crawlab/master/k8s/crawlab-master.yaml
這個文件的內容以下。
apiVersion: v1 kind: Service metadata: name: crawlab namespace: crawlab spec: ports: - port: 8080 targetPort: 8080 nodePort: 30088 selector: app: crawlab-master type: NodePort --- apiVersion: apps/v1 kind: Deployment metadata: name: crawlab-master namespace: crawlab spec: strategy: type: Recreate selector: matchLabels: app: crawlab-master template: metadata: labels: app: crawlab-master spec: containers: - image: tikazyq/crawlab:latest name: crawlab env: # 這裏是 Crawlab 的環境變量配置 - name: CRAWLAB_SERVER_MASTER value: "Y" - name: CRAWLAB_MONGO_HOST # MongoDB 地址,請改變爲實際 MongoDB 地址 value: "mongo" - name: CRAWLAB_REDIS_ADDRESS # Redis 地址,請改變爲實際 Redis 地址 value: "redis" ports: - containerPort: 8080 name: crawlab
這裏須要作的是稍微修改一下上述的容器環境變量,將數據庫配置更改成實際的數據庫地址。Crawlab 的詳細配置請參考 配置章節。
而後執行下列命令使配置生效。
kubectl apply -f crawlab-master.yaml
複製一份 crawlab-worker.yaml
到本地。
wget https://raw.githubusercontent.com/crawlab-team/crawlab/master/k8s/crawlab-worker.yaml
用編輯器打開 crawlab-worker.yaml
。
apiVersion: apps/v1 kind: Deployment metadata: name: crawlab-worker namespace: crawlab spec: replicas: 4 # 多少個工做節點 strategy: type: Recreate selector: matchLabels: app: crawlab-worker template: metadata: labels: app: crawlab-worker spec: containers: - image: tikazyq/crawlab:latest name: crawlab env: # 這裏是 Crawlab 的環境變量配置 - name: CRAWLAB_SERVER_MASTER value: "N" - name: CRAWLAB_MONGO_HOST # MongoDB 地址,請改變爲實際 MongoDB 地址 value: "mongo" - name: CRAWLAB_REDIS_ADDRESS # Redis 地址,請改變爲實際 Redis 地址 value: "redis"
須要作的就是設置 spec.replicas
來肯定啓動多少個工做節點。而後就是配置 Crawlab,詳細配置請參考 配置章節。
而後執行下列命令使配置生效。
kubectl apply -f crawlab-worker.yaml
執行如下命令來查看 Pod
部署狀況。
kubectl get pods -n crawlab
輸出結果以下。
NAME READY STATUS RESTARTS AGE crawlab-master-6f8688cfdd-cc8b6 1/1 Running 0 10m crawlab-worker-6cc6f476f4-bjrbr 1/1 Running 0 7m crawlab-worker-6cc6f476f4-t9shl 1/1 Running 0 7m crawlab-worker-6cc6f476f4-w8mc8 1/1 Running 0 7m crawlab-worker-6cc6f476f4-sg5px 1/1 Running 0 7m
這時打開瀏覽器,在地址欄輸入 http://<master_node_ip>:30088
就能夠看到 Crawlab 的登陸界面。
本篇文章主要介紹瞭如何使用編排工具 Kubernetes 部署 Crawlab 爬蟲管理節點集羣。對於普通的應用來講,例如只須要單節點運行的應用,其實使用 Docker 就已經足夠。可是對於大型的分佈式應用,特別是分佈式爬蟲這樣的大規模應用,使用 Kubernetes 這樣的容器編排工具就會很是方便。限於時間的關係,做者尚未深刻了解 StatefulSet
、Ingress
等概念,所以對容器持久化和容器網絡理解還不是很深入,對於本篇文章的應用部署(特別是生產環境)來講還有很大的提高空間。後續,做者可能會單獨出一篇介紹 Kubernetes 相關知識(包括基礎和進階)的文章,以及如何將其與 DevOps 結合起來。
若是您以爲 Crawlab 對您的平常開發或公司有幫助,請加做者微信 tikazyq1 並註明 "Crawlab",做者會將你拉入羣。歡迎在 Github 上進行 star,以及,若是遇到任何問題,請隨時在 Github 上提 issue。另外,歡迎您對 Crawlab 作開發貢獻。