A. k8s之存儲
k8s的存儲常用的就是上面幾種模式,分為臨時存儲,半持久化存儲鏈消,與持久化存儲這三類,本章我們著重講解emptydir與hostpath與pvc跟pv等
當pod的存儲方案設定為emptydir的時候,pod啟動時,就會在pod所在節點的磁碟空間開辟出一塊空卷,最開始裡面是什麼都沒有的,pod啟動後容器產生的數據會存放到那個空卷中。空卷變成了一個臨時卷
供pod內的容器讀取和寫入數據,一旦pod容器消失,節點上開辟出的這個臨時卷就會隨著pod的銷毀而銷毀
一般來說emptydir的用途都是用來充當臨時存儲空間,例如一些不需要數據持久化的微服務,我們都可以用emptydir來當做微服務pod的存儲方案
k8s存儲emptdir實戰例子:以之前的myapp應用為例
創建應用
觀察是否生產data目錄,並在/data目錄創建文件test.txt
手動刪除容器模擬容器銷毀,用於是pod是被控制器管理的,刪除後會被重建新棚橘知的pod
這時候在看我們之前創建的data.txt已經不見了
hostPath類型則是映射node文件系統中的文件或者目錄到pod里。在使用hostPath類型的存儲卷時,也可以設置type欄位,支持的類型有文件、目錄、File、Socket、CharDevice和BlockDevice(我只映射過文件與目錄)。
其實這個功能就相當於docker中的-v 目錄映射,只不過在k8s中的時候,pod會漂移,當pod漂移到其他node節點的時候,pod不會跨節點的去讀取目錄。所以說hostpath只能算一種半持久化的存儲方式
實戰例子
創建應用
在node節點可以看到生成了/data/volume目錄,在裡面創建測試文件
檢驗pod裡面的/data是否存在這個映射目錄的文件
可以看到剛才創建的文件已經映射到我們的目錄里邊了
為了驗證是否映射到容器裡面的目錄也會隨著pod生命周期的消失而消失,我們手動刪除pod模擬容器終止
可以看到容器被刪除後,新建的pod也可以看到我們映射的目錄,而且裡面數據test.txt還在伍伏。
這有個缺點就是不能夠跨容器去讀取數據,如果刪除後的pod被調度到其他節點的話,原來的數據也就沒有了,如果能不受節點的影響,並且掛載的數據不會隨生命周期的結束而結束,我們應該怎麼解決呢?就是我們後面講到的持久化存儲了
上面介紹了倆種臨時存儲於半持久化存儲的方案。在k8s實際生產環境中,一般會選用私有雲持久化存儲方案還有公有雲持久化存儲方案,私有雲存儲方案包括nfs,ceph,glusterfs等方案。公有雲存儲會用到AWS等方案
存儲方案各有各的優缺點,可參考 https://www.cnblogs.com/yswenli/p/7234579.html 這篇文章。今天我們主要講解pvc,pv,nfs之間的關系。
簡單來說,要使用持久化存儲,就需要使用pvc去跟pv去申請,然後pv查看自己有沒有合適的存儲空間卷,有合適的就與pvc進行綁定。pv與pvc是一一對應綁定的。現在我們用一幅圖來說明pvc,pv,nfs的關系
實戰例子
准備存儲服務安裝nfs
接下來創建pv與nfs綁定
創建pvc與pv關聯
創建並查看結果
注意:STATUS為Bound說明該pvc已經與pv綁定了
接下來創建pod來引用pvc
創建pod
接下來驗證一下在nfs創建一個測試文件,看是否被映射到容器中
可以看到容器裡面也可以看到創建的文件
手動刪除容器,或者調度到其他節點原來的文件還是不會被刪除的,這里就省略驗證了,這就是nfs的好處,不過企業一般不會選用nfs,磁碟IO,性能讀取方面不太理想,畢竟是本地存儲,還是有一定的風險。推薦用用雲存儲。
文件存儲提供無限擴展的文件系統來給雲伺服器存取數據實際上相當於nfs
1、已注冊阿里雲賬號,並完成實名認證。
如果沒有,請先注冊阿里雲賬號,詳情請參見阿里雲賬號注冊流程。
2、已開通NAS服務。
首次登錄NAS控制台時,根據頁面提示開通NAS服務。
3、在需要創建文件系統的地域,已有可用的雲伺服器ECS。
k8s應用NAS實戰例子
1、打開阿里雲NAS控制台確認已創建好文件系統
2、把復制掛載參數把它掛載到伺服器中創建測試目錄,前提是伺服器需要安裝nfs客戶端。
安裝完成掛載到本地目錄並創建test目錄作為測試目錄
並在裡面創建一個測試文件1.txt
接下來可以創建pvc和pv了
創建並查看
接下來創建pod去引用pvc
創建pod
檢驗剛才的1.txt是否掛到容器的/data/nas下
雲存儲適合於生產環境k8s的存儲解決方案
B. K8S常用命令介紹
k8s常用命令:
禁止|恢復node節點調度:
kubectl cordon|uncordon nodename
刪除節點(慎用):
kubectl drain nodename(驅除非系統pod)
kubectl delete nodename (刪除節點)
創建資源:
kubectl create|apply -f file.yaml
create 命令一般用於創建新資源。 因此,如果再次運行該命令,則會拋出錯誤,因為資源名稱在名稱空間中應該是唯一的
apply 命令一般用於更新資源配置。 如果資源不在那裡,那麼它將被創建。 kubectl apply命令可以運行更多次,只要資源定義沒變,資源將不會變動
查看資源列表:
kubectl get node|pod|service|deployment|configmap|... -n namespace [-o wide] [-w]
查看特定資源詳情:
kubectl describe pod podname -n namespace
查看資源定義:
kubectl get deploy deployname -n namespace -o yaml [>file.yaml] 重定向到文件里,可以再次apply -f yaml
編輯資源(只對spec欄位下內容生效):
kubectl edit node|pod|service|deployment|configmap|... -n namespace
刪除資源(慎用):
kubectl delete pod podname -n namespace [--force --grace-period=0] 強制刪除
grace-period表示過渡存活期,默認30s,在刪除POD之前允許POD慢慢終止其上的容器進程,從而優雅退出,0表示立即終止POD
查看pod log:
kubectl logs [-f] podname -n namespace
進入pod(容器),或執行命令:
kubectl exec -it podname -n namespace [-c containername] -- /bin/sh [CMD]
-c 是進入多個容器中的某個指定容器
-- 指的是不用進入容器就可以執行命令
pod擴縮容:k
手動擴縮容:kubectl scale deployment deployname -n namespace --replicas=x;也可用kubectl edit對deployment進行編輯後apply
pod升級與回滾:
deployment:
升級:kubectl set image deployment/deplyname -n namespce image=imagename:xxx; 也可用kubectl edit對deployment進行編輯後apply
更新策略:
Recreate: 更新時先殺掉正在運行的pod,然後創建新的pod
RollingUpdate: 滾動方式進行更新,參數maxUnavailable和maxSurge來控制滾動更新的過程
回滾(不常用):kubectl rollout status|history deployment/deployname -n namespace [--to-revision=x]
pod調度:
NodeName定向調度:通過node節點的主機名進行定向調度
NodeSelector定向調度:通過Node節點標簽和pod資源屬性nodeSelector匹配實現pod的定向調度
查看node節點標簽:
kubectl get node --show-labels
查看指定標簽的節點: kubectl get node -l key=value
節點增加標簽:kubectl label nodes nodename key=value
刪除節點標簽:kubectl label nodes nodename key-
修改節點標簽: kubectl label nodes nodename key=newvalue --overwrite
C. k8s常用命令
命令行 敲出的指令分為2種,
資源管理方式分類
直接使用命令去操作k8s資源,命令和參數一起出現
通過命令和配置文件去操作作k8s資源,命令還是那個命令,只不過參數都放在配置文件裡面
使用apply創建資源,
說明
在master節點執行以下命令即可刪除
還需要在work節點上執行以下命令來清空ini配置
先在主節點創建令牌
然後在需要加入集群的節點中執行令牌,注意這里的命令是通過 kubeadm token create --print-join-command 命令返回的結果
說明
記住,名稱中不能用下劃線 _ ,可以用橫行 - 第一種創建方式–命令行創建
第二種創建方式–命令行 + 配置文件
創建一個名為namespace-dev.yaml的文件,內容如下(注意大小寫,kind的頭字母必須大寫)
然後偶執行命令進行創建
需要注意的是,刪除後,當前命名空間下的pod、deployment、 container 也會一起刪掉
第一種–使用命令刪除
第二種–使用配置文件刪除
說明
獲取所有namespace的pod並監視資源變動
加上 -w 表示監視資源變動信息,此時命令行進入阻塞狀態,如果pod有變化將會馬上呈現出來;
其他參數
因為pod裡面至少要有一個容器,所以pod是和容器一起創建的,新建一個文件 pod.ymal ,內容如下
然後執行命令並指定配置文件進行創建
以下示例是為pod資源打標簽,這種方式是和pod一起創建的,新建一個配置文件 label.yaml
執行命令創建pod
適合更新label值,前提是label的key必須已存在;
刪除key為lebelKey的標簽
pod控制器有很多種,我們這里就用deployment
使用以下run命令運行一個nginx,deployment名稱為 app=run-cmd-nginx-deploy-3
通過以下命令可以看到,會自動生成一個 app=run-cmd-nginx-deploy-3 的標簽
新建一個deployment.yaml文件,內容如下
需要注意的是,一旦刪除pod控制器,此pod控制器下的所有pod和容器也會一並刪除;
默認創建的pod是只能對內訪問的,所以需要創建一個對外的訪問埠,創建一個service其實就是暴露對外的訪問埠
說明
創建好service之後,查看service信息,可以看到,暴露的埠為:30474,
新建一個service.ymal文件,內容如下
以下三種用法都可以
查詢pod控制器和pod
Endpoint是kubernetes中的一個資源對象,存儲在etcd中,用來記錄一個service對應的所有pod的訪問地址,它是根據service配置文件中selector描述產生的。
一個Service由一組Pod組成,這些Pod通過Endpoints暴露出來,Endpoints是實現實際服務的端點集合。換句話說,service和pod之間的聯系是通過endpoints實現的。
每創建一個service,k8s會自動創建一個同名的 Endpoint出來
如果是由service創建出來的endpoints,刪除後會馬上創建出一個同名的endpoint出來,如果要刪除必須先刪除service
因為每次創建一個service,k8s會自動創建一個同名的 Endpoint出來,所我們直接創建service就可以了
--help 用來查看幫助文檔,如果你不知道某個命令怎麼使用了,就可以用 --help 查詢命令的用法
explain用來查看配置文件的 資源結構,如果不知道配置文件中的資源用有哪些結構,那麼就可以使用explain命令來查看
D. k8s常用命令
相關服務及用途節點名稱服務名稱用途管理節點kubctl-apiserver提供HTTP Rest統一介面服務,處理和驗證REST請求和更新etcd中API對象的狀態管理節點kubectl-controller-manager資源控制管理同步管理節點kube-scheler負責資源調度(調度Pod)工作節點kubelet管理Pod的生命周期,創建、啟停等任務工作節點kube-proxy負大悶責網路通信及負載均衡### 1.重啟服務kubectl patch deployment app名稱 -p {"spec":{"template":{"metadata":{"labels":{"date":"date +'%s'"}}}}} -n kube-system
kubectl logs --previous l7-lb-controller-74c67fb85d-5b5cg -n kube-system
kubectl describe pod kubernetes-dashboard -n kube-system
kubectl get svc kubernetes-dashboard -n kube-system
kubectl get ep -n kube-system kubernetes-dashboard
lsmod | grep ip_vs
查看標簽kubectl get node --show-labels -n kube-system
kubectl get pods --show-labels kube-sytem
kubectl get pod --show-labels kubernetes-dashboard-6845889d64-25f9x -n kube-system
kubectl describe svc kubernetes-dashboard -n kube-system
kubectl describe pod kubernetes-dashboard -n kube-system
在容器內執行命令kubectl exec -ti pod名稱 /bin/基閉bash -n kube-system
kubectl get daemonset -o yaml -n kube-system calico-node
kubectl get svc -o json pod名稱 -n kube-system
kubectl get daemonsets -n kube-system
通過文件創建cat > my-namespace.yaml << EOF
apiVersion: v1
kind: Namespace
metadata:
name: new-namespace
EOF
kubectl create -f ./my-namespace.yaml
刪滾鋒彎除命令空間kubectl delete namespaces new-namespace
刪除一個namespace會自動刪除所有屬於該namespace的資源。default 和 kube-system 命名空間不可刪除。### 15.創建/查看 Deployment 記錄版本號kubectl create -f nginx-deployment.yaml --record
重新分配pod數量kubectl scale deployment kubernetes-dashboard --replicas=1 -n kube-system
查看升級歷史記錄kubectl rollout history deployment/kubernetes-dashboard -n kube-system
查看單個revision的詳細信息kubectl rollout history deployment/kubernetes-dashboard --revision=1 -n kube-system
回滾到上一個版本kubectl rollout undo deployment/kubernetes-dashboard -n kube-system
指定回滾某個歷史版本kubectl rollout undo deployment/kubernetes-dashboard --to-revision=1 -n kube-system
查看hap狀態kubectl get hpa kubernetes-dashboard -n kube-system
查看hpa詳細狀態kubectl describe hpa kubernetes-dashboard -n kube-system
刪除hpakubectl delete hpa kubernetes-dashboard -n kube-system
kubectl set image deploy kubernetes-dashboard nginx=nginx:1.9.1
更新升級資源kubectl set resources deployment kubernetes-dashboard -c=kubernetes-dashboard --limits=cpu=200m,memory=512Mi -n kube-system
恢復kubectl rollout resume deploy kubernetes-dashboard -n kube-system
kubectl get csr
添加新工作節點kubectl get csr|grep 'Pending' | awk 'NR>0{print 1}';do kubectl certificate approve 1}';do kubectl certificate deny 1}';do kubectl delete csr $i;done
查看集群訪問連接kubectl cluster-info
查看許可權kubectl describe clusterrole cluster-admin -n kube-system
查看kubectl版本kubectl version
查看支持api版本kubectl api-version
查看當前kubectl配置kubectl config view
查看集群狀態kubectl get componentstatuses
kubectl get rs
查看集群節點kubectl get nodes
查看命名空間kubectl get namespaces
Node狀態維護每個Node都包括以下狀態信息
地址:包括hostname、外網IP和內網IP
條件(Condition):包括OutOfDisk、Ready、MemoryPressure和DiskPressure
容量(Capacity):Node上的可用資源,包括CPU、內存和Pod總數
基本信息(Info):包括內核版本、容器引擎版本、OS類型等
維護狀態/取消維護模式kubectl cordon NodeName
kubectl uncordon NodeName