本文章參考:http://www.kubeasy.com/
一、基礎概念
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次表示未就緒