1. 程式人生 > 其它 >4--k8s之資源管理 ; yaml語言

4--k8s之資源管理 ; yaml語言

目錄

一、 資源管理介紹

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

kubernetes的本質上就是一個集群系統,使用者可以在叢集中部署各種服務,所謂的部署服務,其實就是在kubernetes叢集中執行一個個的容器,並將指定的程式跑在容器中。 kubernetes的最小管理單元是pod而不是容器,所以只能將容器放在Pod中,而kubernetes一般也不會直接管理Pod,而是通過Pod控制器來管理Pod的。 Pod可以提供服務之後,就要考慮如何訪問Pod中服務,kubernetes提供了Service資源實現這個功能。 當然,如果Pod中程式的資料需要持久化,kubernetes還提供了各種儲存系統。

學習kubernetes的核心,就是學習如何對叢集上的Pod、Pod控制器、Service、儲存等各種資源進行操作

二、YAML 檔案詳解

1、YAML 檔案概述

k8s 叢集中對資源管理和資源物件編排部署都可以通過宣告樣式(YAML)檔案來解決,也 就是可以把需要對資源物件操作編輯到 YAML 格式檔案中,我們把這種檔案叫做資源清單文 件,通過 kubectl 命令直接使用資源清單檔案就可以實現對大量的資源物件進行編排部署了。

2、YAML 檔案書寫格式

1、資源清單檔案

2、資源編排

3、YAML 介紹

YAML :仍是一種標記語言。為了強調這種語言以資料做為中心,而不是以標記語言為重點。
YAML 是一個可讀性高,用來表達資料序列的格式。

4、YAML 基本語法

# 1、 縮排的空格數目不重要,只要相同層級的元素左側對齊即可
# 2、 低版本縮排時不允許使用 Tab 鍵,只允許使用空格
# 3、 使用#標識註釋,從這個字元一直到行尾,都會被直譯器忽略
# 4、 使用---表示新的yaml檔案開始
# 5、 大小寫敏感

5、YAML組成

1、控制器定義

2、被控制物件

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

6、yaml配置檔案詳解

apiVersion:v1  #必選,指定K8s部署的API的版本號
kind:Pod   #必選,資源型別Pod
metadata: # 必選,記錄部署應用的元資料
  name: nginx # 必選,符合 RFC 1035 規範的 Pod 名稱
  namespace: web-testing # 可選,不指定預設為 default,Pod 所在的名稱空間
  labels: # 可選,標籤選擇器,一般用於 Selector
    - app: nginx
  annotations: # 可選,註釋列表
    - app: nginx
spec: # 必選,用於部署容器的詳細資訊
  containers: # 必選,容器列表
  - name: nginx # 必選,符合 RFC 1035 規範的容器名稱
    image: nginx:v1 # 必選,容器所用的映象的地址
    imagePullPolicy: Always # 可選,映象拉取策略
    workingDir: /usr/share/nginx/html # 可選,容器的工作目錄
    volumeMounts: # 可選,儲存卷配置(容器內部掛載)
    - name: webroot # 儲存卷名稱
      mountPath: /usr/share/nginx/html # 掛載目錄
      readOnly: true # 只讀
    ports: # 可選,容器需要暴露的埠號列表
    - name: http # 埠名稱
      containerPort: 80 # 埠號
      protocol: TCP # 埠協議,預設 TCP
    env: # 可選,環境變數配置
    - name: TZ # 變數名
      value: Asia/Shanghai
    - name: LANG
      value: en_US.utf8
    resources: # 可選,資源限制和資源請求限制
      limits: # 最大限制設定
        cpu: 1000m
        memory: 1024MiB
      requests: # 啟動所需的資源
        cpu: 100m
        memory: 512MiB
     readinessProbe: # 可選,容器狀態檢查
       httpGet: # 檢測方式
         path: / # 檢查路徑
         port: 80 # 監控埠
       timeoutSeconds: 2 # 超時時間
       initialDelaySeconds: 60 # 初始化時間
     livenessProbe: # 可選,監控狀態檢查
       exec: # 檢測方式
         command:
         - cat
         - /health
       httpGet: # 檢測方式
         path: /_health
         port: 8080
         httpHeaders:
         - name: end-user
           value: jason
        tcpSocket: # 檢測方式
          port: 80
        initialDelaySeconds: 60 # 初始化時間
        timeoutSeconds: 2 # 超時時間
        periodSeconds: 5 # 檢測間隔
        successThreshold: 2 # 檢查成功為 2 次表示就緒
        failureThreshold: 1 # 檢測失敗 1 次表示未就緒
      securityContext: # 可選,限制容器不可信的行為
        provoleged: false
     restartPolicy: Always # 可選,預設為 Always
     nodeSelector: # 可選,指定 Node 節點
       region: subnet7
     imagePullSecrets: # 可選,拉取映象使用的 secret
     - name: default-dockercfg-86258
     hostNetwork: false # 可選,是否為主機模式,如是,會佔用主機埠
     volumes: # 共享儲存卷列表(外部共享)
     - name: webroot # 名稱,與上述對應
       emptyDir: {} # 共享卷型別,空
       hostPath: # 共享卷型別,本機目錄
         path: /etc/hosts
       secret: # 共享卷型別,secret 模式,一般用於密碼
         secretName: default-token-tf2jp # 名稱
         defaultMode: 420 # 許可權
         configMap: # 一般用於配置檔案
         name: nginx-conf
         defaultMode: 420
         
[root@k8s-m-01 ~]# kubectl explain pod.spec  #檢視引數
 string : 跟字串
Object :
[]Object : 
	- name

三、資源管理方式

1、三種資源管理方式

  • 命令式物件管理:直接使用命令去操作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

型別 操作物件 適用環境 優點 缺點
命令式物件管理 物件 測試 簡單 只能操作活動物件,無法審計、跟蹤
命令式物件配置 檔案 開發 可以審計、跟蹤 專案大時,配置檔案多,操作麻煩
宣告式物件配置 目錄 開發 支援目錄操作 意外情況下難以除錯

2、 命令式物件管理

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資源
pod資源控制器 replicasets rs 控制pod資源
pod資源控制器 deployments deploy 控制pod資源
pod資源控制器 daemonsets ds 控制pod資源
pod資源控制器 jobs 控制pod資源
pod資源控制器 cronjobs cj 控制pod資源
pod資源控制器 horizontalpodautoscalers hpa 控制pod資源
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、 命令式物件配置

命令式物件配置就是使用命令配合配置檔案一起來操作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配置檔案(裡面是命令需要的各種引數)

4、 宣告式物件配置

宣告式物件配置跟命令式物件配置很相似,但是它只有一個命令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) 資源名稱
如 kubectl describe -n cdan pod npod