本篇部署教程將講述k8s集羣的節點(master和工做節點)部署,請先按照上一篇教程完成節點的準備。本篇教程中的操做所有使用腳本完成,而且對於某些狀況(好比鏡像拉取問題)還提供了多種解決方案。不過基於部署環境和k8s的複雜性,咱們須要對k8s集羣部署過程當中的一些步驟都有所瞭解,尤爲是「kubeadm init」命令。css
主節點部署 html
Kubeadm以及相關工具包的安裝
node
批量拉取k8s相關鏡像
nginx
使用「kubeadm init」啓動k8s主節點
git
啓動k8s主節點
github
kubectl認證
docker
安裝flannel網絡插件api
檢查集羣狀態安全
工做節點部署 ruby
安裝 kubelet
拉取相關鏡像
使用「kubeadm join」將當前節點加入集羣
複製admin.conf而且設置配置
查看集羣節點狀態
安裝儀表盤
當上述步驟完成後,咱們依照如下步驟來完成主節點的安裝:
安裝腳本以下所示:
#配置源 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
若是使用代理、國際網絡或者指定鏡像庫地址,此步驟能夠忽略。在國內,因爲國際網絡問題,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」來查看本地鏡像是否均已準備穩當:
東西都準備好了,接下來咱們就能夠來建立集羣了。
在前面,咱們講解過了「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」組件。
根據前面的規劃,以及剛纔講述的「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」命令來列出、建立和刪除這類令牌,具體操做見後續的《集羣異常解決方案》。
集羣主節點啓動以後,咱們須要使用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
這裏咱們使用默認的網絡組件flannel,相關安裝命令以下以下所示:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
命令「kubectl apply」能夠用於建立和更新資源,以上命令使用了網絡路徑的yaml來進行建立flanner:
安裝完成以後,咱們可使用如下命令來檢查集羣組件是否運行正常:
kubectl get cs
同時,咱們須要確認相關pod已經正常運行,以下所示:
kubectl get pods -n kube-system -o wide
若是coredns崩潰或者其餘pod崩潰,可參考後續章節的常見問題進行解決,請注意確保這些pod正常運行(Running狀態)後再添加工做節點。
若是命名空間「kube-system」下的pod均正常運行,那麼咱們的主節點已經成功的啓動了,接下來咱們來完成工做節點的部署。
這裏咱們以Node1節點爲例進行安裝。開始安裝以前,請確認已經完成以前的步驟(設置主機、IP、系統、Docker和防火牆等)。注意主機名、IP等配置不要出現重複和錯誤。
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
請參考上面小節中的《批量拉取k8s相關鏡像》,此處略過。
「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,這時咱們僅需耐心等待便可。
爲了在工做節點上也能使用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工做節點的部署初步完成。接下來,咱們須要以一樣的方式將其餘工做節點加入到集羣之中。
集羣建立完成以後,咱們能夠輸入如下命令來查看當前節點狀態:
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,登陸以後以下所示:
咱們能夠經過儀表盤來查看節點信息: