Linux:k8s集群访问集群外部服务(Endpoints)

本文通过实例演示了如何在Kubernetes(k8s)集群中,让Pod访问集群外部的MySQL服务,说明了即使不使用Endpoints,只要宿主机可通信,Pod也能直接通过宿主机IP访问。同时,介绍了Endpoints的作用,即允许通过Service名称来访问外部服务,简化了访问流程。通过创建Endpoints和Service,实现了内部Pod通过Service名连接外部数据库。

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

k8s集群访问集群外部服务(Endpoints)

像数据库这个的服务我们一般是不会用k8s直接来跑的,最好是部署在集群外部的服务器,那么集群内部的pod怎么去访问外部的服务呢?可以使用Endpoints将外部的服务映射到集群内部,然后集群内部就能进行解析,直接访问。实际上,不映射到集群内部,也是可以访问的,下面以mysql服务为例进行说明。

环境准备
搭建一个K8S集群,略
master 192.168.146.10
node1 192.168.146.11
node2 192.168.146.12
node3 192.168.146.13
在任意一台机器安装数据库

[root@node3 ~]# yum -y install mariadb-server
#授权账户
[root@node3 ~]# systemctl start mariadb
[root@node3 ~]# mysql -uroot -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 5.5.65-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> delete from mysql.user where user="";
Query OK, 2 rows affected (0.00 sec)

MariaDB [(none)]> grant all on *.* to "pod"@"192.168.146.%" identified by "123";
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> select user,host,password from mysql.user;
+------+---------------+-------------------------------------------+
| user | host          | password                                  |
+------+---------------+-------------------------------------------+
| root | localhost     |                                           |
| root | node3         |                                           |
| root | 127.0.0.1     |                                           |
| root | ::1           |                                           |
| pod  | 192.168.146.% | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
+------+---------------+-------------------------------------------+
5 rows in set (0.00 sec)

创建一个pod
(哪个节点都可以,只要你配置了使用kubectl命令)

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: yum
spec:
  selector:
    matchLabels:
      app: yum
  replicas: 1
  template:
    metadata:
      labels:
         app: yum
    spec:
      containers:
      - name: yum
        image: registry.cn-shenzhen.aliyuncs.com/jay23/centos_yum:v1.0
        command: ["sh","-c","sleep 10000"]

进入pod,尝试连接数据库

[root@master mysql]# kubectl apply -f deploy2.yaml
deployment.apps/yum created
[root@master mysql]# kubectl get po
NAME                          READY   STATUS        RESTARTS   AGE
counter                       1/1     Running       0          5h4m
dummylogs-6d66db57f8-bp2t5    1/1     Running       1          4h44m
dummylogs-6d66db57f8-k4z76    1/1     Running       1          4h44m
dummylogs-6d66db57f8-m5b2k    1/1     Running       1          4h44m
dummylogs2-77f4d88788-52cmn   1/1     Running       1          4h44m
dummylogs2-77f4d88788-t996h   1/1     Running       1          4h44m
dummylogs2-77f4d88788-vk4h6   1/1     Running       1          4h44m
yum-d9fc97f8-w6mp8            1/1     Running       0          4s
[root@master mysql]# kubectl exec -it yum-d9fc97f8-w6mp8 -- bash
#安装一个数据库客户端
[root@yum-d9fc97f8-w6mp8 /]# yum -y install mariadb
#测试连接
[root@yum-d9fc97f8-w6mp8 /]# mysql -upod -h192.168.146.13 -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 3
Server version: 5.5.65-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

通过以上的实验可以看出,只要宿主机可以通讯,那么pod内也是可以直接通过宿主机的IP访问集群之外的服务。因为虽然是pod发出的请求,实际上经过转发,出去的时候是以宿主机的IP进行访问的,所以我们授权的时候,保证运行pod的宿主机能登录数据库就行了,并不是对pod的IP进行授权。

那么Endpoints的作用是什么呢?
下面我们来创建Endpoints:

---
kind: Service
apiVersion: v1
metadata:
  name: testep          #通过name绑定到下面的Endpoints,否则就用自己的Endpoints
spec:
  ports:
  - port: 3306
