【夜莺监控】管理Kubernetes组件指标(上)

本文涉及的产品
可观测监控 Prometheus 版,每月50GB免费额度
简介: 【夜莺监控】管理Kubernetes组件指标(下)

开始之前

Kubernetes 是一个简单且复杂的系统,简单之处在于其整体架构比较简单清晰,是一个标准的 Master-Slave 模式,如下:

但是,它又是一个复杂的系统,不论是 Master 还是 Slave,都有多个组件组合而成,如上图所示:

  1. Master 组件
  1. apiserver:API 入口,负责认证、授权、访问控制、API 注册与发现等
  2. scheduler:负责资源调度
  3. controller-manager:维护集群状态
  1. Slave 组件
  1. kubelet:维护容器生命周期、CSI 管理以及 CNI 管理
  2. kube-proxy:负责服务发现和负载均衡
  3. container runtime(docker、containerd 等):镜像管理、容器运行、CRI 管理等
  1. 数据库组件
  1. Etcd:保存集群状态,与 apiserver 保持通信

对于如此复杂的简单系统,要时刻掌握里内部的运行状态,是一件挺难的事情,因为它的覆盖面非常的广,主要涉及:

  1. 操作系统层面:Kubernetes 是部署在操作系统之上的,操作系统层面的监控非常重要。
  2. Kubernetes 本身:Kubernetes 涉及相当多的组件,这些组件的运行状态关乎整个集群的稳定性。
  3. Kubernetes 之上的应用:Kubernetes 是为应用提供运行环境的,企业的应用系统都是部署在集群中,这些应用的稳定关乎企业的发展。
  4. 还有其他的比如网络、机房、机柜等等底层支柱。

要监控的非常多,SLI 也非常多。不过,这篇文章只讨论 Kubernetes 本身的监控,而且只讨论如何在夜莺体系中来监控它们。

对于 Kubernetes 本身,主要是监控其系统组件,如下:

image.png

!! Ps:这里不在介绍夜莺监控是怎么安装的,如果不清楚的可以看《【夜莺监控】初识夜莺》这篇文章,本次实验也是使用是这篇文章中的安装方式。

KubeApiServer

ApiServer 是 Kubernetes 架构中的核心,是所有 API 是入口,它串联所有的系统组件。

为了方便监控管理 ApiServer,设计者们为它暴露了一系列的指标数据。当你部署完集群,默认会在default名称空间下创建一个名叫kubernetes的 service,它就是 ApiServer 的地址。

# kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   309d

你可以通过curl -s -k -H "Authorization: Bearer $token" https://10.96.0.1:6443/metrics命令查看指标。其中$token是通过在集群中创建 ServerAccount 以及授予相应的权限得到。

所以,要监控 ApiServer,采集到对应的指标,就需要先授权。为此,我们先准备认证信息。

创建 namespace

kubectl create ns flashcat

创建认证授权信息

创建0-apiserver-auth.yaml文件,内容如下:

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: categraf
rules:
  - apiGroups: [""]
    resources:
      - nodes
      - nodes/metrics
      - nodes/stats
      - nodes/proxy
      - services
      - endpoints
      - pods
    verbs: ["get", "list", "watch"]
  - apiGroups:
      - extensions
      - networking.k8s.io
    resources:
      - ingresses
    verbs: ["get", "list", "watch"]
  - nonResourceURLs: ["/metrics", "/metrics/cadvisor"]
    verbs: ["get"]
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: categraf
  namespace: flashcat
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: categraf
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: categraf
subjects:
  - kind: ServiceAccount
    name: categraf
    namespace: flashcat

上面的内容主要是为categraf授予查询相关资源的权限,这样就可以获取到这些组件的指标数据了。

指标采集

指标采集的方式有很多种,建议通过自动发现的方式进行采集,这样是不论是伸缩、修改组件都无需再次来调整监控方式了。

夜莺支持Prometheus Agent的方式获取指标,而且 Prometheus 在服务发现方面做的非常好,所以这里将使用Prometheus Agent方式来采集 ApiServer 的指标。

(1)创建 Prometheus 配置

apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus-agent-conf
  labels:
    name: prometheus-agent-conf
  namespace: flashcat
data:
  prometheus.yml: |-
    global:
      scrape_interval: 15s
      evaluation_interval: 15s
    scrape_configs:
      - job_name: 'apiserver'
        kubernetes_sd_configs:
        - role: endpoints
        scheme: https
        tls_config:
          insecure_skip_verify: true
        authorization:
          credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
        relabel_configs:
        - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
          action: keep
          regex: default;kubernetes;https
    remote_write:
    - url: 'http://192.168.205.143:17000/prometheus/v1/write'

