一、部署環(huán)境架構(gòu)以及方式
第一種部署方式
1、針對(duì)于master節(jié)點(diǎn)
將API Server、etcd、controller-manager、scheduler各組件進(jìn)行yum install、編譯安裝或者展開(kāi)安裝的方式手動(dòng)直接安裝在master節(jié)點(diǎn)主機(jī)上,作為系統(tǒng)級(jí)守護(hù)進(jìn)程運(yùn)行。
2、針對(duì)于node節(jié)點(diǎn)
將kube-proxy、kubelet、docker、flannel各組件進(jìn)行yum install或下載已預(yù)制好的二進(jìn)制程序包手動(dòng)安裝在node節(jié)點(diǎn)主機(jī)上,作為系統(tǒng)級(jí)守護(hù)進(jìn)程運(yùn)行。
此部署方式非常的繁瑣,出于安全方面的考慮,各組件之間通信都需要配置CA和證書(shū)。
注:此部署方式的缺點(diǎn)就是如果master宕機(jī)了,需要手動(dòng)進(jìn)行啟動(dòng)這些系統(tǒng)級(jí)的守護(hù)進(jìn)程
第二種部署方式
由于第一種部署方式比較繁瑣,此次我們采用kubeadm工具進(jìn)行部署,由k8s官方所提供的專門(mén)部署集群的管理工具。
每一個(gè)節(jié)點(diǎn)主機(jī)上包括master節(jié)點(diǎn)都要手動(dòng)安裝并運(yùn)行docker,同時(shí)也都要手動(dòng)安裝并運(yùn)行kubelet。如果將第一個(gè)節(jié)點(diǎn)初始化為master節(jié)點(diǎn),在執(zhí)行初始化這個(gè)步驟,其實(shí)就是通過(guò)kubeadm工具將API Server、etcd、controller-manager、scheduler各組件運(yùn)行為Pod,也就是跑在docker上。而其他node節(jié)點(diǎn),因已經(jīng)運(yùn)行了kubelet、docker組件,剩下的kube-proxy組件也是要運(yùn)行在Pod上。
kubelet:負(fù)責(zé)能運(yùn)行Pod化容器的核心組件
docker:運(yùn)行容器的引擎
但是以上master節(jié)點(diǎn)上的Pod都是靜態(tài)Pod(static Pod),并不受k8s自身管理,只是運(yùn)行為Pod形式而已,也可運(yùn)行為自托管Pod(本文不作闡述)。
而flannel組件也是運(yùn)行在Pod上的系統(tǒng)級(jí)守護(hù)進(jìn)程,起到各node節(jié)點(diǎn)通信作用。以下是flannel簡(jiǎn)單介紹:
http://www.sfodin.cn/Linux/2019-08/159869.htm
3、kubeadm的介紹
在GitHub上kubeadm的介紹:
https://github.com/kubernetes/kubeadm
二、Kubernetes集群的部署詳細(xì)步驟
(一)簡(jiǎn)述部署流程
1、master、nodes節(jié)點(diǎn)要先安裝kubelet、kubeadm和docker
2、在master節(jié)點(diǎn)上運(yùn)行kubeadm init進(jìn)程進(jìn)行初始化集群
3、將各node節(jié)點(diǎn)加入集群中:kubeadm join
kubeadm工作原理詳解見(jiàn):https://github.com/kubernetes/kubeadm/blob/master/docs/design/design_v1.10.md(此文檔介紹的是k8s1.10版本)
(二)部署流程的詳細(xì)介紹
(1)master節(jié)點(diǎn)環(huán)境安裝的準(zhǔn)備工作
1、確保集群中的所有節(jié)點(diǎn),服務(wù)器時(shí)間是同步的。設(shè)置詳情如下:
https://www.cnblogs.com/huhyoung/p/9657253.html
2、公司內(nèi)部局域網(wǎng)的服務(wù)器可配置hosts文件進(jìn)行域名解析,例如馬哥視頻中的:
而云服務(wù)器需要另外考慮
注:阿里云服務(wù)器切記不要修改hostname
3、關(guān)閉防火墻服務(wù)
需要注意的是,CentOS Linux 7默認(rèn)啟動(dòng)了firewalld(防火墻服務(wù)),而Kubernetes的master與工作node之間會(huì)有大量的網(wǎng)絡(luò)通信,安全的做法是在防火墻上配置各組件需要相互通信的端口號(hào)。在一個(gè)安全的內(nèi)部網(wǎng)絡(luò)環(huán)境中可以關(guān)閉防火墻服務(wù):
[root@master ~]# systemctl disable firewalld
[root@master ~]# systemctl stop firewalld
4、獲取軟件包
第一種部署方式獲取軟件包
源碼包獲取地址:https://github.com/kubernetes/kubernetes/releases
圖中紅色框的為源碼包,而kubernetes.tar.gz不是源碼包,但包含所需的所有組件。建議下載官方預(yù)制好的,master、node相關(guān)組件分別分開(kāi)組建的包,點(diǎn)擊CHANGELOG-1.11.md
點(diǎn)擊目錄Downloads for v1.11.3跳轉(zhuǎn)到
不管是master和node都應(yīng)該安裝服務(wù)端安裝包,像圖中的kubernetes-server-linux-amd64.tar.gz包,如果要進(jìn)行交互,則需要安裝客戶端
第二種部署方式獲取軟件包
如果是Cent OS,建議使用yum install安裝,Google官方已經(jīng)將這些組件制作成了RPM包,這些包需要RPM包生成器動(dòng)態(tài)生成,所以不能下載到本地使用,只能通過(guò)在線倉(cāng)庫(kù)進(jìn)行安裝。
(2)master節(jié)點(diǎn)環(huán)境的安裝
1、配置yum倉(cāng)庫(kù)
先安裝docker鏡像,去阿里云官方鏡像網(wǎng)站:https://opsx.alibaba.com/mirror找到docker-ce對(duì)應(yīng)的linux centos系統(tǒng)repo配置文件,右擊復(fù)制鏈接
然后進(jìn)入/etc/yum.repos.d目錄,下載到本地。
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
接著再生成Kubernetes的倉(cāng)庫(kù)文件,創(chuàng)建并編輯kubernetes.repo。
[root@master yum.repos.d]# vim kubernetes.repo
寫(xiě)入以下內(nèi)容,baseurl和gpgkey的路徑可在阿里云官方鏡像網(wǎng)站Kubernetes目錄下找到。
[kubernetes]
name=Kubernetes Repo
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
enabled=1
創(chuàng)建完之后,獲取當(dāng)前系統(tǒng)有效的repolist
[root@master yum.repos.d]# yum repolist
為了方便在node節(jié)點(diǎn)上安裝,可以將這個(gè)兩個(gè)配置文件通過(guò)scp命令復(fù)制到node節(jié)點(diǎn)服務(wù)器上
[root@master yum.repos.d]# scp kubernetes.repo docker-ce.repo node1:/etc/yum.repos.d/
2、安裝各組件
kuberctl:API Server的命令行客戶端
[root@master yum.repos.d]# yum install docker-ce kubelet kubeadm kubectl
可以看到加載到的是哪些版本的包
安裝到cri-tools-1.11.1-0.x86_64包時(shí)提示gpgkey沒(méi)有安裝
將yum-key.gpg下載到本地進(jìn)行rpm –import導(dǎo)入
發(fā)現(xiàn)還是報(bào)同樣的錯(cuò),于是順便也把rpm包的key也下載下來(lái)進(jìn)行導(dǎo)入
wget https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
最后,都安裝成功了。
3、啟動(dòng)docker
啟動(dòng)docker后,需要注意的是它會(huì)去docker倉(cāng)庫(kù)下載所依賴到的每個(gè)鏡像文件,這些鏡像文件暫時(shí)獲取不到,建議將相關(guān)鏡像文件通過(guò)其他途徑下載到本地然后導(dǎo)入使用,或者推送到本地倉(cāng)庫(kù)。
在這里我們是借用別人此前提供的一種路徑來(lái)獲取并下載使用,因此在啟動(dòng)之前,需要編輯vim /usr/lib/systemd/system/docker.service,在該文件中定義一個(gè)環(huán)境變量
注意NO_PROXY中間是有下劃線的。然后修改完配置文件之后需要重新加載配置文件,然后重新啟動(dòng),否則修改不會(huì)生效。
[root@master ~]# systemctl daemon-reload
[root@master ~]# systemctl start docker
是否啟動(dòng)成功用docker info查看一下,可以看出已經(jīng)啟動(dòng)成功了
同時(shí)還要確保以下兩個(gè)參數(shù)值為1。通過(guò)網(wǎng)橋轉(zhuǎn)發(fā)的IP數(shù)據(jù)包會(huì)iptables規(guī)則過(guò)濾,而這兩個(gè)選項(xiàng)將阻止過(guò)濾,Netfilter是默認(rèn)情況下啟用了橋梁,如果不阻止會(huì)導(dǎo)致嚴(yán)重的混亂
如果不是1需要修改為1
echo 1 > /proc/sys/net/bridge/bridge-nf-call-ip6tables
通過(guò)[root@master ~]# rpm -ql kubelet 命令查看都安裝了什么文件
查看配置文件發(fā)現(xiàn)額外參數(shù)是空的
4、設(shè)置kubelet、docker為開(kāi)機(jī)啟動(dòng)
[root@master ~]# systemctl start kubelet
[root@master ~]# systemctl status kubelet
這邊沒(méi)有明顯的錯(cuò)誤提示,因此查看日志[root@master ~]# tail /var/log/messages
[root@master ~]# systemctl stop kubelet #將kubelet關(guān)閉
因各個(gè)組件還未初始化完成所以不能啟動(dòng),將其設(shè)置開(kāi)機(jī)啟動(dòng)即可
[root@master ~]# systemctl enable kubelet #將其設(shè)置為開(kāi)機(jī)啟動(dòng)
[root@master ~]# systemctl enable docker #將docker設(shè)置為開(kāi)機(jī)啟動(dòng)
5、kubeadm init初始化
查看kubeadm init的幫助信息
[root@master ~]# kubeadm init –help
–apiserver-advertise-address:API服務(wù)器將通知它正在監(jiān)聽(tīng)的IP地址,監(jiān)聽(tīng)的地址為“0.0.0.0”,即本機(jī)所有IP地址。
–apiserver-bind-port:API服務(wù)器綁定到的端口。(默認(rèn):6443)
–cert-dir:加載證書(shū)的相關(guān)目錄(默認(rèn):/etc/kubernetes/pki)
–config:配置文件的路徑。警告:配置文件目前屬于實(shí)驗(yàn)性,還不穩(wěn)定。
–ignore-preflight-errors:將錯(cuò)誤顯示為警告的檢查列表進(jìn)行忽略。例如:“IsPrivilegedUser,Swp”。Value ‘all’忽略所有檢查中的錯(cuò)誤。
–pod-network-cidr:指定pod網(wǎng)絡(luò)的IP地址范圍。如果設(shè)置,控制平面將為每個(gè)節(jié)點(diǎn)自動(dòng)分配CIDRs。
–service-cidr:為service VIPs使用不同的IP地址。(默認(rèn)“10.96.0.0/12”)
然后我們指定選項(xiàng)進(jìn)行初始化:
[root@master ~]# kubeadm init –kubernetes-version=v1.11.1 –pod-network-cidr=10.244.0.0/16 –service-cidr=10.96.0.0/12
如果在初始化中碰到swap不支持的報(bào)錯(cuò),如下圖
需要做兩個(gè)設(shè)定
①[root@master ~]# vim /etc/sysconfig/kubelet #加入以下參數(shù)
KUBELET_EXTRA_ARGS=”–fail-swap-on=false”
②[root@master ~]# kubeadm init –kubernetes-version=v1.11.1 –pod-network-cidr=10.244.0.0/16 –service-cidr=10.96.0.0/12 –ignore-preflight-errors=Swap #在初始化時(shí)加入–ignore選項(xiàng)
最后通過(guò)[root@master ~]# docker image ls 查看鏡像都拉取完了
其中k8s.gcr.io/pause就是基礎(chǔ)架構(gòu)容器,可以不用啟動(dòng),其他容器可以將它當(dāng)成模板進(jìn)行網(wǎng)絡(luò)、存儲(chǔ)卷復(fù)制。
特別注意:
其中有兩個(gè)附件:CoreDNS和kube-proxy
CoreDNS:CoreDNS已經(jīng)經(jīng)歷過(guò)三個(gè)版本:sky-dns()—–>kube-dns(1.3版本)—–>CoreDNS(1.11版本)
kube-proxy:作為附件運(yùn)行自托管與k8s之上,來(lái)幫忙負(fù)責(zé)生成service資源相關(guān)的iptables或者ipvs規(guī)則,在1.11版本默認(rèn)使用ipvs。
6、創(chuàng)建kube目錄,添加kubectl配置
建議用普通用戶運(yùn)行以下三個(gè)命令:
mkdir -p $HOME/.kube;
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config;
sudo chown $(id -u):$(id -g) $HOME/.kube/config
因不是生產(chǎn)環(huán)境,所以此處直接用root權(quán)限執(zhí)行,第三步更改屬主和屬組也不需要操作
還未執(zhí)行以上三個(gè)命令時(shí),查看nodes節(jié)點(diǎn)是會(huì)報(bào)以下錯(cuò)誤:
執(zhí)行完之后,再查看nodes節(jié)點(diǎn)時(shí),結(jié)果如下:
可以看出master的狀態(tài)是未就緒(NotReady),之所以是這種狀態(tài)是因?yàn)檫€缺少一個(gè)附件flannel或者Calico,沒(méi)有網(wǎng)絡(luò)各Pod是無(wú)法通信的。
也可以通過(guò)檢查組件的健康狀態(tài)
[root@master ~]# kubectl get componentstatus #componentstatus可簡(jiǎn)寫(xiě)為cs
7、添加網(wǎng)絡(luò)組件(flannel)
組件flannel可以通過(guò)https://github.com/coreos/flannel中獲取,此處也有介紹怎么安裝
如果Kubernetes版本是1.7以上執(zhí)行這行命令即可,在線自動(dòng)獲取部署清單,然后基于此清單下載鏡像啟動(dòng)并部署
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
看到很多東西被創(chuàng)建是還不夠的,還需要查看flannel是否處于正常啟動(dòng)并運(yùn)行的狀態(tài),才算正在的部署完成
[root@node1 ~]# docker image ls #查看flannel鏡像是否有被拉取下來(lái)
可以看到flannel鏡像已經(jīng)下載下來(lái)了
注意:從這步開(kāi)始我用的版本是v1.11.2,由于代理到期,導(dǎo)致之前的鏡像下載不到重新?lián)Q了途徑下載,所以你們kubeadm init初始化時(shí)記得對(duì)應(yīng)上版本。
[root@node1 ~]# kubectl get pods –all-namespaces #查看所有名稱空間的pod,同時(shí)可以看到flannel已經(jīng)正常啟動(dòng)
[root@node1 ~]# kubectl get pods -n kube-system #查看名稱空間為kube-system的pod
[root@localhost ~]# kubectl get ns #查看有哪些名稱空間
系統(tǒng)級(jí)別的Pod都在名稱空間kube-system中
這樣我們的master節(jié)點(diǎn)就部署好了
8、
(3)node節(jié)點(diǎn)環(huán)境的安裝
[root@node01 ~]# rpm –import rpm-package-key.gpg
[root@node01 ~]# yum install -y docker-ce kubelet kubeadm
[root@master ~]# scp /usr/lib/systemd/system/docker.service node01:/usr/lib/systemd/system/docker.service
[root@master ~]# scp /etc/sysconfig/kubelet node01://etc/sysconfig/
[root@node01 ~]# systemctl daemon-reload
[root@node01 ~]# systemctl start docker
[root@node01 ~]# systemctl enble docker kubelet
[root@node01 ~]# kubeadm join 172.20.0.70:6443 –token jpy0lt.fxz77am8dgr4r93f –discovery-token-ca-cert-hash sha256:70b67aa60ebb2eef3e3e4f76e5278fc23e6972c1c4e0848d744b93caa6f9b6ec –ignore-preflight-errors=Swap
加入成功之后,等以下鏡像下載完之后這個(gè)node節(jié)點(diǎn)就ok了。
可以通過(guò)kubectl get pods -n kube-system -o wide查看flannel和proxy有兩個(gè),一個(gè)在master節(jié)點(diǎn)上,一個(gè)在node01節(jié)點(diǎn)上。