天天看點

CentOS7.3部署Kubernetes1.10叢集及相關基礎應用

  1.什麼是 Kubernetes?

  Kubernetes(通常寫成“k8s”)是最開始由google設計開發最後貢獻給Cloud Native Computing

Foundation的開源容器叢集管理項目。它的設計目标是在主機叢集之間提供一個能夠自動化部署、可拓展、應用容器可營運的平台。Kubernetes通常結合docker容器工具工作,并且整合多個運作着docker容器的主機叢集。

  Kubernetes是近年來最具颠覆性的開源項目,作為一款強大的容器管理工具,在kubernetes的周圍一間建構起了一個完整的開源生态鍊,值得所有人去鑽研學習,Kubernetes具有如下幾個特點:

  ①自動化容器的部署以及控制。

  ②容器規模的動态擴充伸縮(能夠根據主控端自身情況變化,如CPU占用率等)。

  ③将容器組織成組,建構出一組容器叢集,能夠提供服務的負載均衡。

  ④能夠對容器進行動态更新,復原到原版本。

  ⑤自帶控制台,能夠提供Web界面對容器叢集進行管理。

  2.核心概念

  Kubernetes采用主從架構的方式進行管理,由Master上的各個元件将所部署的服務,Pod排程到Slave上面,并對其進行管理,監控其健康狀态。資源的抽象主要包括:

  ①容器組(Pod):由位于統一節點的一個或多個容器組成。由Master進行資源配置設定,是Kubernetes資源排程的最小機關。

  ②服務(Service):能夠通過yaml的方式對所建構的Pod,提供負載均衡,不随Pod的改變而變化,帶有唯一的通路标示,如端口,IP,域名。

  ③複制控制器(Replication Controller):負責啟動Pod并維護其健康狀态,當一個Pod“優雅的”挂掉後,會根據複制控制器重新建立一個相同的Pod,保證Pod的數量。

  ④部署(Deployment):建立Pod,提供了一種更加簡單的更新RC和Pod的機制,K8S版本1.2實作的。通過在Deployment中描述所期望的叢集狀态,Deployment Controller會将現在的叢集狀态在一個可控的速度下逐漸更新成所期望的叢集狀态。Deployment主要職責同樣是為了保證pod的數量和健康,90%的功能與RC完全一樣,可以看做新一代的RC。

  Mster節點組成:

  Master節點上面主要由四個子產品組成:APIServer、scheduler、controller manager、etcd。      

  ①APIServer:APIServer負責對外提供RESTful的Kubernetes API服務,它是系統管理指令的統一入口,任何對資源進行增删改查的操作都要交給APIServer處理後再送出給etcd。

  ②kubectl:Kubernetes提供的用戶端工具,該工具内部就是對Kubernetes API的調用,是直接和APIServer互動的。      

  ③schedule:scheduler的職責很明确,就是負責排程pod到合适的Node上。如果把scheduler看成一個黑匣子,那麼它的輸入是pod和由多個Node組成的清單,輸出是Pod和一個Node的綁定,即将這個pod部署到這個Node上。Kubernetes目前提供了排程算法,但是同樣也保留了接口,使用者可以根據自己的需求定義自己的排程算法。      

  ④controller manager:如果說APIServer做的是“前台”的工作的話,那controller manager就是負責“背景”的。每個資源一般都對應有一個控制器,而controller manager就是負責管理這些控制器的。比如我們通過APIServer建立一個pod,當這個pod建立成功後,APIServer的任務就算完成了。而後面保證Pod的狀态始終和我們預期的一樣的重任就由controller manager去保證了。      

  ⑤etcd:etcd是一個高可用的鍵值存儲系統,Kubernetes使用它來存儲各個資源的狀态,進而實作了Restful的API。

  Slave節點組成:    

  每個Node節點主要由三個子產品組成:kubelet、kube-proxy、runtime。      

  ①runtime:runtime指的是容器運作環境,目前Kubernetes支援docker和rkt兩種容器。      

  ②kube-proxy:該子產品實作了Kubernetes中的服務發現和反向代理功能。反向代理方面:kube-proxy支援TCP和UDP連接配接轉發,預設基于Round Robin算法将用戶端流量轉發到與service對應的一組後端pod。服務發現方面,kube-proxy使用etcd的watch機制,監控叢集中service和endpoint對象資料的動态變化,并且維護一個service到endpoint的映射關系,進而保證了後端pod的IP變化不會對通路者造成影響。另外kube-proxy還支援session affinity。          

  ③kubelet:Kubelet是Master在每個Node節點上面的agent,是Node節點上面最重要的子產品,它負責維護和管理該Node上面的所有容器,但是如果容器不是通過Kubernetes建立的,它并不會管理。本質上,它負責使Pod得運作狀态與期望的狀态一緻。

  3.Kubernetes安裝

  需要安裝的鏡像,kube安裝包

  連結:https://pan.baidu.com/s/1hE4TTDOXv2Bll6OlfWMDog 密碼:wujl

  三台主機,一台master兩台node主機

  192.168.175.142 k8s1

  192.168.175.143 k8s2

  192.168.175.144 k8s3

  1.編輯/etc/hosts,保證各個節點能夠正确解析

