我尝试在Google容器引擎上的群集节点上安装ElasticSearch(最新),但ElasticSearch需要变量:vm.max_map_count
为> = 262144。
如果我ssh到每个节点,我手动运行:
sysctl -w vm.max_map_count=262144
一切顺利,但任何新节点都没有指定的配置。
所以我的问题是:
有没有办法在启动时在每个节点上加载系统配置? Deamon Set不是一个好的解决方案,因为在docker容器中,系统变量是只读的。
我正在使用带有gci
节点图像的全新集群。
答案 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