天天看點

3 第三章 資源管理

3.1 資源管理介紹

在kubernetes中,所有的内容都抽象為資源,使用者需要通過操作資源來管理kubernetes。

kubernetes的本質上就是一個叢集系統,使用者可以在叢集中部署各種服務,所謂的部署服務,其實就是在kubernetes叢集中運作一個個的容器,并将指定的程式跑在容器中。

kubernetes的最小管理單元是pod而不是容器,是以隻能将容器放在

Pod

中,而kubernetes一般也不會直接管理Pod,而是通過

Pod控制器

來管理Pod的。

Pod可以提供服務之後,就要考慮如何通路Pod中服務,kubernetes提供了

Service

資源實作這個功能。

當然,如果Pod中程式的資料需要持久化,kubernetes還提供了各種

存儲

系統。
3 第三章 資源管理
學習kubernetes的核心,就是學習如何對叢集上的

Pod、Pod控制器、Service、存儲

等各種資源進行操作

3.2 YAML語言介紹

YAML是一個類似 XML、JSON 的标記性語言。它強調以資料為中心,并不是以辨別語言為重點。因而YAML本身的定義比較簡單,号稱"一種人性化的資料格式語言"。

<heima>
<age>15</age>
   <address>Beijing</address>
</heima>


heima:
age: 15
address: Beijing
           

YAML的文法比較簡單,主要有下面幾個:

  • 大小寫敏感
  • 使用縮進表示層級關系
  • 縮進不允許使用tab,隻允許空格( 低版本限制 )
  • 縮進的空格數不重要,隻要相同層級的元素左對齊即可
  • '#'表示注釋

YAML支援以下幾種資料類型:

  • 純量:單個的、不可再分的值
  • 對象:鍵值對的集合,又稱為映射(mapping)/ 哈希(hash) / 字典(dictionary)
  • 數組:一組按次序排列的值,又稱為序列(sequence) / 清單(list)
# 純量, 就是指的一個簡單的值,字元串、布爾值、整數、浮點數、Null、時間、日期
# 1 布爾類型
c1: true (或者True)
# 2 整型
c2: 234
# 3 浮點型
c3: 3.14
# 4 null類型
c4: ~  # 使用~表示null
# 5 日期類型
c5: 2018-02-17    # 日期必須使用ISO 8601格式,即yyyy-MM-dd
# 6 時間類型
c6: 2018-02-17T15:02:31+08:00  # 時間使用ISO 8601格式,時間和日期之間使用T連接配接,最後使用+代表時區
# 7 字元串類型
c7: heima     # 簡單寫法,直接寫值 , 如果字元串中間有特殊字元,必須使用雙引号或者單引号包裹
c8: line1
  line2     # 字元串過多的情況可以拆成多行,每一行會被轉化成一個空格
           
# 對象
# 形式一(推薦):
heima:
age: 15
address: Beijing
# 形式二(了解):
heima: {age: 15,address: Beijing}
           
# 數組
# 形式一(推薦):
address:
- 順義
- 昌平
# 形式二(了解):
address: [順義,昌平]
           

小提示:

1 書寫yaml切記

:

 後面要加一個空格

2 如果需要将多段yaml配置放在一個檔案中,中間要使用

---

分隔

3 下面是一個yaml轉json的網站,可以通過它驗證yaml是否書寫正确

https://www.json2yaml.com/convert-yaml-to-json

3.3 資源管理方式

  • 指令式對象管理:直接使用指令去操作kubernetes資源

    kubectl run nginx-pod --image=nginx:1.17.1 --port=80

  • 指令式對象配置:通過指令配置和配置檔案去操作kubernetes資源

    kubectl create/patch -f nginx-pod.yaml

  • 聲明式對象配置:通過apply指令和配置檔案去操作kubernetes資源

    kubectl apply -f nginx-pod.yaml

類型 操作對象 适用環境 優點 缺點
指令式對象管理 對象 測試 簡單 隻能操作活動對象,無法審計、跟蹤
指令式對象配置 檔案 開發 可以審計、跟蹤 項目大時,配置檔案多,操作麻煩
聲明式對象配置 目錄 開發 支援目錄操作 意外情況下難以調試

3.3.1 指令式對象管理

kubectl指令

kubectl是kubernetes叢集的指令行工具,通過它能夠對叢集本身進行管理,并能夠在叢集上進行容器化應用的安裝部署。kubectl指令的文法如下:

kubectl [command] [type] [name] [flags]
           

comand:指定要對資源執行的操作,例如create、get、delete

type:指定資源類型,比如deployment、pod、service

name:指定資源的名稱,名稱大小寫敏感

flags:指定額外的可選參數

# 檢視所有pod
kubectl get pod
​
# 檢視某個pod
kubectl get pod pod_name
​
# 檢視某個pod,以yaml格式展示結果
kubectl get pod pod_name -o yaml
           

資源類型

kubernetes中所有的内容都抽象為資源,可以通過下面的指令進行檢視:

kubectl api-resources
           

經常使用的資源有下面這些:

