You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GKE 1.9.6-gke.1至GCE实例出口网络及Filebeat部署问题

在GKE 1.9.6-gke.1上部署Filebeat DaemonSet + 解决出口网络问题

我来帮你一步步搞定这个部署,顺便解决你提到的GKE到GCE实例的出口网络问题——毕竟1.9.x版本的GKE确实偶尔会有这类网络小坑。

一、先搞定集群权限配置

Filebeat需要访问K8s API来获取Pod元数据,还要读取节点上的容器日志,所以得先给它配置对应的权限:

  1. 创建ServiceAccount(放在kube-system命名空间更合理):
apiVersion: v1
kind: ServiceAccount
metadata:
  name: filebeat
  namespace: kube-system
  1. 创建ClusterRole,定义Filebeat需要的权限:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: filebeat
rules:
- apiGroups: [""]
  resources:
  - namespaces
  - pods
  verbs: ["get", "list", "watch"]
  1. 把ClusterRole绑定到刚才的ServiceAccount:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: filebeat
subjects:
- kind: ServiceAccount
  name: filebeat
  namespace: kube-system
roleRef:
  kind: ClusterRole
  name: filebeat
  apiGroup: rbac.authorization.k8s.io

把这三个配置保存成filebeat-rbac.yaml,然后执行:

kubectl apply -f filebeat-rbac.yaml

二、部署Filebeat DaemonSet

我给你适配了GKE 1.9.6的DaemonSet配置(注意这个版本用extensions/v1beta1的DaemonSet API更稳妥),还有对应的ConfigMap:

1. 先创建Filebeat的ConfigMap(核心配置)

保存成filebeat-config.yaml,记得替换<你的Elasticsearch地址>为实际地址,如果ES有认证就打开用户名密码的注释:

apiVersion: v1
kind: ConfigMap
metadata:
  name: filebeat-config
  namespace: kube-system
  labels:
    k8s-app: filebeat
data:
  filebeat.yml: |-
    filebeat.inputs:
    - type: container
      paths:
        - /var/log/containers/*.log
      processors:
        - add_kubernetes_metadata:
            host: ${NODE_NAME}
            matchers:
            - logs_path:
                logs_path: "/var/log/containers/"

    output.elasticsearch:
      hosts: ["<你的Elasticsearch地址>:9200"]
      # 如果Elasticsearch开启了认证,取消下面两行注释并填写正确信息
      # username: "elastic"
      # password: "changeme"

2. 创建DaemonSet配置

保存成filebeat-daemonset.yaml:

apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: filebeat
  namespace: kube-system
  labels:
    k8s-app: filebeat
spec:
  template:
    metadata:
      labels:
        k8s-app: filebeat
    spec:
      serviceAccountName: filebeat
      terminationGracePeriodSeconds: 30
      containers:
      - name: filebeat
        image: docker.elastic.co/beats/filebeat:7.17.0  # 选和你的Elastic栈匹配的LTS版本,兼容性更好
        args: [
          "-c", "/etc/filebeat.yml",
          "-e",
        ]
        securityContext:
          runAsUser: 0  # 必须以root运行才能读取容器日志文件
        resources:
          limits:
            memory: 200Mi
          requests:
            cpu: 100m
            memory: 100Mi
        volumeMounts:
        - name: config
          mountPath: /etc/filebeat.yml
          subPath: filebeat.yml
        - name: data
          mountPath: /usr/share/filebeat/data  # 持久化Filebeat的状态数据
        - name: varlibdockercontainers
          mountPath: /var/lib/docker/containers
          readOnly: true
        - name: varlog
          mountPath: /var/log
          readOnly: true
      volumes:
      - name: config
        configMap:
          defaultMode: 0600
          name: filebeat-config
      - name: varlibdockercontainers
        hostPath:
          path: /var/lib/docker/containers
      - name: varlog
        hostPath:
          path: /var/log
      - name: data
        hostPath:
          path: /var/lib/filebeat-data
          type: DirectoryOrCreate  # 如果目录不存在自动创建

然后执行部署命令:

kubectl apply -f filebeat-config.yaml
kubectl apply -f filebeat-daemonset.yaml

3. 验证部署

执行以下命令确认每个节点上都运行了Filebeat Pod:

kubectl get pods -n kube-system -l k8s-app=filebeat

如果要查看Filebeat的日志,确认是否正常采集:

kubectl logs <你的filebeat-pod-name> -n kube-system

三、解决GKE到GCE实例的出口网络问题

针对GKE 1.9.6-gke.1的出口问题,给你几个实用的排查和解决步骤:

  1. 检查防火墙规则
    确保GKE节点所在的VPC防火墙允许出站访问GCE实例的目标端口(比如如果是访问ES的9200端口)。用这个命令查看防火墙规则:
gcloud compute firewall-rules list --filter="network:<你的VPC网络名称>"

如果没有对应的出站规则,就创建一个:

gcloud compute firewall-rules create allow-gke-to-gce --network=<你的VPC网络> --direction=EGRESS --action=ALLOW --rules=tcp:<目标端口> --source-ranges=<GKE节点子网CIDR>
  1. 配置Cloud NAT(如果节点没有公网IP)
    如果你的GKE节点是私有节点(没有公网IP),就需要配置Cloud NAT让节点通过NAT网关访问外部资源:
# 先创建路由器(如果还没有)
gcloud compute routers create gke-nat-router --region=us-east1 --network=<你的VPC网络>
# 创建NAT网关
gcloud compute routers nats create gke-nat --router=gke-nat-router --region=us-east1 --auto-allocate-nat-external-ips --nat-all-subnet-ip-ranges
  1. 检查VPC路由表
    确认VPC里有到GCE实例所在子网的路由,如果没有就添加静态路由:
gcloud compute routes create route-gke-to-gce --network=<你的VPC网络> --destination-range=<GCE实例子网CIDR> --next-hop-instance=<GCE实例名称> --next-hop-instance-zone=<GCE实例所在区域>
  1. 验证DNS解析
    有时候出口问题是DNS解析失败导致的,你可以在Filebeat Pod里测试GCE实例的域名解析:
kubectl exec -it <filebeat-pod-name> -n kube-system -- nslookup <GCE实例的域名或IP>

如果解析失败,检查集群的CoreDNS配置,或者给GKE集群添加自定义DNS服务器。

内容的提问来源于stack exchange,提问作者Luis F Hernandez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:15:29