K8S實用整理(10)-Kubernetes配置POD內核參數sysctl


測試環境/生產環境中,docker創建oracle容器時,需配置一些內核參數--sysctl,以保證oracle或其他應用正常運行,創建命令如下。

 

docker run -itd --restart=always --net=host \
--name=centos01 --hostname=centos01 \
--sysctl kernel.msgmnb=13107200 \
--sysctl kernel.msgmni=256 \
--sysctl kernel.msgmax=65536 \
--sysctl kernel.shmmax=69719476736 \
--sysctl kernel.sem='500 256000 250 1024' \
-v /mnt:/update \
centos /bin/bash


docker exec centos01 sysctl -a |grep -E \
'kernel.msgmnb|kernel.msgmni|kernel.msgmax|kernel.shmmax|kernel.sem'
--sysctl kernel.msgmnb=13107200 \
--sysctl kernel.msgmni=256 \
--sysctl kernel.msgmax=65536 \
--sysctl kernel.shmmax=69719476736 \
--sysctl kernel.sem='500 256000 250 1024' \
-v /mnt:/update \
centos /bin/bash


docker exec centos01 sysctl -a |grep -E \
'kernel.msgmnb|kernel.msgmni|kernel.msgmax|kernel.shmmax|kernel.sem'
  



docker run -itd --restart=always --net=macvlan_br0 --ip=21.1.9.11 \
--name=U00-DB1 --hostname=U00-DB1 \
--sysctl kernel.msgmnb=13107200 \
--sysctl kernel.msgmni=256 \
--sysctl kernel.msgmax=65536 \
--sysctl kernel.shmmax=69719476736 \
--sysctl kernel.sem='500 256000 250 1024' \
-v /mnt/update:/update \
172.28.2.2:4000/rh6-db1:20171212 /bin/bash
View Code

 

那么k8s創建POD時,需要怎么處理呢?

1、在對應節點修改kubelet啟動參數,Enabling Unsafe Sysctls

修改方法參見:K8S實用整理(08)-kubelet啟動參數修改方法(配置Enabling Unsafe Sysctls)   http://www.cnblogs.com/DaweiJ/articles/8529706.html

kubelet --experimental-allowed-unsafe-sysctls 'kernel.msg*,kernel.shmmax,kernel.sem,net.ipv4.route.min_pmtu'

2、編輯pod.yml

apiVersion: v1
kind: Pod
metadata:
  name: centos1
  labels:
    app: test
  annotations:
    security.alpha.kubernetes.io/unsafe-sysctls: kernel.msgmnb=13107200,kernel.msgmni=256,kernel.msgmax=65536,kernel.shmmax=69719476736,kernel.sem=500 256000 250 1024
spec:
#  restartPolicy: Always
  nodeSelector:
    cslckind1: test
  containers:
  - name: centos1
    image: 172.28.2.2:4000/sie:20180112
#    imagePullPolicy: IfNotPresent
    command:
    - sleep
    - "360000"
#    - /bin/bash
#    - while true; do sleep 1; done
#    ports:
#    - containerPort: 80
#      protocol: TCP

  

3、node1添加label

kubectl label node node1 cslckind1=test

4、創建pod查看

daweij@master:~/stady01/ipctest$ kubectl apply -f centos1.yml 
pod "centos1" created

若對應節點kubelet未配置,則會報下述類似錯誤:

 

daweij@master:~/stady01/ipctest$ kubectl get pods --show-all
NAME                                   READY     STATUS              RESTARTS   AGE
centos1                                0/1       SysctlForbidden     0          20m

配置正確后,查看結果為:

 

daweij@master:~/stady01/ipctest$ kubectl get pod
NAME                                   READY     STATUS    RESTARTS   AGE
busybox-7c6c97f7cb-jnh4f               1/1       Running   1          22h
centos1                                1/1       Running   0          3s
daweij@master:~/stady01/ipctest$ kubectl exec centos1 -i -t /bin/bash
[root@centos1 /]# sysctl -a |grep -E 'kernel.msgmnb|kernel.msgmni|kernel.msgmax|kernel.shmmax|kernel.sem'
kernel.msgmax = 65536
kernel.msgmnb = 13107200
kernel.msgmni = 256
error: "Operation not permitted" reading key "kernel.unprivileged_userns_apparmor_policy"
kernel.sem = 500	256000	250	1024
kernel.sem_next_id = -1
kernel.shmmax = 69719476736
error: "Input/output error" reading key "net.ipv6.conf.all.stable_secret"
error: "Input/output error" reading key "net.ipv6.conf.default.stable_secret"
error: "Input/output error" reading key "net.ipv6.conf.eth0.stable_secret"
error: "Input/output error" reading key "net.ipv6.conf.lo.stable_secret"

  


 