資源分類 資源名稱 縮寫 資源作用
叢集級别資源 nodes no 叢集組成部分
namespaces ns 隔離Pod
pod資源 pods po 裝載容器
pod資源控制器 replicationcontrollers rc 控制pod資源
replicasets rs 控制pod資源
deployments deploy 控制pod資源
daemonsets ds 控制pod資源
jobs 控制pod資源
cronjobs cj 控制pod資源
horizontalpodautoscalers hpa 控制pod資源
statefulsets sts 控制pod資源
服務發現資源 services svc 統一pod對外接口
ingress ing 統一pod對外接口
存儲資源 volumeattachments 存儲
persistentvolumes pv 存儲
persistentvolumeclaims pvc 存儲
配置資源 configmaps cm 配置
secrets 配置

​操作

kubernetes允許對資源進行多種操作,可以通過--help檢視詳細的操作指令

kubectl --help
           

經常使用的操作有下面這些:

指令分類 指令 翻譯 指令作用
基本指令 create 建立 建立一個資源
edit 編輯 編輯一個資源
get 擷取 擷取一個資源
patch 更新 更新一個資源
delete 删除 删除一個資源
explain 解釋 展示資源文檔
運作和調試 run 運作 在叢集中運作一個指定的鏡像
expose 暴露 暴露資源為Service
describe 描述 顯示資源内部資訊
logs 日志 輸出容器在 pod 中的日志
attach 纏繞 進入運作中的容器
exec 執行 執行容器中的一個指令
cp 複制 在Pod内外複制檔案
rollout 首次展示 管理資源的釋出
scale 規模 擴(縮)容Pod的數量
autoscale 自動調整 自動調整Pod的數量
進階指令 apply rc 通過檔案對資源進行配置
label 标簽 更新資源上的标簽
其他指令 cluster-info 叢集資訊 顯示叢集資訊
version 版本 顯示目前Server和Client的版本

下面以一個namespace / pod的建立和删除簡單示範下指令的使用:

# 建立一個namespace
[[email protected] ~]# kubectl create namespace dev
namespace/dev created
​
# 擷取namespace
[[email protected] ~]# kubectl get ns
NAME              STATUS   AGE
default           Active   21h
dev               Active   21s
kube-node-lease   Active   21h
kube-public       Active   21h
kube-system       Active   21h
​
# 在此namespace下建立并運作一個nginx的Pod
[[email protected] ~]# kubectl run pod --image=nginx:latest -n dev
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/pod created
​
# 檢視新建立的pod
[[email protected] ~]# kubectl get pod -n dev
NAME  READY   STATUS    RESTARTS   AGE
pod   1/1     Running   0          21s
​
# 删除指定的pod
[[email protected] ~]# kubectl delete pod pod-864f9875b9-pcw7x
pod "pod" deleted
​
# 删除指定的namespace
[[email protected] ~]# kubectl delete ns dev
namespace "dev" deleted
           

3.3.2 指令式對象配置

指令式對象配置就是使用指令配合配置檔案一起來操作kubernetes資源。

1) 建立一個nginxpod.yaml,内容如下:

apiVersion: v1
kind: Namespace
metadata:
name: dev
​
---
​
apiVersion: v1
kind: Pod
metadata:
name: nginxpod
namespace: dev
spec:
containers:
- name: nginx-containers
  image: nginx:latest
           

2)執行create指令,建立資源:

[[email protected] ~]# kubectl create -f nginxpod.yaml
namespace/dev created
pod/nginxpod created
           

此時發現建立了兩個資源對象,分别是namespace和pod

3)執行get指令,檢視資源:

[[email protected] ~]# kubectl get -f nginxpod.yaml
NAME            STATUS   AGE
namespace/dev   Active   18s
​
NAME            READY   STATUS    RESTARTS   AGE
pod/nginxpod    1/1     Running   0          17s
           

這樣就顯示了兩個資源對象的資訊

4)執行delete指令,删除資源:

[[email protected] ~]# kubectl delete -f nginxpod.yaml
namespace "dev" deleted
pod "nginxpod" deleted
           

此時發現兩個資源對象被删除了

總結:

指令式對象配置的方式操作資源,可以簡單的認為:指令 + yaml配置檔案(裡面是指令需要的各種參數)

3.3.3 聲明式對象配置

聲明式對象配置跟指令式對象配置很相似,但是它隻有一個指令apply。

# 首先執行一次kubectl apply -f yaml檔案,發現建立了資源
[[email protected] ~]# kubectl apply -f nginxpod.yaml
namespace/dev created
pod/nginxpod created
​
# 再次執行一次kubectl apply -f yaml檔案,發現說資源沒有變動
[[email protected] ~]# kubectl apply -f nginxpod.yaml
namespace/dev unchanged
pod/nginxpod unchanged
           

總結:

  其實聲明式對象配置就是使用apply描述一個資源最終的狀态(在yaml中定義狀态)

使用apply操作資源:

      如果資源不存在,就建立,相當于 kubectl create

如果資源已存在,就更新,相當于 kubectl patch

擴充:kubectl可以在node節點上運作嗎 ?

kubectl的運作是需要進行配置的,它的配置檔案是$HOME/.kube,如果想要在node節點運作此指令,需要将master上的.kube檔案複制到node節點上,即在master節點上執行下面操作:

scp  -r  HOME/.kube   node1: HOME/
           
使用推薦: 三種方式應該怎麼用 ?

建立/更新資源 使用聲明式對象配置 kubectl apply -f XXX.yaml

删除資源 使用指令式對象配置 kubectl delete -f XXX.yaml

查詢資源 使用指令式對象管理 kubectl get(describe) 資源名稱

k8s

繼續閱讀