---
kind: Endpoints
apiVersion: v1
metadata:
  name: testep      #与上面的name要对应
subsets:
- addresses:
  - ip: 192.168.146.13
  ports:
  - port: 3306

查看Endpoints和Service的关系

[root@master mysql]# vim deploy.yaml
[root@master mysql]# kubectl apply -f deploy.yaml
service/testep unchanged
endpoints/testep configured
[root@master mysql]# kubectl describe svc testep
Name:              testep
Namespace:         default
Labels:            <none>
Annotations:       Selector:  <none>
Type:              ClusterIP
IP:                10.111.21.40
Port:              <unset>  3306/TCP
TargetPort:        3306/TCP
Endpoints:         192.168.146.13:3306   #如果不指定Endpoints,这里就是service的ClusterIP
Session Affinity:  None
Events:            <none>

此时,再进入刚刚的pod进行测试

[root@master mysql]# kubectl exec -it yum-d9fc97f8-w6mp8 -- bash
[root@yum-d9fc97f8-w6mp8 /]# mysql -upod -htestep -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 9
Server version: 5.5.65-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> 

发现可以使用Service的名称访问到数据库,大体的流程是这样的:
pod里面是可以解析svc的名字的,又因为svc的Endpoints链接的是其他机器的数据库,所以可以直接通过svc访问到集群之外的数据库。这就是Endpoints的作用。

