1.什麼是 Kubernetes?前端
Kubernetes(一般寫成「k8s」)是最開始由google設計開發最後貢獻給Cloud Native Computing Foundation的開源容器集羣管理項目。它的設計目標是在主機集羣之間提供一個可以自動化部署、可拓展、應用容器可運營的平臺。Kubernetes一般結合docker容器工具工做,而且整合多個運行着docker容器的主機集羣。node
Kubernetes是近年來最具顛覆性的開源項目,做爲一款強大的容器管理工具,在kubernetes的周圍一間構建起了一個完整的開源生態鏈,值得全部人去鑽研學習,Kubernetes具備以下幾個特色:linux
①自動化容器的部署以及控制。nginx
②容器規模的動態擴展伸縮(可以根據宿主機自身狀況變化,如CPU佔用率等)。git
③將容器組織成組,構建出一組容器集羣,可以提供服務的負載均衡。github
④可以對容器進行動態升級,回滾到原版本。算法
⑤自帶控制檯,可以提供Web界面對容器集羣進行管理。docker
2.核心概念後端
Kubernetes採用主從架構的方式進行管理,由Master上的各個組件將所部署的服務,Pod調度到Slave上面,並對其進行管理,監控其健康狀態。資源的抽象主要包括:centos
①容器組(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,保證各個節點可以正確解析
2.保證本機DNS解析可以解析到本身的IP,這是個坑,在kubeadm初始化的時候,要是DNS解析不到本地的話,就會一直超時等待。
如下兩個IP解析的不是本地的DNS,而是vmware的網關,因此須要讓虛擬機可以解析到本身
修改nameserver,指定DNS爲本機
安裝dnsmasq
修改/etc/dnsmasq.conf文件
重啓dnsmasq服務
重試一次,已經可以解析到自身的地址
3.同步系統時間,關閉selinux,iptables,swap,設置內核參數
#systemctl stop firewalld //關閉防火牆
#swapoff on //關閉swap,由於kubeadm初始化,不支持交換分區開啓
設置內核參數
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
# systemctl start docker && systemctl enable docker
導入kubernetes鏡像 # 鏡像包在網盤中下載
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
7.kubeadm初始化master節點
# kubeadm init --kubernetes-version=v1.10.1 --pod-network-cidr=10.244.0.0/16
注意:版本必需要與安裝的kube安裝包一致
初始化正確輸出,下面的是用於將node添加到master的命令,須要記住!!要否則只能從新初始化。
從新初始化,執行如下命令便可
# kubeadm reset
這個時候直接在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
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
至此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
# kubectl describe svc kubernetes-dashboard --namespace=kebe-system 查看服務狀態
由上圖可知dashboard的NodePort爲31000,NodePort爲對外在虛擬機顯示的端口,能夠經過該端口訪問到dashboard的服務
效果圖以下:
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:基於資源對象上綁定的標籤信息,選擇器能夠經過指定標籤鍵值對來過濾出一組特定的資源對象。
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
的映射,便於客戶端進行訪問。
根據上圖yaml文件進行部署以下圖,Pod容器組還在建立中,須要一點時間,若建立失敗,則能夠用
# kubectl describe svc|pods nginx-service | nginx-deployment 查看詳細信息
部署成功,顯示了各個Pod在哪一臺node主機上,狀態如何,Pod IP是多少
經過30089端口正常訪問:
手動down掉一臺Pod,立刻就會建立一臺相同配置的Pod保證高可用
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