使用Kubeadm創建k8s集群之節點部署(三十一)

  • 2019 年 10 月 3 日
  • 筆記

前言         

本篇部署教程將講述k8s集群的節點(master和工作節點)部署,請先按照上一篇教程完成節點的準備。本篇教程中的操作全部使用腳本完成,並且對於某些情況(比如鏡像拉取問題)還提供了多種解決方案。不過基於部署環境和k8s的複雜性,我們需要對k8s集群部署過程中的一些步驟都有所了解,尤其是kubeadm init命令。


 

目錄

主節點部署 

  1. Kubeadm以及相關工具包的安裝

  2. 批量拉取k8s相關鏡像

  3. 使用“kubeadm init”啟動k8s主節點

  4. 啟動k8s主節點

  5. kubectl認證

  6. 安裝flannel網路插件

  7. 檢查集群狀態

     

工作節點部署 

  1. 安裝 kubelet

  2. 拉取相關鏡像

  3. 使用“kubeadm join”將當前節點加入集群

  4. 複製admin.conf並且設置配置

  5. 查看集群節點狀態

     

安裝儀錶盤 


 

 主節點部署

當上述步驟完成後,我們依照以下步驟來完成主節點的安裝:

1.Kubeadm以及相關工具包的安裝

 安裝腳本如下所示:

#配置源  echo '#k8s  [kubernetes]  name=Kubernetes  baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64  enabled=1  gpgcheck=0  '>/etc/yum.repos.d/kubernetes.repo  #kubeadm和相關工具包  yum -y install kubelet kubeadm kubectl kubernetes-cni

注意,以上腳本使用阿里雲鏡像進行安裝。

如果成功安裝,會提示“完畢!”:

安裝完成之後,需要重啟kubelet:

systemctl daemon-reload  systemctl enable kubelet

2.批量拉取k8s相關鏡像

如果使用代理、國際網路或者指定鏡像庫地址,此步驟可以忽略。在中國,由於國際網路問題,k8s相關鏡像在中國可能無法下載,因此我們需要手動準備。

首先,我們先使用“kubeadm config”命令來查看kubeadm相關鏡像的列表:

kubeadm config images list

接下來我們可以從其他倉庫批量下載鏡像並且修改鏡像標籤:

#批量下載鏡像  kubeadm config images list |sed -e 's/^/docker pull /g' -e 's#k8s.gcr.io#docker.io/mirrorgooglecontainers#g' |sh -x  #批量命名鏡像  docker images |grep mirrorgooglecontainers |awk '{print "docker tag ",$1":"$2,$1":"$2}' |sed -e 's# mirrorgooglecontainers# k8s.gcr.io#2' |sh -x  #批量刪除mirrorgooglecontainers鏡像  docker images |grep mirrorgooglecontainers |awk '{print "docker rmi ", $1":"$2}' |sh -x  # coredns沒包含在docker.io/mirrorgooglecontainers中  docker pull coredns/coredns:1.3.1  docker tag coredns/coredns:1.3.1 k8s.gcr.io/coredns:1.3.1  docker rmi coredns/coredns:1.3.1

註:coredns沒包含在docker.io/mirrorgooglecontainers中,需要手工從coredns官方鏡像轉換下。

經過漫長的等待之後,如果鏡像下載完成,我們可以執行命令“docker images”來查看本地鏡像是否均已準備妥當:

東西都準備好了,接下來我們就可以來創建集群了。

3.使用“kubeadm init”啟動k8s主節點

 在前面,我們講解過了“kubeadm init”命令可以用於啟動一個Kubernetes主節點,語法如下所示:

kubeadm init [flags]

其中主要的參數如下所示:

可選參數

說明

–apiserver-advertise-address

指定API Server地址

–apiserver-bind-port

指定綁定的API Server埠,默認值為6443

–apiserver-cert-extra-sans

指定API Server的伺服器證書

–cert-dir

指定證書的路徑

–dry-run

輸出將要執行的操作,不做任何改變

–feature-gates

指定功能配置鍵值對,可控制是否啟用各種功能

-h, –help

輸出init命令的幫助資訊

–ignore-preflight-errors

忽視檢查項錯誤列表,例如“IsPrivilegedUser,Swap”,如填寫為 ‘all’ 則將忽視所有的檢查項錯誤

–kubernetes-version

指定Kubernetes版本

–node-name

指定節點名稱

–pod-network-cidr

指定pod網路IP地址段

–service-cidr

指定service的IP地址段

–service-dns-domain

指定Service的域名,默認為“cluster.local”

–skip-token-print

不列印Token

–token

指定token

–token-ttl

指定token有效時間,如果設置為“0”,則永不過期

–image-repository

指定鏡像倉庫地址,默認為”k8s.gcr.io”

值得注意的是,如上所述,如果我們不想每次都手動批量拉取鏡像,我們可以使用參數“–image-repository”來指定第三方鏡像倉庫,如下述命令所示:

kubeadm init --kubernetes-version=v1.15.0  --apiserver-advertise-address=172.16.2.201  --pod-network-cidr=10.0.0.0/16 --service-cidr 11.0.0.0/12 --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers

“kubeadm init”命令會執行系列步驟來保障啟動一個k8s主節點,我們可以通過命令“kubeadm init –dry-run”來查看其將進行的一些步驟,了解了其動作,我們才能保障在安裝的過程中處理起來遊刃有餘:

如上圖所示,其主體常規步驟(部分步驟根據參數會有變動)如下:

  1. 確定Kubernetes版本。

  2. 預檢。出現錯誤則退出安裝,比如虛擬記憶體(swap)沒關閉,埠被佔用。出現錯誤時,請用心按照按照提示進行處理,不推薦使用“–ignore-preflight-errors”來忽略。

  3. 寫入kubelet配置。

  4. 生成自簽名的CA證書(可指定已有證書)。

  5. 將 kubeconfig 文件寫入 /etc/kubernetes/ 目錄以便 kubelet、controller-manager 和 scheduler 用來連接到 API server,它們每一個都有自己的身份標識,同時生成一個名為 admin.conf 的獨立的kubeconfig文件,用於管理操作(我們下面會用到)。

  6. 為 kube-apiserver、kube-controller-manager和kube-scheduler生成靜態Pod的定義文件。如果沒有提供外部的etcd服務的話,也會為etcd生成一份額外的靜態Pod定義文件。這些靜態Pod的定義文件會寫入到“/etc/kubernetes/manifests”目錄(如下圖所示),kubelet會監視這個目錄以便在系統啟動的時候創建這些Pod。

 

注意:靜態Pod是由kubelet進行管理,僅存在於特定節點上的Pod。它們不能通過API Server進行管理,無法與ReplicationController、Deployment或DaemonSet進行關聯,並且kubelet也無法對其健康檢查。靜態 Pod 始終綁定在某一個kubelet,並且始終運行在同一個節點上。

 

  1. 對master節點應用labels和taints以便不會在它上面運行其它的工作負載,也就是說master節點只做管理不幹活。

  2. 生成令牌以便其它節點註冊。

  3. 執行必要配置(比如集群ConfigMap,RBAC等)。

  4. 安裝“CoreDNS”組件(在 1.11 版本以及更新版本的Kubernetes中,CoreDNS是默認的DNS伺服器)和“kube-proxy”組件。

 

4.啟動k8s主節點

 根據前面的規劃,以及剛才講述的“kubeadm init”命令語法和執行步驟,我們使用如下命令來啟動k8s集群主節點:

kubeadm init --kubernetes-version=v1.15.0  --apiserver-advertise-address=172.16.2.201  --pod-network-cidr=10.0.0.0/16 --service-cidr 11.0.0.0/16

其中,kubernetes version為v1.15.0,apiserver地址為172.16.2.201,pod IP段為10.0.0.0/16。

具體執行細節如下所示:

集群創建成功後,注意這一條命令需要保存好,以便後續將節點添加到集群時使用:

kubeadm join 172.16.2.201:6443 --token jx82lw.8ephcufcot5j06v7       --discovery-token-ca-cert-hash sha256:180a8dfb45398cc6c3addd84a61c1

令牌是用於主節點和新添加的節點之間進行相互身份驗證的,因此需要確保其安全,因為任何人一旦知道了這些令牌,就可以隨便給集群添加節點。如果令牌過期了,我們可以使用 “kubeadm token”命令來列出、創建和刪除這類令牌,具體操作見後續的《集群異常解決方案》。

 

5.kubectl認證

 集群主節點啟動之後,我們需要使用kubectl來管理集群,在開始前,我們需要設置其配置文件進行認證。

這裡我們使用root賬戶,命令如下所示:

#kubectl認證  export KUBECONFIG=/etc/kubernetes/admin.conf

如果是非root賬戶,則需要使用以下命令:

# 如果是非root用戶  $ mkdir -p $HOME/.kube  $ cp -i /etc/kubernetes/admin.conf  $HOME/.kube/config$ chown $(id -u):$(id -g) $HOME/.kube/config

 

6.安裝flannel網路插件

 這裡我們使用默認的網路組件flannel,相關安裝命令如下如下所示:

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

命令“kubectl apply”可以用於創建和更新資源,以上命令使用了網路路徑的yaml來進行創建flanner:

 

7.檢查集群狀態

安裝完成之後,我們可以使用以下命令來檢查集群組件是否運行正常:

kubectl get cs

同時,我們需要確認相關pod已經正常運行,如下所示:

kubectl get pods -n kube-system -o wide

如果coredns崩潰或者其他pod崩潰,可參考後續章節的常見問題進行解決,請注意確保這些pod正常運行(Running狀態)後再添加工作節點。

