K8S LoadBalancer kube-vip 部署

本文介绍了如何在没有云厂商LB服务的情况下,通过kube-vip部署实现集群服务的VIP访问,包括使用DaemonSet的ARP部署方法,以及yaml文件的部署步骤。重点讲解了kube-vip的作用、部署过程和验证安装的方法,适合Kubernetes管理员和运维人员参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

kube-vip 端口

  • kube-vip 端口:6443
  • 服务 端口:443,8443

部署须知:

  • 如果没有云厂商LB 服务,且想实现vip 访问,基于k8s LoadBalancer 的方式,可以使用kube-vip 来实现

查看环境是否安装了kube-vip:

在这里插入图片描述

kube-vip部署

kube-vip 介绍

vip 顾名思义 虚拟 IP,从应用场景上来讲,kube-vip 实现的最终结果就是我们常说的 Keepalived 高可用方案。

在这里插入图片描述

部署:

本次部署kube-vip 是通过DaemoneSet 的 ARP 方式来部署。

方式一:通过现有yaml 文件部署

kube-vip-ds.yaml

apiVersion: apps/v1
kind: DaemonSet
metadata:
  creationTimestamp: null
  labels:
    app.kubernetes.io/name: kube-vip-ds
    app.kubernetes.io/version: v0.5.0
  name: kube-vip-ds
  namespace: kube-system
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: kube-vip-ds
  template:
    metadata:
      creationTimestamp: null
      labels:
        app.kubernetes.io/name: kube-vip-ds
        app.kubernetes.io/version: v0.5.0
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: node-role.kubernetes.io/master
                operator: Exists
            - matchExpressions:
              - key: node-role.kubernetes.io/control-plane
                operator: Exists
      containers:
      - args:
        - manager
        env:
        - name: vip_arp
          value: "true"
        - name: port
          value: "6443"
        - name: vip_interface
          value: eth0  # 主机的网卡
        - name: vip_cidr
          value: "32"
        - name: cp_enable
          value: "true"
        - name: cp_namespace
          value: kube-system
        - name: vip_ddns
          value: "false"
        - name: svc_enable
          value: "true"
        - name: vip_leaderelection
          value: "true"
        - name: vip_leaseduration
          value: "5"
        - name: vip_renewdeadline
          value: "3"
        - name: vip_retryperiod
          value: "1"
        - name: prometheus_server
          value: :2112
        - name: address
          value: "10.90.41.20" #设置vip
        image: ghcr.io/kube-vip/kube-vip:v0.5.0
        imagePullPolicy: IfNotPresent
        name: kube-vip
        resources: {}
        securityContext:
          capabilities:
            add:
            - NET_ADMIN
            - NET_RAW
      hostNetwork: true
      serviceAccountName: kube-vip
      tolerations:
      - effect: NoSchedule
        operator: Exists
      - effect: NoExecute
        operator: Exists
  updateStrategy: {}
status:
  currentNumberScheduled: 0
  desiredNumberScheduled: 0
  numberMisscheduled: 0
  numberReady: 0

rbac.yaml

piVersion: v1
kind: ServiceAccount
metadata:
  name: kube-vip
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  annotations:
    rbac.authorization.kubernetes.io/autoupdate: "true"
  name: system:kube-vip-role
