【智簡聯接,萬物互聯】華為云·云享專家董昕:Serverless和微服務下, IoT的變革蓄勢待發
919
2022-05-30
前言
Kubernetes(K8S) 是非常強大的容器編排工具,可以管理大型集群、微服務、分布式應用等等,是生產環境多節點部署中非常合適的選擇。
而 Crawlab 作為分布式爬蟲管理平臺,同樣也支持 Kubernetes 部署。Kubernetes 部署適合比較大型的分布式應用,但如果您有幾臺機器,也是可以實踐的,Kubernetes 將降低您管理分布式應用的成本。
如果對 Kubernetes 還不了解,可以在 Kubernetes 中文社區入門課程 中學習相關知識;如果您已經了解 Docker,可以參考另外一個比較不錯的免費資源,《從Docker到Kubernetes進階》;同時也推薦掘金的 《Kubernetes 從上手到實踐》 掘金小冊(付費)學習快速入門 K8S 集群的知識;如果想深入了解 K8S 的原理,建議學習極客時間上張磊的 《深入剖析Kubernetes》。注意,由于 Kubernetes 發展很快,可能很多教程的 K8S 版本已經有些老了,有些命令在新版本不生效,因此為了保證您使用的命令和配置是最新的版本,請開發者參考 Kubernetes 官方文檔。
本篇文章將詳細介紹如何在一個 Kubernetes 集群上搭建 Crawlab 多節點應用。首先我們假設您有多臺服務器,操作系統均為 Ubuntu 16.04。
推薦人群:
需要在生產環境中實踐多節點部署 Crawlab 的開發者
需要部署大規模爬蟲應用(例如分布式爬蟲)的開發者
了解 Docker、Kubernetes 或希望學習相關知識的開發者
前言
Kubernetes(K8S) 是非常強大的容器編排工具,可以管理大型集群、微服務、分布式應用等等,是生產環境多節點部署中非常合適的選擇。
而 Crawlab 作為分布式爬蟲管理平臺,同樣也支持 Kubernetes 部署。Kubernetes 部署適合比較大型的分布式應用,但如果您有幾臺機器,也是可以實踐的,Kubernetes 將降低您管理分布式應用的成本。
如果對 Kubernetes 還不了解,可以在 Kubernetes 中文社區入門課程 中學習相關知識;如果您已經了解 Docker,可以參考另外一個比較不錯的免費資源,《從Docker到Kubernetes進階》;同時也推薦掘金的 《Kubernetes 從上手到實踐》 掘金小冊(付費)學習快速入門 K8S 集群的知識;如果想深入了解 K8S 的原理,建議學習極客時間上張磊的 《深入剖析Kubernetes》。注意,由于 Kubernetes 發展很快,可能很多教程的 K8S 版本已經有些老了,有些命令在新版本不生效,因此為了保證您使用的命令和配置是最新的版本,請開發者參考 Kubernetes 官方文檔。
本篇文章將詳細介紹如何在一個 Kubernetes 集群上搭建 Crawlab 多節點應用。首先我們假設您有多臺服務器,操作系統均為 Ubuntu 16.04。
推薦人群:
需要在生產環境中實踐多節點部署 Crawlab 的開發者
需要部署大規模爬蟲應用(例如分布式爬蟲)的開發者
了解 Docker、Kubernetes 或希望學習相關知識的開發者
推薦配置:
Docker: 18.03+
Kubernetes: 1.17.3+
1. 節點安裝配置
如果您已經有一個工作的 K8S 集群,您可以略過本節,直接跳到 2. 配置 Crawlab。
1.1 安裝 Docker
我們在 Docker 安裝部署 中已經詳細講述了如何安裝 Docker,請參考該小節的安裝教程在每一臺機器上安裝 Docker。
??注意:您需要在每一臺機器上安裝 Docker。
1.2 安裝 Kubernetes
安裝 Kubernetes 的過程比較繁瑣,建議您耐心操作。我們首先將在主節點上安裝和配置 Kubernetes,主節點名稱叫 master。
如果您有比較好的網絡環境(例如在國外),可以考慮忽略這一步。
這一步是將 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?????
我們看到,名叫 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://
2.2 生產環境部署
在 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://
參考
Crawlab Github: https://github.com/crawlab-team/crawlab
Crawlab Demo: http://crawlab.cn/demo
Crawlab 文檔: https://docs.crawlab.cn
總結
Go Kubernetes
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。