上面的内容主要是通过endpoints的方式主动发现在default名称空间下名字为kubernetes且端口为https的服务,然后将获取到的监控指标传输给夜莺服务端http://192.168.205.143:17000/prometheus/v1/write(这个地址根据实际情况做调整)。

(2)部署 Prometheus Agent

apiVersion: apps/v1
kind: Deployment
metadata:
  name: prometheus-agent
  namespace: flashcat
  labels:
    app: prometheus-agent
spec:
  replicas: 1
  selector:
    matchLabels:
      app: prometheus-agent
  template:
    metadata:
      labels:
        app: prometheus-agent
    spec:
      serviceAccountName: categraf
      containers:
        - name: prometheus
          image: prom/prometheus
          args:
            - "--config.file=/etc/prometheus/prometheus.yml"
            - "--web.enable-lifecycle"
            - "--enable-feature=agent"
          ports:
            - containerPort: 9090
          resources:
            requests:
              cpu: 500m
              memory: 500M
            limits:
              cpu: 1
              memory: 1Gi
          volumeMounts:
            - name: prometheus-config-volume
              mountPath: /etc/prometheus/
            - name: prometheus-storage-volume
              mountPath: /prometheus/
      volumes:
        - name: prometheus-config-volume
          configMap:
            defaultMode: 420
            name: prometheus-agent-conf
        - name: prometheus-storage-volume
          emptyDir: {}

其中--enable-feature=agent表示启动的是 agent 模式。

然后将上面的所有 YAML 文件部署到 Kubernetes 中,然后查看 Prometheus Agent 是否正常。

# kubectl get po -n flashcat
NAME                                READY   STATUS    RESTARTS   AGE
prometheus-agent-78c8ccc4f5-g25st   1/1     Running   0          92s

然后可以到夜莺UI查看对应的指标。640.png

获取到了指标数据,后面就是合理利用指标做其他动作,比如构建面板、告警处理等。