CentOS7.3部署Kubernetes1.10叢集及相關基礎應用

  2.保證本機DNS解析能夠解析到自己的IP,這是個坑,在kubeadm初始化的時候,要是DNS解析不到本地的話,就會一直逾時等待。

  以下兩個IP解析的不是本地的DNS,而是vmware的網關,是以需要讓虛拟機能夠解析到自己

CentOS7.3部署Kubernetes1.10叢集及相關基礎應用

  修改nameserver,指定DNS為本機

CentOS7.3部署Kubernetes1.10叢集及相關基礎應用

  安裝dnsmasq

CentOS7.3部署Kubernetes1.10叢集及相關基礎應用

  修改/etc/dnsmasq.conf檔案

CentOS7.3部署Kubernetes1.10叢集及相關基礎應用

  重新開機dnsmasq服務

  重試一次,已經能夠解析到自身的位址

CentOS7.3部署Kubernetes1.10叢集及相關基礎應用

  3.同步系統時間,關閉selinux,iptables,swap,設定核心參數

CentOS7.3部署Kubernetes1.10叢集及相關基礎應用

  #systemctl stop firewalld //關閉防火牆

  #swapoff on  //關閉swap,因為kubeadm初始化,不支援交換分區開啟

  設定核心參數

CentOS7.3部署Kubernetes1.10叢集及相關基礎應用

  sysctl --system //加載核心參數

  4.安裝docker

  # yum install https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch.rpm  -y

  # yum install https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/docker-ce-17.03.2.ce-1.el7.centos.x86_64.rpm  -y

  # systemctl start docker && systemctl enable docker

  導入kubernetes鏡像       # 鏡像包在網盤中下載下傳  

CentOS7.3部署Kubernetes1.10叢集及相關基礎應用

  5.安裝kube軟體              # 軟體包在網盤中下載下傳    

  # tar -xvf kube-packages-1.10.1.tar

  # cd kube-packages-1.10.1

  # yum -y install local *.rpm

  # systemctl start kubelet && systemctl enable kubelet

  6.統一k8s與docker的驅動

  修改/etc/systemd/system/kubelet.service.d/10-kubeadm.conf

  修改cgroupfs

CentOS7.3部署Kubernetes1.10叢集及相關基礎應用

  7.kubeadm初始化master節點

  # kubeadm init --kubernetes-version=v1.10.1 --pod-network-cidr=10.244.0.0/16

  注意:版本必須要與安裝的kube安裝包一緻

  初始化正确輸出,下面的是用于将node添加到master的指令,需要記住!!要不然隻能重新初始化。

  重新初始化,執行以下指令即可

  # kubeadm reset

CentOS7.3部署Kubernetes1.10叢集及相關基礎應用

  這個時候直接在node上面執行上述指令就能夠将其添加入kubernetes叢集當中

  如果以後再root管理kubernetes就直接在root下執行以下指令,不然就切換使用者執行

  mkdir -p $HOME/.kube

  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

  sudo chown $(id -u):$(id -g) $HOME/.kube/config

  檢視各個節點的狀态

  #kubectl get node -o wide

CentOS7.3部署Kubernetes1.10叢集及相關基礎應用

  8.部署網絡flannel

  隻需要在master上執行

    wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

    #版本資訊:quay.io/coreos/flannel:v0.9.1-amd64

    #kubectl create -f  kube-flannel.yml

    網絡部署完成,可以檢視到每一個節點下都有flannel

    #ip a

CentOS7.3部署Kubernetes1.10叢集及相關基礎應用

  至此kubernetes叢集配置完成

  4.dashboard配置

  # kubectl apply -f kubernetes-dashboard-http.yaml

  # kubectl apply -f admin-role.yaml

  # kubectl apply -f kubernetes-dashboard-admin.rbac.yaml

  yaml腳本在百度雲盤中有

  檢視運作情況

  # kubectl get pods --namespace=kube-system

