services資源+pod詳解
一、Service
雖然每個Pod都會分配一個單獨的Pod IP,然而卻存在如下兩問題:
- Pod IP 會隨著Pod的重建產生變化
- Pod IP 僅僅是叢集內可見的虛擬IP,外部無法訪問
這樣對於訪問這個服務帶來了難度。因此,kubernetes設計了Service來解決這個問題。
Service可以看作是一組同類Pod對外的訪問介面。藉助Service,應用可以方便地實現服務發現和負載均衡。
操作一:建立叢集內部可訪問的Service
# 暴露Service
[root@master ~]# kubectl expose deploy nginx --name=svc-nginx1 --type=ClusterIP --port=80 --target-port=80 -n dev
service/svc-nginx1 exposed
# 檢視service
[root@master ~]# kubectl get svc svc-nginx1 -n dev -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
svc-nginx1 ClusterIP 10.109.179.231 <none> 80/TCP 3m51s run=nginx
# 這裡產生了一個CLUSTER-IP,這就是service的IP,在Service的生命週期中,這個地址是不會變動的
# 可以透過這個IP訪問當前service對應的POD
[root@master ~]# curl 10.109.179.231:80
<!DOCTYPE html><html><head><title>Welcome to nginx!</title></head><body><h1>Welcome to nginx!</h1>
.......</body></html>
操作二:建立叢集外部也可訪問的Service
# 上面建立的Service的type型別為ClusterIP,這個ip地址只用叢集內部可訪問# 如果需要建立外部也可以訪問的Service,需要修改type為NodePort
[root@master ~]# kubectl expose deploy nginx --name=svc-nginx2 --type=NodePort --port=80 --target-port=80 -n dev
service/svc-nginx2 exposed
# 此時檢視,會發現出現了NodePort型別的Service,而且有一對Port(80:31928/TC)
[root@master ~]# kubectl get svc svc-nginx2 -n dev -o wideNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
svc-nginx2 NodePort 10.100.94.0 <none> 80:31928/TCP 9s run=nginx
# 接下來就可以透過叢集外的主機訪問 節點IP:31928訪問服務了# 例如在的電腦主機上透過瀏覽器訪問下面的地址http://192.168.100.10:31928/
刪除Service
[root@master ~]# kubectl delete svc svc-nginx-1 -n dev
service "svc-nginx-1" deleted
配置方式
建立一個svc-nginx.yaml,內容如下:
apiVersion: v1
kind: Service
metadata:
name: svc-nginx
namespace: dev
spec:
clusterIP: 10.109.179.231 #固定svc的內網ip
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
run: nginx
type: ClusterIP
然後就可以執行對應的建立和刪除命令了:
建立:kubectl create -f svc-nginx.yaml
刪除:kubectl delete -f svc-nginx.yaml
二、pod詳解
//pod的資源清單
apiVersion: v1 #必選,版本號,例如v1
kind: Pod #必選,資源型別,例如 Pod
metadata: #必選,後設資料
name: string #必選,Pod名稱
namespace: string #Pod所屬的名稱空間,預設為"default"
labels: #自定義標籤列表
- name: string
spec: #必選,Pod中容器的詳細定義
containers: #必選,Pod中容器列表
- name: string #必選,容器名稱
image: string #必選,容器的映象名稱
imagePullPolicy: [ Always|Never|IfNotPresent ] #獲取映象的策略
command: [string] #容器的啟動命令列表,如不指定,使用打包時使用的啟動命令
args: [string] #容器的啟動命令引數列表
workingDir: string #容器的工作目錄
volumeMounts: #掛載到容器內部的儲存卷配置
- name: string #引用pod定義的共享儲存卷的名稱,需用volumes[]部分定義的的卷名
mountPath: string #儲存卷在容器內mount的絕對路徑,應少於512字元
readOnly: boolean #是否為只讀模式
ports: #需要暴露的埠庫號列表
- name: string #埠的名稱
containerPort: int #容器需要監聽的埠號
hostPort: int #容器所在主機需要監聽的埠號,預設與Container相同
protocol: string #埠協議,支援TCP和UDP,預設TCP
env: #容器執行前需設定的環境變數列表
- name: string #環境變數名稱
value: string #環境變數的值
resources: #資源限制和請求的設定
limits: #資源限制的設定
cpu: string #Cpu的限制,單位為core數,將用於docker run --cpu-shares引數
memory: string #記憶體限制,單位可以為Mib/Gib,將用於docker run --memory引數
requests: #資源請求的設定
cpu: string #Cpu請求,容器啟動的初始可用數量
memory: string #記憶體請求,容器啟動的初始可用數量
lifecycle: #生命週期鉤子
postStart: #容器啟動後立即執行此鉤子,如果執行失敗,會根據重啟策略進行重啟
preStop: #容器終止前執行此鉤子,無論結果如何,容器都會終止
livenessProbe: #對Pod內各容器健康檢查的設定,當探測無響應幾次後將自動重啟該容器
exec: #對Pod容器內檢查方式設定為exec方式
command: [string] #exec方式需要制定的命令或指令碼
httpGet: #對Pod內個容器健康檢查方法設定為HttpGet,需要制定Path、port
path: string
port: number
host: string
scheme: string
HttpHeaders:
- name: string
value: string
tcpSocket: #對Pod內個容器健康檢查方式設定為tcpSocket方式
port: number
initialDelaySeconds: 0 #容器啟動完成後首次探測的時間,單位為秒
timeoutSeconds: 0 #對容器健康檢查探測等待響應的超時時間,單位秒,預設1秒
periodSeconds: 0 #對容器監控檢查的定期探測時間設定,單位秒,預設10秒一次
successThreshold: 0
failureThreshold: 0
securityContext:
privileged: false
restartPolicy: [Always | Never | OnFailure] #Pod的重啟策略
nodeName: <string> #設定NodeName表示將該Pod排程到指定到名稱的node節點上
nodeSelector: obeject #設定NodeSelector表示將該Pod排程到包含這個label的node上
imagePullSecrets: #Pull映象時使用的secret名稱,以key:secretkey格式指定
- name: string
hostNetwork: false #是否使用主機網路模式,預設為false,如果設定為true,表示使用宿主機網路
volumes: #在該pod上定義共享儲存卷列表
- name: string #共享儲存卷名稱 (volumes型別有很多種)
emptyDir: {} #型別為emtyDir的儲存卷,與Pod同生命週期的一個臨時目錄。為空值
hostPath: string #型別為hostPath的儲存卷,表示掛載Pod所在宿主機的目錄
path: string #Pod所在宿主機的目錄,將被用於同期中mount的目錄
secret: #型別為secret的儲存卷,掛載叢集與定義的secret物件到容器內部
scretname: string
items:
- key: string
path: string
configMap: #型別為configMap的儲存卷,掛載預定義的configMap物件到容器內部
name: string
items:
- key: string
path: string
#小提示:# 在這裡,可透過一個命令來檢視每種資源的可配置項# kubectl explain 資源型別 檢視某種資源可以配置的一級屬性# kubectl explain 資源型別.屬性 檢視屬性的子屬性
[root@k8s-master01 ~]# kubectl explain pod
KIND: Pod
VERSION: v1
FIELDS:
apiVersion <string>
kind <string>
metadata <Object>
spec <Object>
status <Object>
[root@k8s-master01 ~]# kubectl explain pod.metadata
KIND: Pod
VERSION: v1
RESOURCE: metadata <Object>
FIELDS:
annotations <map[string]string>
clusterName <string>
creationTimestamp <string>
deletionGracePeriodSeconds <integer>
deletionTimestamp <string>
finalizers <[]string>
generateName <string>
generation <integer>
labels <map[string]string>
managedFields <[]Object>
name <string>
namespace <string>
ownerReferences <[]Object>
resourceVersion <string>
selfLink <string>
uid <string>
在kubernetes中基本所有資源的一級屬性都是一樣的,主要包含5部分:
1、apiVersion 版本,由kubernetes內部定義,版本號必須可以用 kubectl api-versions 查詢到
2、kind 型別,由kubernetes內部定義,版本號必須可以用 kubectl api-resources 查詢到
3、metadata 後設資料,主要是資源標識和說明,常用的有name、namespace、labels等
4、spec描述,這是配置中最重要的一部分,裡面是對各種資源配置的詳細描述
5、status狀態資訊,裡面的內容不需要定義,由kubernetes自動生成
在上面的屬性中,spec是接下來研究的重點,繼續看下它的常見子屬性:
1、containers <[]Object> 容器列表,用於定義容器的詳細資訊
2、nodeName 根據nodeName的值將pod排程到指定的Node節點上
3、nodeSelector <map[]> 根據NodeSelector中定義的資訊選擇將該Pod排程到包含這些label的Node 上
4、hostNetwork 是否使用主機網路模式,預設為false,如果設定為true,表示使用宿主機網路
5、volumes <[]Object> 儲存卷,用於定義Pod上面掛載的儲存資訊
6、restartPolicy 重啟策略,表示Pod在遇到故障的時候的處理策略
//pod配置
本小節主要來研究pod.spec.containers屬性,這也是pod配置中最為關鍵的一項配置。
[root@master01 ~]# kubectl explain pod.spec.containers
KIND: Pod
VERSION: v1
RESOURCE: containers <[ ]Object> # 陣列,代表可以有多個容器
FIELDS:
name
image
imagePullPolicy
command <[ ]string> # 容器的啟動命令列表,如不指定,使用打包時使用的啟動命令
args <[ ]string> # 容器的啟動命令需要的引數列表
env <[ ]Object> # 容器環境變數的配置
ports <[ ]Object> # 容器需要暴露的埠號列表
resources