持久更改 kube-env 变量的推荐方法
Recommended way to persistently change kube-env variables
我们使用 elasticsearch/kibana 而不是 gcp 进行日志记录(基于 here 的描述)。
为了启动 fluentd-elsticsearch pod,我们在 "Compute Instance Template" -> "Custom metadata" -> "kube-env" 中设置了 LOGGING_DESTINATION=elasticsearch
和 ENABLE_NODE_LOGGING="true"
。 =18=]
虽然这在手动完成时工作正常,但它会被每个 gcloud container clusters upgrade
覆盖,因为创建了一个具有默认值 (LOGGING_DESTINATION=gcp
...) 的新实例模板。
我的问题是:如何为 GKE/GCE 保留这种配置?
我考虑过添加 k8s-user-startup-script,但它也在实例模板中定义,因此被 gcloud container clusters upgrade
覆盖。
我还尝试将 k8s-user-startup-script 添加到项目元数据,但没有考虑到这一点。
//编辑
手动切换回 elasticsearch 的当前解决方法(无需重新创建实例模板和实例)是:
for node in $(kubectl get nodes -o name | cut -f2 -d/); do
gcloud compute ssh $node \
--command="sudo cp -a /srv/salt/fluentd-es/fluentd-es.yaml /etc/kubernetes/manifests/; sudo rm /etc/kubernetes/manifests/fluentd-gcp.yaml";
done
kubelet 将接管它,终止 fluentd-gcp 并启动 fluentd-es。
//编辑#2
现在 运行 一个 "startup-script" DaemonSet 为此:
kind: DaemonSet
apiVersion: extensions/v1beta1
metadata:
name: startup-script
namespace: kube-system
labels:
app: startup-script
spec:
template:
metadata:
labels:
app: startup-script
spec:
hostPID: true
containers:
- name: startup-script
image: gcr.io/google-containers/startup-script:v1
securityContext:
privileged: true
env:
- name: STARTUP_SCRIPT
value: |
#! /bin/bash
set -o errexit
set -o pipefail
set -o nounset
# Replace Google-Cloud-Logging with EFK
if [[ ! -f /etc/kubernetes/manifests/fluentd-es.yaml ]]; then
if [[ -f /home/kubernetes/kube-manifests/kubernetes/fluentd-es.yaml ]]; then
# GCI images
cp -a /home/kubernetes/kube-manifests/kubernetes/fluentd-es.yaml /etc/kubernetes/manifests/
elif [[ -f /srv/salt/fluentd-es/fluentd-es.yaml ]]; then
# Debian based GKE images
cp -a /srv/salt/fluentd-es/fluentd-es.yaml /etc/kubernetes/manifests/
fi
test -f /etc/kubernetes/manifests/fluentd-es.yaml && rm /etc/kubernetes/manifests/fluentd-gcp.yaml
fi
在 GKE 中没有完全支持的重新配置 kube-env 的方法。正如您所发现的,您可以破解实例模板,但这不能保证在升级过程中有效。
另一种方法是在不启用 gcp 日志记录的情况下创建集群,然后创建一个 DaemonSet,在每个节点上放置一个 fluentd-elasticsearch pod。使用这种技术,您不需要编写(脆弱的)启动脚本或依赖于内置启动脚本在设置 LOGGING_DESTINATION=elasticsearch
时恰好起作用的事实(即使它不是,也可能会中断升级被覆盖)。
我们使用 elasticsearch/kibana 而不是 gcp 进行日志记录(基于 here 的描述)。
为了启动 fluentd-elsticsearch pod,我们在 "Compute Instance Template" -> "Custom metadata" -> "kube-env" 中设置了 LOGGING_DESTINATION=elasticsearch
和 ENABLE_NODE_LOGGING="true"
。 =18=]
虽然这在手动完成时工作正常,但它会被每个 gcloud container clusters upgrade
覆盖,因为创建了一个具有默认值 (LOGGING_DESTINATION=gcp
...) 的新实例模板。
我的问题是:如何为 GKE/GCE 保留这种配置?
我考虑过添加 k8s-user-startup-script,但它也在实例模板中定义,因此被 gcloud container clusters upgrade
覆盖。
我还尝试将 k8s-user-startup-script 添加到项目元数据,但没有考虑到这一点。
//编辑
手动切换回 elasticsearch 的当前解决方法(无需重新创建实例模板和实例)是:
for node in $(kubectl get nodes -o name | cut -f2 -d/); do
gcloud compute ssh $node \
--command="sudo cp -a /srv/salt/fluentd-es/fluentd-es.yaml /etc/kubernetes/manifests/; sudo rm /etc/kubernetes/manifests/fluentd-gcp.yaml";
done
kubelet 将接管它,终止 fluentd-gcp 并启动 fluentd-es。
//编辑#2 现在 运行 一个 "startup-script" DaemonSet 为此:
kind: DaemonSet
apiVersion: extensions/v1beta1
metadata:
name: startup-script
namespace: kube-system
labels:
app: startup-script
spec:
template:
metadata:
labels:
app: startup-script
spec:
hostPID: true
containers:
- name: startup-script
image: gcr.io/google-containers/startup-script:v1
securityContext:
privileged: true
env:
- name: STARTUP_SCRIPT
value: |
#! /bin/bash
set -o errexit
set -o pipefail
set -o nounset
# Replace Google-Cloud-Logging with EFK
if [[ ! -f /etc/kubernetes/manifests/fluentd-es.yaml ]]; then
if [[ -f /home/kubernetes/kube-manifests/kubernetes/fluentd-es.yaml ]]; then
# GCI images
cp -a /home/kubernetes/kube-manifests/kubernetes/fluentd-es.yaml /etc/kubernetes/manifests/
elif [[ -f /srv/salt/fluentd-es/fluentd-es.yaml ]]; then
# Debian based GKE images
cp -a /srv/salt/fluentd-es/fluentd-es.yaml /etc/kubernetes/manifests/
fi
test -f /etc/kubernetes/manifests/fluentd-es.yaml && rm /etc/kubernetes/manifests/fluentd-gcp.yaml
fi
在 GKE 中没有完全支持的重新配置 kube-env 的方法。正如您所发现的,您可以破解实例模板,但这不能保证在升级过程中有效。
另一种方法是在不启用 gcp 日志记录的情况下创建集群,然后创建一个 DaemonSet,在每个节点上放置一个 fluentd-elasticsearch pod。使用这种技术,您不需要编写(脆弱的)启动脚本或依赖于内置启动脚本在设置 LOGGING_DESTINATION=elasticsearch
时恰好起作用的事实(即使它不是,也可能会中断升级被覆盖)。