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

前言         

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


 

目錄

主節點部署 html

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

  2. 批量拉取k8s相關鏡像
    nginx

  3. 使用「kubeadm init」啓動k8s主節點
    git

  4. 啓動k8s主節點
    github

  5. kubectl認證
    docker

  6. 安裝flannel網絡插件api

  7. 檢查集羣狀態安全

     

工做節點部署 ruby

  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,登陸以後以下所示:

咱們能夠經過儀表盤來查看節點信息:

 

往期內容連接

相關文章
相關標籤/搜索