比如夜莺Categraf提供了 ApiServer 的仪表盘(https://github.com/flashcatcloud/categraf/blob/main/k8s/apiserver-dash.json),导入后如下:

但是,不论是做面板也好,还是做告警也罢,首先都要对 ApiServer 的指标有一个清晰的认识。

下面做了一些简单的整理。

指标简介

以下指标来自阿里云 ACK 官方文档,我觉得整理的比较全,比较细,就贴了一部分。想要了解更多的可以到官方网站去查看。

指标清单

指标 类型 解释
apiserver_request_duration_seconds_bucket Histogram 该指标用于统计 APIServer 客户端对 APIServer 的访问时延。对 APIServer 不同请求的时延分布。请求的维度包括 Verb、Group、Version、Resource、Subresource、Scope、Component 和 Client。
Histogram Bucket 的阈值为:**{0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.25, 1.5, 1.75, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5, 6, 7, 8, 9, 10, 15, 20, 25, 30, 40, 50, 60}**,单位:秒。

apiserver_request_total Counter 对 APIServer 不同请求的计数。请求的维度包括 Verb、Group、Version、Resource、Scope、Component、HTTP contentType、HTTP code 和 Client。
apiserver_request_no_resourceversion_list_total Counter 对 APIServer 的请求参数中未配置 ResourceVersion 的 LIST 请求的计数。请求的维度包括 Group、Version、Resource、Scope 和 Client。用来评估 quorum read 类型 LIST 请求的情况,用于发现是否存在过多 quorum read 类型 LIST 以及相应的客户端,以便优化客户端请求行为。
apiserver_current_inflight_requests Gauge APIServer 当前处理的请求数。包括 ReadOnly 和 Mutating 两种。
apiserver_dropped_requests_total Counter 限流丢弃掉的请求数。HTTP 返回值是**429 'Try again later'**。
apiserver_admission_controller_admission_duration_seconds_bucket Gauge 准入控制器(Admission Controller)的处理延时。标签包括准入控制器名字、操作(CREATE、UPDATE、CONNECT 等)、API 资源、操作类型(validate 或 admit)和请求是否被拒绝(true 或 false)。
Bucket 的阈值为:**{0.005, 0.025, 0.1, 0.5, 2.5}**,单位:秒。

apiserver_admission_webhook_admission_duration_seconds_bucket Gauge 准入 Webhook(Admission Webhook)的处理延时。标签包括准入控制器名字、操作(CREATE、UPDATE、CONNECT 等)、API 资源、操作类型(validate 或 admit)和请求是否被拒绝(true 或 false)。
Bucket 的阈值为:**{0.005, 0.025, 0.1, 0.5, 2.5}**,单位:秒。

apiserver_admission_webhook_admission_duration_seconds_count Counter 准入 Webhook(Admission Webhook)的处理请求统计。标签包括准入控制器名字、操作(CREATE、UPDATE、CONNECT 等)、API 资源、操作类型(validate 或 admit)和请求是否被拒绝(true 或 false)。
cpu_utilization_core Gauge CPU 使用量,单位:核(Core)。
cpu_utilization_ratio Gauge CPU 使用率=CPU 使用量/内存资源上限,百分比形式。
memory_utilization_byte Gauge 内存使用量,单位:字节(Byte)。
memory_utilization_ratio Gauge 内存使用率=内存使用量/内存资源上限,百分比形式。
up Gauge 服务可用性。
  • 1:表示服务可用。
  • 0:表示服务不可用。 |

关键指标

名称 PromQL 说明
API QPS sum(irate(apiserver_request_total[$interval])) APIServer 总 QPS。
读请求成功率 sum(irate(apiserver_request_total{code=~"20.*",verb=~"GET|LIST"}[interval])) APIServer 读请求成功率。
写请求成功率 sum(irate(apiserver_request_total{code=~"20.*",verb!~"GET|LIST|WATCH|CONNECT"}[interval])) APIServer 写请求成功率。
在处理读请求数量 sum(apiserver_current_inflight_requests{requestKind="readOnly"}) APIServer 当前在处理读请求数量。
在处理写请求数量 sum(apiserver_current_inflight_requests{requestKind="mutating"}) APIServer 当前在处理写请求数量。
请求限流速率 sum(irate(apiserver_dropped_requests_total[$interval])) Dropped Request Rate。

资源指标

名称 PromQL 说明
内存使用量 memory_utilization_byte{container="kube-apiserver"} APIServer 内存使用量,单位:字节。
CPU 使用量 cpu_utilization_core{container="kube-apiserver"}*1000 CPU 使用量,单位:豪核。
内存使用率 memory_utilization_ratio{container="kube-apiserver"} APIServer 内存使用率,百分比。
CPU 使用率 cpu_utilization_ratio{container="kube-apiserver"} APIServer CPU 使用率,百分比。
资源对象数量

  • max by(resource)(apiserver_storage_objects)
  • max by(resource)(etcd_object_counts) | Kubernetes 管理资源数量,不同版本名称可能不同。 |

QPS 和时延

名称 PromQL 说明
按 Verb 维度分析 QPS sum(irate(apiserver_request_total{verb=~"verb"}[interval]))by(verb) 按 Verb 维度,统计单位时间(1s)内的请求 QPS。
按 Verb+Resource 维度分析 QPS sum(irate(apiserver_request_total{verb=~"resource"}[$interval]))by(verb,resource) 按 Verb+Resource 维度,统计单位时间(1s)内的请求 QPS。
按 Verb 维度分析请求时延 histogram_quantile(interval])) by (le,verb)) 按 Verb 维度,分析请求时延。
按 Verb+Resource 维度分析请求时延 histogram_quantile(interval])) by (le,verb,resource)) 按 Verb+Resource 维度,分析请求时延。
非 2xx 返回值的读请求 QPS sum(irate(apiserver_request_total{verb=~"GET|LIST",resource=~"resource",code!~"2.*"}[interval])) by (verb,resource,code) 统计非 2xx 返回值的读请求 QPS。
非 2xx 返回值的写请求 QPS sum(irate(apiserver_request_total{verb!~"GET|LIST|WATCH",verb=~"resource",code!~"2.*"}[$interval])) by (verb,resource,code) 统计非 2xx 返回值的写请求 QPS。

KubeControllerManager

ControllerManager 也是 Kubernetes 的重要组件,它负责整个集群的资源控制管理,它有许多的控制器,比如 NodeController、JobController 等。

ControllerManager 的监控思路和 ApiServer 一样,都使用 Prometheus Agent 进行采集。

指标采集

ControllerManager 是通过10257/metrics接口进行指标采集,要访问这个接口同样需要相应的权限,不过我们在采集 ApiServer 的时候创建过相应的权限,这里就不用创建了。

(1)添加 Prometheus 配置 在原有的 Prometheus 采集配置中新增一个 job 用于采集 ControllerManager,如下:

apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus-agent-conf
  labels:
    name: prometheus-agent-conf
  namespace: flashcat
