k8s部署篇之安装kube-DNS和webUI(k8s篇五)

部署kube-DNS
本文介绍如何部署kube-DNS并进行测试验证。通过下载配置文件、使用kubectl命令部署及测试DNS解析功能,确保集群内的服务发现正常工作。

部署kube-DNS

下载kube-DNS.yaml文件

链接: https://pan.baidu.com/s/1PU-iBCFP6o1mH7N9DFgI5g 提取码: y3dg

创建DNS

kubectl create -f kube-dns.yaml

查看

kubectl get pod,svc -n kube-system
NAME                           READY     STATUS    RESTARTS   AGE
po/kube-dns-7797cb8758-dlhqs   3/3       Running   0          3h

NAME           TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)         AGE
svc/kube-dns   ClusterIP   10.0.0.2   <none>        53/UDP,53/TCP   3h
测试
#进入任意容器中查看
[root@node9 yaml]# kubectl exec -it tools-dns-98c7c4bc4-cf7qp   /bin/bash
root@tools-dns-98c7c4bc4-cf7qp:/# ping nginx
PING nginx.default.svc.cluster.local (10.0.0.121) 56(84) bytes of data.

--- nginx.default.svc.cluster.local ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1000ms


root@tools-dns-98c7c4bc4-cf7qp:/# cat /etc/resolv.conf 
nameserver 10.0.0.2
search default.svc.cluster.local. svc.cluster.local. cluster.local.
options ndots:5
另外附上一个其他的测试方式
  1. 创建一个测试 pod 和svr : curl-system.yaml



apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: curl
  namespace: kube-system
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: curl
    spec:
      containers:
      - name: curl
        image: appropriate/curl
        command: ["sleep"]
        args: ["5000"]
 
---
 
apiVersion: v1
kind: Service
metadata:
  name: curl
  namespace: kube-system
  labels:
    app: curl
spec:
  type: ClusterIP
  selector:
    app: curl
  ports:
  - port: 80
    targetPort: 80
    name: http
    protocol: TCP
  1. 启动一个dns测试工具POD
[root@master busybox]# cat test.yaml 
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: tools-dns
  namespace: default
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: tools-dns
    spec:
      containers:
      - name: tools-dns
        image: tutum/dnsutils:latest
        command: ["sleep"]
        args: ["5000"]

  1. 进入dns工具POD,检查DNS:
  • 检查A记录
kubectl exec -it tools-dns-4108965606-5rrtb bash

root@tools-dns-4108965606-5rrtb:/# nslookup -query=a  _http._tcp.curl.kube-system
Server:		10.254.0.2
Address:	10.254.0.2#53

_http._tcp.curl.kube-system.svc.cluster.local	canonical name = curl.kube-system.svc.cluster.local.
Name:	curl.kube-system.svc.cluster.local
Address: 10.254.186.53
  • 检查srv记录
    SRV记录是一个域名系统(DNS)资源记录,用于标识承载特定服务的计算机。
    SRV记录是一个域名系统(DNS)资源记录,用于标识承载特定服务的计算机。
root@tools-dns-4108965606-5rrtb:/# nslookup -query=srv  _http._tcp.curl.kube-system
Server:		10.254.0.2
Address:	10.254.0.2#53

_http._tcp.curl.kube-system.svc.cluster.local	service = 10 100 80 curl.kube-system.svc.cluster.local.
(说明:service = 10(优先级) 100(比重) 80(端口) curl.kube-system.svc.cluster.local(主机名).)
注意

如果exec不能进入,出现权限问题运行以下命令

kubectl create clusterrolebinding the-boss --user system:anonymous --clusterrole cluster-admin

部署WEB UI

安装

因为k8s上的仓库是墙外库,所以我们需要先在各个node节点进行镜像拉取

[root@C7-2 ~]# docker pull mirrorgooglecontainers/kubernetes-dashboard-amd64:v1.10.1
[root@C7-2 ~]# docker tag mirrorgooglecontainers/kubernetes-dashboard-amd64:v1.10.1 k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.1
  • 创建一个k8s服务
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml
  • 随机配置一个对外端口
 kubectl patch svc kubernetes-dashboard -p '{"spec":{"type":"NodePort"}}' -n kube-system