官網相關內容:

https://kubernetes.io/docs/concepts/cluster-administration/sysctl-cluster/

Enabling Unsafe Sysctls

With the warning above in mind, the cluster admin can allow certain unsafe sysctls for very special situations like e.g. high-performance or real-time application tuning. Unsafe sysctls are enabled on a node-by-node basis with a flag of the kubelet, e.g.:

$ kubelet --experimental-allowed-unsafe-sysctls 'kernel.msg*,net.ipv4.route.min_pmtu' ... 

For minikube, this can be done via the extra-config flag:

$ minikube start --extra-config="kubelet.AllowedUnsafeSysctls=kernel.msg*,net.ipv4.route.min_pmtu"... 

Only namespaced sysctls can be enabled this way.

Setting Sysctls for a Pod

The sysctl feature is an alpha API in Kubernetes 1.4. Therefore, sysctls are set using annotations on pods. They apply to all containers in the same pod.

Here is an example, with different annotations for safe and unsafe sysctls:

apiVersion: v1 kind: Pod metadata: name: sysctl-example annotations: security.alpha.kubernetes.io/sysctls: kernel.shm_rmid_forced=1 security.alpha.kubernetes.io/unsafe-sysctls: net.ipv4.route.min_pmtu=1000,kernel.msgmax=1 2 3 spec: ... 

Note: a pod with the unsafe sysctls specified above will fail to launch on any node which has not enabled those two unsafe sysctls explicitly. As with node-level sysctls it is recommended to use taints and toleration feature or taints on nodes to schedule those pods onto the right nodes.

PodSecurityPolicy Annotations

The use of sysctl in pods can be controlled via annotations on the PodSecurityPolicy.

Here is an example, it authorizes binding user creating pod with corresponding safe and unsafe sysctls.

apiVersion: extensions/v1beta1 kind: PodSecurityPolicy metadata: name: sysctl-psp annotations: security.alpha.kubernetes.io/sysctls: 'kernel.shm_rmid_forced' security.alpha.kubernetes.io/unsafe-sysctls: 'net.ipv4.route.*,kernel.msg*' spec: ...

  

 


 kubenetes相關內容如下:

背景介紹

sysctl是一個允許改變正在運行中的Linux系統內核參數的接口。

可以通過sysctl修改Linux系統內核中的TCP/IP 堆棧和虛擬內存系統的高級選項,而且不需要重新啟動Linux系統,就可以實現優化Linux系統和提高應用進程運行性能。

通過Linux系統中的/proc虛擬文件系統來實現動態配置Linux系統內核參數,在/proc/sys目錄下有Linux系統絕大多數的內核參數。

這些內核參數可以在Linux系統運行時進行修改,並且不需要重新啟動Linux系統便可以立刻生效。

但是這種修改在重新啟動Linux系統后便會失效,要是想永久生效的話,需要更改配置文件/etc/sysctl.conf中相應的內核參數配置項

可以通過下面命令獲取sysctl可以操作的所有內核參數配置項和已經配置的數值:

# sysctl –a

 

這些內核參數主要包括下面幾類配置項:

  • 全局內核配置項:以“kernel.”為配置項前綴,舉例:
  1. kernel.shmmax = 33554432(共享內存段的最大尺寸,以字節為單位)
  2. kernel.threads-max = 139264(Linux內核所能使用的線程最大數量)
  • 網絡配置項:以“net.”為配置項前綴,舉例:
  1. net.ipv4.ipfrag_low_thresh = 196608(用於IP分片匯聚的最小內存用量)
  2. net.ipv4.ipfrag_high_thresh = 262144(用於IP分片匯聚的最大內存用量)
  • 虛擬內存配置項:以“vm.”為配置項前綴,舉例:
  1. vm.swappiness = 60(減少系統對於swap頻繁的寫入,將加快應用程序之間的切換,有助於提升系統性能)
  2. vm.dirty_ratio = 40(該文件表示如果進程產生的廢數據到達系統整體內存的百分比,此時進程自信把廢數據寫回磁盤)
  • 設備專用配置項:以“dev.”為配置項前綴,舉例:
  1. dev.raid.speed_limit_max = 200000(需要初始化同步RAID的同步最大速度限制)
  2. dev.raid.speed_limit_min = 1000(需要初始化同步RAID的同步最小速度限制)
  • 文件系統專用配置項:以“fs.”為配置項前綴
  1. fs.file-max = 779703(可以分配的文件句柄的最大數目)
  2. fs.file-nr = 3930 0 779703(已分配文件句柄的數目,已使用文件句柄的數目,文件句柄的最大數目,該文件是只讀的,僅用於顯示信息)

 


 