<think>嗯,用户问的是外部普罗米修斯如何监控k8s集群。首先,我得确定用户对普罗米修斯和k8s的了解程度。可能他们已经有k8s环境,想要用外部的普罗米修斯实例来监控,而不是使用集群内部的。这时候需要考虑两者的网络连接、服务发现、权限等问题。 用户可能是运维或者开发人员,负责维护集群的监控系统。他们可能已经尝试过内部部署,但出于资源隔离、集中管理或者避免单点故障的原因,想要将普罗米修斯部署在集群外部。这时候需要确保外部普罗米修斯能够访问k8s的API,以及各个组件的metrics端点。 接下来,我得回忆外部普罗米修斯监控k8s的常见方法。通常有两种方式:通过k8s API自动发现,或者手动配置目标。自动发现更灵活,特别是动态环境,但需要配置RBAC和正确的服务账户。手动配置可能适合静态环境,但不够灵活。 然后,需要具体步骤。首先,确保k8s组件(如kubelet、apiserver、coredns等)已经暴露了metrics端口。接着,配置普罗米修斯的服务发现,比如使用kubernetes_sd_configs,配置相应的角色,如node、endpoints、pod等。然后,可能需要relabel_configs来筛选和重写标签,确保目标正确。 权限方面,普罗米修斯需要能够访问k8s API,所以需要创建ServiceAccount,ClusterRole和ClusterRoleBinding。这部分需要详细说明,比如创建具有get、list、watch权限的ClusterRole,并绑定到ServiceAccount,然后外部普罗米修斯使用对应的token进行认证。 另外,要考虑网络访问外部普罗米修斯需要能访问k8s节点的IP和metrics端口。如果是托管集群,可能需要配置安全组或防火墙规则,允许外部访问。如果是自建集群,可能需要配置NodePort或者LoadBalancer服务来暴露metrics端点。 存储和配置管理方面,外部普罗米修斯的配置文件中需要定义scrape_configs,使用kubernetes_sd_configs,并正确配置TLS和认证信息。可能需要使用Bearer Token文件,比如挂载ServiceAccount的token。 还有可能需要监控自定义的应用,这时候需要确保应用的Pod暴露了metrics端点,并且有正确的annotations或labels供普罗米修斯自动发现。例如,使用prometheus.io/scrape: "true"这样的注解。 最后,可能需要集成Alertmanager和Grafana,进行告警和可视化。这部分用户可能已经了解,但如果有需要的话,可以简要提及。 总结下来,回答需要涵盖服务发现配置、权限设置、网络访问、配置文件和实际监控对象的处理步骤。同时,要提醒用户注意安全,比如使用RBAC最小权限,加密通信等。外部</think> Prometheus 监控 Kubernetes 集群的核心是通过服务发现机制动态获取监控目标,并配合权限配置实现跨集群的数据采集。以下是具体实现步骤和原理: --- ### **1. 前置条件** - **Metrics 端点暴露**:确保 Kubernetes 组件(kubelet、API Server 等)和应用已暴露 Prometheus 格式的 metrics 接口(如 `:10250/metrics`)。 - **网络连通性**:外部 Prometheus 需能访问 Kubernetes 节点的 IP 及 Service 网络(可能需要打通防火墙/NAT)。 --- ### **2. 服务发现配置** 在 Prometheus 的 `prometheus.yml` 中配置 Kubernetes 服务发现模块: ```yaml scrape_configs: - job_name: 'kubernetes-nodes' kubernetes_sd_configs: - role: node # 发现集群所有节点 scheme: https tls_config: insecure_skip_verify: true # 生产环境应配置证书 bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token relabel_configs: - source_labels: [__address__] regex: '(.*):10250' replacement: '${1}:10255' target_label: __address__ ``` --- ### **3. 权限配置(RBAC)** 为 Prometheus 创建 ServiceAccount 并绑定权限: ```yaml # prometheus-rbac.yaml apiVersion: v1 kind: ServiceAccount metadata: name: prometheus-external namespace: monitoring --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: prometheus-external rules: - apiGroups: [""] resources: ["nodes", "services", "pods", "endpoints"] verbs: ["get", "list", "watch"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: prometheus-external roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: prometheus-external subjects: - kind: ServiceAccount name: prometheus-external namespace: monitoring ``` 执行 `kubectl apply -f prometheus-rbac.yaml` 应用配置。 --- ### **4. 访问凭证配置** 外部 Prometheus 需使用 ServiceAccount 的 Token 访问 Kubernetes API: ```yaml # 获取 Token(在集群内部执行) kubectl -n monitoring get secret $(kubectl -n monitoring get sa prometheus-external -o jsonpath='{.secrets[0].name}') -o jsonpath='{.data.token}' | base64 -d > token ``` 将生成的 `token` 文件挂载到外部 Prometheus 容器中,并在配置中引用。 --- ### **5. 动态目标 Relabeling** 通过 `relabel_configs` 重写标签,筛选有效监控目标: ```yaml relabel_configs: # 仅抓取带注解 prometheus.io/scrape=true 的 Pod - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape] action: keep regex: true # 从注解中获取自定义 metrics 路径和端口 - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path] target_label: __metrics_path__ regex: (.+) - source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port] regex: ([^:]+)(?::\d+)?;(\d+) replacement: $1:$2 target_label: __address__ ``` --- ### **6. 高级监控对象** - **API Server**:直接监控 `kubernetes.default.svc:443`。 - **CoreDNS**:通过 Endpoints 发现 `kube-dns` 服务。 - **Node Exporter**:部署 DaemonSet 并在每个节点暴露 `9100` 端口。 --- ### **7. 网络访问模式** | 模式 | 配置方式 | 适用场景 | |--|-----------------------------------|----------------------------| | Direct NodeIP | 直接访问节点 IP + 端口 | 简单环境,节点 IP 可直连 | | NodePort | 通过 NodePort Service 暴露 metrics | 托管集群(如 EKS、GKE) | | Ingress | 通过 Ingress 统一入口 | 需要 HTTPS/域名管理的场景 | --- ### **8. 安全增强** - **TLS 加密**:配置 `tls_config` 使用合法证书。 - **网络策略**:限制 Prometheus 源 IP 访问权限。 - **审计日志**:监控 Kubernetes API 的异常访问。 --- ### **9. 验证与调试** - 访问 Prometheus 的 `Targets` 页面检查状态。 - 使用 `kubectl get --raw /api/v1/nodes/<node>/proxy/metrics` 手动验证端点。 - 查看 Prometheus 日志排查连接问题。 --- 通过以上步骤,外部 Prometheus 可动态监控 Kubernetes 集群的核心组件、节点资源及业务应用,实现跨集群的统一监控体系。对于混合云或多集群场景,可结合 Thanos 或 VictoriaMetrics 实现数据联邦。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值