k8s node为什么需要关闭selinux与swap

1、关闭selinux

centos关闭方法:

setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
reboot

注意查看centos与ubunutu可能不同,而且ubuntu部分发行版本默认就没装selinux,且关闭方式可能与centos不同,视具体情况而定

为什么k8s集群需要关闭这个

1、selinux安全机制较复杂,可能会与k8s本身的流量机制冲突,因为k8s本身会在netfilter里设置
流量规则,也即:iptables规则

2、这是允许容器访问主机文件系统所必需的,而这些操作是为了例如 Pod 网络工作正常,

官方文档解释:

Setting SELinux in permissive mode by runningsetenforce 0andsed …effectively disables it.
This is required to allow containers to access the host filesystem, which is needed by pod networks for example.
You have to do this until SELinux support is improved in the kubelet.

参考此官方文档链接,在基于red hat发行版的那部分有相关说明,red hat需要做这个,ubunutu按需,因为部分版本默认没有selinux

2、关闭swap

在进行部署 Kubernetes 时,我们往往会发现这样一种场景:官方强烈建议在环境初始化时关闭 Swap 空间 。比如在进行 K8S 相关操作时,给予如下提示:

Running with swap on is not supported, please disable swap! or set --fail-swap-on flag to false

或者抛以下错误信息:

[ERROR Swap]: running with swap on is not supported. Please disable swap

针对 Kubernetes ,为什么要禁用 Swap呢

1、基于其出发点,k8s希望将资源限制在一个严格,精确可控范围内:

Kubernetes 云原生的实现目的是将运行实例紧密包装到尽可能接近 100%:
所有的部署、运行环境应该与 CPU 以及内存限定在一个可控的空间内。所以如果调度程序发送一个 Pod 到某一台节点机器,它不应该使用 Swap。如果使用swap,则其实node的pod使用内存总和可能超过了node的内存,这样其实就达不到资源的严格限制和管理的目的

原因参考:

Support for swap is non-trivial. Guaranteed pods should never require swap. Burstable pods should have their requests met without requiring swap. BestEffort pods have no guarantee. The kubelet right now lacks the smarts to provide the right amount of predictable behavior here across pods.

The reason for this, as I understand it, is that the kubelet isn’t designed to handle swap situations and the Kubernetes team aren’t planning to implement this as the goal is that pods should fit within the memory of the host.

官方讨论issue:

https://github.com/kubernetes/kubernetes/issues/53533

2、为了性能和服务的稳定性

若开启 Swap ,将会减慢速度。因此,关闭 Swap 也有一部分是为了性能考虑。
原因是kubelet不是为了处理交换情况而设计的,Kubernetes团队不打算实现这一点,因为目标是pod应该适合主机的内存。打开这个之后,不稳定,pod可能使用内存也可以使用交换,这样对服务不稳定,而且无法保证pod申请的内存应该是真正使用的内存,
还可能运行运行着,服务用的内存越来越多,导致已有服务可能部分内存不用的时候释放掉,再申请的时候是被分配到swap了,效率就变了,
这样引发的问题很难定位,也很难确定,出现未定义行为

3、默认不允许,如果需要也确实可以打开,kubelet的–fail-swap-on flag可以控制:

这个flag表示为:Makes the Kubelet fail to start if swap is enabled on the node.
如果为true(默认值)就要求必须要关闭swap,false是表示即使宿主开启了swap,kubelet也是可以成功启动,但是pod是允许使用swap了,这部分代码因为经常出问题,所以直接swap在宿主上禁用会比较好。

检查swap是否打开:

1、free -h

有swap的时候,free -h应该是这样:
free -h
               total        used        free      shared  buff/cache   available
Mem:            11Gi       1.2Gi       6.3Gi        41Mi       4.3Gi        10Gi
Swap:          975Mi          0B       975Mi


没有swap的时候,free -h应该是这样:
free -h
              total        used        free      shared  buff/cache   available
Mem:           15Gi       1.1Gi       167Mi       2.0Mi        14Gi        14Gi
Swap:            0B          0B          0B

2、blkid

有swap的时候,blkid应该是这样:
blkid
/dev/mapper/vgubuntu-swap_1: UUID="066b66e6-7ffc-4f2e-ab72-5078313b17c9" TYPE="swap"
/dev/mapper/vgubuntu-root: UUID="38b831fc-df0b-4777-90e3-3f62624b9358" BLOCK_SIZE="4096" TYPE="ext4"
/dev/sr0: BLOCK_SIZE="2048" UUID="2022-08-17-13-52-40-00" LABEL="CDROM" TYPE="iso9660


没有swap的时候,blkid应该是这样:
/dev/vda2: UUID="09170560-d4c0-4658-8fbd-75a7a1445fed" TYPE="ext4" PARTUUID="5c2be174-8542-4868-a01a-43cdfc75640d"
/dev/vdb1: LABEL="vdb1" UUID="ee4580a3-b4c5-49ca-b8c2-77aa31435019" TYPE="ext4" PARTUUID="1203cde3-273c-4b4e-abea-7cd998842e35"
/dev/sr0: UUID="2022-09-28-22-28-08-00" LABEL="cidata" TYPE="iso9660"
/dev/loop0: TYPE="squashfs"
/dev/loop1: TYPE="squashfs"
/dev/loop2: TYPE="squashfs"
/dev/loop3: TYPE="squashfs"
/dev/loop4: TYPE="squashfs"
/dev/loop5: TYPE="squashfs"

3、lsblk

有swap的时候,lsblk应该是这样:
lsblk
NAME                MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
fd0                   2:0    1     4K  0 disk 
loop0                 7:0    0     4K  1 loop /snap/bare/5
loop2                 7:2    0 236.5M  1 loop /snap/code/113
loop3                 7:3    0  45.9M  1 loop /snap/snap-store/638
loop4                 7:4    0   304K  1 loop /snap/snapd-desktop-integration/43
loop5                 7:5    0 243.1M  1 loop /snap/code/114
loop6                 7:6    0  63.2M  1 loop /snap/core20/1695
loop7                 7:7    0  63.2M  1 loop /snap/core20/1738
loop8                 7:8    0 116.7M  1 loop /snap/core/14399
loop9                 7:9    0 346.3M  1 loop /snap/gnome-3-38-2004/115
loop10                7:10   0 346.3M  1 loop /snap/gnome-3-38-2004/119
loop11                7:11   0  81.3M  1 loop /snap/gtk-common-themes/1534
loop12                7:12   0  91.7M  1 loop /snap/gtk-common-themes/1535
loop13                7:13   0  37.1M  1 loop /snap/hunspell-dictionaries-1-7-2004/2
loop14                7:14   0  49.6M  1 loop /snap/snapd/17883
loop15                7:15   0  45.9M  1 loop /snap/snap-store/599
loop16                7:16   0 237.5M  1 loop /snap/firefox/2154
loop17                7:17   0  49.6M  1 loop 
loop19                7:19   0   284K  1 loop /snap/snapd-desktop-integration/14
loop20                7:20   0 237.6M  1 loop /snap/firefox/2088
sda                   8:0    0    40G  0 disk 
├─sda1                8:1    0     1M  0 part 
├─sda2                8:2    0   513M  0 part /boot/efi
└─sda3                8:3    0  39.5G  0 part 
  ├─vgubuntu-root   253:0    0  38.5G  0 lvm  /var/snap/firefox/common/host-hunspell
  │                                           /
  └─vgubuntu-swap_1 253:1    0   976M  0 lvm  [SWAP]
sr1                  11:1    1  1024M  0 rom  


没有swap的时候,lsblk应该是这样:
lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
loop0    7:0    0 61.9M  1 loop /snap/core20/1518
loop1    7:1    0 63.2M  1 loop /snap/core20/1623
loop2    7:2    0 67.2M  1 loop /snap/lxd/21835
loop3    7:3    0 67.8M  1 loop /snap/lxd/22753
loop4    7:4    0   47M  1 loop /snap/snapd/16010
loop5    7:5    0   48M  1 loop /snap/snapd/17029
sr0     11:0    1  368K  0 rom
vda    252:0    0   40G  0 disk
├─vda1 252:1    0    1M  0 part
└─vda2 252:2    0   40G  0 part /
vdb    252:16   0  500G  0 disk
└─vdb1 252:17   0  500G  0 part /data

关闭swap方法:

临时关闭swap分区,当前会话生效,重启失效
swapoff  -a

永久关闭swap分区
sed -ri 's/.*swap.*/#&/' /etc/fstab 

ubuntu关闭swap时的特殊情况: 参考此连接进行变更

Debian 默认使用 systemd 接管 swap 的挂载。systemd 对于交换分区的激活方式都是通过 /usr/lib/systemd/system-generators 中的可执行文件,具体可分为两种:

systemd-fstab-generator:读取 fstab
systemd-gpt-auto-generator:检查根磁盘,只在 GPT 磁盘上使用,通过 GUID 类型识别交换分区
因此只修改 /etc/fstab 是不够的,必须对 systemd 相关的设置进行修改。

具体地,执行 systemctl --type swap --all,查看所有与 swap 相关的 systemd 项:
之后执行 systemctl mask dev-xxx.swap,即可关闭相关项。重启之后 swap 分区就不会再被挂载。
Logo

开源、云原生的融合云平台

更多推荐