?史上最全的企業級容器系列之kubernetes入門和搭建(二)

六脈神劍發表於2020-02-28

前言

文字已收錄至我的GitHub倉庫,歡迎Star:github.com/bin39232820…
種一棵樹最好的時間是十年前,其次是現在
我知道很多人不玩qq了,但是懷舊一下,歡迎加入六脈神劍Java菜鳥學習群,群聊號碼:549684836 鼓勵大家在技術的路上寫部落格

絮叨

昨天我們把Master節點成功搭建了,今天我們要繼續把Node節點搭建成功,並且部署幾個服務玩玩。

使用 kubeadm 配置 slave 節點

將 slave 節點加入到叢集中很簡單,只需要在 slave 伺服器上安裝 kubeadm,kubectl,kubelet 三個工具,然後使用 kubeadm join 命令加入即可。準備工作如下:

  • 修改主機名
  • 配置軟體源
  • 安裝三個工具

然後執行那個

?史上最全的企業級容器系列之kubernetes入門和搭建(二)
上一節初始化Master的時候生成的

kubeadm join 192.168.62.159:6443 --token abcdef.0123456789abcdef   --discovery-token-ca-cert-hash sha256:7237dd082021214d77c1d99f0cdc2a1a110c33ba94c5e2df699ea3cebbab1ea4 
複製程式碼

?史上最全的企業級容器系列之kubernetes入門和搭建(二)

說明:

  • token
    • 可以通過安裝 master 時的日誌檢視 token 資訊
    • 可以通過 kubeadm token list 命令列印出 token 資訊
    • 如果 token 過期,可以使用 kubeadm token create 命令建立新的 token
  • discovery-token-ca-cert-hash
    • 可以通過安裝 master 時的日誌檢視 sha256 資訊
    • 可以通過 openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //' 命令檢視 sha256 資訊

驗證是否成功

回到 master 伺服器

kubectl get nodes
複製程式碼

?史上最全的企業級容器系列之kubernetes入門和搭建(二)

檢視 pod 狀態

 kubectl get pod -n kube-system -o wide
複製程式碼

?史上最全的企業級容器系列之kubernetes入門和搭建(二)

由此可以看出 coredns 尚未執行,此時我們還需要安裝網路外掛。

配置網路

容器網路是容器選擇連線到其他容器、主機和外部網路的機制。容器的 runtime 提供了各種網路模式,每種模式都會產生不同的體驗。例如,Docker 預設情況下可以為容器配置以下網路:

  • none: 將容器新增到一個容器專門的網路堆疊中,沒有對外連線。
  • host: 將容器新增到主機的網路堆疊中,沒有隔離。
  • default bridge: 預設網路模式。每個容器可以通過 IP 地址相互連線。
  • 自定義網橋: 使用者定義的網橋,具有更多的靈活性、隔離性和其他便利功能。

什麼是 CNI

CNI(Container Network Interface) 是一個標準的,通用的介面。在容器平臺,Docker,Kubernetes,Mesos 容器網路解決方案 flannel,calico,weave。只要提供一個標準的介面,就能為同樣滿足該協議的所有容器平臺提供網路功能,而 CNI 正是這樣的一個標準介面協議。

Kubernetes 中的 CNI 外掛

CNI 的初衷是建立一個框架,用於在配置或銷燬容器時動態配置適當的網路配置和資源。外掛負責為介面配置和管理 IP 地址,並且通常提供與 IP 管理、每個容器的 IP 分配、以及多主機連線相關的功能。容器執行時會呼叫網路外掛,從而在容器啟動時分配 IP 地址並配置網路,並在刪除容器時再次呼叫它以清理這些資源。

執行時或協調器決定了容器應該加入哪個網路以及它需要呼叫哪個外掛。然後,外掛會將介面新增到容器網路名稱空間中,作為一個 veth 對的一側。接著,它會在主機上進行更改,包括將 veth 的其他部分連線到網橋。再之後,它會通過呼叫單獨的 IPAM(IP地址管理)外掛來分配 IP 地址並設定路由。

在 Kubernetes 中,kubelet 可以在適當的時間呼叫它找到的外掛,為通過 kubelet 啟動的 pod進行自動的網路配置。

Kubernetes 中可選的 CNI 外掛如下:

  • Flannel
  • Calico
  • Canal
  • Weave-

什麼是 Calico

Calico 為容器和虛擬機器提供了安全的網路連線解決方案,並經過了大規模生產驗證(在公有云和跨數千個叢集節點中),可與 Kubernetes,OpenShift,Docker,Mesos,DC / OS 和 OpenStack 整合。

Calico 還提供網路安全規則的動態實施。使用 Calico 的簡單策略語言,您可以實現對容器,虛擬機器工作負載和裸機主機端點之間通訊的細粒度控制。

安裝網路外掛 Calico

參考官方文件安裝:docs.projectcalico.org/v3.7/gettin…

# 在 Master 節點操作即可
kubectl apply -f https://docs.projectcalico.org/v3.11/manifests/calico.yaml

