【问题标题】:k8s running inside CentOS docker container running on my macOS host - swap problems?在我的 macOS 主机上运行的 CentOS docker 容器中运行的 k8s - 交换问题?
【发布时间】:2019-10-03 11:06:02
【问题描述】:

我想在 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) 我尝试关闭容器内的交换,但我得到...

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 desktop v2.1.0.3 中通过其 UI 中的首选项调整交换设置,但它不会让我将交换减少到 512.0 MiB 以下。

您能否建议一种方法让 k8s 在我的 macOS 主机上运行的 CentOS docker 容器中运行

【问题讨论】:

    标签: docker kubernetes


    【解决方案1】:

    我认为问题可能出在您的 apiVersion kubeadm 上!您有一个旧的已弃用版本,即 v1alpha3 强烈建议 here 迁移旧配置以使用较新的 api,即 v1beta1

    在 Kubernetes 1.11 及更高版本中,可以使用 kubeadm config print 命令打印出默认配置。建议您使用 kubeadm config migrate 命令将旧的 v1alpha3 配置迁移到 v1beta1,因为 v1alpha3 将在 Kubernetes 1.14 中被删除。

    【讨论】:

    • 谢谢 (+1)。根据您的建议,我提高了我的 apiVersion,但根本原因不同,所以我添加了一个单独的答案来解释我是如何让它工作的。
    【解决方案2】:

    我的第 6 次(也是最终成功的)尝试是这样的。请参阅下面的最后 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
    

    【讨论】:

      【解决方案3】:

      如果您决定启用交换,那么我猜您的工作负载可能需要它。

      我将为那些选择此选项作为默认解决方案的读者添加一个较小的免责声明,而不管是否有特定的工作负载。

      Kubelet 似乎没有设计为在启用交换的情况下正常工作 - K8S 非常清楚这个主题,正如您在 Kubeadm installation 中看到的那样:

      交换已禁用。您必须禁用交换才能使 kubelet 工作 正确。

      我建议阅读 Evicting end-user Pods 以及 K8S 提供的用于优先考虑 pod 内存的相关功能:

      1 ) The 3 qos classes - 确保您的高优先级工作负载使用 Guaranteed(或至少 Burstable)类运行。

      2)Pod Priority and Preemption.

      【讨论】:

        猜你喜欢
        • 2022-10-06
        • 2019-10-13
        • 1970-01-01
        • 2023-01-08
        • 2019-08-25
        • 2020-04-24
        • 2014-03-22
        • 1970-01-01
        • 2021-07-08
        相关资源
        最近更新 更多