scheduler  暴露10251端口


Kubernetes 调度器是一个控制面进程,负责将 Pods 指派到节点上。 调度器基于约束和可用资源为调度队列中每个 Pod 确定其可合法放置的节点。 调度器之后对所有合法的节点进行排序,将 Pod 绑定到一个合适的节点。 在同一个集群中可以使用多个不同的调度器

版本是1.19+,如果k8s版本是1.19这个版本,可以看到这些都是拒绝的,因为这些端口都没有暴露出来,所以在监控这些组件的时候,会发现监控不了。如何将这些端口暴露出来呢?

[root@master ~]# kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME                 STATUS      MESSAGE                                                                                       ERROR
controller-manager   Unhealthy   Get "http://127.0.0.1:10252/healthz": dial tcp 127.0.0.1:10252: connect: connection refused   
scheduler            Unhealthy   Get "http://127.0.0.1:10251/healthz": dial tcp 127.0.0.1:10251: connect: connection refused   
etcd-0               Healthy     {"health":"true"}
[root@master ~]# cd /etc/kubernetes/manifests/
[root@master manifests]# ls
kube-apiserver.yaml  kube-controller-manager.yaml  kube-scheduler.yaml


修改如下:
 - --port=0   #去掉这行
 - --bind-address=192.168.100.5  #127.0.0.1修改为本机的ip地址

监听 --secure-port 端口的 IP 地址。 集群的其余部分以及 CLI/ Web 客户端必须可以访问关联的接口。 如果为空,将使用所有接口(0.0.0.0 表示使用所有 IPv4 接口,"::" 表示使用所有 IPv6 接口)。 如果为空或未指定地址 (0.0.0.0 或 ::),所有接口将被使用。 

--bind-address string     默认值:0.0.0.0

已弃用: 在没有身份验证和鉴权的情况下不安全地为 HTTP 服务的端口。 如果为 0,则根本不提供 HTTP。请参见 --secure-port。 如果 --config 指定了一个配置文件,这个参数将被忽略。

--port int     默认值:10251
[root@master ~]# netstat -tpln | grep 10251
tcp6       0      0 :::10251                :::*                    LISTEN      28249/kube-schedule
[root@master ~]# kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME                 STATUS      MESSAGE                                                                                       ERROR
controller-manager   Unhealthy   Get "http://127.0.0.1:10252/healthz": dial tcp 127.0.0.1:10252: connect: connection refused   
scheduler            Healthy     ok                                                                                            
etcd-0               Healthy     {"health":"true"}
- job_name: 'kubernetes-scheduler'
      scrape_interval: 5s
      static_configs:
      - targets: ['192.168.100.5:10251']
        labels:
          app: kubernetes-scheduler

skywalking监控k8s容器服务_IP

skywalking监控k8s容器服务_prometheus_02

注意,并非都是10251!!!!!!!!!!!!!如下所示

[root@k8s-uat-m01 ~]# kubectl get svc -n kube-system
NAME                          TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                        AGE
kube-scheduler-svc            ClusterIP   None             <none>        10259/TCP                      80d


[root@k8s-uat-m01 ~]# kubectl describe svc kube-scheduler-svc  -n kube-system
Name:              kube-scheduler-svc
Namespace:         kube-system
Labels:            app.kubernetes.io/name=kube-scheduler
Annotations:       prometheus.io/port: 10259
                   prometheus.io/scrape: true
Selector:          component=kube-scheduler
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                None
IPs:               None
Port:              https-metrics  10259/TCP
TargetPort:        10259/TCP
Endpoints:         10.202.17.17:10259,10.202.17.18:10259,10.202.17.19:10259
Session Affinity:  None
Events:            <none>

 controller-manager  暴露10252端口


Kubernetes 控制器管理器是一个守护进程,内嵌随 Kubernetes 一起发布的核心控制回路。 在机器人和自动化的应用中,控制回路是一个永不休止的循环,用于调节系统状态。 在 Kubernetes 中,每个控制器是一个控制回路,通过 API 服务器监视集群的共享状态, 并尝试进行更改以将当前状态转为期望状态。 目前,Kubernetes 自带的控制器例子包括副本控制器、节点控制器、命名空间控制器和服务账号控制器等。

[root@master manifests]# vim  kube-controller-manager.yaml 


修改如下:
 - --port=0   #去掉这行
 - --bind-address=192.168.100.5  #127.0.0.1修改为本机的ip地址

让上面全部失效

systemctl restart kubelet
- job_name: 'kubernetes-controller-manager'
      scrape_interval: 5s
      static_configs:
      - targets: ['192.168.100.5:10252']

kube-proxy


可以看到kube-proxy还是绑定本机127.0.0.1 lo网卡上,怎么绑定到本机网卡呢

[root@master ~]# netstat -tpln | grep 10249
tcp        0      0 127.0.0.1:10249         0.0.0.0:*               LISTEN      3122/kube-proxy     
You have new mail in /var/spool/mail/root


