06 . Kubernetes之Pod控制器詳細介紹及應用
阿新 • • 發佈:2020-07-02
#### Pod API屬性詳解
> Pod是k8s叢集中的最小編排單位。將這個設計落實到API物件上,容器就成了Pod屬性裡一個普通的欄位。那麼到底哪些屬性屬於Pod物件,哪些屬性屬於容器的呢?先看下面的一段描述:
>
>
>
> 假如把Pod看成傳統環境裡的"機器"、那麼容器就是執行在這個"機器"裡的"使用者程式",這樣很多關於Pod物件的設計就非常容易理解了。凡是排程、網路、儲存,以及安全相關的屬性,基本上是Pod級別的。他們的共同特徵是:描述的是"機器"這個整體,而不是裡面執行的"程式"。比如:
```python
# 配置這個"機器"的網絡卡——Pod 的網路定義
# 配置這個"機器"的磁碟——Pod 的儲存定義
# 配置這個"機器"的防火牆——Pod 的安全定義
# 這臺"機器"執行在哪個伺服器之上——Pod 的排程
```
##### 關於標籤
> 所有的資源都可以設定標籤,目的就是為了給資源貼識別符號,使用時用選擇器呼叫標籤,用到標籤的地方:
>
>
>
> 後端有以副本形式存在的Pod,這麼多副本最好做負載均衡,此時就在前面建立一個service,一般情況下是先建立rc,然後建立service,建立完成後需要將service和後端的rc關聯到一起,關聯到一起就是用標籤選擇器關聯的,即使不需要標籤也最好設定一個能用的標籤,標籤可以由多個字典元素組成. 標籤的格式: name:value,一個鍵值對錶示一個標籤,呼叫時一起呼叫,例如: 做nginx,這裡是眾多nginx的第一個,故可以設定這個標籤由兩個字典元素組成,標籤可以有多行,但標籤的值不能是純數字.
#### Pod級別的相關屬性
> 凡是跟Namespace都是Pod級別的,比如,容器的Linux Namespace、容器共享宿主機的 Namespace
> 原因:Pod 的設計就是要讓它裡面的容器儘可能多地共享Linux Namespace,僅保留必要的隔離和限制能力。如此Pod模擬出的效果才能跟虛擬機器里程序間的關係非常類似.
##### **apiVersion**
`除了deployment是v1的升級版,其他的基本都是v1。 # kubectl api-versions`
##### **kind**
`指定這個API物件的資源型別: Pod、Deployment、Job、Ingress、Service等,資源型別的首字母需大寫.`
**metadata**
`描述建立資源的屬性,比如Pod的名稱,namspace、標籤等資訊.`
**spec**
> specification of the resource content: 指定該資源的內容,包括一些container,storage,volume以及其他k8s需要的引數,以及諸如是否在容器失敗時重新啟動容器的屬性,可在特定Kubernetes API找到完整的Kubernetes Pod屬性.
**Spec常用欄位**
```yaml
# Pod資源:
spec.containers <[]object >
spec:
containers:
- name
image # 倉庫路徑,專案名稱,使用者,映象名稱,映象標籤
ports:
- name: http
containerPort: 80
- name: https
containerPort: 443
imagePullPolicy: IfNotPresent # 映象獲取策略
# 修改映象中的預設應用:
command,args
# 標籤<最多六十三個字元>
key=value
key: 字元,數字,_-,.,# 只能以字母數字開頭及結尾
value: 可以為空, # 只能字母或者數字開頭及結尾,中間可使用:
# Always,Never,IfNotPresent
# Always: 本地不管有沒有映象都是要到倉庫去下載,本地無論有還是沒有到要去倉庫下載,就算本地有映象他也不用:
# 雖然會導致容器啟動變慢,但是可以防止被人惡意修改映象不被中招:
# Never: 永遠不下載,需要使用者手動去拖映象,映象一旦建立,不允許被更改,一旦編輯就報錯,除非刪除再建立:
# IfNotPresent: 本地不存在就去下載:
# 如果是latest標籤就是Always,否則就是IfNotPresent
```
##### Example1(給Pod打標籤示例)
```yaml
cat demo1-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-demo
namespace: default
labels:
app: myapp
tier: frontend
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
ports:
- name: http
containerPort: 80
- name: https
containerPort: 443
- name: busybox
image: busybox:latest
imagePullPolicy: IfNotPresent
command:
- "/bin/sh"
- "-c"
- "sleep 3600"
```
##### 檢視Pod標籤
```python
[root@master YAML]# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-test2 1/1 Running 0 37m run=nginx-test2
pod-demo 2/2 Running 0 2m30s app=myapp,tier=frontend
[root@master YAML]# kubectl get pods -L app
# 顯示指定資源類別物件下所有標籤的值.
NAME READY STATUS RESTARTS AGE APP
nginx-test2 1/1 Running 0 36m
pod-demo 2/2 Running 0 71s myapp
[root@master YAML]# kubectl get pods -l app
# -l才是過濾
NAME READY STATUS RESTARTS AGE
pod-demo 2/2 Running 0 84s
```
##### **修改標籤**
```yaml
# 如果期望將金絲雀改變為穩定版,覺得版本釋出沒問題,可以改過去
kubectl label pods pod-demo release=canar
# 標籤不能重名,如果需要重名加上--overwrite覆蓋即可.
kubectl label pod pod-demo release=stable --overwrite
# 修改節點標籤
kubectl label nodes node1 disktype=ssd
```
##### **標籤選擇器**
`等值關係: =,==,!=都表示等值關係`
```python
kubectl get pods -l release=stable,app --show-labels
NAME READY STATUS RESTARTS AGE LABELS
pod-demo 2/2 Running 0 11m app=myapp,release=stable,tier=frontend
# 集合關係:
# KEY in (VALUE1,VALUE2...)
# KEY notin (VALUE1,VALUE2...)
```
**nodeSelector