部門產品線本身是做DEVOPS平臺,最近部署架構也在往K8S上靠了,不得不學一下K8S。自己搭建了K8S叢集與harbor倉庫來學習。
1、kubernetes之常用核心資源物件
1.1、K8s服務部署
Kubernetes: 用來編排(管理)容器的,但是kubernetes不直接部署容器,而是通過部署一個pod服務來間接管理容器,pod內部封裝的是一個容器。
1.2、POD
POD是kubernetes叢集的最小任務排程單元。
Kubernetes裡的所有資源物件都可以採用YAML或者JSON格式的檔案來定義描述。比如下面的POD定義:
apiVersion: v1
kind: Pod
metadata:
name: mytomcat
labels:
name: mytomcat
spec:
containers:
- name: mytomcat
image: harbor.hyz.com/library/mytomcat:v1
prots:
- containerPort: 8080
1.3、標籤label
標籤定義:標籤用於區分物件(比如Pod、Service),鍵/值對存在;每個資源物件可以有多個標籤,通過標籤關聯物件。
Kubernetes中任意API物件都是通過Label進行標識,Label的實質是一系列的Key/Value鍵值對,其中key於value由使用者自己指定。
Label可以附加在各種資源物件上,如Node、Pod、Service、RC等,一個資源物件可以定義任意數量的Label,同一個Label也可以被新增到任意數量的資源物件上去。
Label是Replication Controller和Service執行的基礎,二者通過Label來進行關聯Node上執行的Pod。
我們可以通過給指定的資源物件捆綁一個或者多個不同的Label來實現多維度的資源分組管理功能,以便於靈活、方便的進行資源分配、排程、配置等管理工作。
一些常用的Label如下:
版本標籤:"release":"stable","release":"canary"......
環境標籤:"environment":"dev","environment":"qa","environment":"production"
架構標籤:"tier":"frontend","tier":"backend","tier":"middleware"
分割槽標籤:"partition":"customerA","partition":"customerB"
質量管控標籤:"track":"daily","track":"weekly"
問題: 在伺服器部署的容器雲環境中,有成千上萬個POD服務,那麼副本控制器是如何知道哪些pod服務被當前的副本控制器控制?
答案: 通過標籤確定哪些服務屬於誰控制;
1.4、volume
Volume是kubernetes抽象出來的資料儲存資源物件;和docker的volume沒有關係,volume資料卷會把儲存介質(磁碟,網路檔案系統)中資料掛載到pod服務內容的容器中,volume是k8s管理的資料卷;
小結:
1、volume資料卷本身並不儲存資料,只是把資料給掛載到pod服務內部的容器中去,volume僅僅是k8s管理的資源物件
2、pod內部服務容器當機了,volume資料卷不會丟失。
3、pod服務當機,消失了。Volume資料卷也會消失,且資料全部丟失。
1.5、副本控制器
副本控制器資源物件名稱: ReplicationController(淘汰,只支援單個標籤選擇器), ReplicaSet(目前使用這款副本控制器,支援符合標籤選擇器)
作用:用來保證服務副本數量與預期所設定的數量保持一致,也就是說服務永遠保證服務處於高可用狀態。
場景:當服務上線部署後,一段時間後某一個服務(POD)當機了,副本控制器立馬對服務進行重建,永遠保證服務數量等於之前所設定數量(例如: 規定服務叢集服務數量=3,副本控制將會永遠保證服務數量為3);
apiVersion: extensions/v1beta1
kind: ReplicaSet
metadata:
name: frontend
spec:
replicas: 3
selector:
matchLabels:
tier: frontend
template:
metadata:
labels:
tier: frontend
spec:
containers:
- name: tomcat-demo
image: harbor.hyz.com/library/mytomcat:v1
imagePullPolicy: IfNotPresent
env:
- name: GET_HOST_FROM
value: dns
ports:
- containerPort: 80
問題1: ReplicaSet副本控制器僅僅是控制POD副本數量(僅僅是一個副本控制器),不支援滾動更新,擴容縮容等;因此必須引入Deployment資源物件,實現服務滾動更新,擴容縮容。
1.6、Deployment
Deployment為Pod和ReplicaSet 提供了一個 宣告式定義方法,相當於RC/RS的升級版。其中一個最大升級功能是我們可以隨時知道當前pod“部署”的進度。
典型的應用場景:
(1)、定義Deployment 來建立 Pod 和 ReplicaSet
(2)、滾動升級和回滾應用
(3)、擴容和索容
(4)、暫停和繼續 Deployment
Deployment不僅僅可以滾動更新,而且可以進行回滾,如果發現升級到V2版本後,發現服務不可用,可以回滾到V1版本。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
1.7、DaemonSet
DaemonSet確保全部(或者一些 [ node打上汙點(可以想象成一個標籤),pod如果不定義容忍這個汙點,那麼pod就不會被排程器分配到這個node ])Node上執行一個Pod的副本。當有Node加入叢集時,也會為他們新增一個Pod。當有Node從叢集移除時,這些Pod也會被回收。刪除DaemonSet將會刪除他建立的所有Pod,使用DaemonSet 的一些典型用法:
(1)在每個Node上執行日誌收集Daemon,例如:fluentd、logstash.
(2)在每個Node上執行監控Daemon,例如:Prometheus Node Exporter
小結: DeamonSet控制器,讓每一個node節點都部署一個相同服務(副本),因此deamonSet通常被用來部署一些公共的服務。
這些公共服務,每一個節點都需要;
例如:
需求: 在服務叢集網路中,收集每一個節點的日誌(每一個節點都需要部署一個收集日誌程式)
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: daemonset-logstash
namespace: default
labels:
k8s: logstash
spec:
selector:
matchLabels:
name: daemonset-logstash
template:
metadata:
labels:
name: daemonset-logstash
spec:
tolerations:
# 這些容忍度設定是為了讓守護程式在控制平面節點上執行
# 如果你不希望控制平面節點執行 Pod,可以刪除它們
- key: node-role.kubernetes.io/control-plane
operator: Exists
effect: NoSchedule
containers:
- name: logstash
image: logstash
resources:
limits:
memory: 200Mi
requests:
cpu: 100m
memory: 200Mi
volumeMounts:
- name: varlog
mountPath: /var/log
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
terminationGracePeriodSeconds: 30
volumes:
- name: varlog
hostPath:
path: /var/log
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
參考:https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/daemonset/