上次我跟大家簡單介紹了一下Kubernetes的各個元件及其含義,本期本來計劃帶領大家一起學習一些常用命令,但我認為這種方式可能無法達到學習的效果。有可能你們會直接忘記,甚至可能沒有興趣去學。我也理解,心想這跟我有什麼關係,我本地又搭建不起來K8s。
我一直堅持讓大家親自動手敲命令解決問題,因為只有這樣才能真正理解命令的作用。所以我一直秉持著讓大家能夠直接學習命令,我也不想去寫什麼安裝教程,直接給你們封裝好環境了,但是這個環境是我自己站在巨人的肩膀上一步一步搭建起來的。我本地進行測試是沒有問題的。這個環境僅供大家本地學習使用,如果因此造成任何損失,我概不負責哦。
如果你想獲取Kubernetes的學習環境,請關注我的主頁,然後在微信中搜尋我的公眾號即可後臺回覆: k8s
。由於不能進行廣告宣傳,我就不在這裡提及公眾號的名字了。現在,我們繼續正式話題,開始快速安裝istio。
K8s直接安裝
前提是你需要先獲取一個適用於Kubernetes學習環境的安裝包。我的分享連結將提供五個檔案,它們分別是:
oracle VM visualbox 類似於你的vmware一樣是一個執行虛擬機器的軟體,你總不能去買一臺高配置的雲伺服器去搞吧。也沒有資金。
k1215-centos81-docker-1.20.6-56.5.ova是隻整合了k8s和docker的映象,可以直接學習各種k8s的命令
k8s-istio-centos81-docker-1.20.6-56.ova是在k1215-centos81-docker-1.20.6-56.5.ova版本基礎上整合好了istio的映象,你可以直接匯入到visualbox 中啟動執行即可。剩下的就可以學習服務網格了。
istio-1.11.1-linux-amd64.tar.gz是istio的離線安裝包,因為需要代理,所以我也提前下載下來了。
kube-flannel.yaml是網路元件,因為需要代理,所以我也提前下載下來了。
一旦你下載完成。助你快速學習k8s的命令用法以及其他知識,省去安裝這種費勁的無用耗時。
匯入基礎K8s映象
我們將根據一個僅整合了Kubernetes和Docker的映象,逐步進行istio的安裝。這樣做有兩個好處:一方面,你可以直接練習Kubernetes的命令;另一方面,你能夠更深入地理解Kubernetes的各種概念和問題。好的,我們開始吧。
首先,你需要確保已經成功安裝了Oracle VM VirtualBox(關於這個安裝過程我就不詳細解釋了)。安裝完成後,我們需要進行第一步,即處理你的NAT網路設定,因為這個映象需要透過NAT模式進行聯網。請按照以下圖示進行設定:
在建立時,你無需填寫任何內容,因為系統會自動為你生成IP地址。你只需要記住這個NAT網路的名稱即可。
好的,現在你可以開始直接匯入基於k8s的基礎映象。如下圖所示:
在匯入選擇K8s的基礎映象後,需要注意的是MAC地址設定這個方面。除此之外,沒有其他需要特別注意的地方。接下來就是等待過程。
當你完成操作之後,請務必進行虛擬機器網路的設定。
好的,現在讓我們來啟動你的虛擬機器吧!k8s的大門已經為你開啟了。然而,在建立istio服務網格的過程中,你可能會遇到各種報錯。不用擔心,我撰寫本文的目的就是為了幫助你解決這些報錯,併成功建立起istio服務網格。此外,你還能學到一些常用命令。
istio手動安裝
當你準備登入虛擬機器時,請使用以下賬戶資訊:使用者名稱為root,密碼為123456。如果你安裝了xshell,你可以透過使用IP地址192.168.56.5直接進行連線。無需擔心IP地址與你本地裝置的地址不同,因為它已被設定為固定值。
由於我已經完成了所有的環境配置工作,因此可以直接利用k8s的命令進行操作。
kubectl get cs
好的,讓我們開始執行第一個命令,用於檢視各個元件的狀態。這個命令的縮寫是"cs",代表"component status"。我已經在之前的文章中講解了有哪些元件了。所以我不會再重複告訴你。然而,令人意外的是,執行命令後出現了錯誤。
至於為什麼會報出這個錯誤,關於這個問題在網上有很多不同的說法。幸運的是,我找到了一個解決方案。首先,我需要先解除安裝一下相關的內容。
解除安裝:
kubeadm reset
ifconfig cni0 down && ip link delete cni0
ifconfig flannel.1 down && ip link delete flannel.1
rm -rf /var/lib/cni/
rm -rf /etc/kubernetes
rm -rf /root/.kube/config
rm -rf /var/lib/etcd
重新安裝:
kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version=v1.21.5 --pod-network-cidr=10.10.0.0/16 --service-cidr=10.20.0.0/16 --apiserver-advertise-address=192.168.56.5
安裝完之後,在執行一下,kubeadm讓我們執行的語句:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
再次執行檢視元件狀態後,仍然無法正常工作。然而,其中一個元件成功執行了:
這時候,為了完成任務,我們需要對一些檔案進行修改。我已經準備好了命令,我們需要做的是註釋掉兩個檔案中的port這一行。
vim /etc/kubernetes/manifests/kube-scheduler.yaml
vim /etc/kubernetes/manifests/kube-controller-manager.yaml
一旦你完成了操作,你就能夠觀察到我們的k8s正常執行了。
好的,現在我們開始安裝istio吧。由於istio需要使用代理,所以我已經提前準備好了相應版本的istio安裝包。接下來,只需將安裝包直接複製到虛擬機器中即可開始安裝。
使用tar -zxvf istio-1.11.1-linux-amd64.tar.gz
命令解壓成功後,需要你修改到etc/profile
中。
export ISTIO_HOME=/root/istio-1.11.1/bin
export PATH=$ISTIO_HOME:$PATH
在執行完相應的操作後,記得使用命令 "source /etc/profile" 來使其生效。接下來,你就可以開始安裝了。
安裝命令:istioctl install --set profile=demo -y
在等待了大約幾分鐘後,不出所料,還是遇到了錯誤。我們的第一反應肯定是上網搜尋解決方案。然而,儘管我嘗試了所有的解決方案,例如網路代理等,但都沒有成功解決我的問題。答案眾多,但都不是我所需要的正確答案。
然而,我知道當安裝istio時,它會在k8s中啟動一個pod。於是,我決定直接檢視後臺啟動日誌,這樣或許能找到問題的所在。因此,現在我們可以開始學習一些關於k8s命令的知識了。
首先,我們需要檢查一下istio是否安裝在特定的名稱空間中。名稱空間可以被理解為一種隔離機制,類似於進行分組操作,將同一名稱空間下的pod視為一組。
kubectl get ns
為了檢視所有的名稱空間,你可以使用以下命令:kubectl get namespaces 或者 kubectl get ns。透過執行這個命令,你可以輕鬆地確定istio是否安裝在名為istio-system的名稱空間中。通常情況下,我們會在預設的名稱空間default下進行操作。
kubectl get pods -n
為了檢視istio-system名稱空間下的pod狀態,你可以使用以下命令:kubectl get pods -n istio-system
。透過新增"-n"引數並指定名稱空間,你可以在不切換名稱空間的情況下,輕鬆地檢視指定名稱空間下的pod狀態。當然,如果你希望切換到其他名稱空間,你可以使用以下命令::kubectl config set-context $(kubectl config current-context) --namespace=istio-system
kubectl describe pod
好的,我們注意到pod的狀態異常,因此我們首先檢視pod的描述以確定是否有異常情況。執行命令kubectl describe pod <pod的名稱> -n istio-system
後,我們發現確實有提示資訊如下:
kubectl taint nodes
錯誤資訊可以輕鬆檢視真正的錯誤原因。通常情況下,Kubernetes的Master節點是不可排程的,以防止在Master節點上執行使用者Pod。然而,考慮到我們的虛擬環境只是用於學習,我們可以直接執行Pod而不管它們是否可以排程。因此,我們需要對配置進行調整。
命令是:kubectl taint nodes <node-name> node-role.kubernetes.io/master-
請將
kubectl get nodes
如果你不知道你的node-name的話,可以使用kubectl get nodes
獲取。
當你執行完後,我們再來重新安裝一次istio,經過最佳化。然而,我們發現問題仍然存在,因此我們再次執行describe命令時仍然遇到了錯誤。具體錯誤資訊如下:
我看完日誌後的第一反應是感到困惑,因為我對日誌中出現的內容不太理解。於是我決定找AI幫忙,讓它來分析一下。AI給出的介面看起來很可信,它指出缺少了POD network Flannel網路外掛,我看了一下報錯資訊果然如此。既然找到了問題,那就著手解決吧。
kubectl apply -f
經過一番搜尋看來是需要:wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yaml
執行命令下載一個檔案。但是一看就是需要代理的,所以我也提前準備好了kube-flannel.yaml
。當你往你的虛擬機器中傳輸完之後,可以直接使用命令啟動kubectl apply -f kube-flannel.yaml
然而,我執行完畢後,令人驚訝的是,Istio仍然無法正常工作。從啟動日誌中可以看出,它被安裝在了kube-flannel名稱空間中。現在,我們來檢視一下它的Pod情況。
k get pod -n kube-flannel
執行完後檢視到pod沒啟動成功,我們再看下他的描述資訊。
kubectl logs -n
這次的描述資訊似乎很正常,沒有明顯的錯誤提示,只有一個提示資訊。為了更進一步瞭解情況,我們可以再次檢視它的啟動日誌,以下是相應的命令:kubectl logs -n kube-flannel kube-flannel-ds-h47f6
在檢視日誌後,我們發現問題居然是由於網路段的設定引起的,這真是個坑啊。不過好訊息是,這似乎是最後一個問題了。我就不在此處詳述了,我希望你能夠自行解決。解決完畢後,你將進入istio的訓練天地,如果你真的遇到困難,可以在我的公眾號中回覆k8s
,我將會給你回覆並提供答案。
當你安裝成功後,所有的服務都將啟動
總結
以上所有的問題,我都是自己解決的。如果你覺得我提供的幫助不錯,可以給我一個贊。對於初學者來說,我建議從基礎版映象開始慢慢構建istio,這樣可以更好地學習k8s的命令。當然,如果你已經是k8s的老手,除了別跳過visualBox的過程外,你可以直接下載已經搭建好的istio虛擬機器映象。好的,這一章就到此結束了。記得關注我的公眾號,我的宗旨是讓你用最小的成本學習到最多的技術內容。