rules:
  - apiGroups: [""]
    resources: ["services", "services/status", "nodes", "endpoints"]
    verbs: ["list","get","watch", "update"]
  - apiGroups: ["coordination.k8s.io"]
    resources: ["leases"]
    verbs: ["list", "get", "watch", "update", "create"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: system:kube-vip-binding
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:kube-vip-role
subjects:
- kind: ServiceAccount
  name: kube-vip
  namespace: kube-system

执行命令安装:

kubectl apply -f rbac.yaml
kubectl apply -f kube-vip-ds.yaml

#方式二:通过运行kube-vip命令生成yaml 文件部署

1、创建命令快捷别名:
alias kube-vip="docker run --network host --rm ghcr.io/kube-vip/kube-vip:$KVVERSION"
2、生成yaml清单文件
kube-vip manifest daemonset \
    --interface $INTERFACE \
    --address $VIP \
    --inCluster \
    --taint \
    --controlplane \
    --services \
    --arp \
    --leaderElection | tee kube-vip-ds.yaml
执行命令安装:
kubectl apply -f rbac.yaml  # rbac 文件用预先生成的就可以
kubectl apply -f kube-vip-ds.yaml
查看keub-vip是否安装成功:

在这里插入图片描述
status 为Running 状态即安装成功

修改 服务 service

# 执行以下命令:
kubectl edit svc service-name
# 在spec 中增加 loadBalancerIP:vip

在这里插入图片描述

欢迎扫码关注V信公众号一起交流:一苦四甜

<think>嗯,用户问为什么在Kubernetes集群安装kube-prometheus技术栈时,默认会在monitoring命名空间下配置很多NetworkPolicy,导致新手部署后无法访问。我需要先回忆一下kube-prometheus的默认配置和NetworkPolicy的作用。 首先,kube-prometheus是一个集成了Prometheus Operator、Grafana、Alertmanager等组件的堆栈,用于监控Kubernetes集群。安装时会自动创建各种资源,包括Deployment、Service、ServiceMonitor以及NetworkPolicy。NetworkPolicy是Kubernetes中用来控制Pod之间网络流量的资源,它定义了哪些Pod可以相互通信,以及允许的端口和协议。 新手部署后无法访问,很可能是因为NetworkPolicy默认设置比较严格,限制了外部访问。比如,Grafana或Prometheus的Web界面可能需要通过Ingress或NodePort暴露,但NetworkPolicy可能只允许来自特定命名空间或标签的Pod的流量,导致外部请求被拒绝。 接下来,我需要考虑kube-prometheus默认生成的NetworkPolicy有哪些。例如,可能有针对Prometheus、Alertmanager、Grafana等的策略,限制入口流量仅来自监控组件内部或kube-system命名空间。如果用户没有正确配置Ingress或Service,或者没有在允许的IP范围内,就会无法访问。 另外,Kubernetes的NetworkPolicy需要网络插件支持,比如Calico、Cilium或Weave Net。如果集群的网络插件不支持NetworkPolicy,这些策略实际上不会生效,但用户的问题里提到无法访问,所以可能插件是支持的,但策略阻止了流量。 新手可能遇到的问题包括:不了解NetworkPolicy的存在,没有调整默认策略,或者没有正确暴露服务。例如,如果用户通过NodePort或LoadBalancer暴露了Grafana,但NetworkPolicy只允许来自特定标签的Pod的流量,外部请求就会被拒绝。 解决方法可能包括:检查默认生成的NetworkPolicy,调整允许的入口规则,或者暂时禁用某些策略以测试访问。但建议用户不要直接删除所有策略,而是根据需求逐步调整,保持必要的安全限制。 还需要考虑kube-prometheus的版本,不同版本可能生成不同的NetworkPolicy配置。用户可能使用的是较新的版本,默认启用了更多的网络策略,而旧版本可能没有这些策略。 总结来说,回答需要解释NetworkPolicy的作用,kube-prometheus默认配置的原因,导致访问问题的具体策略,以及解决方法和最佳实践。</think>### 问题本质分析 当使用 **kube-prometheus** 部署监控技术栈时,默认在 `monitoring` 命名空间下生成的 `NetworkPolicy` 是一套 **白名单规则**,用于限制对监控组件的网络访问。这对新手来说容易导致以下现象: - **Grafana/Prometheus Web 界面无法通过浏览器访问** - **其他命名空间的 Pod 无法调用监控组件接口** - **NodePort/LoadBalancer 暴露服务后仍被拦截** 根本原因是:**NetworkPolicy 默认仅允许特定来源的流量**,而新手往往未显式配置放行规则。 --- ### 关键 NetworkPolicy 及其作用 以下是 kube-prometheus 默认生成的核心策略: #### 1. **允许监控组件内部通信** ```yaml apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-monitoring spec: podSelector: matchLabels: app.kubernetes.io/part-of: kube-prometheus ingress: - from: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: monitoring ports: - protocol: TCP port: 9090 # Prometheus - protocol: TCP port: 3000 # Grafana ``` **效果**:仅允许 `monitoring` 命名空间内的 Pod 访问 Prometheus/Grafana。 --- #### 2. **放行 Kubernetes 核心组件** ```yaml - from: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: kube-system - podSelector: matchLabels: k8s-app: node-exporter ``` **效果**:允许 `kube-system` 命名空间和 `node-exporter` 的数据采集。 --- #### 3. **拒绝所有其他流量** 默认策略的缺省行为是 **拒绝所有入口流量(Deny All)**,导致外部访问被拦截。 --- ### 新手常见问题场景 #### 场景 1:通过 NodePort 访问 Grafana 被拒绝 **现象**:浏览器访问 `http://<NodeIP>:30000` 超时。 **原因**:Grafana 的 NetworkPolicy 未放行外部 IP。 #### 场景 2:其他命名空间的 Pod 调用 Prometheus API 失败 **现象**:代码访问 `http://prometheus-k8s.monitoring.svc:9090` 返回连接拒绝。 **原因**:调用方 Pod 未匹配 NetworkPolicy 的 `namespaceSelector` 或 `podSelector`。 --- ### 分步解决方案 #### 方法 1:临时禁用 NetworkPolicy(测试环境) ```bash # 删除所有监控相关的 NetworkPolicy kubectl delete networkpolicies -n monitoring --all ``` **注意**:此操作会暴露监控组件到整个集群网络,仅建议在测试环境使用。 --- #### 方法 2:放行特定来源流量(生产推荐) **示例**:允许 `default` 命名空间的 Pod 访问 Grafana: ```yaml apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-grafana-from-default namespace: monitoring spec: podSelector: matchLabels: app.kubernetes.io/name: grafana ingress: - from: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: default ports: - protocol: TCP port: 3000 ``` --- #### 方法 3:放行外部 IP 段 **示例**:允许办公网 IP 范围 `192.168.1.0/24` 访问 Prometheus: ```yaml apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-prometheus-external namespace: monitoring spec: podSelector: matchLabels: app.kubernetes.io/name: prometheus ingress: - from: - ipBlock: cidr: 192.168.1.0/24 ports: - protocol: TCP port: 9090 ``` --- #### 方法 4:调整 Service 类型 + Ingress 通过 **Ingress Controller** 暴露服务,并在 NetworkPolicy 中放行 Ingress Controller 的 Pod: ```yaml # 放行 Ingress Controller 的流量 - from: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: ingress-nginx podSelector: matchLabels: app.kubernetes.io/name: ingress-nginx ``` --- ### 原理解析:为什么默认配置如此严格? kube-prometheus 的设计遵循 **最小权限原则**,默认 NetworkPolicy 的作用包括: 1. **防止监控数据泄露**:避免集群内其他组件误读敏感指标。 2. **减少攻击面**:阻止非授权 Pod 访问 Prometheus 的 Admin API。 3. **符合安全合规要求**:满足 PCI DSS、HIPAA 等场景的网络隔离需求。 --- ### 最佳实践建议 1. **按需开放端口**:使用 `kubectl describe networkpolicies -n monitoring` 分析现有规则。 2. **标签精细化控制**:通过 `podSelector` 精确放行特定应用。 3. **结合 ServiceMonitor 使用**:自动发现监控目标时,确保其 Pod 标签匹配 NetworkPolicy。 4. **定期审计策略**:检查是否有冗余或过期的规则。 --- ### 排查命令清单 ```bash # 查看所有 NetworkPolicy kubectl get networkpolicies -n monitoring # 检查策略详情 kubectl describe networkpolicy <policy-name> -n monitoring # 模拟流量测试(需安装 `knp` 工具) knp monitoring allow-grafana-from-default ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值