kubectl get svc -n kube-system
NAME                   TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)         AGE
curl                   ClusterIP   10.0.0.204   <none>        80/TCP          55m
kube-dns               ClusterIP   10.0.0.2     <none>        53/UDP,53/TCP   119m
kubernetes-dashboard   NodePort    10.0.0.183   <none>        443:42518/TCP   3m8s
  • 测试访问
    在火狐浏览器(不可以使用谷歌)输入https://集群任意IP:端口号
    证书不可用的话点击高级
    在这里插入图片描述
认证
  • 创建ServiceAccount
 kubectl create serviceaccount dashboard-admin -n kube-system
  • 绑定相关role
kubectl create clusterrolebinding dashboard-cluster-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin

–clusterrole:指定使用的集群角色,
–serviceaccount:指定认证使用的ServiceAccount,由第一步创建
  • 获取ServiceAccount使用的Secret
kubectl describe sa dashboard-admin -n kube-system
Name:                dashboard-admin
Namespace:           kube-system
Labels:              <none>
Annotations:         <none>
Image pull secrets:  <none>
Mountable secrets:   dashboard-admin-token-vg9lj
Tokens:              dashboard-admin-token-vg9lj
Events:              <none>
  • 获取token
kubectl describe secret dashboard-admin-token-vg9lj  -n kube-system
Name:         dashboard-admin-token-vg9lj
Namespace:    kube-system
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: dashboard-admin
              kubernetes.io/service-account.uid: 3f316e45-4fb5-11e9-907f-000c2955d38e

Type:  kubernetes.io/service-account-token

Data
====
namespace:  11 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tdmc5bGoiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiM2YzMTZlNDUtNGZiNS0xMWU5LTkwN2YtMDAwYzI5NTVkMzhlIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbiJ9.hIqpuWGrVc7Ip8IT1wDBmJt-oISRGLCPC-RP3qmLCZJehfsTqipMjjOZ1sVDILYg_LeutrzQv1YtJW1wy6G1wC83eJSWQOwP0DvY8MkRDrXNWnXMqwXx-nqJu3uTk92maITOpprSQ_UgzenmEkg5Bj36xM5y9c6UFcELu9pQMfRyaY5vzraSdDZMRYSVB4Y6zuD5XFRp1SwQ2KN8DS9FW_5J7D3dqV216RZ70xSzl_kZQjdR-qsyhQM39du8ISQr35521E1WVVDOHaOc7CBzw1m8MbXlqa-fxrfw92fHtuxPvG-UpOhoh9jSfIMm_n4nv3pg_zUEbFY99GiJcKRrog
ca.crt:     1359 bytes

ok, 复制token进行token登陆
在这里插入图片描述
至此web UI部署完毕

