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

雪雁發表於2019-08-02

前言         

本篇部署教程將講述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,登入之後如下所示:

我們可以通過儀表盤來檢視節點資訊:

 

往期內容連結

相關文章