摘要:所以,選擇把運行直接運行在宿主機中,使用容器部署其他組件。獨立部署方式所需機器資源多按照集群的奇數原則,這種拓撲的集群關控制平面最少就要臺宿主機了。
在上篇文章minikube部署中,有提到Minikube部署Kubernetes的核心就是Kubeadm,這篇文章來詳細說明下Kubeadm原理及部署步驟。寫這篇文章的時候,Kubernetes1.14剛剛發布,所以部署步驟以1.14版為主。
Kubeadm原理簡述Kubeadm工具的出發點很簡單,就是盡可能簡單的部署一個生產可用的Kubernetes集群。實際也確實很簡單,只需要兩條命令:
# 創建一個 Master 節點 $ kubeadm init # 將一個 Node 節點加入到當前集群中 $ kubeadm join
kubeadm做了這些事
執行 kubeadm init時:
自動化的集群機器合規檢查
自動化生成集群運行所需的各類證書及各類配置,并將Master節點信息保存在名為cluster-info的ConfigMap中。
通過static Pod方式,運行API server, controller manager 、scheduler及etcd組件。
生成Token以便其他節點加入集群
執行 kubeadm join時:
節點通過token訪問kube-apiserver,獲取cluster-info中信息,主要是apiserver的授權信息(節點信任集群)。
通過授權信息,kubelet可執行TLS bootstrapping,與apiserver真正建立互信任關系(集群信任節點)。
簡單來說,kubeadm做的事就是把大部分組件都容器化,通過StaticPod方式運行,并自動化了大部分的集群配置及認證等工作,簡單幾步即可搭建一個可用Kubernetes的集群。
這里有個問題,為什么不把kubelet組件也容器化呢,是因為,kubelet在配置容器網絡、管理容器數據卷時,都需要直接操作宿主機,而如果現在 kubelet 本身就運行在一個容器里,那么直接操作宿主機就會變得很麻煩。比如,容器內要做NFS的掛載,需要kubelet先在宿主機執行mount掛載NFS。如果kubelet運行在容器中問題來了,如果kubectl運行在容器中,要操作宿主機的Mount Namespace是非常復雜的。所以,kubeadm選擇把kubelet運行直接運行在宿主機中,使用容器部署其他Kubernetes組件。所以,Kubeadm部署要安裝的組件有Kubeadm、kubelet、kubectl三個。
上面說的是kubeadm部署方式的一般步驟,kubeadm部署是可以自由定制的,包括要容器化哪些組件,所用的鏡像,是否用外部etcd,是否使用用戶證書認證等以及集群的配置等等,都是可以靈活定制的,這也是kubeadm能夠快速部署一個高可用的集群的基礎。詳細的說明可以參考官方Reference。但是,kubeadm最重要的作用還是解決集群部署問題,而不是集群配置管理的問題,官方也建議把Kubeadm作為一個基礎工具,在其上層再去量身定制適合自己的集群的管理工具(例如minikube)。
Kubeadm部署一個高可用集群 Kubernetes的高可用Kubernetes的高可用主要指的是控制平面的高可用,簡單說,就是有多套Master節點組件和Etcd組件,工作節點通過負載均衡連接到各Master。HA有兩種做法,一種是將etcd與Master節點組件混布在一起:
另外一種方式是,使用獨立的Etcd集群,不與Master節點混布:
兩種方式的相同之處在于都提供了控制平面的冗余,實現了集群高可以用,區別在于:
Etcd混布方式:
所需機器資源少
部署簡單,利于管理
容易進行橫向擴展
風險大,一臺宿主機掛了,master和etcd就都少了一套,集群冗余度受到的影響比較大。
Etcd獨立部署方式:
所需機器資源多(按照Etcd集群的奇數原則,這種拓撲的集群關控制平面最少就要6臺宿主機了)。
部署相對復雜,要獨立管理etcd集群和和master集群。
解耦了控制平面和Etcd,集群風險小健壯性強,多帶帶掛了一臺master或etcd對集群的影響很小。
部署環境由于機器資源不足,下面的部署測試,只會以混布的方式部署一個1*haproxy,2*master,2*node,共5臺機器的集群,實際上由于etcd選舉要過半數,至少要3臺master節點才能構成高可用,在生產環境,還是要根據實際情況,盡量選擇風險低的拓撲結構。
機器:
master-1:192.168.41.230 (控制平面節點1)
master-2:192.168.41.231 (控制平面節點2)
node-1:172.16.201.108 (工作節點1)
node-2:172.16.201.109 (工作節點2)
haproxy:192.168.41.231 (haproxy)
系統內核版本:
# 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
在所有節點上操作:
關閉selinux,firewall
setenforce 0 sed -i "s/SELINUX=enforcing/SELINUX=permissive/" /etc/selinux/config systemctl stop firewalld systemctl disable firewalld
關閉swap,(1.8版本后的要求,目的應該是不想讓swap干擾pod可使用的內存limit)
swapoff -a
修改下面內核參數,否則請求數據經過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以外所有節點上操作
將Kubernetes安裝源改為阿里云,方便國內網絡環境安裝
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安裝配置負載均衡
在haproxy節點操作:
# 安裝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 # 指定后端機器及端口,負載方式為輪詢 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 # 開機默認啟動haproxy,開啟服務 systemctl enable haproxy systemctl start haproxy # 檢查服務端口情況: # netstat -lntup | grep 6443 tcp 0 0 0.0.0.0:6443 0.0.0.0:* LISTEN 3110/haproxy部署Kubernetes
在master-1節點操作:
準備集群配置文件,目前用的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 # 計劃使用flannel網絡插件,指定pod網段及掩碼 EOF
執行節點初始化
systemctl enable kubelet systemctl start kubelet kubeadm config images pull --config kubeadm-config.yaml # 通過阿里源預先拉鏡像 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節點用以下命令加入集群: 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: # 工作節點用以下命令加入集群: kubeadm join 192.168.41.232:6443 --token ocb5tz.pv252zn76rl4l3f6 --discovery-token-ca-cert-hash sha256:141bbeb79bf58d81d551f33ace207c7b19bee1cfd7790112ce26a6a300eee5a2
原來的kubeadm版本,join命令只用于工作節點的加入,而新版本加入了 --experimental-contaol-plane 參數后,控制平面(master)節點也可以通過kubeadm join命令加入集群了。
加入另外一個master節點
在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
現在,在任何一個master 節點,執行kubectl get no,可以看到,集群中已經有2臺master節點了
# kubectl get no NAME STATUS ROLES AGE VERSION master-1 NotReady master 34m v1.14.0 master-2 NotReady master 4m52s v1.14.0
加入兩個工作節點
分別在兩個node節點操作:
kubeadm join 192.168.41.232:6443 --token ocb5tz.pv252zn76rl4l3f6 --discovery-token-ca-cert-hash sha256:141bbeb79bf58d81d551f33ace207c7b19bee1cfd7790112ce26a6a300eee5a2
再次執行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
可以看到兩個node節點都加入集群了??墒?,各個節點狀態為什么都是NotReady呢。通過執行kubectl describe master-1,可以看到這樣的提示:
runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized
原來是因為網絡插件沒有就緒導致的。所以 ,我們來安裝一波
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml
再次查看節點狀態,可以看到所有節點都已經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
至此,一個2主節點2工作節點的k8s集群已經搭建完畢。如果要加入更多的master或node節點,只要多次執行kubeadm join命令加入集群就好,不需要額外配置,非常方便。
集群測試跟上篇文章minikube部署一樣,這里部署一個簡單的goweb服務來測試集群,運行時暴露8000端口,同時訪問/info路徑會顯示容器的主機名。
準備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
部署服務
kubectl apply -f deployment-goweb.yaml kubectl apply -y svc-goweb.yaml
查看pod及服務
[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個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端口
測試訪問
[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 #可以看到,對SVC的請求會在pod間負載均衡。小結
本文簡單介紹了kubeadm工具原理,以及如何用它部署一個高可用的kubernetes集群。需要注意的是,kubeadm工具總體已經GA,可以在生產環境使用了。但是文中通過"kubeadm join -experimental-contaol-plane"參數增加主節點的方式,還是在alpha階段,實際在生產環境還是用init方式來增加主節點比較穩定。kubeadm更多詳細配置可以參考官方文檔
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/27767.html
摘要:所以,選擇把運行直接運行在宿主機中,使用容器部署其他組件。獨立部署方式所需機器資源多按照集群的奇數原則,這種拓撲的集群關控制平面最少就要臺宿主機了。 在上篇文章minikube部署中,有提到Minikube部署Kubernetes的核心就是Kubeadm,這篇文章來詳細說明下Kubeadm原理及部署步驟。寫這篇文章的時候,Kubernetes1.14剛剛發布,所以部署步驟以1.14版為...
摘要:代表的解決方案為。雖然官網列出的部署方式很多,但也不用被這么多種部署方式搞糊涂了。雖然只是一條命令,但其實執行了很多步驟命令執行后輸出如下可以看到,主要做了這些事創建了名為的虛擬機,并在虛擬機中安裝了容器運行時。 綜述 Kubernetes集群的組件眾多,要部署一套符合生產環境的集群不是一件容易的事。好在隨著社區的快速發展,特別是在它成為事實上的容器編排標準以后,基本所有的主流云平臺都...
摘要:代表的解決方案為。雖然官網列出的部署方式很多,但也不用被這么多種部署方式搞糊涂了。雖然只是一條命令,但其實執行了很多步驟命令執行后輸出如下可以看到,主要做了這些事創建了名為的虛擬機,并在虛擬機中安裝了容器運行時。 綜述 Kubernetes集群的組件眾多,要部署一套符合生產環境的集群不是一件容易的事。好在隨著社區的快速發展,特別是在它成為事實上的容器編排標準以后,基本所有的主流云平臺都...
摘要:幫助企業快速搭建和使用大數據平臺,降低大數據開發運維成本。發布范圍北京二可用區灰度中。機型快杰版的數據庫實例,采用業內主流的計算存儲分離架構計算層使用高性能快杰云主機,存儲層采用超高性能云盤。UCloud PyPI私有源上線PyPI是Python官方的第三方庫的倉庫,為解決默認官方源在國內的訪問速度受限,并發請求受限,經常出現丟包、超時等問題,UCloud 近期上線了PyPI私有源。PyPI...
閱讀 854·2023-04-26 00:11
閱讀 2655·2021-11-04 16:13
閱讀 2101·2021-09-09 09:33
閱讀 1471·2021-08-20 09:35
閱讀 3817·2021-08-09 13:42
閱讀 3604·2019-08-30 15:55
閱讀 1039·2019-08-30 15:55
閱讀 2218·2019-08-30 13:55