CentOS7.3部署Kubernetes1.10叢集及相關基礎應用

  # kubectl describe svc kubernetes-dashboard --namespace=kebe-system 檢視服務狀态

CentOS7.3部署Kubernetes1.10叢集及相關基礎應用

  由上圖可知dashboard的NodePort為31000,NodePort為對外在虛拟機顯示的端口,可以通過該端口通路到dashboard的服務

  效果圖如下:

CentOS7.3部署Kubernetes1.10叢集及相關基礎應用

  5.kubernetes基本應用

  1.配置單個pod

   配置一個pod,可以通過dashboard上書寫yaml檔案進行部署,也可以在指令行使用kubectl create建立

   下圖為建立nginx Pod的一個簡單部署,為了讓其能夠通過外部直接通路到,是以給他設定了Service負載

均衡,對外顯示的NodePort端口為30088,NodePort指定的端口需要在30000-32767之間,這是外部通過

Service方位Pod的一種方式,還有就是Loadbalance。Service是根據Pod的Label标簽來判斷,那些Pod是

在該服務中,通過Pod的Label與Service的Selector選擇器,來標明該服務中的容器組。

  selector:基于資源對象上綁定的标簽資訊,選擇器可以通過指定标簽鍵值對來過濾出一組特定的資源對象。

CentOS7.3部署Kubernetes1.10叢集及相關基礎應用

  Service是定義一系列Pod以及通路這些Pod的政策的一層抽象。Service通過Label找到Pod組。因為Service是抽象的,是以在圖表裡通常看不到它們的存在,這也就讓這一概念更難以了解。

  現在,假定有2個背景Pod,并且定義背景Service的名稱為‘backend-service’,lable選擇器為(tier=backend, app=myapp)。backend-service 的Service會完成如下兩件重要的事情:會為Service建立一個本地叢集的DNS入口,是以前端Pod隻需要DNS查找主機名為 ‘backend-service’,就能夠解析出前端應用程式可用的IP位址。現在前端已經得到了背景服務的IP位址,但是它應該通路2個背景Pod的哪一個呢?Service在這2個背景Pod之間提供透明的負載均衡,會将請求分發給其中的任意一個(如下面的動畫所示)。通過每個Node上運作的代理(kube-proxy)完成。這裡有更多技術細節。

  2.部署Nginx應用(Deployment)

  Deployment需要差別apiVersion以及kind,Deployment部署正如前面所說的是能夠成為新一代的Replication Controller而存在的

能夠配置Pod叢集,保證Pod高可用,并能夠進行健康監測,在dashboard上能夠較為清晰地了解到。

  replicas: 3 表示開啟三個Pod容器組分布在兩個Node節點上,當有一個Pod關閉,就會自動建立相同的Pod,保證Pod的數量在3。

還可以根據cpu負載數來調控Pod的數量。

  Label: app 設定标簽,标簽是一組鍵值對,用來标記所綁定對象,典型的就是Pod,進而可以分類。

  Deployment部署Nginx的Pod後,再通過Service的NodePort暴露出Pod容器組内服務的80端口在kubernetes對外的通路端口30089

的映射,便于用戶端進行通路。

CentOS7.3部署Kubernetes1.10叢集及相關基礎應用

  根據上圖yaml檔案進行部署如下圖,Pod容器組還在建立中,需要一點時間,若建立失敗,則可以用

  # kubectl describe svc|pods nginx-service | nginx-deployment 檢視詳細資訊

CentOS7.3部署Kubernetes1.10叢集及相關基礎應用

  部署成功,顯示了各個Pod在哪一台node主機上,狀态如何,Pod IP是多少

CentOS7.3部署Kubernetes1.10叢集及相關基礎應用

  通過30089端口正常通路:

CentOS7.3部署Kubernetes1.10叢集及相關基礎應用

  手動down掉一台Pod,馬上就會建立一台相同配置的Pod保證高可用

CentOS7.3部署Kubernetes1.10叢集及相關基礎應用

 Deployment動态擴充

  擴充Pod數為4個

  # kubectl scale deployment nginx-deployment --replicas=4

  縮減Pod數為1個

  # kubectl scale deployment nginx-deployment --replicas=1

  最關鍵的功能就是可以彈性擴容根據CPU的占用率(需要結合資源限制一同使用),後面會進行實際示範,cpu使用率80%

  # kubectl autoscale deployment nginx-deployment --min=2 --max=10 --cpu-percent=80

上一篇: C 錯誤處理
下一篇: C 遞歸