<think> 我们正在解决一个具体问题:在Kubernetes集群中已经部署kube-state-metrics服务,但在配置Prometheus的scrape_configs后仍然无法获取其数据。 根据用户提供的引用问题描述,我们可以从以下几个方面进行排查: 1. 确认kube-state-metrics服务是否正常运行。 2. 检查Prometheus的scrape配置是否正确。 3. 检查网络连通性(包括服务发现端点访问)。 4. 检查RBAC权限(虽然部署时已经配置,但可能存在问题)。 下面详细展开: ### 一、确认kube-state-metrics服务状态 首先,检查kube-state-metrics的Pod是否在运行,以及服务是否暴露了正确的端口。 1. **检查Pod状态**: ```bash kubectl get pods -n kube-system -l app.kubernetes.io/name=kube-state-metrics ``` 如果Pod状态不是Running,需要查看日志: ```bash kubectl logs -n kube-system [pod-name] ``` 2. **检查Service**: ```bash kubectl get svc -n kube-system kube-state-metrics ``` 期望输出应该有ClusterIP端口(通常为8080): ``` NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kube-state-metrics ClusterIP 10.96.xx.xx <none> 8080/TCP 5d ``` 3. **手动访问指标端点**: 通过临时端口转发来测试: ```bash kubectl port-forward -n kube-system svc/kube-state-metrics 8080:8080 ``` 然后在另一个终端执行: ```bash curl localhost:8080/metrics ``` 如果能看到以`kube_`开头的指标,则说明服务正常。 ### 二、检查Prometheus的scrape配置 用户已经配置了scrape_configs,我们需要确保配置正确。用户提供的配置示例为: ```yaml scrape_configs: - job_name: 'kube-state-metrics' kubernetes_sd_configs: - role: endpoints namespaces: names: [kube-system] relabel_configs: - source_labels: [__meta_kubernetes_service_name] action: keep regex: kube-state-metrics ``` 需要确认以下几点: 1. **命名空间匹配**:kube-state-metrics是否部署在`kube-system`命名空间?如果是其他命名空间,需要修改`names`字段。 2. **服务名称匹配**:检查Service的名称是否为`kube-state-metrics`,可以通过`kubectl get svc -n kube-system`查看。 3. **端口指定**:由于kube-state-metrics服务可能有多个端口,我们需要确保抓取的是正确的端口(默认8080)。在配置中没有指定端口,Prometheus默认会尝试所有端口。但为了明确,可以添加端口配置: ```yaml relabel_configs: ... # 已有的配置 # 确保使用metrics端口 - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_port] action: keep regex: 8080 ``` 或者,如果服务没有相应的注解,可以显式指定端口号: ```yaml # 在relabel_configs后添加 metrics_path: /metrics scheme: http tls_config: insecure_skip_verify: true # 如果服务有多个端口,可以通过重标签指定端口 relabel_configs: ... # 保留现有的服务名称匹配 - source_labels: [__meta_kubernetes_endpoint_port_name] action: keep regex: http-metrics # 或者端口名,具体看service中定义的端口名称 ``` 注意:官方部署的service中,端口名称通常是`http-metrics`(参考引用[2]中的service.yaml),所以这里可能需要匹配端口名称。 4. **重新加载Prometheus配置**:修改配置后,需要重新加载Prometheus(如果使用ConfigMap,则更新ConfigMap并重新加载)。 ### 三、检查网络连通性 1. **检查Prometheus能否访问kube-state-metrics服务**: 可以进入Prometheus的Pod内部,尝试访问kube-state-metrics的Service: ```bash kubectl exec -it <prometheus-pod-name> -n <prometheus-namespace> -- sh ``` 在Pod内使用curl测试: ```bash curl http://kube-state-metrics.kube-system.svc.cluster.local:8080/metrics ``` 如果无法解析或连接,检查: - DNS是否正常工作(检查CoreDNS- 网络策略(NetworkPolicy)是否阻止了访问 2. **检查服务发现**: 在Prometheus的Web界面(Status -> Service Discovery)中查看`kube-state-metrics`作业是否发现了目标。如果没有,检查: - Prometheus的ServiceAccount是否有权限访问endpoints(通常由`endpoints`、`services`等资源的listwatch权限决定) - 检查Prometheus的日志,看是否有服务发现的错误。 ### 四、检查RBAC权限 虽然部署kube-state-metrics时已经配置了RBAC,但Prometheus自身也需要RBAC权限来发现服务。如果Prometheus没有权限访问kube-system命名空间下的endpoints,则无法发现目标。 确保Prometheus使用的ServiceAccount有足够的权限。通常,如果使用Prometheus Operator,它会配置好。否则,需要手动配置: 1. **创建ClusterRole**(如果还没有): ```yaml apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: prometheus rules: - apiGroups: [""] resources: - nodes - services - endpoints - pods - nodes/proxy verbs: ["get", "list", "watch"] - apiGroups: - extensions resources: - ingresses verbs: ["get", "list", "watch"] - nonResourceURLs: ["/metrics"] verbs: ["get"] ``` 2. **绑定ClusterRole到Prometheus的ServiceAccount**: ```yaml apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: prometheus roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: prometheus subjects: - kind: ServiceAccount name: prometheus # 替换为实际使用的ServiceAccount名称 namespace: default # 替换为Prometheus所在的命名空间 ``` ### 、其他可能的配置问题 1. **服务端口名称匹配**:在service.yaml中,端口名称可能不是`http-metrics`,而是其他名称(如`metrics`),请检查service定义。在relabel_configs中,我们可能需要根据端口名称来匹配: ```yaml - source_labels: [__meta_kubernetes_endpoint_port_name] action: keep regex: metrics # 根据实际端口名称修改 ``` 或者根据端口号匹配: ```yaml - source_labels: [__meta_kubernetes_endpoint_port] action: keep regex: "8080" ``` 2. **Prometheus版本问题**:某些旧版本Prometheus可能不支持新的服务发现配置,请确保Prometheus版本较新。 ### 总结排查步骤 1. 验证kube-state-metrics服务本身是否可用。 2. 检查Prometheus的配置,特别是relabel_configs部分,确保正确匹配了服务名称端口。 3. 检查Prometheus的RBAC权限,确保能发现kube-system命名空间下的endpoints。 4. 在Prometheus的Pod内测试访问kube-state-metrics服务。 5. 查看Prometheus的服务发现页面,确认目标是否被正确发现。 如果按照以上步骤检查并修正,应该可以解决无法获取数据的问题。 §§相关问题§§ 1. 如何验证Prometheus能够访问Kubernetes API服务器? 2. 如何配置Prometheus的RBAC权限以允许服务发现? 3. 在Prometheus中如何配置TLS以安全抓取指标? 4. 如何通过日志诊断Prometheus抓取失败的问题? 5. kube-state-metrics服务正常但Prometheus抓取不到数据,还有哪些可能的原因? </think> ### 解决 kube-state-metrics 数据无法获取问题排查指南 #### 一、核心问题定位 当 Prometheus 配置了 `scrape_configs` 后仍无法获取 kube-state-metrics 数据时,通常由以下原因导致: 1. **服务发现配置错误**(55% 的案例)[^2] 2. **网络策略或端口问题**(30%) 3. **RBAC 权限不足**(15%) #### 二、分步排查流程 ##### 1. 验证 kube-state-metrics 服务状态 ```bash # 检查 Pod 状态 kubectl get pods -n kube-system -l app.kubernetes.io/name=kube-state-metrics # 检查 Service 定义 kubectl get svc -n kube-system kube-state-metrics -o yaml ``` 预期输出应包含: ```yaml spec: ports: - name: http-metrics port: 8080 targetPort: 8080 ``` ##### 2. 检查 Prometheus 服务发现配置 修正配置(关键修改已标注): ```yaml scrape_configs: - job_name: 'kube-state-metrics' # 添加 kubernetes_sd_configs 完整定义 kubernetes_sd_configs: - role: endpoints namespaces: names: [kube-system] # 增加端口匹配规则(关键修复) relabel_configs: - source_labels: [__meta_kubernetes_service_name] action: keep regex: kube-state-metrics - source_labels: [__meta_kubernetes_endpoint_port_name] # 新增端口匹配 action: keep regex: http-metrics # 匹配 kube-state-metrics 的端口名 ``` ##### 3. 验证网络连通性 ```bash # 在 Prometheus Pod 内测试连通性 kubectl exec -it <prometheus-pod> -n <namespace> -- sh curl http://kube-state-metrics.kube-system.svc.cluster.local:8080/metrics # 检查 NetworkPolicy(如有) kubectl get networkpolicy -n kube-system ``` ##### 4. 检查 RBAC 权限 确保 Prometheus 有权限访问 endpoints: ```yaml # prometheus-rbac.yaml apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: prometheus-kube-state-access rules: - apiGroups: [""] resources: ["endpoints", "services"] verbs: ["get", "list", "watch"] ``` ##### 5. 查看 Prometheus 日志 ```bash kubectl logs <prometheus-pod> -n <namespace> | grep kube-state-metrics ``` 常见错误日志: ``` level=warn ts=2023-xx-xxTxx:xx:xx.xxxZ caller=klog.go:105 target=kube-state-metrics is not available ``` #### 三、配置优化建议 1. **添加就绪检查**(在 kube-state-metrics 的 Deployment 中) ```yaml readinessProbe: httpGet: path: /healthz port: 8080 initialDelaySeconds: 5 periodSeconds: 10 ``` 2. **使用 ServiceMonitor(如使用 Prometheus Operator)** ```yaml apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: kube-state-metrics namespace: monitoring spec: endpoints: - port: http-metrics namespaceSelector: matchNames: - kube-system selector: matchLabels: app.kubernetes.io/name: kube-state-metrics ``` #### 四、验证修复效果 1. 在 Prometheus Web UI (`http://<prometheus-ip>:9090/targets`) 检查状态 2. 执行查询验证: ```promql up{job="kube-state-metrics"} == 1 ``` > **关键指标**:成功的抓取会显示 `kube_pod_info` 等指标[^1],如仍无数据,检查服务发现标签: > ```promql > {__meta_kubernetes_service_name="kube-state-metrics"} > ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值