data:
  prometheus.yml: |-
    global:
      scrape_interval: 15s
      evaluation_interval: 15s
    scrape_configs:
      - job_name: 'apiserver'
        kubernetes_sd_configs:
        - role: endpoints
        scheme: https
        tls_config:
          insecure_skip_verify: true
        authorization:
          credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
        relabel_configs:
        - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
          action: keep
          regex: default;kubernetes;https
      - job_name: 'controller-manager'
        kubernetes_sd_configs:
        - role: endpoints
        scheme: https
        tls_config:
          insecure_skip_verify: true
        authorization:
          credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
        relabel_configs:
        - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
          action: keep
          regex: kube-system;kube-controller-manager;https-metrics
    remote_write:
    - url: 'http://192.168.205.143:17000/prometheus/v1/write'

由于我的集群里没有相应的 endpoints,所以需要创建一个,如下:

apiVersion: v1
kind: Service
metadata:
  annotations:
  labels:
    k8s-app: kube-controller-manager
  name: kube-controller-manager
  namespace: kube-system
spec:
  clusterIP: None
  ports:
    - name: https-metrics
      port: 10257
      protocol: TCP
      targetPort: 10257
  selector:
    component: kube-controller-manager
  sessionAffinity: None
  type: ClusterIP

将 YAML 的资源更新到 Kubernetes 中,然后使用curl -X POST "http://<PROMETHEUS_IP>:9090/-/reload"重载 Prometheus。

但是现在我们还无法获取到 ControllerManager 的指标数据,需要把 ControllerManager 的bind-address改成0.0.0.0

然后就可以在夜莺 UI 中查看指标了。640.png

然后可以导入https://github.com/flashcatcloud/categraf/blob/main/k8s/cm-dash.json的是数据大盘。

指标简介

指标清单

指标 类型 说明
workqueue_adds_total Counter Workqueue 处理的 Adds 事件的数量。
workqueue_depth Gauge Workqueue 当前队列深度。
workqueue_queue_duration_seconds_bucket Histogram 任务在 Workqueue 中存在的时长。
memory_utilization_byte Gauge 内存使用量,单位:字节(Byte)。
memory_utilization_ratio Gauge 内存使用率=内存使用量/内存资源上限,百分比形式。
cpu_utilization_core Gauge CPU 使用量,单位:核(Core)。
cpu_utilization_ratio Gauge CPU 使用率=CPU 使用量/内存资源上限,百分比形式。
rest_client_requests_total Counter 从状态值(Status Code)、方法(Method)和主机(Host)维度分析 HTTP 请求数。
rest_client_request_duration_seconds_bucket Histogram 从方法(Verb)和 URL 维度分析 HTTP 请求时延。

Queue 指标

名称 PromQL 说明
Workqueue 入队速率 sum(rate(workqueue_adds_total{job="ack-kube-controller-manager"}[$interval])) by (name)
Workqueue 深度 sum(rate(workqueue_depth{job="ack-kube-controller-manager"}[$interval])) by (name)
Workqueue 处理时延 histogram_quantile($quantile, sum(rate(workqueue_queue_duration_seconds_bucket{job="ack-kube-controller-manager"}[5m])) by (name, le))

资源指标

名称 PromQL 说明
内存使用量 memory_utilization_byte{container="kube-controller-manager"} 内存使用量,单位:字节。
CPU 使用量 cpu_utilization_core{container="kube-controller-manager"}*1000 CPU 使用量,单位:毫核。
内存使用率 memory_utilization_ratio{container="kube-controller-manager"} 内存使用率,百分比。
CPU 使用率 cpu_utilization_ratio{container="kube-controller-manager"} CPU 使用率,百分比。

QPS 和时延

