3 第三章 資源管理


3 第三章 資源管理

3.1 資源管理介紹

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

kubernetes的本質上就是一個集群系統,用戶可以在集群中部署各種服務,所謂的部署服務,其實就是在kubernetes集群中運行一個個的容器,並將指定的程序跑在容器中。

kubernetes的最小管理單元是pod而不是容器,所以只能將容器放在Pod中,而kubernetes一般也不會直接管理Pod,而是通過Pod控制器來管理Pod的。

Pod可以提供服務之后,就要考慮如何訪問Pod中服務,kubernetes提供了Service資源實現這個功能。

當然,如果Pod中程序的數據需要持久化,kubernetes還提供了各種存儲系統。

image-20200406225334627

學習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
[root@master ~]# kubectl create namespace dev
namespace/dev created

# 獲取namespace
[root@master ~]# 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
[root@master ~]# 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
[root@master ~]# kubectl get pod -n dev
NAME  READY   STATUS    RESTARTS   AGE
pod   1/1     Running   0          21s

# 刪除指定的pod
[root@master ~]# kubectl delete pod pod-864f9875b9-pcw7x
pod "pod" deleted

# 刪除指定的namespace
[root@master ~]# 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命令,創建資源:

[root@master ~]# kubectl create -f nginxpod.yaml
namespace/dev created
pod/nginxpod created

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

3)執行get命令,查看資源:

[root@master ~]# 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命令,刪除資源:

[root@master ~]# kubectl delete -f nginxpod.yaml
namespace "dev" deleted
pod "nginxpod" deleted

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

總結:
命令式對象配置的方式操作資源,可以簡單的認為:命令 + yaml配置文件(里面是命令需要的各種參數)

3.3.3 聲明式對象配置

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

# 首先執行一次kubectl apply -f yaml文件,發現創建了資源
[root@master ~]# kubectl apply -f nginxpod.yaml
namespace/dev created
pod/nginxpod created

# 再次執行一次kubectl apply -f yaml文件,發現說資源沒有變動
[root@master ~]# 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) 資源名稱


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM