前言
本篇部署教程將講述k8s叢集的節點(master和工作節點)部署,請先按照上一篇教程完成節點的準備。本篇教程中的操作全部使用指令碼完成,並且對於某些情況(比如映象拉取問題)還提供了多種解決方案。不過基於部署環境和k8s的複雜性,我們需要對k8s叢集部署過程中的一些步驟都有所瞭解,尤其是“kubeadm init”命令。
目錄
主節點部署
-
Kubeadm以及相關工具包的安裝
-
批量拉取k8s相關映象
-
使用“kubeadm init”啟動k8s主節點
-
啟動k8s主節點
-
kubectl認證
-
安裝flannel網路外掛
-
檢查叢集狀態
工作節點部署
-
安裝 kubelet
-
拉取相關映象
-
使用“kubeadm join”將當前節點加入叢集
-
複製admin.conf並且設定配置
-
檢視叢集節點狀態
安裝儀表盤
主節點部署
當上述步驟完成後,我們依照以下步驟來完成主節點的安裝:
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”來檢視其將進行的一些步驟,瞭解了其動作,我們才能保障在安裝的過程中處理起來遊刃有餘:
如上圖所示,其主體常規步驟(部分步驟根據引數會有變動)如下:
-
確定Kubernetes版本。
-
預檢。出現錯誤則退出安裝,比如虛擬記憶體(swap)沒關閉,埠被佔用。出現錯誤時,請用心按照按照提示進行處理,不推薦使用“--ignore-preflight-errors”來忽略。
-
寫入kubelet配置。
-
生成自簽名的CA證書(可指定已有證書)。
-
將 kubeconfig 檔案寫入 /etc/kubernetes/ 目錄以便 kubelet、controller-manager 和 scheduler 用來連線到 API server,它們每一個都有自己的身份標識,同時生成一個名為 admin.conf 的獨立的kubeconfig檔案,用於管理操作(我們下面會用到)。
-
為 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,並且始終執行在同一個節點上。
-
對master節點應用labels和taints以便不會在它上面執行其它的工作負載,也就是說master節點只做管理不幹活。
-
生成令牌以便其它節點註冊。
-
執行必要配置(比如叢集ConfigMap,RBAC等)。
-
安裝“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,登入之後如下所示:
我們可以通過儀表盤來檢視節點資訊: