在MacOS主机上运行的CentOS docker容器内运行的k8s-交换问题吗?

时间:2019-10-03 11:06:02

标签: docker kubernetes

我想在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容器中运行吗?

3 个答案:

答案 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)类一起运行。

2)Pod Priority and Preemption