Kubernetes 持续更改kube环境变量的推荐方法

Kubernetes 持续更改kube环境变量的推荐方法,kubernetes,google-kubernetes-engine,Kubernetes,Google Kubernetes Engine,我们使用elasticsearch/kibana代替gcp进行日志记录(基于所述内容) 为了启动fluentd elsticsearch pod,我们在“计算实例模板”->“自定义元数据”->“kube环境”中设置了日志记录\u DESTINATION=elasticsearch和启用节点\u LOGGING=“true” 虽然手动完成此操作后效果良好,但每次gcloud container clusters升级都会覆盖它,因为会创建一个带有默认值(LOGGING\u DESTINATION=g

我们使用elasticsearch/kibana代替gcp进行日志记录(基于所述内容)

为了启动fluentd elsticsearch pod,我们在“计算实例模板”->“自定义元数据”->“kube环境”中设置了
日志记录\u DESTINATION=elasticsearch
启用节点\u LOGGING=“true”

虽然手动完成此操作后效果良好,但每次
gcloud container clusters升级
都会覆盖它,因为会创建一个带有默认值(
LOGGING\u DESTINATION=gcp
…)的新实例模板

我的问题是:如何为GKE/GCE坚持这种配置

我曾考虑添加一个k8s用户启动脚本,但该脚本也在实例模板中定义,因此会被
gcloud container clusters upgrade
覆盖。 我还尝试将k8s用户启动脚本添加到项目元数据中,但没有考虑到这一点

//编辑
手动切换回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 现在正在为此运行“启动脚本”守护程序:

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日志记录的情况下创建集群,然后创建一个守护程序集,在每个节点上放置fluentd elasticsearch pod。使用这种技术,您不需要编写(脆弱的)启动脚本,也不需要依赖于这样一个事实,即在设置
LOGGING\u DESTINATION=elasticsearch
(即使未被覆盖,也可能会在升级过程中中断)时,内置启动脚本恰好工作

谢谢!我认为没有办法为现有集群禁用gcp日志记录,这对吗?不幸的是,没有。现在,它需要重新启动集群中的所有节点,此时您也可以创建一个新集群。