D14 kubernetes 容器服務質量和容器環境變數

Hello_worlds發表於2024-09-05

1、容器服務質量

	服務質量(quality of Services,QoS),是kubernetes用於對pod的進行優先順序劃分的一種機制。透過QoS,kubernetes將pod劃分為3個等級。如下所示
Guaranteed	優先順序最高	pod中每個容器都被設定了CPU/記憶體的資源請求和資源限制,並且資源請求的值與資源限制的值相等
Burstable	優先順序中等	pod中至少有一個容器設定了CPU或記憶體的資源請求或資源限制
BestEffort	優先順序最低	pod中沒有容器設定資源請求和資源限制
  • 建立一個QoS級別為Guaranteed的pod
[root@k8s-master k8s]# cat pod-qos1.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-qos1
spec:
  containers:
  - name: web
    image: uhub.service.ucloud.cn/librarys/nginx:1.23
    resources:
      # 資源請求
      requests:
        memory: "500Mi"
        cpu: "200m"
      # 資源限制
      limits:
        memory: "500Mi"
        cpu: "200m"
[root@k8s-master k8s]# kubectl apply -f pod-qos1.yaml
pod/pod-qos1 created
[root@k8s-master k8s]# kubectl describe pod pod-qos1 | grep "QoS"
QoS Class:                   Guaranteed
  • 建立一個QoS級別為Burstable的pod
[root@k8s-master k8s]# cat pod-qos2-Burstable.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-qos2
spec:
  containers:
  - name: web
    image: uhub.service.ucloud.cn/librarys/nginx:1.23
    resources:
      # 資源請求
      requests:
        memory: "500Mi"
      # 資源限制
      limits:
        memory: "500Mi"
[root@k8s-master k8s]# kubectl apply -f pod-qos2-Burstable.yaml
pod/pod-qos2 created
[root@k8s-master k8s]# kubectl describe pod pod-qos2 | grep "QoS"
QoS Class:                   Burstable
  • 建立一個QoS級別為BestEffort的pod
[root@k8s-master k8s]# cat pod-qos3-BestEffort.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-qos3
spec:
  containers:
  - name: web
    image: uhub.service.ucloud.cn/librarys/nginx:1.23
[root@k8s-master k8s]# kubectl apply -f pod-qos3-BestEffort.yaml
pod/pod-qos3 created
[root@k8s-master k8s]# kubectl describe pod pod-qos3 | grep "QoS"
QoS Class:                   BestEffort
	綜上所述,pod的QoS級別是由資源請求和資源限制決定的。瞭解pod的QoS級別對於管理和最佳化叢集資源分配提供了有效的依據,具有以下作用
資源分配最佳化:瞭解pod 的QoS級別有助於更好的理解和規劃資源分配,透過針對不同QoS級別的pod採取不同的資源排程策略,可以最大程度提高叢集的資源利用率
故障恢復:當節點發生故障或資源不足時,kubernetes會優先保留Guaranteed級別的pod,並終止或重啟低階別的pod,以保護叢集的穩定性。因此,QoS級別可以幫助預測哪些pod可能受到影響,並相應的設計故障恢復機制
	為了提高應用程式的服務質量,可以根據應用程式的需求設定合適的QoS級別,如將核心應用設定為Guaranteed級別,將常規應用設定為Burstable級別。

2、容器環境變數

	在pod配置中,env欄位用於設定容器的環境變數。透過環境變數,可以向容器中傳遞資料,如配置資訊、授權憑據等。容器中的應用程式可以讀取這些環境以獲取資料並使用
  • 環境變數配置示例如下:
[root@k8s-master k8s]# cat pod-env.yaml
apiVersion: v1
kind: Pod
metadata:
  labels:
    app: pod-env
  name: pod-env
spec:
  containers:
  - name: web
    image: uhub.service.ucloud.cn/librarys/nginx:1.23
    env:
    - name: API_URL
      value: "https://172.16.99.71/api"
    - name: API_KEY
      value: "LuNOpq"
在上述配置中,容器設定了兩個環境變數。分別是API_URL和API_KEY
[root@k8s-master k8s]# kubectl apply -f pod-env.yaml
pod/pod-env created
[root@k8s-master k8s]# kubectl exec -it pod-env -- bash
容器中應用程式可以透過讀取這兩個環境變數來獲取API連線資訊
root@pod-env:/# echo $API_URL
https://172.16.99.71/api
root@pod-env:/# echo $API_KEY
LuNOpq
	另外,kubernetes還提供了 DownwardAPI功能,該功能允許容器獲取與pod 相關的後設資料資訊。如pod的名稱、名稱空間、ip地址等。配置示例如下
[root@k8s-master k8s]# cat pod-env-info.yaml
apiVersion: v1
kind: Pod
metadata:
  labels:
    app: pod-env-info
  name: pod-env-info
spec:
  containers:
  - name: web
    image: uhub.service.ucloud.cn/librarys/nginx:1.23
    env:
    - name: MY_NODE_NAME
      valueFrom:
        fieldRef:
          fieldPath: spec.nodeName
    - name: MY_POD_NAME
      valueFrom:
        fieldRef:
          fieldPath: metadata.name
    - name: MY_POD_NAMESPACE
      valueFrom:
        fieldRef:
          fieldPath: metadata.namespace
    - name: MY_POD_IP
      valueFrom:
        fieldRef:
          fieldPath: status.podIP
[root@k8s-master k8s]# kubectl apply -f pod-env-info.yaml
pod/pod-env-info created
[root@k8s-master k8s]# kubectl exec -it pod-env-info -- bash
root@pod-env-info:/# echo -e "$MY_NODE_NAME\t$MY_POD_NAME\t$MY_POD_NAMESPACE\t$MY_POD_IP"
k8s-node02	pod-env-info	default	10.244.58.238
  • 在上述配置中,將以下pod相關資訊注入容器的環境變數中
MY_NODE_NAME:這個環境變數的值來自pod所在的節點名稱
MY_POD_NAME:這個環境變數來自pod的名稱
MY_POD_NAMESPACE:這個環境變數來自pod所在的名稱空間
MY_POD_IP:這個環境變數來自pod的ip地址
容器中的應用程式可以很方便的讀取這些環境變數,以獲取pod相關資訊

相關文章