[root@node1 ~]# netstat -tpln | grep 10249
tcp        0      0 127.0.0.1:10249         0.0.0.0:*               LISTEN      3296/kube-proxy  


[root@node2 ~]# netstat -tpln | grep 10249
tcp        0      0 127.0.0.1:10249         0.0.0.0:*               LISTEN      3897/kube-proxy

这里不能修改为具体的ip了,因为kube-proxy在每个节点都有,所以不能变为具体的IP

[root@master prometheus]# kubectl edit configmap kube-proxy -n kube-system

  metricsBindAddress: "0.0.0.0:10249"

修改之后保存,将这些pod删除掉

[root@master manifests]# kubectl delete pod kube-proxy-5zxsr -n kube-system
pod "kube-proxy-5zxsr" deleted
[root@master manifests]# kubectl delete pod kube-proxy-bwm6f -n kube-system
pod "kube-proxy-bwm6f" deleted
[root@master manifests]# kubectl delete pod kube-proxy-x7mb4  -n kube-system
pod "kube-proxy-x7mb4" deleted
kubectl get pods -n kube-system | grep kube-proxy |awk '{print $1}' | xargs kubectl delete pods -n kube-system
[root@master ~]# netstat -tpln | grep 10249
tcp6       0      0 :::10249                :::*                    LISTEN      740/kube-proxy 

[root@node1 ~]# netstat -tpln | grep 10249
tcp6       0      0 :::10249                :::*                    LISTEN      7910/kube-proxy  


[root@node2 ~]# netstat -tpln | grep 10249
tcp6       0      0 :::10249                :::*                    LISTEN      17547/kube-proxy

所以在安装好k8s之后,想要监控scheduler ,controller-manager,kube-proxy这些,最好按照上面步骤修改。修改之后重启kubelet和删除kube-proxy。(不要在业务已经跑起来的时候去做这些操作!)

- job_name: 'kubernetes-kube-proxy'
      scrape_interval: 5s
      static_configs:
      - targets: ['192.168.100.5:10249','192.168.100.6:10249','192.168.100.7:10249']

skywalking监控k8s容器服务_IP_03

skywalking监控k8s容器服务_skywalking监控k8s容器服务_04

skywalking监控k8s容器服务_服务器_05

Etcd


 生成一个etcd-certs,这个在prometheus监控etcd的时候需要

[root@master ~]# ps -ef | grep etcd
--etcd-cafile=/etc/ssl/etcd/ssl/ca.pem --etcd-certfile=/etc/ssl/etcd/ssl/node-master.pem --etcd-keyfile=/etc/ssl/etcd/ssl/node-master-key.pem --etcd-servers=https://192.168.100.5:2379


kubectl -n monitor create secret generic etcd-certs --from-file=/etc/ssl/etcd/ssl/node-master-key.pem  --from-file=/etc/ssl/etcd/ssl/node-master.pem --from-file=/etc/ssl/etcd/ssl/ca.pem
volumeMounts:
        - mountPath: /etc/prometheus
          name: prometheus-config
        - name: localtime
          mountPath: /etc/localtime
        - name: etcd-certs
          mountPath: /var/run/secrets/kubernetes.io/k8s-certs/etcd/

      volumes:
        - name: prometheus-config
          configMap:
            name: prometheus-config
        - name: alertmanager-config
          configMap:
            name: alertmanager-config
        - name: localtime
          hostPath:
            path: /usr/share/zoneinfo/Asia/Shanghai
        - name: etcd-certs
          secret:
           secretName: etcd-certs
- job_name: 'kubernetes-etcd'
      scheme: https
      tls_config:
        ca_file: /var/run/secrets/kubernetes.io/k8s-certs/etcd/ca.pem
        cert_file: /var/run/secrets/kubernetes.io/k8s-certs/etcd/node-master.pem
        key_file: /var/run/secrets/kubernetes.io/k8s-certs/etcd/node-master-key.pem
      scrape_interval: 5s
      static_configs:
      - targets: ['192.168.100.5:2379']

skywalking监控k8s容器服务_服务器_06

skywalking监控k8s容器服务_IP_07

kubesphere在使用etcd监控的步骤 


⽣成etcd相关secret ,为etcd监控创建相关secret,注意替换第⼆条命令中的证书⽂件名称。


证书⽂件名称可通过 ps -ef|grep etcd 查找


查看:本案例为master01


--etcd-cafile=/etc/ssl/etcd/ssl/ ca.pem 
--etcd-certfile=/etc/ssl/etcd/ssl/node-master01.pem 
--etcd-keyfile=/etc/ssl/etcd/ssl/node-master01-key.pem 
--etcd-servers=https://192.168.10.2:2379,https://192.168.10.3:2379,https://192.168.10.4:2379



创建namespace