# 安裝時顯示如下輸出
configmap/calico-config created
customresourcedefinition.apiextensions.k8s.io/felixconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamblocks.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/blockaffinities.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamhandles.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamconfigs.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/bgppeers.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/bgpconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ippools.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/hostendpoints.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/clusterinformations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworksets.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networksets.crd.projectcalico.org created
clusterrole.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrolebinding.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrole.rbac.authorization.k8s.io/calico-node created
clusterrolebinding.rbac.authorization.k8s.io/calico-node created
daemonset.extensions/calico-node created
serviceaccount/calico-node created
deployment.extensions/calico-kube-controllers created
serviceaccount/calico-kube-controllers created
複製程式碼

確認安裝是否成功

watch kubectl get pods --all-namespaces

# 需要等待所有狀態為 Running,注意時間可能較久,3 - 5 分鐘的樣子
Every 2.0s: kubectl get pods --all-namespaces                                                                                                    kubernetes-master: Fri May 10 18:16:51 2019

NAMESPACE     NAME                                        READY   STATUS    RESTARTS   AGE
kube-system   calico-kube-controllers-8646dd497f-g2lln    1/1     Running   0          50m
kube-system   calico-node-8jrtp                           1/1     Running   0          50m
kube-system   coredns-8686dcc4fd-mhwfn                    1/1     Running   0          51m
kube-system   coredns-8686dcc4fd-xsxwk                    1/1     Running   0          51m
kube-system   etcd-kubernetes-master                      1/1     Running   0          50m
kube-system   kube-apiserver-kubernetes-master            1/1     Running   0          51m
kube-system   kube-controller-manager-kubernetes-master   1/1     Running   0          51m
kube-system   kube-proxy-p8mdw                            1/1     Running   0          51m
kube-system   kube-scheduler-kubernetes-master     
複製程式碼

解決 ImagePullBackOff

在使用 watch kubectl get pods --all-namespaces 命令觀察 Pods 狀態時如果出現 ImagePullBackOff 無法 Running 的情況,請嘗試使用如下步驟處理:

  • Master 中刪除 Nodes:kubectl delete nodes
  • Slave 中重置配置:kubeadm reset
  • Slave 重啟計算機:reboot
  • Slave 重新加入叢集:kubeadm join

完成搭建

?史上最全的企業級容器系列之kubernetes入門和搭建(二)

?史上最全的企業級容器系列之kubernetes入門和搭建(二)

檢查元件執行狀態

kubectl get cs

# 輸出如下
NAME                 STATUS    MESSAGE             ERROR
# 排程服務,主要作用是將 POD 排程到 Node
scheduler            Healthy   ok                  
# 自動化修復服務,主要作用是 Node 當機後自動修復 Node 回到正常的工作狀態
controller-manager   Healthy   ok                  
# 服務註冊與發現
etcd-0               Healthy   {"health":"true"} 
複製程式碼

檢查 Master 狀態

kubectl cluster-info
#輸出如下
Kubernetes master is running at https://192.168.62.159:6443
KubeDNS is running at https://192.168.62.159:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
複製程式碼

執行第一個容器例項

# 使用 kubectl 命令建立兩個監聽 80 埠的 Nginx Pod(Kubernetes 執行容器的最小單元)
kubectl run nginx --image=nginx --replicas=2 --port=80

# 輸出如下
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/nginx created
複製程式碼

檢視全部 Pods 的狀態

kubectl get pods

nginx-5578584966-f7vl5   0/1     ContainerCreating   0          55s
nginx-5578584966-p9s24   0/1     ContainerCreating   0          55s


nginx-5578584966-f7vl5   1/1     Running   0          18m
nginx-5578584966-p9s24   1/1     Running   0          18m

複製程式碼

檢視已部署的服務

kubectl get deployment

# 輸出如下
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   2/2     2            2           91m
複製程式碼

對映服務,讓使用者可以訪問

kubectl expose deployment nginx --port=80 --type=LoadBalancer

# 輸出如下
service/nginx exposed
複製程式碼

檢視已釋出的服務

kubectl get services
NAME         TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP      10.96.0.1      <none>        443/TCP        21h
nginx        LoadBalancer   10.96.133.79   <pending>     80:31091/TCP   13m
複製程式碼

檢視服務詳情

kubectl describe service nginx


Name:                     nginx
Namespace:                default
Labels:                   run=nginx
Annotations:              <none>
Selector:                 run=nginx
Type:                     LoadBalancer
IP:                       10.96.133.79
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  31091/TCP
Endpoints:                192.168.17.1:80,192.168.8.130:80
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>
複製程式碼

驗證是否成功 通過瀏覽器訪問 Master 伺服器

http://192.168.62.159:30830/
複製程式碼

?史上最全的企業級容器系列之kubernetes入門和搭建(二)

停止服務

kubectl delete deployment nginx

# 輸出如下
deployment.extensions "nginx" deleted
複製程式碼
kubectl delete service nginx

# 輸出如下
service "nginx" deleted
複製程式碼

結尾

目前是已經把K8s叢集搭建完成了 並且我們用它部署了nginx,先到這裡把

日常求贊

好了各位,以上就是這篇文章的全部內容了,能看到這裡的人呀,都是真粉

創作不易,各位的支援和認可,就是我創作的最大動力,我們下篇文章見

六脈神劍 | 文 【原創】如果本篇部落格有任何錯誤,請批評指教,不勝感激 !

相關文章