在集群节点

时间:2016-12-22 08:11:34

标签: elasticsearch kubernetes google-kubernetes-engine

我尝试在Google容器引擎上的群集节点上安装ElasticSearch(最新),但ElasticSearch需要变量:vm.max_map_count为> = 262144。

如果我ssh到每个节点,我手动运行:

sysctl -w vm.max_map_count=262144

一切顺利,但任何新节点都没有指定的配置。

所以我的问题是:

有没有办法在启动时在每个节点上加载系统配置? Deamon Set不是一个好的解决方案,因为在docker容器中,系统变量是只读的。

我正在使用带有gci节点图像的全新集群。

3 个答案:

答案 0 :(得分:10)

我在查看this repository时找到了另一种解决方案。

它依赖于an init container的使用,正面是只有init容器以特权运行:

annotations:
    pod.beta.kubernetes.io/init-containers: '[
      {
      "name": "sysctl",
        "image": "busybox",
        "imagePullPolicy": "IfNotPresent",
        "command": ["sysctl", "-w", "vm.max_map_count=262144"],
        "securityContext": {
          "privileged": true
        }
      }
    ]'

自Kubernetes 1.6以来,还有一种新的语法可用于1.7。从1.8开始,这个新语法是必需的。 init容器的声明被移动到spec

  - name: init-sysctl
    image: busybox
    command:
    - sysctl
    - -w
    - vm.max_map_count=262144
    imagePullPolicy: IfNotPresent
    securityContext:
      privileged: true

答案 1 :(得分:2)

您应该能够使用DaemonSet来模拟启动脚本的行为。如果脚本需要在节点上执行根级别操作,则可以将DaemonSet窗格配置为以特权模式运行。

有关如何执行此操作的示例,请参阅https://github.com/kubernetes/contrib/tree/master/startup-script

答案 2 :(得分:2)

正如Robert所指出的,DaemonSet可以作为启动脚本运行。不幸的是,GKE只允许你运行一个daemonSet,并将restartPolicy设置为Always。

因此,为了防止k8s在运行sysctl后不断重启容器,它必须在安装后休眠,最好只在选定的节点上运行。它不是一个优雅的解决方案,但它至少具有弹性。

示例

es-host-setup Dockerfile:

FROM alpine
CMD sysctl -w vm.max_map_count=262144; sleep 365d

DaemonSet资源文件:

apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: es-host-setup
spec:
  template:
    metadata:
      labels:
        name: es-host-setup
    spec:
      containers:
      - name: es-host-setup
        image: es-host-setup
        securityContext:
          privileged: true
      restartPolicy: Always
      nodeSelector:
        pool: elasticsearch