K8S簡介
Kubernetes是Google開源的一個容器編排引擎,它支持自動化部署、大規模可伸縮、應用容器化管理。在生產環境中部署一個應用程序時,通常要部署該應用的多個實例以便對應用請求進行負載均衡。
在Kubernetes中,我們可以創建多個容器,每個容器裏面運行一個應用實例,然後通過內置的負載均衡策略,實現對這一組應用實例的管理、發現、訪問,而這些細節都不需要運維人員去進行復雜的手工配置和處理。
這裏首先摘抄了百度百科對k8s的介紹,k8s作爲當前最火熱的容器編排技術,我們公司當前也在使用其作爲我們的微服務集成平臺。但是今天這篇文章主要不講k8s的架構與組成,也不講如何搭建k8s集羣,主要是因爲本人發現網上這些文章都很多,而且寫得也非常不錯;另外,直接上k8s官網上去,其官方文檔講解的也是非常詳細。今天主要根據我自己這段時間對k8s的接觸與使用,整理了一份k8s資源清單或者說是如何快速上手熟悉並且使用k8s資源清單。文章主要分爲5個部分
- Yaml語法
- k8s資源分類
- 資源常用字段說明
- Pod生命週期簡介
- 總結
Yaml語法
簡單說明
Yaml是一個可讀性高,用來表達數據序列的格式。YAML的意思是:仍是一種標記語言,但爲了強調這種語言以數據作爲中心,而不是以標記語言爲重點
基本語法
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、最最最重要的時,想要熟練使用一個東西,需要多動手與總結。