K8S資源清單及Pod生命週期簡介

K8S簡介

Kubernetes是Google開源的一個容器編排引擎,它支持自動化部署、大規模可伸縮、應用容器化管理。在生產環境中部署一個應用程序時,通常要部署該應用的多個實例以便對應用請求進行負載均衡。
在Kubernetes中,我們可以創建多個容器,每個容器裏面運行一個應用實例,然後通過內置的負載均衡策略,實現對這一組應用實例的管理、發現、訪問,而這些細節都不需要運維人員去進行復雜的手工配置和處理。

這裏首先摘抄了百度百科對k8s的介紹,k8s作爲當前最火熱的容器編排技術,我們公司當前也在使用其作爲我們的微服務集成平臺。但是今天這篇文章主要不講k8s的架構與組成,也不講如何搭建k8s集羣,主要是因爲本人發現網上這些文章都很多,而且寫得也非常不錯;另外,直接上k8s官網上去,其官方文檔講解的也是非常詳細。今天主要根據我自己這段時間對k8s的接觸與使用,整理了一份k8s資源清單或者說是如何快速上手熟悉並且使用k8s資源清單。文章主要分爲5個部分

  • Yaml語法
  • k8s資源分類
  • 資源常用字段說明
  • Pod生命週期簡介
  • 總結

Yaml語法

簡單說明

Yaml是一個可讀性高,用來表達數據序列的格式。YAML的意思是:仍是一種標記語言,但爲了強調這種語言以數據作爲中心,而不是以標記語言爲重點

基本語法

  • 縮進時不允許使用Tab鍵,只允許使用空格
  • 縮進的空格數目不重要,只要相同層級的元素左側對其即可
  • 標識註釋,從這個字符一直到行尾,都會被解釋器忽略

YAML支持的數據結構

  • 對象:鍵值對的集合,又稱爲映射(mapping)/哈希(hashes)/字典(dictionary)
  • 數組:一組按次序怕列的值,又稱爲序列(sequence)/列表(list)
  • 純量(scalars):單個的、不可再分的值

對象類型:對象的一組鍵值對,使用冒號結構表示

name: Steve
age: 18

**Yaml也允許另一種寫法,將所有鍵值對寫成一個行內對象

hash: { name: Steve, age: 18 }

數組類型:一組連詞線開頭的行,構成一個數組

animal
- Cat
- Dog

數組也可以採用行內表示法

animal: [Cat, Dog]

複合結構:對象和數組可以結合使用,形成複合結構

languages:
- Ruby
- Perl
- Python
websites:
YAML: yaml.org
Ruby: ruby-lang.org
Python: python.org
Perl: use.perl.org

純量:純量是最基本的、不可再分的值。以下數據類型都屬於純量

1 字符串 布爾值 整數 浮點數 Null
2 時間 日期

數值直接以字面量的形式表示
number: 12.30

布爾值用true和false表示
isSet: true

null用 ~ 表示
parent: ~

時間採用ISO8601 格式
ios8601: 2020-02-12t20:14:44.10-05:00

日期採用複合 iso8601 格式的年、月、日表示
date: 2012-02-12

YAML 允許使用兩個感嘆號,強制轉換數據類型
e: !!str 123
f: !!str true

字符串

字符串默認不適用引號表示

str: 這是一行字符串

**如果字符串之中包含空格或特殊字符,需要放在引號之中

str: '內容:  字符串'

單引號和雙引號都可以使用,雙引號不會對特殊字符轉移

s1: '內容\n字符串'
s2: "內容\n字符串"

單引號之中如果還有單引號,必須連續使用兩個單引號轉義

str: 'labor''s day'

字符串可以寫成多行,從第二行開始,必須有一個單空格縮進,換行符會被轉爲空格

str: 這是一段
 多行
 字符串

多行字符串可以使用|保留換行符,也可以使用>摺疊換行

this: |
Foo
Bar
that: >
Foo
Bar

** + 表示保留文字塊末尾的換行, - 表示刪除字符串末尾的換行

s1: |
  Foo

s2: |+
  Foo
  
s3: |-
  Foo

YAML錨點&和別名*

** & 用來建立錨點(defaults), << 表示合併到當前數據, * 用來引用錨點**


defaults: &defaults
  adapter:  postgres
  host:     localhost
 
development:
  database: myapp_development
  <<: *defaults
 
test:
  database: myapp_test
  <<: *defaults
    - &showell Steve
    - Clark
    - Brian
    - Oren
    - *showell

集羣資源分類

名稱空間級別:最典型的就是k8s管理的資源的最小單位Pod,它是根據命名空間隔離的,在一個命名空間的資源在另一個命名空間不可見。

  • 工作負載型資源:Pod、ReplicaSet、Deployment、Statefulset、DaemonSet、Job、CronJob;
  • 服務發現及負載均衡型資源:Service、Ingress、…;
  • 配置與存儲型資源:Volume(存儲卷)、CSI(容器存儲接口,可以擴展各種第三方存儲卷);
  • 特殊類型的存儲卷:ConfigMap(可以當配置中心)、Secret(保存敏感數據)、DownwardAPI(把外部環境的信息輸出給容器)。

集羣級別:不管在哪個命名空間的資源都能訪問,只要在這個k8s集羣下的資源都能訪問。

  • Namespace
  • Node
  • Role
  • ClusterRole
  • CLusterRoleBinding

元數據型

  • HPA
  • PodTemplate
  • LimitRange

常用字段說明

我將常用的配置翻譯整理在下面的表格裏:

參數名 字段類型 說明
version String 這裏是指的是K8S API版本,目標基本上市v1,可以用kubectl api-versions命令查詢
kind String 這裏指的是yaml文件定義的資源類型和角色,比如Pod
metadata Object 元數據對象,固定值就寫metadata
metadata.name String 元數據對象的名字,這裏由我麼編寫,比如命名Pod的名字
metadata.namespace String 元數據對象的命名空間,由我們填寫
Spec Object 詳細定義對象,固定值就寫Spec
spec.containers[] list 這裏定義容器的列表
spec.containers[].name String 這裏定義容器名稱
spec.containers[].image String 這裏定義啓動容器使用的鏡像
spec.containers[].imagePullPolicy String 定義鏡像拉取策略,有Always、Never、ifNotPresent,分別爲每次都重新拉取鏡像、使用本地鏡像、如果本地有則使用本地鏡像,本地不存在則拉取鏡像
spec.containers[].env[] List 指定容器運行前需要設置環境變量列表
spec.containers[].command[] List 指定容器啓動命令,不指定則使用鏡像打包時的命令,可以指定多個
spec.containers[].args[] List 指定容器啓動命令參數,可以指定多個
spec.containers[].workingDir String 指定容器的工作目錄
spec.containers[].volumeMounts[] List 指定容器內部的存儲卷配置信息
spec.containers[].volumeMounts[].name String 指定容器內部的存儲卷名稱
spec.containers[].volumeMounts[].mountPath String 指定容器內部的存儲卷掛載路徑
spec.containers[].volumeMounts[].readOnly String 指定容器存儲卷讀寫模式,true或者false,默認爲讀寫模式
spec.containers[].ports[] List 指定容器需要用到的端口列表
spec.containers[].ports[].name String 端口名稱
spec.containers[].ports[].containerPort String 容器需要監聽的端口號
spec.containers[].ports[].hostPort String 指定容器在所在主機監聽的端口號,設置改參數後,同一臺主機無法啓動多個容器副本
spec.containers[].ports[].protocol String 端口協議,支持TCP和UDP,默認爲TCP
spec.restartPolicy String 定義Pod的重啓策略,可選值爲Always、OnFailure,默認值爲Always。1、Always:Pod一旦終止運行,則無論容器如何終止的,kubelet服務都將重啓它。2、OnFailure:只有Pod已非0退出碼終止時,kubelet纔會重啓該容器。如果容器正常結束(退出碼爲0),則kubelet不會重啓它。3、Never:Pod終止後,kubelet將終止碼報告給master,不會重啓容器。
spec.nodeSelector Object 定義Node的Label過濾標籤,以key:value格式指定
spec.imagePullSecrets Object 定義pull鏡像時使用secret名稱,以name:secretkey格式指定
spec.hostNetwork Boolean 定義是否使用主機網絡模式,默認值爲false,設置true表示使用宿主機網咯,不使用docker網橋,同時設置了true將無法在同一臺宿主機上啓動第二個副本

