ReplicationController
存活探針
Kubemetes有以下三種探測容器的機制:
- HTTPGET探針對容器的IP地址(你指定的端口和路徑)執行HTTPGET請求,如果探測器收到響應,並且響應狀態碼不代表錯誤(換句話說,如果HTTP 響應狀態碼是2xx或3xx), 則認為探測成功。
如果服務器返回錯誤響應狀態 碼或者根本沒有響應,那么探測就被認為是失敗的,容器將被重新啟動。 - TCP套接字探針嘗試與容器指定端口建立TCP連接。如果連接成功建立,則 探測成功。否則,容器重新啟動。
- Exec探針在容器內執行任意命令,並檢查命令的退出狀態碼。如果狀態碼 是o, 則探測成功。所有其他狀態碼都被認為失敗。
基於HTTP的存活探針
創建(只截取容器配置的部分)
spec:
containers:
- name: IMAGE_NAME
image: WAREHOUSE/NAMESPACE/IMAGE_NAME:TAG
# 一個基於HTTP GET的存活探針
livenessProbe:
# 第一次檢測在容器啟動15秒后
initialDelaySeconds: 15
httpGet:
port: 8080
path: /
ReplicationController
- 創建ReplicationController的yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: app
spec:
# 這里的selector可以刪除,這樣的話會默認從模板(template)中獲取標簽
selector:
app: app
replicas: 2
template:
metadata:
labels:
app: app
spec:
containers:
- name: app
image: app/1.0
ports:
- containerPort: 8080
2 . ReplicationController(Rc)會根據標簽選擇器管理符合其標簽的所有pod,並維持在replicas設置的數量上。
當有一個pod發生故障然后又需要保留pod以查詢日志信息的時候,可以更改pod的標簽來移出ReplicationController的管理范圍,
這樣Rc會重新創建一個pod,故障pod也不會刪除,仍然可以根據日志分析故障原因
3 . 注意:修改yaml文件的模板或者標簽選擇器時,要刪除之前創建的pod,不然pod會失去Rc的管理,白白占用內存空間,類似於java中的內存泄漏
4 . 直接編輯Rc的yaml命令,命令執行后會自動生效,可以用來升級pod,但是后面有更好的方法
kubectl edit rc myapp
5 . 有的時候需要刪除Rc但是不能刪除Rc下面管理的pod,比如需要將Rc升級到ReplicaSet(Rs),可以執行以下命令
kubectl delete re kubia --cascade=false
ReplicationController 與 ReplicaSet 的對比
目前ReplicationController已經被ReplicaSet完全取代了,而我們也不會直接去創建ReplicaSet,是使用Deployment去管理ReplicaSet,在后面會講到
- ReplicaSet對標簽的匹配規則更加多樣化
- ReplicaSet可以將標簽選擇器設置為一個數組,只要是這個數組里的標簽都會被匹配
1 . 創建ReplicaSet
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: app
spec:
selector:
matchLabels:
app: app
replicas: 2
template:
metadata:
labels:
app: app
spec:
containers:
- name: app
image: app/1.0
ports:
- containerPort: 8080
2 . 更加強大的標簽選擇器:matchExpressions
spec:
selector:
matchExpressions:
- key: app
operator: In
values:
- app
每個表達式都必須包含一個key、一 個operator(運算符),並且可能還有一個values的列表(取決於運算符),運算符如下:
- In : Label的值必須與其中一個指定的values匹配。
- Notln : Label的值與任何指定的values不匹配。
- Exists : pod必須包含一個指定名稱的標簽(值不重要)。使用此運算符時, 不應指定values字段。
- DoesNotExist : pod不得包含有指定名稱的標簽。values屬性不得指定
如果你指定了多個表達式,則所有這些表達式都必須為true才能使選擇器與 pod匹配。如果同時指定matchLabels和matchExpressions, 則所有標簽都必須匹配,並且所有表達式必須計算為true以使該pod與選擇器匹配
3 . 刪除Rs
kubectl delete rs kubia