容器相關內核參數

上面介紹了通過sysctl可以操作Linux系統內核參數,在這些內核參數中,有些不但是操作系統全局級別的內核參數,還是命名空間級別的內核參數。

對於容器來說,是通過命名空間實現隔離的,那么就意味着這些命名空間級別的參數是容器相關的內核參數。

Linux系統命名空間的分類如下:

命名空間級別的內核參數包括:

  • kernel.shm*(內核中共享內存相關參數),舉例:
  1. kernel.shmall = 3774873(可以使用的共享內存的總量)
  2. kernel.shmmax = 15461882265(單個共享內存段的最大值)
  • kernel.msg*(內核中SystemV消息隊列相關參數)
  1. kernel.msgmnb = 16384(每個消息隊列的最大字節限制)
  2. kernel.msgmni = 128(同時運行的最大的消息隊列個數)
  • kernel.sem(內核中信號量參數)
  1. kernel.sem = 250 32000 100 128(每個信號集中的最大信號量數目、系統范圍內的最大信號量總數目、每個信號發生時的最大系統操作數目、系統范圍內的最大信號集總數目)
  • fs.mqueue.*(內核中POSIX消息隊列相關參數)
  1. fs.mqueue. msg_max = 32678(隊列里緩存的軟最大消息數目)
  2. fs.mqueue. msgsize_max = 8192(最大消息長度上限)
  • net.*(內核中網絡配置項相關參數)
  1. net.ipv4.ipfrag_low_thresh = 196608(用於IP分片匯聚的最小內存用量)
  2. net.ipv4.ipfrag_high_thresh = 262144(用於IP分片匯聚的最大內存用量)

新特性

docker 1.12之后版本支持--sysctl修改容器相關內核參數

因為sysctl可以修改命名空間級別的內核參數,所以在Kubernetes1.4中通過sysctl來配置POD中Linux內核參數的功能

通過修改POD中Linux內核參數,可以優化POD性能,提升POD中容器運行效率。在Kubernetes1.4中這還是一個阿爾法特性。

修改Linux內核參數存在安全風險,修改錯誤很可能會降低系統性能,甚至會引起系統崩潰,所以需要謹慎對待。

在Kubernetes1.4中將命名空間級別的內核參數分成了兩類,一類是安全的內核參數,一類是不安全的內核參數

所謂安全的命名空間級別內核參數,就是要能夠實現相同節點上不同POD之間的完全隔離,要滿足如下條件:

  1. 不能對相同節點上其他POD產生任何影響
  2. 不能對節點上操作系統健康造成影響
  3. 不能在POD資源限制以外獲取更多的CPU和內存資源

根據上面三個條件可以發現,大多數的命名空間級別內核參數都不是安全的。

在Kubernetes1.4中,認為下面的命名空間級別內核參數是安全的:

  1. kernel.shm_rmid_forced = 1(表示是否強制將共享內存和一個進程聯系在一起,這樣的話可以通過殺死進程來釋放共享內存)
  2. net.ipv4.ip_local_port_range =1024 65000(表示允許使用的端口范圍)
  3. net.ipv4.tcp_syncookies = 1(表示是否打開TCP同步標簽,同步標簽可以防止一個套接字在有過多試圖連接時引起過載)

在Kubernetes以后的版本中,還會繼續擴充安全的命名空間級別內核參數。

在Kubernetes中,所有安全的命名空間級別內核參數默認都是啟用狀態的,所有不安全的命名空間級別內核參數默認都是禁用狀態的,如果想設置不安全的內核參數,需要Kubernetes管理員手工啟用

如果管理員沒有手工啟用不安全的內核參數,那么Kubernetes仍然會進行調度,將這些帶有不安全內核參數的POD分配到節點上,但是這些POD在啟動時會失敗。

在啟動kubelet時通過增加參數“experimental-allowed-unsafe-sysctls”來啟用不安全的命名空間級別內核參數:

可以在POD配置文件中設置已經被啟用的命名空間級別內核參數:

上面的配置文件在POD中設置了安全的命名空間級內核參數:kernel.shm_rmid_forced;

並且在POD中設置了兩個不安全的命名空間級內核參數:net.ipv4.route.min_pmte和kernet.msgmax

在annotations中的“security.alpha.kubernetes.io/sysctls”參數上設置安全的命名空間級內核參數,

在annotations中的“security.alpha.kubernetes.io/unsafe-sysctls”參數上設置不安全的命名空間級內核參數。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM