我想在macOS主机上运行的CentOS docker容器内运行Kubernetes v1.13.5
单元测试。我尝试运行kubeadm
时遇到错误,因为它不喜欢启用交换功能。
1)我尝试了kubeadm init --fail-swap-on=false
,但得到了Error: unknown flag: --fail-swap-on
。也许仅在较早的k8s中受支持,但文档似乎不清楚。
2)我尝试过
kubeadm init --config /etc/kubernetes/kubeadm-config.yaml --ignore-preflight-errors=all --skip-token-print
与/etc/kubernetes/kubeadm-config.yaml
一样
---
apiVersion: kubeadm.k8s.io/v1alpha3
controlPlaneEndpoint: ""
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: k8s.gcr.io
kind: ClusterConfiguration
networking:
podSubnet: "10.244.0.0/16"
serviceSubnet: "10.96.0.0/12"
kubernetesVersion: "v1.13.5"
failSwapOn: false
但是这给了... error execution phase wait-control-plane: couldn't initialize a Kubernetes cluster", ... SNIP ... error unmarshaling JSON: while decoding JSON: json: unknown field \"failSwapOn\""
3)我尝试关闭容器内的swap,但得到...
docker run -i -t centos
[root @ 2ed611b32f1a /]#swapoff -a
swapoff:不是超级用户。
或在privileged
模式下运行但不影响设置
docker run --privileged -i -t centos
[root@94f9a0e5e46a /]# swapoff -a
[root@94f9a0e5e46a /]# free -h
total used free shared buff/cache available
Mem: 12Gi 371Mi 11Gi 1.0Mi 1.1Gi 12Gi
Swap: 2.0Gi 0B 2.0Gi
4)我尝试了docker run --memory 256M --memory-swap 256M
之类的标志,但尽管not honoured inside the container表示...,这些标志还是https://docs.docker.com/config/containers/resource_constraints/。
从交换中获取容器
如果--memory和--memory-swap设置为相同的值,则可以防止 容器使用任何交换。这是因为--memory-swap是 可以使用的组合内存和交换的数量,而--memory是 只能使用的物理内存量。
5)我尝试在笔记本电脑上的Docker桌面v2.1.0.3中通过其UI中的首选项调整交换设置,但这不会让我将交换降低到512.0 MiB以下。
您能建议使k8在macOS主机上运行的CentOS docker容器中运行吗??
答案 0 :(得分:1)
我认为问题可能出在您的kubeadm apiVersion
上!您有一个已弃用的旧版本v1alpha3
,强烈建议here迁移旧配置以使用更新的api v1beta1
在Kubernetes 1.11和更高版本中,可以使用kubeadm config print命令打印出默认配置。建议您使用kubeadm config migrate命令将旧的v1alpha3配置迁移到v1beta1,因为v1alpha3将在Kubernetes 1.14中删除。
答案 1 :(得分:0)
我的第六次尝试(最终成功)是这样。请参阅下面的最后4行。
kubeadm init --config /etc/kubernetes/kubeadm-config.yaml --ignore-preflight-errors=all --skip-token-print
kubeadm-config.yaml
看起来像...
---
apiVersion: kubeadm.k8s.io/v1alpha3
controlPlaneEndpoint: ""
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: k8s.gcr.io
kind: ClusterConfiguration
networking:
podSubnet: "10.244.0.0/16"
serviceSubnet: "10.96.0.0/12"
kubernetesVersion: "v1.13.5"
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
failSwapOn: false
答案 2 :(得分:0)
如果您决定启用交换,那么我猜您的工作负载可能需要它。
对于那些选择此选项作为默认解决方案的读者,我将为其添加一个较小的免责声明。
Kubelet似乎无法在启用交换功能的情况下正常工作-如您在Kubeadm installation中所见,K8S对此主题非常清楚:
禁止交换。您必须禁用交换才能使kubelet正常工作 正确。
我建议阅读有关Evicting end-user Pods以及K8S提供的用于优先安排豆荚内存的相关功能的信息:
1)The 3 qos classes-确保您的高优先级工作负载正在与Guaranteed
(或至少Burstable
)类一起运行。