一、基礎概念
1、Master節點
整個叢集的控制中樞。Master節點是Kubernetes叢集的控制節點,在生產環境中不建議部署叢集核心元件外的任何Pod,公司業務的Pod更是不建議部署到Master節點上,以免升級或者維護時對業務造成影響。
- Kube-APIServer:叢集的控制中樞,各個模組之間資訊互動都需要經過Kube-APIServer,同時它也是叢集管理、資源配置、整個叢集安全機制的入口。
- Controller-Manager:叢集的狀態管理器,保證Pod或其他資源達到期望值,也是需要和APIServer進行通訊,在需要的時候建立、更新或刪除它所管理的資源。
- Scheduler:叢集的排程中心,它會根據指定的一系列條件,選擇一個或一批最佳的節點,然後部署我們的Pod。
- Etcd:鍵值資料庫,報錯一些叢集的資訊,一般生產環境中建議部署三個以上節點(奇數個)。
2、Node節點
也叫Worker、Node節點、Minion節點
- Kubelet:負責監聽節點上Pod的狀態,同時負責上報節點和節點上面Pod的狀態,負責與Master節點通訊,並管理節點上面的Pod。
- Kube-proxy:負責Pod之間的通訊和負載均衡,將指定的流量分發到後端正確的機器上。
- 檢視Kube-proxy工作模式:curl 127.0.0.1:10249/proxyMode
- Ipvs:監聽Master節點增加和刪除service以及endpoint的訊息,呼叫Netlink介面建立相應的IPVS規則。通過IPVS規則,將流量轉發至相應的Pod上。
- Iptables:監聽Master節點增加和刪除service以及endpoint的訊息,對於每一個Service,他都會場景一個iptables規則,將service的clusterIP代理到後端對應的Pod。
注意:kubelet,kube-proxy也可以部署在master節點上,kubernetes叢集並沒有規定master和node節點。只是我們抽象邏輯出來的概念。
3、
Pod是Kubernetes中最小的單元,Pod資源物件是一種集合了一到多個應用容器、儲存資源、專用IP及支撐容器執行的其他選項的邏輯元件。Pod代表著Kubernetes的部署單元及原子執行單元,即一個應用程式的單一執行例項,它通常由共享資源且關係緊密的一個或多個應用容器組成每個Pod還包含了一個Pause容器,Pause容器是Pod的父容器,為整個Pod提供網路基礎設施設定的,主要負責殭屍程式的回收管理,通過Pause容器可以使同一個Pod裡面的多個容器共享儲存、PID、IPC等。
3.1、Pod基礎
- 自主式pod
- 控制器管理的pod
- Replication Controller (複製控制器)
- ReplicaSet(複製集)
- Deployment (無狀態應用)
- StatefulSet (有狀態應用)
- DeamonSet (守護程式)
- HPA(HorizontalPodAutoscaler),水平pod自動伸縮控制器
- Job,Ctonjob
3.2、定義一個pod
建立pod的方式有很多,可以直接run執行,也可以定義一個yaml檔案建立。
3.2.1、直接執行的方式建立一個Pod,--image代表指定映象
[root@master yaml]# kubectl run --image=tomcat tomcat-app
pod/tomcat-app created
[root@master yaml]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-app 1/1 Running 0 31m
tomcat-app 1/1 Running 0 22s
3.2.2、用yaml檔案建立
[root@master yaml]# kubectl create -f nginx.yaml
pod/nginx-yaml created
[root@master yaml]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-app 1/1 Running 0 35m
nginx-yaml 1/1 Running 0 10s
tomcat-app 1/1 Running 0 4m5s
#yaml檔案放在下邊供大家參考,yaml檔案的欄位資訊說明也已經標上註釋
3.2.3、nginx-app1.yaml
# cat nginx-app.yaml
apiVersion: v1 # 必選,API的版本號
kind: Pod # 必選,型別Pod
metadata: # 必選,後設資料
name: nginx # 必選,符合RFC 1035規範的Pod名稱
namespace: default # 可選,Pod所在的名稱空間,不指定預設為default,可以使用-n 指定namespace
labels: # 可選,標籤選擇器,一般用於過濾和區分Pod
app: nginx
role: frontend # 可以寫多個
annotations: # 可選,註釋列表,可以寫多個
app: nginx
spec: # 必選,用於定義容器的詳細資訊
initContainers: # 初始化容器,在容器啟動之前執行的一些初始化操作
- command:
- sh
- -c
- echo "I am InitContainer for init some configuration"
image: busybox
imagePullPolicy: IfNotPresent
name: init-container
containers: # 必選,容器列表
- name: nginx # 必選,符合RFC 1035規範的容器名稱
image: nginx:latest # 必選,容器所用的映象的地址
imagePullPolicy: Always # 可選,映象拉取策略
command: # 可選,容器啟動執行的命令
- nginx
- -g
- "daemon off;"
workingDir: /usr/share/nginx/html # 可選,容器的工作目錄
volumeMounts: # 可選,儲存卷配置,可以配置多個
- name: webroot # 儲存卷名稱
mountPath: /usr/share/nginx/html # 掛載目錄
readOnly: true # 只讀
ports: # 可選,容器需要暴露的埠號列表
- name: http # 埠名稱
containerPort: 80 # 埠號
protocol: TCP # 埠協議,預設TCP
env: # 可選,環境變數配置列表
- name: TZ # 變數名
value: Asia/Shanghai # 變數的值
- name: LANG
value: en_US.utf8
resources: # 可選,資源限制和資源請求限制
limits: # 最大限制設定
cpu: 1000m
memory: 1024Mi
requests: # 啟動所需的資源
cpu: 100m
memory: 512Mi
# startupProbe: # 可選,檢測容器內程式是否完成啟動。注意三種檢查方式同時只能使用一種。
# httpGet: # httpGet檢測方式,生產環境建議使用httpGet實現介面級健康檢查,健康檢查由應用程式提供。
# path: /api/successStart # 檢查路徑
# port: 80
readinessProbe: # 可選,健康檢查。注意三種檢查方式同時只能使用一種。
httpGet: # httpGet檢測方式,生產環境建議使用httpGet實現介面級健康檢查,健康檢查由應用程式提供。
path: / # 檢查路徑
port: 80 # 監控埠
livenessProbe: # 可選,健康檢查
#exec: # 執行容器命令檢測方式
#command:
#- cat
#- /health
#httpGet: # httpGet檢測方式
# path: /_health # 檢查路徑
# port: 8080
# httpHeaders: # 檢查的請求頭
# - name: end-user
# value: Jason
tcpSocket: # 埠檢測方式
port: 80
initialDelaySeconds: 60 # 初始化時間
timeoutSeconds: 2 # 超時時間
periodSeconds: 5 # 檢測間隔
successThreshold: 1 # 檢查成功為2次表示就緒
failureThreshold: 2 # 檢測失敗1次表示未就緒
lifecycle:
postStart: # 容器建立完成後執行的指令, 可以是exec httpGet TCPSocket
exec:
command:
- sh
- -c
- 'mkdir /data/ '
preStop:
httpGet:
path: /
port: 80
# exec:
# command:
# - sh
# - -c
# - sleep 9
restartPolicy: Always # 可選,預設為Always
#nodeSelector: # 可選,指定Node節點
# region: subnet7
imagePullSecrets: # 可選,拉取映象使用的secret,可以配置多個
- name: default-dockercfg-86258
hostNetwork: false # 可選,是否為主機模式,如是,會佔用主機埠
volumes: # 共享儲存卷列表
- name: webroot # 名稱,與上述對應
emptyDir: {} # 掛載目錄
#hostPath: # 掛載本機目錄
# path: /etc/hosts
3.2.4、nginx-app2.yaml
# cat nginx-app2.yaml
apiVersion: v1 # 必選,API的版本號
kind: Pod # 必選,型別Pod
metadata: # 必選,後設資料
name: nginx # 必選,符合RFC 1035規範的Pod名稱
# namespace: default # 可選,Pod所在的名稱空間,不指定預設為default,可以使用-n 指定namespace
labels: # 可選,標籤選擇器,一般用於過濾和區分Pod
app: nginx
role: frontend # 可以寫多個
annotations: # 可選,註釋列表,可以寫多個
app: nginx
spec: # 必選,用於定義容器的詳細資訊
# initContainers: # 初始化容器,在容器啟動之前執行的一些初始化操作
# - command:
# - sh
# - -c
# - echo "I am InitContainer for init some configuration"
# image: busybox
# imagePullPolicy: IfNotPresent
# name: init-container
containers: # 必選,容器列表
- name: nginx # 必選,符合RFC 1035規範的容器名稱
image: nginx:1.15.2 # 必選,容器所用的映象的地址
imagePullPolicy: IfNotPresent # 可選,映象拉取策略, IfNotPresent: 如果宿主機有這個映象,那就不需要拉取了. Always: 總是拉取, Never: 不管是否儲存都不拉去
command: # 可選,容器啟動執行的命令 ENTRYPOINT, arg --> cmd
- nginx
- -g
- "daemon off;"
workingDir: /usr/share/nginx/html # 可選,容器的工作目錄
# volumeMounts: # 可選,儲存卷配置,可以配置多個
# - name: webroot # 儲存卷名稱
# mountPath: /usr/share/nginx/html # 掛載目錄
# readOnly: true # 只讀
ports: # 可選,容器需要暴露的埠號列表
- name: http # 埠名稱
containerPort: 80 # 埠號
protocol: TCP # 埠協議,預設TCP
env: # 可選,環境變數配置列表
- name: TZ # 變數名
value: Asia/Shanghai # 變數的值
- name: LANG
value: en_US.utf8
# resources: # 可選,資源限制和資源請求限制
# limits: # 最大限制設定
# cpu: 1000m
# memory: 1024Mi
# requests: # 啟動所需的資源
# cpu: 100m
# memory: 512Mi
# startupProbe: # 可選,檢測容器內程式是否完成啟動。注意三種檢查方式同時只能使用一種。
# httpGet: # httpGet檢測方式,生產環境建議使用httpGet實現介面級健康檢查,健康檢查由應用程式提供。
# path: /api/successStart # 檢查路徑
# port: 80
# readinessProbe: # 可選,健康檢查。注意三種檢查方式同時只能使用一種。
# httpGet: # httpGet檢測方式,生產環境建議使用httpGet實現介面級健康檢查,健康檢查由應用程式提供。
# path: / # 檢查路徑
# port: 80 # 監控埠
# livenessProbe: # 可選,健康檢查
#exec: # 執行容器命令檢測方式
#command:
#- cat
#- /health
#httpGet: # httpGet檢測方式
# path: /_health # 檢查路徑
# port: 8080
# httpHeaders: # 檢查的請求頭
# - name: end-user
# value: Jason
# tcpSocket: # 埠檢測方式
# port: 80
# initialDelaySeconds: 60 # 初始化時間
# timeoutSeconds: 2 # 超時時間
# periodSeconds: 5 # 檢測間隔
# successThreshold: 1 # 檢查成功為2次表示就緒
# failureThreshold: 2 # 檢測失敗1次表示未就緒
# lifecycle:
# postStart: # 容器建立完成後執行的指令, 可以是exec httpGet TCPSocket
# exec:
# command:
# - sh
# - -c
# - 'mkdir /data/ '
# preStop:
# httpGet:
# path: /
# port: 80
# exec:
# command:
# - sh
# - -c
# - sleep 9
restartPolicy: Always # 可選,預設為Always,容器故障或者沒有啟動成功,那就自動該容器,Onfailure: 容器以不為0的狀態終止,自動重啟該容器, Never:無論何種狀態,都不會重啟
#nodeSelector: # 可選,指定Node節點
# region: subnet7
# imagePullSecrets: # 可選,拉取映象使用的secret,可以配置多個
# - name: default-dockercfg-86258
# hostNetwork: false # 可選,是否為主機模式,如是,會佔用主機埠
# volumes: # 共享儲存卷列表
# - name: webroot # 名稱,與上述對應
# emptyDir: {} # 掛載目錄
# #hostPath: # 掛載本機目錄
# # path: /etc/hosts
#
3.3、Pod探針
- StartupProbe:k8s 1.16版本後新加的探測方式,用於判斷容器內應用程式是否已經啟動。如果配置了startupProbe,就會先禁止其他的探測,直到它成功為止,成功後將不在進行探測。
- LivenessProbe:用於探測容器是否執行,如果探測失敗,kubelet會根據配置的重啟策略進行相應的處理。若沒有配置該探針,預設就是success。
- ReadinessProbe:一般用於探測容器內的程式是否健康,它的返回值如果為success,那麼久代表這個容器已經完成啟動,並且程式已經是可以接受流量的狀態。
3.4、Pod探針方式
- ExecAction:在容器內執行一個命令,如果返回值為0,則認為容器健康。
- TCPSocketAction:通過TCP連線檢查容器內的埠是否是通的,如果是通的就認為容器健康。
- HTTPGetAction:通過應用程式暴露的API地址來檢查程式是否是正常的,如果狀態碼為200~400之間,則認為容器健康。
3.5、Pod探針檢查引數配置
- initialDelaySeconds: 60 # 初始化時間
- timeoutSeconds: 2 # 超時時間
- periodSeconds: 5 # 檢測間隔
- successThreshold: 1 # 檢查成功為1次表示就緒
- failureThreshold: 2 # 檢測失敗2次表示未就緒