個人博客站—運維鹿: http://www.kervin24.top
CSDN博客—做個超努力的小奚: https://blog.csdn.net/qq_52914969?type=blog
一、kubernetes介紹
Kubernetes本質是一組服務器集群,它可以在集群的每個節點上運行特定的程序,來對節點中的容器進行過管理。它的目的就是實現資源管理的自動化,主要提供了以下的主要功能:
自我修復:一旦某個容器崩潰,能夠在1秒中左右迅速啟動新的容器
彈性伸縮:可以根據需要,自動對集群中正在運行的容器數量進行調整
服務發現:服務可以通過自動發現的形式找到它所依賴的服務
負載均衡:如果一個服務啟動了多個容器,能夠自動實現請求的負載均衡
版本回退:如果發現新發布的程序版本有問題,可以立即回退到原來的版本
存儲編排:可以根據容器自身的需求自動創建存儲卷
1.1、kubernetes組件
一個kubernetes集群主要由控制節點(master)、工作節點(node)構成,每個節點上都會安裝不同的組件。
master:集群的控制平面,負責集群的決策
ApiServer:資源操作的唯一入口,接收用戶輸入的命令,提供認證、授權、API注冊和發現等機制
Scheduler:負責集群資源調度,按照預定的調度策略將Pod調度到相應的node節點上
ControllerManager:負責維護集群的狀態,比如程序部署安排、故障檢測、自動擴展、滾蛋更新等
Etcd:負責存儲集群中各種資源對象的信息
node:集群的數據平面,負責為容器提供運行環境
Kubelet:負責維護容器的生命周期,即通過控制docker,來創建、更新、銷毀容器
KuberProxy:負責提供集群內部的服務發現和負責均衡
Docker:負責節點上容器的各種操作
下面以部署一個nginx服務來說明Kubernetes系統各個組件調用關系:
1、首先要明確,一旦k8s環境啟動之后,master和node都會將自身信息存儲到etcd數據庫中
2、一個nginx服務的安裝請求會被發送到master節點的apiServer組件
3、apiServer組件會調用schedule組件來決定到底應該把這個服務安裝到哪個node節點上
4、apiServer調用controller-manager去調度Node節點去安裝nginx服務
5、Kubelet接收到指令之后,會通知docker,然后由docker來啟動一個nginx的pod,pod是kubernetes的最小操作單元,容器必須跑在pod中
6、一個nginx服務就運行了,如果需要訪問nginx,就需要通過kube-proxy來對pod產生訪問的代理。這樣,外界用戶就可以訪問集群中的nginx服務
1.2、Kubernetes概念
Master:集群控制節點,每個集群需要至少一個master節點來負責集群的管控
Node:工作負載節點,由master分配容器到這些node工作節點上,然后node節點上的docker負責容器的運行
Pod:kubernetes的最小控制單元,容器都是運行在pod中的,一個pod可以有1個或者多個容器
Controller:控制器,通過它來實現對pod的管理,比如啟動pod、停止pod、伸縮pod的數量等等
Service:pod對外服務的統一入口,下面可以維護者同一類的多個pod
Label:標簽,用于對pod進行分類,同一類pod會擁有相同的標簽
NameSpace:命令空間,用來隔離pod的運行環境
二、 集群環境搭建
2.1、集群類型
Kubernertes集群大體分為兩類:一主多從和多主多從
一主多從:一臺master節點和多臺node節點,搭建簡單,但是有單機故障風險,適合用于測試環境
多主多從:多臺master節點和多臺node節點,搭建麻煩,安全性高,適合用于生產環境
2.2、安裝方式
Kubernetes有多種部署方式,目前主流的方式有kubeadm、minikube、二進制包
minikube:一個用于快速搭建單節點kubernetes的工具
kubeadm:應該用于快速搭建kubernetes集群的工具
二進制包:從官網下載每個組件的二進制包,依次去安裝
2.3、環境搭建
略
三、資源管理
3.1、資源管理介紹
在kubernetes中,所有的內容都抽象為資源,用戶需要通過操作資源來管理kubernetes
kubernetes的本質是一個集群系統,用戶可以在集群中部署各種服務,所謂的部署服務,其實就是在kubernetes集群中運行一個個容器,并將指定的程序跑在容器中。
kubernetes的最小管理單元是pod而不是容器,所以只能將容器放在Pod中,而kubernetes一般也不會直接管理Pod,而是通過Pod控制器來管理Pod的。
Pod可以提供服務之后,就要考慮如何訪問Pod中的服務,Kubernetes提供了Service資源實現這個功能
當然,如果Pod中程序的數據需要持久化,kubernetes還提供了各種存儲系統
3.2、資源管理方式
命令式對象管理:直接使用命令去操作Kubernetes資源
kubectl run nginx-pod --image=nginx:1.17.1 --port=80
命令式對象配置:通過命令配置和配置文件去操作kubernetes資源
kubetcl create/patch -f nginx-pod.yaml
聲明式對象配置:通過apply命令和配置文件去操作kubernetes資源
kubectl apply -f nginx-pod.yaml
類型 | 操作對象 | 適用環境 | 優點 | 缺點 |
---|---|---|---|---|
命令式對象管理 | 對象 | 測試 | 簡單 | 只能操作活動對象,無法審計、跟蹤 |
命令式對象配置 | 文件 | 開發 | 可以審計、跟蹤 | 項目大時,配置文件多,操作麻煩 |
聲明式對象配置 | 目錄 | 開發 | 支持目錄操作 | 意外情況下難以調試 |
3.2.1、命令式對象管理
kubectl命令
kubect是kubernetes集群的命令行工具,通過它能夠對集群本身進行管理,并能夠在集群上進行容器化應用的安裝部署,kubectl命令的語法如下:
kubectl [command] [type] [name] [flags]
command:指定要對資源執行的操作,例如:create、get、delete
type:指定資源類型,比如:deployment、pod、service
name:指定資源的名稱,名稱大小寫敏感
flags:指定額外的可選參數
?#查看所有podkubectl get pod?#查看某個podkubectl get pod pod_name?#查看某個pod,以yaml格式展示結構kubectl get pod pod_name -o yaml
資源類型
kubernetes中所有的內容都抽象為資源,可以通過--help查看詳細的命令
kubectl --help
下面以一個namespace的創建和刪除簡單演示下命令的使用:
?#創建一個namespace[root@master01 ~]# kubectl create namespace devnamespace/dev created?#獲取namespace[root@master01 ~]# kubectl get nsNAME ? ? ? ? ? ? ? ? ? STATUS ? AGEdefault ? ? ? ? ? ? ? Active ? 3y20ddev ? ? ? ? ? ? ? ? ? Active ? 49skube-node-lease ? ? ? Active ? 3y20dkube-public ? ? ? ? ? Active ? 3y20dkube-system ? ? ? ? ? Active ? 3y20dkubernetes-dashboard ? Active ? 3y20d?#在此namespace下創建并運行一個nginx的pod ? [root@master01 ~]# kubectl run nginx-pod --image=nginx:latest -n devpod/nginx-pod created??#查看新創建的pod[root@master01 ~]# kubectl get pod -n devNAME ? ? ? READY ? STATUS ? RESTARTS ? AGEnginx-pod ? 1/1 ? ? Running ? 0 ? ? ? ? 23s[root@master01 ~]# kubectl describe pod -n dev??#刪除指定的pod[root@master01 ~]# kubectl delete pod nginx-pod -n devpod "nginx-pod" deleted?#刪除指定的namespace[root@master01 ~]# kubectl delete ns devnamespace "dev" deleted
3.2.2、命令式對象配置
命令式對象配置就是使用命令配合配置文件一起來操作kubernetes資源
1)創建一個nginxpod.yaml,內容如下:
?apiVersion: v1kind: Namespacemetadata:name: dev ---??apiVersion: v1kind: Podmetadata:name: nginxpodnamespace: devspec:containers:- name: nginx-containersimage: nginx:1.17.1
2)執行create命令,創建資源:
?[root@master01 ~]# kubectl create -f nginxpod.yaml namespace/dev createdpod/nginxpod created
此時發現創建了兩個資源對象,分別是namespace和pod
3)執行get命令,查看資源
?[root@master01 ~]# kubectl get -f nginxpod.yaml NAME ? ? ? ? ? STATUS ? AGEnamespace/dev ? Active ? 2m31s?NAME ? ? ? ? ? READY ? STATUS ? ? ? ? ? ? RESTARTS ? AGEpod/nginxpod ? 0/1 ? ? ContainerCreating ? 0 ? ? ? ? 2m30s
4)執行delete命令,刪除資源對象
?[root@master01 ~]# kubectl delete -f nginxpod.yaml namespace "dev" deletedpod "nginxpod" deleted
此時發現兩個資源對象被刪除了
?[root@master01 ~]# kubectl get -f nginxpod.yaml Error from server (NotFound): namespaces "dev" not foundError from server (NotFound): namespaces "dev" not found
總結:命令式對象配置的方式操作資源,可以簡單的認為:命令+yaml配置文件(里面是命令需要的各種參數)
3.2.3、聲明式對象配置
聲明式對象配置 跟命令式對象配置很相似,但是它只有一個命令apply
?#首先執行一次kubectl apply -f yaml文件,發現創建了資源[root@master01 ~]# kubectl apply -f nginxpod.yaml namespace/dev createdpod/nginxpod created?#再次執行一次kubectl apply -f yaml文件,發現說資源沒有變動[root@master01 ~]# kubectl apply -f nginxpod.yaml namespace/dev unchangedpod/nginxpod unchanged
總結:
其實聲明式對象配置就是使用apply描述一個資源最終的狀態(在yaml中定義狀態)
使用apply操作資源:
如果資源不存在,就創建,相當于kubectl create
如果資源已存在,就更新,相當于kubectl patch