kubernetes的集羣部署
kubernetes系統可以運行在多種平臺之上,包括虛擬機、裸服務器或PC等,例如本地主機或者託管的雲端虛擬機。這裏使用虛擬機作爲本地主機,將master和node部署到多臺主機之上。
kubeadm部署工具
kuberadm是kubernetes自帶的集羣構建工具,它負責執行構建一個最小化的可用集羣以及將其啓動等必要步驟,簡單來講,kuberadm是kubernetes集羣全生命週期的管理工具,可用於實現集羣的部署、升級/降級以及拆除。
集羣的運行模式
獨立模式:系統個組件直接以守護進程的方式運行在節點之上,各個組件之間相互協作構成集羣。這種模式需要將個組件運行於系統之上的獨立守護進程當中,期間需要用到的證書及Token等認證信息也需要手動完成,過程非常繁瑣而且極其容易出錯;如果有需要用到,建議使用Githup上合用的項目進行輔助,例如通過ansible playbook進行自動部署。
靜態Pod模式:除了kubelet和docker之外的其他組件(如:etcd、kube-apiservice、kube-controller-manager和kube-scheduler等)都是以靜態Pod對象運行在集羣之上。
自託管模式:類似第二種方式,將kubelet和docker之外的其他組件運行爲集羣之上的Pod對象,但不同的是,這些Pod對象託管運行在集羣自身之上受控於DaemonSet類型的控制器,而非靜態的Pod對象。
使用kubeadm部署的kubernetes集羣可運行爲第二或者第三中模式,默認爲靜態Pod模式,需要使用自託管模式時,kubeadm init命令使用“–features-gates=seltHosting”選項即可。
準備用於實踐操作的集羣環境
準備四個虛擬主機
這裏使用的虛擬機是VMware,操作系統是Centos7。
修改主機名:
vim /etc/networks
修改主機名映射:
vim /etc/hosts
關閉firewalld:
systemctl stop firewalld(關閉)
systemctl disable firewalld(開機禁用)
設置docker yum源:
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager
–add-repo
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
設置kubernetes yum源:
vim /etc/yum.repos.d/kubernetes.repo
添加內容
[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/rpm-package-key.gpg
enable=1
這裏使用的是阿里的雲鏡像源
克隆節點主機:
關閉k8s-master主機,右鍵虛擬機主機->管理->克隆,克隆方式選擇完整克隆,分別克隆三臺虛擬主機。
修改節點主機參數:
由於node主機是master克隆出來的,需要修改其一些參數,修改node主機IP,主機名稱和Hosts
vim /etc/sysconfig/network-scripts/ifcfg-ens33
vim /etc/networks
vim /etc/hosts
初始化Master
修改bridge-nf-call-iptables
由於kubeadm初始化的時候,會生成大量iptables規則,所有需要開啓bridge-nf-call-iptables
cat /proc/sys/net/bridge/bridge-nf-call-iptables
如果值爲0,則需要修改爲1。
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
同理/proc/sys/net/bridge/bridge-nf-call-ip6tables也一樣。
安裝docker-ce,kubelet,kubeadm,kubectl
yum install -y docker-ce kubelet-1.15.3 kubeadm-1.15.3 kubectl-1.15.3
這裏我使用的k8s版本是1.15.3,那是因爲後面k8s初始化的時候需要使用k8s.gcr.io這個倉庫地址的鏡像,而這個倉庫因爲一些原因在國內無法被訪問,不過有很多人把鏡像同步到了docker.io上,需要我們自己去找,而我手上有的鏡像版本是1.15.3,後面我會放出這些鏡像的壓縮包的地址。如果你想安裝最新的k8s穩定版,只需要把後面的版本號去掉就行,然後根據安裝的提示自己去找相應版本的依賴鏡像,或者直接FQ。
修改kubelet配置文件
vim /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="–fail-swap-on=false"
kubeadm初始化
kubeadm init --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap
–pod-network-cidr=10.244.0.0/16和–service-cidr=10.96.0.0/12都是kubeadm初始化時候的默認值,也可以不指定這兩個參數或者指定爲其他網段
這時候如果你不是FQ或者提前把k8s.gcr.io相應導入到本地倉庫,那麼會報錯:
錯誤會顯示所需要拉取的鏡像倉庫和Tag。
下載所需要的鏡像壓縮包並且導入到本地倉庫
重置kubeadm
kubeadm reset
再次執行初始化命令
kubeadm init --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap
如果出現上面的內容表示初始化成功,如何把圖中的紅圈標記的三條命令,分別執行一次,這是kubeadm創建的k8s配置信息。
同時記得把最後面這個信息記錄下來,因爲後面node節點需要加入到當前集羣需要用到這個信息
kubeadm join 192.168.3.80:6443 --token j5jmj3.f156dy95ejkzonnd \
–discovery-token-ca-cert-hash sha256:d55325115fa153d2fcb53a69bf3d3f24bb6b9369fb3c7594297baa3b98d27cc4
安裝flannel
這裏k8s集羣的Pod網絡配置,有flannel插件提供,flannel不屬於k8s官方組件,所以需要我們額外自己安裝。
flannel Githup
在flannel的Githup主頁面介紹,如果kubernetes是1.7版本以上我們只需要安裝後面的命令安裝即可,我上面安裝的是1.15.3。
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
上面輸入內容表示flannel已經開始安裝,但是不代表已經安裝完成。
我們通過命令
docker images
查看flannel鏡像是否已經拉下來
當鏡像拉取下來後,我們通過命令
kubectl get pods -n kube-system
上面輸出顯示了Master節點所有的系統組件靜態Pod對象和flannel Pod對象。
初始化node主機
前面和master初始化時一樣:修改bridge-nf-call-iptables、安裝docker-ce,kubelet,kubeadm,kubectl、修改kubelet配置文件
導入本地依賴鏡像
node節點鏡像只需要導入k8s.gcr.io/kube-proxy和k8s.gcr.io/pause即可,flannel在加入master的時候會自動拉取。
加入到mater
找到master剛剛初始化成功後,最後輸出的token信息,粘貼過來,同時後面加上–ignore-preflight-errors=Swap
kubeadm join 192.168.3.80:6443 --token j5jmj3.f156dy95ejkzonnd \
–discovery-token-ca-cert-hash
sha256:d55325115fa153d2fcb53a69bf3d3f24bb6b9369fb3c7594297baa3b98d27cc4 --ignore-preflight-errors=Swap
輸出上面信息,表示node節點已經加入到當前k8s集羣。
再到master主機,輸入
kubectl get nodes
如同所示,這樣集羣中便有了一個master節點和一個node節點
node2和node3同樣的方式初始化
這樣我們用於實踐的K8s集羣環境就初始化完成了。