摘要:所以,選擇把運(yùn)行直接運(yùn)行在宿主機(jī)中,使用容器部署其他組件。獨(dú)立部署方式所需機(jī)器資源多按照集群的奇數(shù)原則,這種拓?fù)涞募宏P(guān)控制平面最少就要臺(tái)宿主機(jī)了。
在上篇文章minikube部署中,有提到Minikube部署Kubernetes的核心就是Kubeadm,這篇文章來詳細(xì)說明下Kubeadm原理及部署步驟。寫這篇文章的時(shí)候,Kubernetes1.14剛剛發(fā)布,所以部署步驟以1.14版為主。
Kubeadm原理簡(jiǎn)述Kubeadm工具的出發(fā)點(diǎn)很簡(jiǎn)單,就是盡可能簡(jiǎn)單的部署一個(gè)生產(chǎn)可用的Kubernetes集群。實(shí)際也確實(shí)很簡(jiǎn)單,只需要兩條命令:
# 創(chuàng)建一個(gè) Master 節(jié)點(diǎn) $ kubeadm init # 將一個(gè) Node 節(jié)點(diǎn)加入到當(dāng)前集群中 $ kubeadm join
kubeadm做了這些事
執(zhí)行 kubeadm init時(shí):
自動(dòng)化的集群機(jī)器合規(guī)檢查
自動(dòng)化生成集群運(yùn)行所需的各類證書及各類配置,并將Master節(jié)點(diǎn)信息保存在名為cluster-info的ConfigMap中。
通過static Pod方式,運(yùn)行API server, controller manager 、scheduler及etcd組件。
生成Token以便其他節(jié)點(diǎn)加入集群
執(zhí)行 kubeadm join時(shí):
節(jié)點(diǎn)通過token訪問kube-apiserver,獲取cluster-info中信息,主要是apiserver的授權(quán)信息(節(jié)點(diǎn)信任集群)。
通過授權(quán)信息,kubelet可執(zhí)行TLS bootstrapping,與apiserver真正建立互信任關(guān)系(集群信任節(jié)點(diǎn))。
簡(jiǎn)單來說,kubeadm做的事就是把大部分組件都容器化,通過StaticPod方式運(yùn)行,并自動(dòng)化了大部分的集群配置及認(rèn)證等工作,簡(jiǎn)單幾步即可搭建一個(gè)可用Kubernetes的集群。
這里有個(gè)問題,為什么不把kubelet組件也容器化呢,是因?yàn)椋琸ubelet在配置容器網(wǎng)絡(luò)、管理容器數(shù)據(jù)卷時(shí),都需要直接操作宿主機(jī),而如果現(xiàn)在 kubelet 本身就運(yùn)行在一個(gè)容器里,那么直接操作宿主機(jī)就會(huì)變得很麻煩。比如,容器內(nèi)要做NFS的掛載,需要kubelet先在宿主機(jī)執(zhí)行mount掛載NFS。如果kubelet運(yùn)行在容器中問題來了,如果kubectl運(yùn)行在容器中,要操作宿主機(jī)的Mount Namespace是非常復(fù)雜的。所以,kubeadm選擇把kubelet運(yùn)行直接運(yùn)行在宿主機(jī)中,使用容器部署其他Kubernetes組件。所以,Kubeadm部署要安裝的組件有Kubeadm、kubelet、kubectl三個(gè)。
上面說的是kubeadm部署方式的一般步驟,kubeadm部署是可以自由定制的,包括要容器化哪些組件,所用的鏡像,是否用外部etcd,是否使用用戶證書認(rèn)證等以及集群的配置等等,都是可以靈活定制的,這也是kubeadm能夠快速部署一個(gè)高可用的集群的基礎(chǔ)。詳細(xì)的說明可以參考官方Reference。但是,kubeadm最重要的作用還是解決集群部署問題,而不是集群配置管理的問題,官方也建議把Kubeadm作為一個(gè)基礎(chǔ)工具,在其上層再去量身定制適合自己的集群的管理工具(例如minikube)。
Kubeadm部署一個(gè)高可用集群 Kubernetes的高可用Kubernetes的高可用主要指的是控制平面的高可用,簡(jiǎn)單說,就是有多套Master節(jié)點(diǎn)組件和Etcd組件,工作節(jié)點(diǎn)通過負(fù)載均衡連接到各Master。HA有兩種做法,一種是將etcd與Master節(jié)點(diǎn)組件混布在一起:
另外一種方式是,使用獨(dú)立的Etcd集群,不與Master節(jié)點(diǎn)混布:
兩種方式的相同之處在于都提供了控制平面的冗余,實(shí)現(xiàn)了集群高可以用,區(qū)別在于:
Etcd混布方式:
所需機(jī)器資源少
部署簡(jiǎn)單,利于管理
容易進(jìn)行橫向擴(kuò)展
風(fēng)險(xiǎn)大,一臺(tái)宿主機(jī)掛了,master和etcd就都少了一套,集群冗余度受到的影響比較大。
Etcd獨(dú)立部署方式:
所需機(jī)器資源多(按照Etcd集群的奇數(shù)原則,這種拓?fù)涞募宏P(guān)控制平面最少就要6臺(tái)宿主機(jī)了)。
部署相對(duì)復(fù)雜,要獨(dú)立管理etcd集群和和master集群。
解耦了控制平面和Etcd,集群風(fēng)險(xiǎn)小健壯性強(qiáng),多帶帶掛了一臺(tái)master或etcd對(duì)集群的影響很小。
部署環(huán)境由于機(jī)器資源不足,下面的部署測(cè)試,只會(huì)以混布的方式部署一個(gè)1*haproxy,2*master,2*node,共5臺(tái)機(jī)器的集群,實(shí)際上由于etcd選舉要過半數(shù),至少要3臺(tái)master節(jié)點(diǎn)才能構(gòu)成高可用,在生產(chǎn)環(huán)境,還是要根據(jù)實(shí)際情況,盡量選擇風(fēng)險(xiǎn)低的拓?fù)浣Y(jié)構(gòu)。
機(jī)器:
master-1:192.168.41.230 (控制平面節(jié)點(diǎn)1)
master-2:192.168.41.231 (控制平面節(jié)點(diǎn)2)
node-1:172.16.201.108 (工作節(jié)點(diǎn)1)
node-2:172.16.201.109 (工作節(jié)點(diǎn)2)
haproxy:192.168.41.231 (haproxy)
系統(tǒng)內(nèi)核版本:
# cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) # uname -r 5.0.5-1.el7.elrepo.x86_64
集群版本
kubeadm:1.14.0
Kubernetes:1.14.0
Docker:Community 18.09.4
haproxy: 1.5.18
在所有節(jié)點(diǎn)上操作:
關(guān)閉selinux,firewall
setenforce 0 sed -i "s/SELINUX=enforcing/SELINUX=permissive/" /etc/selinux/config systemctl stop firewalld systemctl disable firewalld
關(guān)閉swap,(1.8版本后的要求,目的應(yīng)該是不想讓swap干擾pod可使用的內(nèi)存limit)
swapoff -a
修改下面內(nèi)核參數(shù),否則請(qǐng)求數(shù)據(jù)經(jīng)過iptables的路由可能有問題
cat <安裝kubeadm、docker/etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF sysctl --system
在除了haproxy以外所有節(jié)點(diǎn)上操作
將Kubernetes安裝源改為阿里云,方便國內(nèi)網(wǎng)絡(luò)環(huán)境安裝
cat << EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF
安裝docker-ce
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum install -y docker-ce
安裝kubelet kubeadm kubectl
yum install -y kubelet kubeadm kubectl安裝配置負(fù)載均衡
在haproxy節(jié)點(diǎn)操作:
# 安裝haproxy yum install haproxy -y # 修改haproxy配置 cat << EOF > /etc/haproxy/haproxy.cfg global log 127.0.0.1 local2 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 4000 user haproxy group haproxy daemon defaults mode tcp log global retries 3 timeout connect 10s timeout client 1m timeout server 1m frontend kube-apiserver bind *:6443 # 指定前端端口 mode tcp default_backend master backend master # 指定后端機(jī)器及端口,負(fù)載方式為輪詢 balance roundrobin server master-1 192.168.41.230:6443 check maxconn 2000 server master-2 192.168.41.231:6443 check maxconn 2000 EOF # 開機(jī)默認(rèn)啟動(dòng)haproxy,開啟服務(wù) systemctl enable haproxy systemctl start haproxy # 檢查服務(wù)端口情況: # netstat -lntup | grep 6443 tcp 0 0 0.0.0.0:6443 0.0.0.0:* LISTEN 3110/haproxy部署Kubernetes
在master-1節(jié)點(diǎn)操作:
準(zhǔn)備集群配置文件,目前用的api版本為v1beta1,具體配置可以參考官方reference
cat << EOF > /root/kubeadm-config.yaml apiVersion: kubeadm.k8s.io/v1beta1 kind: ClusterConfiguration kubernetesVersion: v1.14.0 # 指定1.14版本 controlPlaneEndpoint: 192.168.41.232:6443 # haproxy地址及端口 imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers # 指定鏡像源為阿里源 networking: podSubnet: 10.244.0.0/16 # 計(jì)劃使用flannel網(wǎng)絡(luò)插件,指定pod網(wǎng)段及掩碼 EOF
執(zhí)行節(jié)點(diǎn)初始化
systemctl enable kubelet systemctl start kubelet kubeadm config images pull --config kubeadm-config.yaml # 通過阿里源預(yù)先拉鏡像 kubeadm init --config=kubeadm-config.yaml --experimental-upload-certs
安裝成功,可以看到輸出
You can now join any number of the control-plane node running the following command on each as root: # master節(jié)點(diǎn)用以下命令加入集群: kubeadm join 192.168.41.232:6443 --token ocb5tz.pv252zn76rl4l3f6 --discovery-token-ca-cert-hash sha256:141bbeb79bf58d81d551f33ace207c7b19bee1cfd7790112ce26a6a300eee5a2 --experimental-control-plane --certificate-key 20366c9cdbfdc1435a6f6d616d988d027f2785e34e2df9383f784cf61bab9826 Then you can join any number of worker nodes by running the following on each as root: # 工作節(jié)點(diǎn)用以下命令加入集群: kubeadm join 192.168.41.232:6443 --token ocb5tz.pv252zn76rl4l3f6 --discovery-token-ca-cert-hash sha256:141bbeb79bf58d81d551f33ace207c7b19bee1cfd7790112ce26a6a300eee5a2
原來的kubeadm版本,join命令只用于工作節(jié)點(diǎn)的加入,而新版本加入了 --experimental-contaol-plane 參數(shù)后,控制平面(master)節(jié)點(diǎn)也可以通過kubeadm join命令加入集群了。
加入另外一個(gè)master節(jié)點(diǎn)
在master-2操作:
kubeadm join 192.168.41.232:6443 --token ocb5tz.pv252zn76rl4l3f6 --discovery-token-ca-cert-hash sha256:141bbeb79bf58d81d551f33ace207c7b19bee1cfd7790112ce26a6a300eee5a2 --experimental-control-plane --certificate-key 20366c9cdbfdc1435a6f6d616d988d027f2785e34e2df9383f784cf61bab9826 mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config
現(xiàn)在,在任何一個(gè)master 節(jié)點(diǎn),執(zhí)行kubectl get no,可以看到,集群中已經(jīng)有2臺(tái)master節(jié)點(diǎn)了
# kubectl get no NAME STATUS ROLES AGE VERSION master-1 NotReady master 34m v1.14.0 master-2 NotReady master 4m52s v1.14.0
加入兩個(gè)工作節(jié)點(diǎn)
分別在兩個(gè)node節(jié)點(diǎn)操作:
kubeadm join 192.168.41.232:6443 --token ocb5tz.pv252zn76rl4l3f6 --discovery-token-ca-cert-hash sha256:141bbeb79bf58d81d551f33ace207c7b19bee1cfd7790112ce26a6a300eee5a2
再次執(zhí)行kubectl get no
# kubectl get no NAME STATUS ROLES AGE VERSION master-1 NotReady master 45m v1.14.0 master-2 NotReady master 15m v1.14.0 node-1 NotReady6m19s v1.14.0 node-2 NotReady 4m59s v1.14.0
可以看到兩個(gè)node節(jié)點(diǎn)都加入集群了。可是,各個(gè)節(jié)點(diǎn)狀態(tài)為什么都是NotReady呢。通過執(zhí)行kubectl describe master-1,可以看到這樣的提示:
runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized
原來是因?yàn)榫W(wǎng)絡(luò)插件沒有就緒導(dǎo)致的。所以 ,我們來安裝一波
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml
再次查看節(jié)點(diǎn)狀態(tài),可以看到所有節(jié)點(diǎn)都已經(jīng)ready了。
# kubectl get no NAME STATUS ROLES AGE VERSION master-1 Ready master 134m v1.14.0 master-2 Ready master 104m v1.14.0 node-1 Ready94m v1.14.0 node-2 Ready 93m v1.14.0
至此,一個(gè)2主節(jié)點(diǎn)2工作節(jié)點(diǎn)的k8s集群已經(jīng)搭建完畢。如果要加入更多的master或node節(jié)點(diǎn),只要多次執(zhí)行kubeadm join命令加入集群就好,不需要額外配置,非常方便。
集群測(cè)試跟上篇文章minikube部署一樣,這里部署一個(gè)簡(jiǎn)單的goweb服務(wù)來測(cè)試集群,運(yùn)行時(shí)暴露8000端口,同時(shí)訪問/info路徑會(huì)顯示容器的主機(jī)名。
準(zhǔn)備deployment和svc的yaml:
# deployment-goweb.yaml apiVersion: apps/v1 kind: Deployment metadata: name: goweb spec: selector: matchLabels: app: goweb replicas: 4 template: metadata: labels: app: goweb spec: containers: - image: lingtony/goweb name: goweb ports: - containerPort: 8000
# svc-goweb.yaml apiVersion: v1 kind: Service metadata: name: gowebsvc spec: selector: app: goweb ports: - name: default protocol: TCP port: 80 targetPort: 8000
部署服務(wù)
kubectl apply -f deployment-goweb.yaml kubectl apply -y svc-goweb.yaml
查看pod及服務(wù)
[root@master-1 ~]# kubectl get po -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES goweb-6c569f884-67z89 1/1 Running 0 25m 10.244.1.2 node-1goweb-6c569f884-bt4p6 1/1 Running 0 25m 10.244.1.3 node-1 goweb-6c569f884-dltww 1/1 Running 0 25m 10.244.1.4 node-1 goweb-6c569f884-vshkm 1/1 Running 0 25m 10.244.3.4 node-2 # 可以看到,4個(gè)pod分布在不同的node上 [root@master-1 ~]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE gowebsvc ClusterIP 10.106.202.0 80/TCP 11m kubernetes ClusterIP 10.96.0.1 443/TCP 21h # 暴露80端口
測(cè)試訪問
[root@master-1 ~]# curl http://10.106.202.0/info Hostname: goweb-6c569f884-bt4p6 [root@master-1 ~]# curl http://10.106.202.0/info Hostname: goweb-6c569f884-67z89 [root@master-1 ~]# curl http://10.106.202.0/info Hostname: goweb-6c569f884-vshkm #可以看到,對(duì)SVC的請(qǐng)求會(huì)在pod間負(fù)載均衡。小結(jié)
本文簡(jiǎn)單介紹了kubeadm工具原理,以及如何用它部署一個(gè)高可用的kubernetes集群。需要注意的是,kubeadm工具總體已經(jīng)GA,可以在生產(chǎn)環(huán)境使用了。但是文中通過"kubeadm join -experimental-contaol-plane"參數(shù)增加主節(jié)點(diǎn)的方式,還是在alpha階段,實(shí)際在生產(chǎn)環(huán)境還是用init方式來增加主節(jié)點(diǎn)比較穩(wěn)定。kubeadm更多詳細(xì)配置可以參考官方文檔
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/27767.html
摘要:所以,選擇把運(yùn)行直接運(yùn)行在宿主機(jī)中,使用容器部署其他組件。獨(dú)立部署方式所需機(jī)器資源多按照集群的奇數(shù)原則,這種拓?fù)涞募宏P(guān)控制平面最少就要臺(tái)宿主機(jī)了。 在上篇文章minikube部署中,有提到Minikube部署Kubernetes的核心就是Kubeadm,這篇文章來詳細(xì)說明下Kubeadm原理及部署步驟。寫這篇文章的時(shí)候,Kubernetes1.14剛剛發(fā)布,所以部署步驟以1.14版為...
摘要:代表的解決方案為。雖然官網(wǎng)列出的部署方式很多,但也不用被這么多種部署方式搞糊涂了。雖然只是一條命令,但其實(shí)執(zhí)行了很多步驟命令執(zhí)行后輸出如下可以看到,主要做了這些事創(chuàng)建了名為的虛擬機(jī),并在虛擬機(jī)中安裝了容器運(yùn)行時(shí)。 綜述 Kubernetes集群的組件眾多,要部署一套符合生產(chǎn)環(huán)境的集群不是一件容易的事。好在隨著社區(qū)的快速發(fā)展,特別是在它成為事實(shí)上的容器編排標(biāo)準(zhǔn)以后,基本所有的主流云平臺(tái)都...
摘要:代表的解決方案為。雖然官網(wǎng)列出的部署方式很多,但也不用被這么多種部署方式搞糊涂了。雖然只是一條命令,但其實(shí)執(zhí)行了很多步驟命令執(zhí)行后輸出如下可以看到,主要做了這些事創(chuàng)建了名為的虛擬機(jī),并在虛擬機(jī)中安裝了容器運(yùn)行時(shí)。 綜述 Kubernetes集群的組件眾多,要部署一套符合生產(chǎn)環(huán)境的集群不是一件容易的事。好在隨著社區(qū)的快速發(fā)展,特別是在它成為事實(shí)上的容器編排標(biāo)準(zhǔn)以后,基本所有的主流云平臺(tái)都...
摘要:幫助企業(yè)快速搭建和使用大數(shù)據(jù)平臺(tái),降低大數(shù)據(jù)開發(fā)運(yùn)維成本。發(fā)布范圍北京二可用區(qū)灰度中。機(jī)型快杰版的數(shù)據(jù)庫實(shí)例,采用業(yè)內(nèi)主流的計(jì)算存儲(chǔ)分離架構(gòu)計(jì)算層使用高性能快杰云主機(jī),存儲(chǔ)層采用超高性能云盤。UCloud PyPI私有源上線PyPI是Python官方的第三方庫的倉庫,為解決默認(rèn)官方源在國內(nèi)的訪問速度受限,并發(fā)請(qǐng)求受限,經(jīng)常出現(xiàn)丟包、超時(shí)等問題,UCloud 近期上線了PyPI私有源。PyPI...
閱讀 863·2023-04-26 00:11
閱讀 2660·2021-11-04 16:13
閱讀 2112·2021-09-09 09:33
閱讀 1481·2021-08-20 09:35
閱讀 3830·2021-08-09 13:42
閱讀 3613·2019-08-30 15:55
閱讀 1063·2019-08-30 15:55
閱讀 2225·2019-08-30 13:55