Kubernetes权威指南——Kubernetes集群管理(五)

零基础学kubernetes(k8s)必看教程,带你10分钟快速实战入门k8s 作为一个工作十余年,拥有比较丰富的计算机网络运维、主机运维、云计算平台运维、自动化运维开发经验的老鸟,我来说说我当初刚接触Kubernetes时的一些感受以及学习技巧。 阅读详情

8、Kubernetes集群监控

Kubernetes的早期版本依靠Heapster来实现完整的性能数据采集和监控功能,Kubernetes从1.8版本开始,性能数据开始以Metrics API的方式提供标准化接口,并且从1.10版本开始将Heapster替换为Metrics Server。在Kubernetes新的监控体系中,Metrics Server用于提供核心指标(Core Metrics)​,包括Node、Pod的CPU和内存使用指标。对其他自定义指标(Custom Metrics)的监控则由Prometheus等组件来完成。

8.1、 通过Metrics Server监控Pod和Node的CPU和内存资源使用数据

Metrics Server在部署完成后,将通过Kubernetes核心API Server的“/apis/metrics.k8s.io/v1beta1”路径提供Pod和Node的监控数据。Metrics Server源代码和部署配置可以在GitHub代码库(https://github.com/kubernetes-incubator/metrics-server)找到。

首先,部署Metrics Server实例,在下面的YAML配置中包含ServiceAccount、Deployment和Service的定义:

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: metrics-server
  namespace: kube-system
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: metrics-server
  namespace: kube-system
  labels:
    k8s-app: metrics-server
spec:
  selector:
    matchLabels:
      k8s-app: metrics-server
  template:
    metadata:
      name: metrics-server
      labels:
        k8s-app: metrics-server
    spec:
      serviceAccountName: metrics-server
      containers:
        - name: metrics-server
          image: k8s.gcr.io/metrics-server-amd64:v0.3.1
          imagePullPolicy: IfNotPresent
          volumeMounts:
            - name: tmp-dir
              mountPath: /tmp
      volumes:
        - name: tmp-dir
          emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
  name: metrics-server
  namespace: kube-system
  labels:
    kubernetes.io/name: "Metrics-server"
spec:
  selector:
    k8s-app: metrics-server
  ports:
    - port: 443
      protocol: TCP
      targetPort: 443

然后,创建metrics-server所需的RBAC权限配置,此处略。

最后,创建APIService资源,将监控数据通过“/apis/metrics.k8s.io/v1beta1”路径提供:

apiVersion: apiregistration.k8s.io/v1beta1
kind: APIService
metadata:
  # APIService 的标准命名规范通常为 “version.group”
  name: v1beta1.metrics.k8s.io
spec:
  # 后端实际提供该 API 服务的 Kubernetes Service 信息
  service:
    name: metrics-server        # 后端服务的名称
    namespace: kube-system      # 后端服务所在的命名空间
  
  # API 组名称
  group: metrics.k8s.io
  # API 版本
  version: v1beta1
  
  # 是否跳过 TLS 证书验证(测试或简化配置时常用,生产环境建议配置受信任的 CA 证书)
  insecureSkipTLSVerify: true
  
  # 优先级设置:决定同一 Group 中多个版本或服务的优先级顺序
  groupPriorityMinimum: 100
  versionPriority: 100

在部署完成后确保metrics-server的Pod启动成功:

# kubectl -n kube-system get pod -l k8s-app=metrics-server
NAME                                        READY   STATUS    RESTARTS   AGE
metrics-server-7cb798c45b-4dnmh            1/1     Running   0          5m

使用kubectl top nodes和kubectl top pods命令监控CPU和内存资源的使用情况:

# kubectl top nodes
NAME         CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
k8s-node-1   319m         7%     1167Mi          67%

# kubectl top pods --all-namespaces
NAMESPACE     NAME                                        CPU(cores)   MEMORY(bytes)
kube-system   coredns-767997f5b5-sfz2w                   6m           36Mi
kube-system   metrics-server-7cb798c45b-4dnmh            3m           22Mi
......

Metrics Server提供的数据也可以供HPA控制器使用,以实现基于CPU使用率或内存使用值的Pod自动扩缩容功能。

8.2、Prometheus+Grafana集群性能监控平台搭建

Prometheus是由SoundCloud公司开发的开源监控系统,是继Kubernetes之后CNCF第2个毕业的项目,在容器和微服务领域得到了广泛应用。Prometheus的主要特点如下。

  • 使用指标名称及键值对标识的多维度数据模型。
  • 采用灵活的查询语言PromQL。
  • 不依赖分布式存储,为自治的单节点服务。
  • 使用HTTP完成对监控数据的拉取。
  • 支持通过网关推送时序数据。
  • 支持多种图形和Dashboard的展示,例如Grafana。

Prometheus生态系统由各种组件组成,用于功能的扩充。

  • Prometheus Server:负责监控数据采集和时序数据存储,并提供数据查询功能。
  • 客户端SDK:对接Prometheus的开发工具包。
  • Push Gateway:推送数据的网关组件。
  • 第三方Exporter:各种外部指标收集系统,其数据可以被Prometheus采集。
  • AlertManager:告警管理器。
  • 其他辅助支持工具。

Prometheus的核心组件Prometheus Server的主要功能包括:从Kubernetes Master获取需要监控的资源或服务信息;从各种Exporter抓取(Pull)指标数据,然后将指标数据保存在时序数据库(TSDB)中;向其他系统提供HTTP API进行查询;提供基于PromQL语言的数据查询;可以将告警数据推送(Push)给AlertManager,等等。

Prometheus的系统架构如图所示。
在这里插入图片描述
在部署Prometheus时可以直接基于官方提供的镜像进行,也可以通过Operator模式进行。本文以直接部署为例,Operator模式的部署案例可以参考3.12.2节的示例。

下面对部署Prometheus服务的过程进行说明。

首先,创建一个ConfigMap用于保存Prometheus的主配置文件prometheus.yml,其中可以配置需要监控的Kubernetes集群的资源对象或服务(如Service、Pod、Node等)​:

apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus-config
  namespace: kube-system
  labels:
    kubernetes.io/cluster-service: "true"
    addonmanager.kubernetes.io/mode: EnsureExists
data:
  prometheus.yml: |
    global:
      scrape_interval: 30s
    scrape_configs:
      - job_name: prometheus
        static_configs:
          - targets:
              - localhost:9090

      - job_name: kubernetes-apiservers
        kubernetes_sd_configs:
          - role: endpoints
        relabel_configs:
          - action: keep
            regex: default;kubernetes;https
            source_labels:
              - __meta_kubernetes_namespace
              - __meta_kubernetes_service_name
              - __meta_kubernetes_endpoint_port_name
        scheme: https
        tls_config:
          ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
          insecure_skip_verify: true
        bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token

      - job_name: kubernetes-nodes-kubelet
        # 此处可根据实际需求补充对应节点的抓取规则
        
      - job_name: kubernetes-service-endpoints
        # 此处可补充服务端点抓取规则
        
      - job_name: kubernetes-services
        # 此处可补充集群 Service 抓取规则
        
      - job_name: kubernetes-pods
        # 此处可补充 Pod 指标抓取规则

接下来部署Prometheus Deployment和Service:

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: prometheus
  namespace: kube-system
  labels:
    k8s-app: prometheus
    kubernetes.io/cluster-service: "true"
    addonmanager.kubernetes.io/mode: Reconcile
spec:
  replicas: 1
  selector:
    matchLabels:
      k8s-app: prometheus
  template:
    metadata:
      labels:
        k8s-app: prometheus
      annotations:
        scheduler.alpha.kubernetes.io/critical-pod: ''
    spec:
      priorityClassName: system-cluster-critical
      # 初始化容器:用于调整数据目录的属主权限(确保非 root 运行的 prometheus 有权写入 /data)
      initContainers:
        - name: "init-chown-data"
          image: "busybox:latest"
          imagePullPolicy: "IfNotPresent"
          command: ["chown", "-R", "65534:65534", "/data"]
          volumeMounts:
            - name: storage-volume
              mountPath: /data
              subPath: ""
      containers:
        # 辅助容器:监控 ConfigMap 变化并自动热重载 Prometheus 配置
        - name: prometheus-server-configmap-reload
          image: "jimmidyson/configmap-reload:v0.1"
          imagePullPolicy: "IfNotPresent"
          args:
            - --volume-dir=/etc/config
            - --webhook-url=http://localhost:9090/-/reload
          volumeMounts:
            - name: config-volume
              mountPath: /etc/config
              readOnly: true
        # Prometheus 主容器
        - name: prometheus-server
          image: "prom/prometheus:v2.8.0"
          imagePullPolicy: "IfNotPresent"
          args:
            - --config.file=/etc/config/prometheus.yml
            - --storage.tsdb.path=/data
            - --web.console.libraries=/etc/prometheus/console_libraries
            - --web.console.templates=/etc/prometheus/consoles
            - --web.enable-lifecycle
          ports:
            - containerPort: 9090
          readinessProbe:
            httpGet:
              path: /-/ready
              port: 9090
            initialDelaySeconds: 30
            timeoutSeconds: 30
          livenessProbe:
            httpGet:
              path: /-/healthy
              port: 9090
            initialDelaySeconds: 30
            timeoutSeconds: 30
          volumeMounts:
            - name: config-volume
              mountPath: /etc/config
            - name: storage-volume
              mountPath: /data
              subPath: ""
      terminationGracePeriodSeconds: 300
      volumes:
        - name: config-volume
          configMap:
            name: prometheus-config
        - name: storage-volume
          hostPath:
            path: /prometheus-data
            type: Directory
---
apiVersion: v1
kind: Service
metadata:
  name: prometheus
  namespace: kube-system
  labels:
    kubernetes.io/name: "Prometheus"
    kubernetes.io/cluster-service: "true"
    addonmanager.kubernetes.io/mode: Reconcile
spec:
  type: NodePort
  ports:
    - name: http
      port: 9090
      nodePort: 9090
      protocol: TCP
      targetPort: 9090
  selector:
    k8s-app: prometheus

在部署完成后,确保Prometheus运行成功:

# kubectl -n kube-system get pods -l k8s-app=prometheus
NAME                              READY   STATUS    RESTARTS   AGE
prometheus-5fbb5ddd4f-2wrxj   2/2     Running   0          3m32s

Prometheus提供了一个简单的Web页面用于查看已采集的监控数据,上面的Service定义了NodePort为9090,我们可以通过访问Node的9090端口访问这个页面,如图所示。
在这里插入图片描述
在Prometheus提供的Web页面上,可以输入PromQL查询语句对指标数据进行查询,也可以选择一个指标进行查看,例如选择container_network_receive_bytes_total指标查看容器的网络接收字节数,如图所示。

在这里插入图片描述
单击Graph标签,可以查看该指标的时序图,如图所示。
在这里插入图片描述
接下来可以针对各种系统和服务部署各种Exporter进行指标数据的采集。目前Prometheus支持多种开源软件的Exporter,包括数据库、硬件系统、消息系统、存储系统、HTTP服务器、日志服务,等等,可以从Prometheus的官网https://prometheus.io/docs/instrumenting/exporters/获取各种Exporter的信息。

下面以官方维护的node_exporter为例进行部署。node_exporter主要用于采集主机相关的性能指标数据,其官网为https://github.com/prometheus/node_exporter。node_exporter的YAML配置文件如下:

---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: node-exporter
  namespace: kube-system
  labels:
    k8s-app: node-exporter
    kubernetes.io/cluster-service: "true"
    addonmanager.kubernetes.io/mode: Reconcile
    version: v0.17.0
spec:
  selector:
    matchLabels:
      k8s-app: node-exporter
  updateStrategy:
    type: OnDelete
  template:
    metadata:
      labels:
        k8s-app: node-exporter
        version: v0.17.0
      annotations:
        scheduler.alpha.kubernetes.io/critical-pod: ''
    spec:
      priorityClassName: system-node-critical
      # 开启宿主机网络与 PID 命名空间,以便直接读取宿主机的系统状态
      hostNetwork: true
      hostPID: true
      containers:
        - name: prometheus-node-exporter
          image: "prom/node-exporter:v0.17.0"
          imagePullPolicy: "IfNotPresent"
          args:
            - --path.procfs=/host/proc
            - --path.sysfs=/host/sys
          ports:
            - name: metrics
              containerPort: 9100
              hostPort: 9100
          volumeMounts:
            - name: proc
              mountPath: /host/proc
              readOnly: true
            - name: sys
              mountPath: /host/sys
              readOnly: true
          resources:
            limits:
              cpu: 1
              memory: 512Mi
            requests:
              cpu: 100m
              memory: 50Mi
      volumes:
        - name: proc
          hostPath:
            path: /proc
        - name: sys
          hostPath:
            path: /sys
---
apiVersion: v1
kind: Service
metadata:
  name: node-exporter
  namespace: kube-system
  annotations:
    prometheus.io/scrape: "true"
    prometheus.io/port: "9100"
    prometheus.io/path: "/metrics"
  labels:
    kubernetes.io/cluster-service: "true"
    addonmanager.kubernetes.io/mode: Reconcile
    kubernetes.io/name: "NodeExporter"
spec:
  # Headless Service:不分配 Cluster IP,直接通过 Pod IP 列表进行抓取
  clusterIP: None
  ports:
    - name: metrics
      port: 9100
      protocol: TCP
      targetPort: 9100
  selector:
    k8s-app: node-exporter

在部署完成后,在每个Node上都运行了一个node-exporter Pod:

# kubectl -n kube-system get pods -l k8s-app: node-exporter
NAME                                        READY   STATUS    RESTARTS   AGE
node-exporter-2x4fq                        1/1     Running   0          15m
node-exporter-saz2w                        1/1     Running   0          15m
node-exporter-kr8wc                        1/1     Running   0          15m
......

从Prometheus的Web页面就可以查看node-exporter采集的Node指标数据了,如图所示。
在这里插入图片描述最后,部署Grafana用于展示专业的监控页面,其YAML配置文件如下:

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: grafana
  namespace: kube-system
  labels:
    k8s-app: grafana
    kubernetes.io/cluster-service: "true"
    addonmanager.kubernetes.io/mode: Reconcile
spec:
  replicas: 1
  selector:
    matchLabels:
      k8s-app: grafana
  template:
    metadata:
      labels:
        k8s-app: grafana
      annotations:
        scheduler.alpha.kubernetes.io/critical-pod: ''
    spec:
      priorityClassName: system-cluster-critical
      # 容忍 Master 节点的污点,允许 Grafana 调度到控制平面节点上运行
      tolerations:
        - key: node-role.kubernetes.io/master
          effect: NoSchedule
        - key: "CriticalAddonsOnly"
          operator: "Exists"
      containers:
        - name: grafana
          image: grafana/grafana:6.0.1
          imagePullPolicy: IfNotPresent
          resources:
            limits:
              cpu: 1
              memory: 1Gi
            requests:
              cpu: 100m
              memory: 100Mi
          env:
            - name: GF_AUTH_BASIC_ENABLED
              value: "false"
            - name: GF_AUTH_ANONYMOUS_ENABLED
              value: "true"
            - name: GF_AUTH_ANONYMOUS_ORG_ROLE
              value: Admin
            - name: GF_SERVER_ROOT_URL
              value: /api/v1/namespaces/kube-system/services/grafana/proxy/
          ports:
            - name: ui
              containerPort: 3000
---
apiVersion: v1
kind: Service
metadata:
  name: grafana
  namespace: kube-system
  labels:
    kubernetes.io/cluster-service: "true"
    addonmanager.kubernetes.io/mode: Reconcile
    kubernetes.io/name: "Grafana"
spec:
  ports:
    - port: 80
      protocol: TCP
      targetPort: ui
  selector:
    k8s-app: grafana

部署完成后,通过Kubernetes Master的URL访问Grafana页面,例如http://192.168.18.3:8080/api/v1/namespaces/kube-system/services/grafana/proxy。

在Grafana的设置页面添加类型为Prometheus的数据源,输入Prometheus服务的URL(如http://prometheus:9090)进行保存,如图所示。
在这里插入图片描述

在Grafana的Dashboard控制面板导入预置的Dashboard模板,以显示各种监控图表。Grafana官网(https://grafana.com/dashboards)提供了许多针对Kubernetes集群监控的Dashboard模板,可以下载、导入并使用。下图显示了一个可以监控集群CPU、内存、文件系统、网络吞吐率的Dashboard。

在这里插入图片描述

至此,基于Prometheus+Grafana的Kubernetes集群监控系统就搭建完成了。

9、集群统一日志管理

在Kubernetes集群环境中,一个完整的应用或服务都会涉及为数众多的组件运行,各组件所在的Node及实例数量都是可变的。日志子系统如果不做集中化管理,则会给系统的运维支撑造成很大的困难,因此有必要在集群层面对日志进行统一收集和检索等工作。

在容器中输出到控制台的日志,都会以*-json.log的命名方式保存在/var/lib/docker/containers/目录下,这就为日志采集和后续处理奠定了基础。

Kubernetes推荐采用Fluentd+Elasticsearch+Kibana完成对系统和容器日志的采集、查询和展现工作。

部署统一的日志管理系统,需要以下两个前提条件。

  • API Server正确配置了CA证书。
  • DNS服务启动、运行。

9.1、系统部署架构

该系统的逻辑架构如图所示。
在这里插入图片描述
在各Node上都运行了一个Fluentd容器,采集本节点/var/log和/var/lib/docker/containers两个目录下的日志进程,将其汇总到Elasticsearch集群,最终通过Kibana完成和用户的交互工作。

这里有一个特殊的需求:Fluentd必须在每个Node上运行。为了满足这一需求,我们通过以下几种方式部署Fluentd。

  • 直接在Node主机上部署Fluentd。
  • 利用kubelet的–config参数,为每个Node都加载Fluentd Pod。
  • 利用DaemonSet让Fluentd Pod在每个Node上运行。

9.2、创建Elasticsearch RC和Service

Elasticsearch的RC和Service定义如下:

---
apiVersion: v1
kind: ReplicationController
metadata:
  name: elasticsearch-logging-v1
  namespace: kube-system
  labels:
    k8s-app: elasticsearch-logging
    version: v1
    kubernetes.io/cluster-service: "true"
spec:
  replicas: 2
  selector:
    k8s-app: elasticsearch-logging
    version: v1
  template:
    metadata:
      labels:
        k8s-app: elasticsearch-logging
        version: v1
        kubernetes.io/cluster-service: "true"
    spec:
      containers:
        - name: elasticsearch-logging
          image: gcr.io/google_containers/elasticsearch:1.8
          resources:
            # 保持 requests 与 limits 相等,使该容器处于 Guaranteed(保证型)QoS 级别
            limits:
              cpu: 100m
            requests:
              cpu: 100m
          ports:
            - containerPort: 9200
              name: db
              protocol: TCP
            - containerPort: 9300
              name: transport
              protocol: TCP
          volumeMounts:
            - name: es-persistent-storage
              mountPath: /data
      volumes:
        - name: es-persistent-storage
          emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
  name: elasticsearch-logging
  namespace: kube-system
  labels:
    k8s-app: elasticsearch-logging
    kubernetes.io/cluster-service: "true"
    kubernetes.io/name: "Elasticsearch"
spec:
  ports:
    - port: 9200
      protocol: TCP
      targetPort: db
  selector:
    k8s-app: elasticsearch-logging

执行kubectl create -f elastic-search.yml命令完成创建。

在命令成功执行后,首先验证Pod的运行情况。通过kubectl get pods–namespaces=kube-system获取运行中的Pod:

# kubectl get pods --namespaces=kube-system
NAMESPACE     NAME                                   READY    STATUS   RESTARTS  AGE
kube-system   elasticsearch-logging-v1-59qvp      1/1     Running   0      18h
kube-system   elasticsearch-logging-v1-xnv14      1/1     Running   0      18h

接下来通过Elasticsearch页面验证其功能。

首先,执行# kubectl cluster-info命令获取Elasticsearch服务的地址:

# kubectl cluster-info
Elasticsearch is running at
http://192.168.18.3:8080/api/v1/proxy/namespaces/kube-system/services/elasticsea
rch-logging

然后,使用# kubectl proxy命令对API Server进行代理,在成功执行后输出如下内容:

# kubectl proxy
Starting to serve on 127.0.0.1:8001

这样就可以在浏览器上访问URL地址http://192.168.18.3:8001/api/v1/proxy/namespaces/kube-system/services/elasticsearch-logging,来验证Elasticsearch的运行情况了,返回的内容是一个JSON文档:

{
"status": 200,
"name": "Emplate",
"cluster_name": "kubernetes-logging",
"version": {
"number": "1.5.2",
"build_hash": "62ff9868b4c8a0c45860bebb259e21980778ab1c",
"build_timestamp": "2015-04-27T09:21:06Z",
"build_snapshot": false,
"lucene_version": "4.10.4"
},
"tagline": "You Know, for Search"
}

9.3、在每个Node上启动Fluentd

Fluentd的DaemonSet定义如下:

---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd-cloud-logging
  namespace: kube-system
  labels:
    k8s-app: fluentd-cloud-logging
spec:
  selector:
    matchLabels:
      k8s-app: fluentd-cloud-logging
  template:
    metadata:
      namespace: kube-system
      labels:
        k8s-app: fluentd-cloud-logging
    spec:
      tolerations:
        - operator: Exists
          effect: NoSchedule
      containers:
        - name: fluentd-cloud-logging
          image: gcr.io/google_containers/fluentd-elasticsearch:1.17
          resources:
            limits:
              cpu: 100m
              memory: 200Mi
          env:
            - name: FLUENTD_ARGS
              value: -q
          volumeMounts:
            - name: varlog
              mountPath: /var/log
              readOnly: false
            - name: containers
              mountPath: /var/lib/docker/containers
              readOnly: true
      volumes:
        - name: containers
          hostPath:
            path: /var/lib/docker/containers
        - name: varlog
          hostPath:
            path: /var/log

通过kubectl create命令创建Fluentd容器:

# kubectl create -f fluentd-ds.yml

查看创建的结果:

# kubectl get daemonset
NAME                         DESIRED  CURRENT   NODE-SELECTOR   AGE
fluentd-cloud-logging    3          3          <none>           1h

# kubectl get pods
NAMESPACE     NAME                      READY     STATUS    RESTARTS   AGE
fluentd-cloud-logging-7tw9z           1/1       Running    0          18h
fluentd-cloud-logging-aqdn1           1/1       Running    0          18h
fluentd-cloud-logging-o4usx           1/1       Running    0          18h

结果显示Fluentd DaemonSet正常运行,还启动了3个Pod,与集群中的Node数量一致。

接下来使用# kubectl logs fluentd-cloud-logging-7tw9z命令查看Pod的日志,在Elasticsearch正常工作的情况下,我们会看到类似下面这样的日志内容:

# kubectl logs fluentd-cloud-logging-7tw9z
Connection opened to Elasticsearch cluster =>
{:host=>"elasticsearch-logging", :port=>9200, :scheme=>"http"}

说明Fluentd与Elasticsearch已经正确建立了连接。

9.4、运行Kibana

至此已经运行了Elasticsearch和Fluentd,数据的采集和汇聚已经完成,接下来使用Kibana展示和操作数据。

Kibana的RC和Service定义如下:

---
apiVersion: v1
kind: ReplicationController
metadata:
  name: kibana-logging-v1
  namespace: kube-system
  labels:
    k8s-app: kibana-logging
    version: v1
    kubernetes.io/cluster-service: "true"
spec:
  replicas: 1
  selector:
    k8s-app: kibana-logging
    version: v1
  template:
    metadata:
      labels:
        k8s-app: kibana-logging
        version: v1
        kubernetes.io/cluster-service: "true"
    spec:
      containers:
        - name: kibana-logging
          image: gcr.io/google_containers/kibana:1.3
          resources:
            # 保持 requests 与 limits 相等,使该容器处于 Guaranteed(保证型)QoS 级别
            limits:
              cpu: 100m
            requests:
              cpu: 100m
          env:
            - name: "ELASTICSEARCH_URL"
              value: "http://elasticsearch-logging:9200"
          ports:
            - containerPort: 5601
              name: ui
              protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
  name: kibana-logging
  namespace: kube-system
  labels:
    k8s-app: kibana-logging
    kubernetes.io/cluster-service: "true"
    kubernetes.io/name: "Kibana"
spec:
  ports:
    - port: 5601
      protocol: TCP
      targetPort: ui
  selector:
    k8s-app: kibana-logging

通过kubectl create -f kibana-rc-svc.yml命令创建Kibana的RC和Service:

# kubectl create -f kibana-rc-svc.yml
replicationcontroller "kibana-logging-v1" created
service "kibana-logging" created

查看Kibana的运行情况:

# kubectl get pods
NAMESPACE   NAME                         READY     STATUS    RESTARTS   AGE
default     kibana-logging-v1-o1akg   1/1       Running   0           1h
    # kubectl get svc
    NAME               CLUSTER-IP         EXTERNAL-IP   PORT(S)    AGE
    kibana-logging   169.169.195.177   <none>         5601/TCP   1h

    # kubectl get rc
    NAME                            DESIRED   CURRENT   AGE
    kibana-logging-v1             1          1          1h

结果表明运行均已成功。通过kubectl cluster-info命令获取Kibana服务的URL地址:

# kubectl cluster-info
Kibana is running at
http://127.0.0.1:8080/api/v1/proxy/namespaces/kube-system/
services/kibana-logging

同样通过kubectl proxy命令启动代理,在出现“Startingto serve on 127.0.0.1:8001”字样之后,用浏览器访问URL地址http://192.168.18.3:8001/api/v1/proxy/namespaces/kube-system/services/kibana-logging即可访问Kibana页 面。

第1次进入页面时需要进行一些设置,如图所示,选择所需选项后单击create按钮。
在这里插入图片描述
然后单击discover按钮,就可以正常查询日志了,如图所示。
在这里插入图片描述
在搜索栏输入“error”关键字,可以搜索出包含该关键字的日志记录,如图所示。
在这里插入图片描述
同时,通过左边菜单中Fields相关的内容对查询的内容进行限定,如图所示。
在这里插入图片描述
至此,Kubernetes集群范围内的统一日志收集和查询系统就搭建完成了。

Kubernetes权威指南:从Docker到Kubernetes实践全接触(第5版)读书笔记 目录 Kubernetes权威指南:从Docker到Kubernetes实践全接触(第5版)读书笔记。 阅读详情

相关推荐

Kubernetes权威指南第5版:从Docker到Kubernetes实践全接触

快速深入学习kubernetes

m0_55441854的博客 2846

【k8s权威指南】第1章 Kubernetes入门

本系列文章是<Kubernetes权威指南(第四版)>的学习笔记,适合初学者,理清k8s学习框架

weixin_45909424的博客 2645

Docker 与 Kubernetes 权威指南

作者:禅与计算机程序设计艺术 1.简介 概要 作为Docker火爆发展的一年里,Kubernetes带来了容器编排的革命性变化。Kubernetes整合了云原生计算的理念和开源社区的力量,真正成为企业级容器集群管理的事实标准。本书从Docker与Kubernetes的基

AI天才研究院 1303

Kubernetes技术笔记-从理论到实践,轻松搭建K8s集群

本文详细介绍了Kubernetes集群的部署流程,包括理论架构和实际操作步骤,从理论到实践,从零开始搭建属于自己的K8s集群,全文6k字。首先阐述了K8s作为容器编排系统的核心功能,解析了Master和Node节点的组件构成。随后提供了完整的集群规划方案,涵盖环境要求、主机准备和必要服务配置。重点讲解了Master节点的搭建过程,包括环境配置、软件安装、容器运行时设置、内核参数优化等关键步骤,并详细说明了网络插件Calico的安装方法。最后指导Node节点如何加入集群,并给出验证命令。

m0_65816971的博客 1788

【GAN实战】基于pytorch-CycleGAN与pix2pix的自定义数据集训练全攻略

本文详细解析了基于PyTorch的CycleGAN与pix2pix模型在自定义数据集上的完整训练流程。核心在于根据数据是否成对来正确选择模型:pix2pix适用于严格配对的“孪生”数据,而CycleGAN则擅长处理非配对的“散装”数据集。文章从数据准备、配置训练到测试应用,提供了全链路实战指南与关键参数调优心得,帮助开发者高效实现图像到图像的风格转换。

x2y3z4a5b的博客 704

MATLAB 2022b 用户专属:保姆级IPOPT求解器安装配置全流程(含OPTI工具箱)

本文为MATLAB 2022b用户提供IPOPT求解器的详细安装与配置指南,涵盖OPTI工具箱的适配安装、环境变量设置及常见问题解决方案。通过实战案例演示非线性优化问题的求解过程,帮助用户高效部署这一强大的优化工具,提升工程计算效率。

weixin_29092031的博客 406

赠书福利丨Kubernetes权威指南第4版

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33904756的博客 3839

VLP16:使用pointcloud_to_laserscan将三维点云转化为二维LaserScan

velodyne16线激光雷达 VLP16:使用pointcloud_to_laserscan将三维点云转化为二维LaserScan

NEUer_ljx的博客 4620

kubernetes 根 README 深度解读:从源码构建 K8s 到把 K8s 组件当库用的实践指南

本文基于 kubernetes 仓库根目录 [README.md](https://link.gitcode.com/i/b7f700c85eaa8c2d40a7c031e44d02a0) 展开,带你完整掌握三件事:Kubernetes 的定位与设计渊源(Google Borg 经验)、两种官方支持的源码构建方式(Go 环境 `make` 与 Docker 环境 `make quick-relea

gitblog_00036的博客 1134

AI编程助手Cursor如何革新经济学研究:从计量模型到可视化全流程实战

在数据科学和人工智能技术蓬勃发展的今天,如何高效地将前沿AI工具融入专业领域的研究工作流,成为提升科研效率的关键。其核心原理在于通过自然语言交互,将研究者的专业问题转化为机器可执行的指令,从而实现人机协作的范式转移。这一技术的核心价值在于大幅降低非计算机背景研究者的编程门槛,将精力从繁琐的代码实现中解放出来,更聚焦于学科本身的思想与逻辑。尤其在经济学、金融学等高度依赖数据分析和计量建模的领域,AI编程助手能够快速处理数据清洗、模型估计、可视化及结果解释等任务。具体到应用场景,研究者可以利用结构化提示词工程,

weixin_42531579的博客 296

手把手教你学Simulink--基于储能系统的建模与仿真场景:-锂电池储能系统充放电管理策略仿真

《锂电池储能系统充放电管理的Simulink建模与仿真》摘要 本文详细介绍了使用Simulink+SimscapeElectrical对锂电池储能系统进行充放电管理策略建模的全过程。从系统结构设计入手,重点阐述了锂电池模型、充放电控制器、热管理系统等核心模块的搭建方法,并提供了完整的仿真流程。文章详细说明了如何实现荷电状态管理、温度控制和功率限制等关键策略,通过仿真分析了电池电压、电流、SoC和温度等关键指标的变化规律。最后提出了基于仿真结果的优化建议,包括参数整定、算法改进等方面,为锂电池储能系统的安全高

MHD0815的博客 1万+

Kubernetes权威指南

网站 更多书籍点击进入>> CiCi岛 下载 电子版仅供预览及学习交流使用,下载后请24小时内删除,支持正版,喜欢的请购买正版书籍 电子书下载(皮皮云盘-点击“普通下载”) 购买正版 封页 编辑推荐 本书是容器圈Kubernetes重磅开山作《Kubernetes权威指南》的纪念版,内容更新到Kubernetes v1.6 版本。   本书作者全部来自惠普公司云计算实战一线,敏锐...

CiCi岛的专栏 2084

液滴碰撞壁面的过程背景论文——bouncing反弹,spreading扩展,splashing飞溅。铺展过程介绍。还存在很多未解之谜。

【1993-德国-Phenomena of liquid drop impact on solid and liquid surfaces】液滴碰撞壁面的过程背景——bouncing反弹,spreading扩展,splashing飞溅。还存在很多未解之谜。还存在很多未解之谜。不同液滴形状碰撞过程。

qq_15963745的博客 200

【免费下载】 Kubernetes权威指南(纪念版)PDF资源介绍

Kubernetes权威指南(纪念版)PDF资源介绍 【下载地址】Kubernetes权威指南纪念版PDF资源介绍分享 Kubernetes权威指南(纪念版)PDF资源介绍欢迎来到Kubernetes学习资源页面!这里我们自豪地分享《Kubernetes权威指南(纪念版)》的PDF版本,此版本虽然相对旧些,但其核心概念和...

gitblog_06545的博客 2330

【WRF-Chem教程-附录 C】闪电-NOx 参数化方案详解

闪电-NOx 参数化方案详解

WW、forever的博客 974

Kong API Gateway 配置与深入

Kong是一个开源的、高性能的API网关,提供了一种简单易用的服务间路由、流量管理和安全防护方案,其最初起源于Nginx Inc.,但后迁移至Apache Software Foundation。Kong支持RESTful、GraphQL、TCP/UDP等协议,可与AWS Lambda、Azure Functions、Google Cloud Functions等云函数平台集成。其主要功能包括:服务发现与负载均衡、请求代理、身份认证与授权、缓存、日志记录、监控指标、灰度发布、多种插件等。

AI天才研究院 2284

《Kubernetes权威指南》一起来免费下载学习

​人人都想拥有的K8s重磅级案头手册 本书从架构师、开发人员和运维人员的角度,阐述了Kubernetes 的基本概念、实践指南、核心原理、开发指导、运维指南、新特性演进等内容,图文并茂、内容丰富、由浅入深、讲解全面;并围绕在生产环境中可能出现的问题,给出了大量的典型案例,有很强的实战指导意义。 关注本公众号,后台回复 k8s 即可获取 Java的docker东风 开发者家目录(社区),专注于Java、Linux 以及docker、kubernetes(k8s)等云原生领域的技术分享;同时...

u012809308的博客 3546

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【亲测免费】 探索云原生世界的必备指南:《Kubernetes 权威指南》

探索云原生世界的必备指南:《Kubernetes 权威指南》 【下载地址】Kubernetes权威指南分享 Kubernetes 权威指南欢迎使用《Kubernetes 权威指南》,这是一本全面覆盖Kubernetes技术栈的深度学习资料 ...

gitblog_06653的博客 1260

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

【亲测免费】 Kubernetes 权威指南

Kubernetes 权威指南 【下载地址】Kubernetes权威指南分享 Kubernetes 权威指南欢迎使用《Kubernetes 权威指南》,这是一本全面覆盖Kubernetes技术栈的深度学习资料 项目地址: http...

gitblog_06675的博客 804

Flink on Kubernetes Operator:在K8s上部署Flink的权威指南

**[Flink on Kubernetes Operator](https://github.com/GoogleCloudPlatform/flink-on-k8s-operator)** 是由Google Cloud Platform维护的一个开源项目,旨在简化Apache Flink集群在Kubernetes(K8s)环境中的部署和管理过程。通过利用Kubernetes的原生资源管理和自动

gitblog_00423的博客 843

kubernetes权威指南_如何快速上手成为大厂标配的kubernetes?

程序员书库(ID:CodingBook) 猿妹 综合整理过去几年,以docker、kubernetes为代表的容器技术已发展为一项通用技术,BAT、滴滴、京东、头条等大厂,都争相把容器和k8s项目作为技术重心。据说阿里巴巴目前所有业务都跑在云上,许多业务已迁移到自己定制 kubernetes 集群上。然而,要想用好Kubernetes,还是有些东西要注意的,否则可能会给自己带来一些小麻烦...

weixin_42375011的博客 202

k8s pod部署到不同node_K8S集群管理

本文对k8s中的集群管理进行总结,参见文档<权威指南>。Node管理K8S集群中的资源是由Node提供。这里将介绍Node的隔离和扩容。-Node隔离在硬件升级和维护的过程中,可能需要隔离某些Node使其不被k8s调度。K8s中提供2种方式让Node脱离调度和恢复调度。指定spec.unschedulable设置spec.unschedulable为true便可以隔离Node,使其不受...

weixin_39636333的博客 1641

Kubernetes权威指南-第5版

无

魏波 9988

《Kubernetes权威指南:从Docker到Kubernetes实践全接触》读书笔记

对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想的懦弱回归,是随波逐流,是对内心的恐惧 ——赫尔曼·黑塞《德米安》

山河已无恙 2571

Kubernetes权威指南(上)

K8S权威指南

Phineas0326的博客 2347

Kubernetes权威指南——Kubernetes集群管理(一)

接下来,需要为这两个工作组分别定义一个Context,即运行环境。这个运行环境将属于某个特定的命名空间。128:8080clusters:- cluster:contexts:- context:- context:users: []注意,通过kubectl config命令在${HOME}/.kube目录下生成了一个名为config的文件,文件的内容为以kubectlconfig view命令查看到的内容。所以,也可以通过手工编辑该文件的方式来设置Context。

吴声子夜歌的博客 188
上一篇: Kubernetes权威指南——Kubernetes集群管理(四)
下一篇: Kubernetes权威指南——Kubernetes集群管理(六)
吴声子夜歌
博客等级 码龄9年 2688粉丝 2271原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值