另外如果需要查看更加詳細的配置信息,可以在已經搭建好的K8S集羣中使用命令查看,如查看Pod的資源模板可以使用一下命令:

[app@master1 ~]$ kubectl explain pod
KIND:     Pod
VERSION:  v1

DESCRIPTION:
     Pod is a collection of containers that can run on a host. This resource is
     created by clients and scheduled onto hosts.

FIELDS:
   apiVersion	<string>
     APIVersion defines the versioned schema of this representation of an
     object. Servers should convert recognized schemas to the latest internal
     value, and may reject unrecognized values. More info:
     https://git.k8s.io/community/contributors/devel/api-conventions.md#resources

   kind	<string>
     Kind is a string value representing the REST resource this object
     represents. Servers may infer this from the endpoint the client submits
     requests to. Cannot be updated. In CamelCase. More info:
     https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds

   metadata	<Object>
     Standard object's metadata. More info:
     https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata

   spec	<Object>
     Specification of the desired behavior of the pod. More info:
     https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status

   status	<Object>
     Most recently observed status of the pod. This data may not be up to date.
     Populated by the system. Read-only. More info:
     https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status

想要進一步查看pod下某個屬性的具體信息,如apiVersion,再進一步使用kubectl explain pod.apiVersion

[app@master1 ~]$ kubectl explain pod.apiVersion
KIND:     Pod
VERSION:  v1

FIELD:    apiVersion <string>

DESCRIPTION:
     APIVersion defines the versioned schema of this representation of an
     object. Servers should convert recognized schemas to the latest internal
     value, and may reject unrecognized values. More info:
     https://git.k8s.io/community/contributors/devel/api-conventions.md#resources

如果覺得命令行裏的信息還不夠詳細,命令行裏也有提示,可以去指定的網址查看更加詳細的信息。


Pod生命週期簡介

先上圖
在這裏插入圖片描述
首先,k8s在啓動Pod時,會先啓動一個pause,這個pause容器是由k8s爲我們提供並準備的,用來提供pod內部的必要的公共的功能,比如網絡。這個pause用戶定義不了,也控制不了,是容器運行的必要環境。
然後,容器會進行InitC容器的創建和運行,這個可以有用戶定義,InitC可以有多個,按照順序執行,執行失敗後續的主容器不會啓動。這個可以用來做一些我們主容器啓動前的準備工作,比如數據庫的初始化或者更新。
再繼續,就回啓動主容器,容器啓動時,k8s會使用readiness進行容器可訪問性的探測,如果檢測到容器正常啓動,能夠對外提供服務,則容器的狀態會變爲running。
而伴隨整個容器生命週期的liveiness,也會在一直在容器運行的時候檢測容器的狀態,當容器由於某些原因導致容器不可訪問時,它會報告給k8s,讓k8s對容器做下一步處理,比如,重啓等等。
最後直到容器結束。

可能這裏我對於pod的生命週期理解的也不夠全面與詳細,如果有錯誤請指正。


總結

1、想要熟練使用k8s,需要的知識面非常廣,比如操作系統知識,網絡知識、編程等等。
2、最最最重要的時,想要熟練使用一個東西,需要多動手與總結。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章