用 Kubernetes 部署 Crawlab 爬蟲管理節點集羣

前言

本篇文章摘自 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

  • 須要在生產環境中實踐多節點部署 Crawlab 的開發者
  • 須要部署大規模爬蟲應用(例如分佈式爬蟲)的開發者
  • 瞭解 Docker、Kubernetes 或但願學習相關知識的開發者

推薦配置:redis

  • Docker: 18.03+
  • Kubernetes: 1.17.3+

1. 節點安裝配置

若是您已經有一個工做的 K8S 集羣,您能夠略過本節,直接跳到 2. 配置 Crawlabdocker

1.1 安裝 Docker

咱們在 Docker 安裝部署 中已經詳細講述瞭如何安裝 Docker,請參考該小節的安裝教程在每一臺機器上安裝 Docker。shell

⚠️注意:您須要在每一臺機器上安裝 Docker。數據庫

1.2 安裝 Kubernetes

安裝 Kubernetes 的過程比較繁瑣,建議您耐心操做。咱們首先將在主節點上安裝和配置 Kubernetes,主節點名稱叫 master。bootstrap

1.2.1 拉取 Kubernetes 基礎鏡像

若是您有比較好的網絡環境(例如在國外),能夠考慮忽略這一步。

這一步是將 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 服務了。

1.2.2 獲取 Kubernetes 執行文件

# 獲取 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/

1.2.3 安裝 CNI 執行文件

下載並解壓 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

1.2.4 配置 kubelet

執行如下命令來配置 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

1.2.5 初始化主節點 Kubernetes 服務

請在 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... 就是加入從節點的命令,您須要在從節點上執行這個命令。

1.2.6 配置容器網絡

如今能夠來配置網絡了,咱們採用 flannel

執行如下命令來加入 flannel

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

1.2.7 驗證節點狀態

節點初始化完畢後,在命令行中輸入如下命令查看節點狀態。

kubectl get nodes

您將會看到相似以下輸出。

NAME      STATUS     ROLES     AGE       VERSION
master    Ready        master    5m       v1.17.3

狀態 STATUSReady 表示節點已經成功初始化了。若是狀態爲 NotReady,表示節點初始化時遇到了問題,須要排查異常。這時能夠經過如下命令來查看日誌。

journalctl -f -u kubelet.service

1.2.8 加入工做節點

如今的任務就是將剩餘的服務器或節點加入到當前的 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 命令,您能夠經過 這篇文章 來加入工做節點。

2. 配置部署 Crawlab

K8S是經過 yaml 文件來配置應用的。下面咱們將介紹如何配置 yaml 文件來配置 Crawlab 應用。一樣的,咱們將配置主節點(Master)和工做節點(Node)。這裏介紹兩種部署方式:首先咱們將用一個快速配置的例子來部署 Crawlab 應用,這個只是預覽體驗用,不推薦應用在生產環境中;第二種是生產環境部署,相對來講更安全穩定。

2.1 快速部署

這裏只是讓您快速體驗 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 的登陸界面。

2.2 生產環境部署

在 K8S 上作持久化是一個比較繁瑣的事情,所以咱們建議您先經過 Docker 或直接安裝或雲儲存服務的方式來搭建 MongoDB 和 Redis 數據庫。這裏咱們假設您已經有可用的 MongoDB 和 Redis 數據庫。

2.2.1 部署主節點

首先複製一份 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

2.2.2 部署工做節點

複製一份 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

2.2.3 驗證部署

執行如下命令來查看 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 這樣的容器編排工具就會很是方便。限於時間的關係,做者尚未深刻了解 StatefulSetIngress 等概念,所以對容器持久化和容器網絡理解還不是很深入,對於本篇文章的應用部署(特別是生產環境)來講還有很大的提高空間。後續,做者可能會單獨出一篇介紹 Kubernetes 相關知識(包括基礎和進階)的文章,以及如何將其與 DevOps 結合起來。

若是您以爲 Crawlab 對您的平常開發或公司有幫助,請加做者微信 tikazyq1 並註明 "Crawlab",做者會將你拉入羣。歡迎在 Github 上進行 star,以及,若是遇到任何問題,請隨時在 Github 上提 issue。另外,歡迎您對 Crawlab 作開發貢獻。

相關文章
相關標籤/搜索