root@master01:~# kubectl create ns kubesphere-monitoring-system 
namespace/kubesphere-monitoring-system created


root@master01:~# kubectl -n kubesphere-monitoring-system create secret generic kube-etcd-client-certs 
--from-file=etcd-client-ca.crt=/etc/ssl/etcd/ssl/ca.pem 
--from-file=etcd-client.crt=/etc/ssl/etcd/ssl/node-master01.pem 
--from-file=etcd-client.key=/etc/ssl/etcd/ssl/node-master01-key.pem 

 #结果  secret/kube-etcd-client-certs created
etcd: 
  monitoring: false # Enable or disable etcd monitoring dashboard installation. You have to create a Secret for etcd before you enable it. 
  endpointIps: 192.168.10.2,192.168.10.3,192.168.10.4 # etcd cluster EndpointIps. It can be a bunch of IPs here. 
  port: 2379 # etcd port. 
  tlsEnable: true

补充:

etcd 支持自动 TLS 以及通过客户端证书的身份验证, 包括客户端到服务器以及对等(服务器到服务器/集群)的通信。Prometheus访问时,需要使用etcd指定ca认证的client证书,而不可以使用serviceaccount token做认证(etcd不支持)。

先看一下etcd运行参数 证书相关的部分:

/usr/bin/etcd --client-cert-auth
--trusted-ca-file=/var/lib/etcd/cert/ca.pem
--cert-file=/var/lib/etcd/cert/etcd-server.pem
--key-file=/var/lib/etcd/cert/etcd-server-key.pem
--peer-client-cert-auth
--peer-trusted-ca-file=/var/lib/etcd/cert/peer-ca.pem
--peer-cert-file=/var/lib/etcd/cert/10.0.0.9-name-3.pem
--peer-key-file=/var/lib/etcd/cert/10.0.0.9-name-3-key.pem

不看代码,如何知道etcd客户端证书在哪儿?我们参考apiserver中配置的etcd client 证书,看看apiserver如何访问etcd的,借鉴即可:

kube-apiserver
--etcd-cafile=/etc/kubernetes/pki/etcd/ca.pem
--etcd-certfile=/etc/kubernetes/pki/etcd/etcd-client.pem
--etcd-keyfile=/etc/kubernetes/pki/etcd/etcd-client-key.pem

skywalking监控k8s容器服务_IP_08

其中/etc/kubernetes/pki/etcd中的三个客户端证书文件(CA证书ca.pem和签名密钥对c)等效果于/var/lib/etcd/cert/中的client 证书。

skywalking监控k8s容器服务_prometheus_09

[root@ack ~]# cd  /var/lib/etcd/cert/
[root@ack cert]# ls
10.0.0.7-name-1.csr      10.0.0.8-name-2.csr      10.0.0.9-name-3.csr      ca-config.json  ca.pem               etcd-client.pem      etcd-server.pem      peer-ca-key.pem
10.0.0.7-name-1-key.pem  10.0.0.8-name-2-key.pem  10.0.0.9-name-3-key.pem  ca.csr          etcd-client.csr      etcd-server.csr      peer-ca-config.json  peer-ca.pem
10.0.0.7-name-1.pem      10.0.0.8-name-2.pem      10.0.0.9-name-3.pem      ca-key.pem      etcd-client-key.pem  etcd-server-key.pem  peer-ca.csr

[root@ack cert]# cd /etc/kubernetes/pki/etcd
[root@ack etcd]# ls
ca.pem  etcd-client-key.pem  etcd-client.pem

借鉴apiserver访问etcd方式,客户端到服务器端通讯,prometheus获取etcd metrics可用curl模拟如下:

curl
--cacert  /etc/kubernetes/pki/etcd/ca.crt
--cert /etc/kubernetes/pki/apiserver-etcd-client.crt  
--key  /etc/kubernetes/pki/apiserver-etcd-client.key
-X GET https://127.0.0.1:2379/metrics

skywalking监控k8s容器服务_skywalking监控k8s容器服务_10

总结:

以上解析中可以看到客户端证书可以获取指标了,则etcd客户端证书可以被打包到k8s secret中, mount 到 prometheus server pod里。


volumeMounts:
    - mountPath: /var/run/secrets/kubernetes.io/k8s-certs/etcd/
      name: etcd-certs
    volumes:
    - name: etcd-certs
      secret:
        secretName: etcd-certs


配置抓取任务的时候,指定prometheus server  pod 里证书目录即可。


- job_name: 'k8s-etcd-yibei'
    scheme: https
    tls_config: 
      ca_file: /var/run/secrets/kubernetes.io/k8s-certs/etcd/ca.pem
      cert_file: /var/run/secrets/kubernetes.io/k8s-certs/etcd/etcd-client.pem
      key_file: /var/run/secrets/kubernetes.io/k8s-certs/etcd/etcd-client-key.pem

注意etcd证书的权限和所有者,否则监控不到