如果命名空間“kube-system”下的pod均正常運行,那麼我們的主節點已經成功的啟動了,接下來我們來完成工作節點的部署。

 

工作節點部署

這裡我們以Node1節點為例進行安裝。開始安裝之前,請確認已經完成之前的步驟(設置主機、IP、系統、Docker和防火牆等)。注意主機名、IP等配置不要出現重複和錯誤。

1.安裝 kubelet和kubeadm

kubelet是節點代理,而kubeadm則用於將當前節點加入集群。下面我們就開始進行安裝,

安裝命令如下所示:

#配置源  echo '#k8s  [kubernetes]  name=Kubernetes  baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64  enabled=1  gpgcheck=0  '>/etc/yum.repos.d/kubernetes.repo  #kubeadm和相關工具包  yum -y install kubelet kubeadm

重啟kubelet:

systemctl daemon-reload  systemctl enable kubelet

 

2.拉取相關鏡像

請參考上面小節中的《批量拉取k8s相關鏡像》,此處略過。

 

3.使用“kubeadm join”將當前節點加入集群

“kubeadm join”命令可以啟動一個Kubernetes工作節點並且將其加入到集群,語法如下所示:

kubeadm join [api-server-endpoint] [flags]

使用“kubeadm join”就相對簡單多了,這裡,我們回到前面,找到使用“kubeadm init”啟動主節點時列印出來的“kubeadm join”腳本進行執行:

kubeadm join 172.16.2.201:6443 --token jx82lw.8ephcufcot5j06v7       --discovery-token-ca-cert-hash sha256:180a8dfb45398cc6c3addd84a61c1bd4364297da1e91611c8c46a976dc12ff17

如未保存該命令或者token已過期,請參考後續章節的常見問題。這裡,正常情況下加入成功後如下所示:

加入集成成功之後,k8s就會自動調度Pod,這時我們僅需耐心等待即可。

 

4.複製admin.conf並且設置配置

為了在工作節點上也能使用kubectl,而kubectl命令需要使用kubernetes-admin來運行,因此我們需要將主節點中的【/etc/kubernetes/admin.conf】文件拷貝到工作節點相同目錄下,這裡推薦使用scp進行複製,語法如下所示:

#複製admin.conf,請在主節點伺服器上執行此命令  scp /etc/kubernetes/admin.conf {當前工作節點IP}:/etc/kubernetes/admin.conf

具體執行內容如下:

scp /etc/kubernetes/admin.conf 172.16.2.202:/etc/kubernetes/admin.conf  scp /etc/kubernetes/admin.conf 172.16.2.203:/etc/kubernetes/admin.conf

複製時需要輸入相關節點的root賬戶的密碼:

複製完成之後,我們就可以設置kubectl的配置文件了,以便我們在工作節點上也可以使用kubectl來管理k8s集群:

#設置kubeconfig文件  export KUBECONFIG=/etc/kubernetes/admin.conf  echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile

至此,k8s工作節點的部署初步完成。接下來,我們需要以同樣的方式將其他工作節點加入到集群之中。

 

5.查看集群節點狀態

集群創建完成之後,我們可以輸入以下命令來查看當前節點狀態:

kubectl get nodes

接下來,我們可以開始按需安裝儀錶盤以及部署應用了。

 

安裝儀錶盤

命令如下所示:

#如果使用代理或者使用國際網路,則可跳過此步驟  docker pull mirrorgooglecontainers/kubernetes-dashboard-amd64:v1.10.1  docker tag mirrorgooglecontainers/kubernetes-dashboard-amd64:v1.10.1 k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.1  #安裝儀錶盤  kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml

創建admin許可權:  echo '  ---  apiVersion: v1  kind: ServiceAccount  metadata:    labels:      k8s-app: kubernetes-dashboard    name: kubernetes-dashboard-admin    namespace: kube-system  ---  apiVersion: rbac.authorization.k8s.io/v1beta1  kind: ClusterRoleBinding  metadata:    name: kubernetes-dashboard-admin    labels:      k8s-app: kubernetes-dashboard  roleRef:    apiGroup: rbac.authorization.k8s.io    kind: ClusterRole    name: cluster-admin  subjects:  - kind: ServiceAccount    name: kubernetes-dashboard-admin    namespace: kube-system' >kubernetes-dashboard-admin.rbac.yaml    kubectl create -f kubernetes-dashboard-admin.rbac.yaml

使用命令得到token:

#獲取token名稱  kubectl -n kube-system get secret | grep kubernetes-dashboard-admin  #根據名稱拿到token  kubectl describe -n kube-system secret/kubernetes-dashboard-admin-token-lphq4

接下來可以使用以下命令來訪問面板:

kubectl proxy

訪問地址如下所示:

http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/

這裡我們輸入我們剛才得到的Token,登錄之後如下所示:

我們可以通過儀錶盤來查看節點資訊:

 

往期內容鏈接