名称 PromQL 说明
Kube API 请求 QPS

  • sum(rate(rest_client_requests_total{job="ack-scheduler",code=~"2.."}[$interval])) by (method,code)
  • sum(rate(rest_client_requests_total{job="ack-scheduler",code=~"3.."}[$interval])) by (method,code)
  • sum(rate(rest_client_requests_total{job="ack-scheduler",code=~"4.."}[$interval])) by (method,code)
  • sum(rate(rest_client_requests_totaljob="ack-scheduler",code=~"5.."}[$interval])) by (method,code)对 kube-apiserver 发起的 HTTP 请求,从方法(Method)和返回值(Code) 维度分析。 | | Kube API 请求时延 | histogram_quantile($quantile, sum(rate(rest_client_request_duration_seconds_bucket{job="ack-kube-controller-manager"[$interval])) by (verb,url,le)) | 对 kube-apiserver 发起的 HTTP 请求时延,从方法(Verb)和请求 URL 维度分析。 |

KubeScheduler

Scheduler 监听在10259端口,依然通过 Prometheus Agent 的方式采集指标。

指标采集

(1)编辑 Prometheus 配置文件

apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus-agent-conf
  labels:
    name: prometheus-agent-conf
  namespace: flashcat
data:
  prometheus.yml: |-
    global:
      scrape_interval: 15s
      evaluation_interval: 15s
    scrape_configs:
      - job_name: 'apiserver'
        kubernetes_sd_configs:
        - role: endpoints
        scheme: https
        tls_config:
          insecure_skip_verify: true
        authorization:
          credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
        relabel_configs:
        - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
          action: keep
          regex: default;kubernetes;https
      - job_name: 'controller-manager'
        kubernetes_sd_configs:
        - role: endpoints
        scheme: https
        tls_config:
          insecure_skip_verify: true
        authorization:
          credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
        relabel_configs:
        - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
          action: keep
          regex: kube-system;kube-controller-manager;https-metrics
      - job_name: 'scheduler'
        kubernetes_sd_configs:
        - role: endpoints
        scheme: https
        tls_config:
          insecure_skip_verify: true
        authorization:
          credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
        relabel_configs:
        - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
          action: keep
          regex: kube-system;kube-scheduler;https
    remote_write:
    - url: 'http://192.168.205.143:17000/prometheus/v1/write'

然后配置 Scheduler 的 Service。

apiVersion: v1
kind: Service
metadata:
  labels:
    k8s-app: kube-scheduler
  name: kube-scheduler
  namespace: kube-system
spec:
  clusterIP: None
  ports:
    - name: https
      port: 10259
      protocol: TCP
      targetPort: 10259
  selector:
    component: kube-scheduler
  sessionAffinity: None
  type: ClusterIP

将 YAML 的资源更新到 Kubernetes 中,然后使用curl -X POST "http://<PROMETHEUS_IP>:9090/-/reload"重载 Prometheus。

但是现在我们还无法获取到 Scheduler 的指标数据,需要把 Scheduler 的bind-address改成0.0.0.0

修改完成过后就可以正常在夜莺UI中查看指标了。

导入监控大盘(https://github.com/flashcatcloud/categraf/blob/main/k8s/scheduler-dash.json)。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
4月前
|
Kubernetes API 调度
Kubernetes 架构解析:理解其核心组件
【8月更文第29天】Kubernetes(简称 K8s)是一个开源的容器编排系统,用于自动化部署、扩展和管理容器化应用。它提供了一个可移植、可扩展的环境来运行分布式系统。本文将深入探讨 Kubernetes 的架构设计,包括其核心组件如何协同工作以实现这些功能。
349 0
|
3月前
|
Kubernetes 容器
Kubernetes附加组件Dashboard部署实战篇
关于如何在Kubernetes集群中部署和配置Dashboard组件的详细实战指南,涵盖了从创建证书、部署Dashboard、设置服务访问到登录认证的完整流程。
435 0
Kubernetes附加组件Dashboard部署实战篇
|
4月前
|
存储 Kubernetes API
在K8S中,Kubernetes的组件有哪些?
在K8S中,Kubernetes的组件有哪些?
|
3月前
|
运维 Kubernetes 监控
Loki+Promtail+Grafana监控K8s日志
综上,Loki+Promtail+Grafana 监控组合对于在 K8s 环境中优化日志管理至关重要,它不仅提供了强大且易于扩展的日志收集与汇总工具,还有可视化这些日志的能力。通过有效地使用这套工具,可以显著地提高对应用的运维监控能力和故障诊断效率。
328 0
|
4月前
|
Kubernetes 调度 容器
k8s descheduler 组件安装
k8s descheduler 组件安装
|
4月前
|
存储 Kubernetes API
在K8S中,各组件是如何实现高可用的?
在K8S中,各组件是如何实现高可用的?
|
4月前
|
存储 Kubernetes API
在K8S中,各个组件及其作用是什么呢?
在K8S中,各个组件及其作用是什么呢?
|
4月前
|
Kubernetes 负载均衡 网络协议
在K8S中,DNS组件有什么特性?
在K8S中,DNS组件有什么特性?
|
4月前
|
存储 Kubernetes API
在K8S中,calico有哪些组件?都是做什么的?
在K8S中,calico有哪些组件?都是做什么的?
|
4月前
|
域名解析 Kubernetes 负载均衡
在K8S中,外部访问容器服务,比如说提供了一个域名,链路怎么走?数据经过哪些组件?
在K8S中,外部访问容器服务,比如说提供了一个域名,链路怎么走?数据经过哪些组件?