CKA认证 | Day2 K8s内部监控与日志

第三章 Kubernetes监控与日志

1、查看集群资源状态

在 Kubernetes 集群中,查看集群资源状态和组件状态是非常重要的操作。以下是一些常用的命令和解释,帮助你更好地管理和监控 Kubernetes 集群。

1.1 查看master组件状态

Kubernetes 的 Master 组件包括 API Server、Controller Manager 和 Scheduler。可以使用 kubectl get cs (cs:componentstatuses)命令来查看这些组件的状态。

  • 命令:kubectl get cs
bash 复制代码
[root@k8s-master-1-71 ~]# kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME                 STATUS    MESSAGE                         ERROR
etcd-0               Healthy   {"health":"true","reason":""}
controller-manager   Healthy   ok
scheduler            Healthy   ok

ComponentStatus 在 Kubernetes 1.19 及以上版本中已被弃用,建议使用其他方式监控 Master 组件的状态;没有显示 API Server 的状态,因为查看 Master 组件状态的请求本身就是通过 API Server 进行的

1.2 查看所有的node状态

使用 kubectl get node 命令可以查看集群中所有节点的状态。

  • 命令:kubectl get node
bash 复制代码
[root@k8s-master-1-71 ~]# kubectl get node
NAME              STATUS   ROLES           AGE   VERSION
k8s-master-1-71   Ready    control-plane   72m   v1.26.0
k8s-node1-1-72    Ready    <none>          58m   v1.26.0
k8s-node2-1-73    Ready    <none>          58m   v1.26.0

该命令获取的是 kubelet 的信息,显示节点的状态、角色、年龄和版本

1.3 查看资源的详细信息

使用 kubectl describe 命令可以查看特定资源的详细信息,包括 Events 相关事件。

  • 命令:kubectl describe <资源类型> <资源名称>
bash 复制代码
kubectl describe node k8s-master-1-71

该命令会输出节点的详细信息,包括 CPU、内存、存储等资源的使用情况,以及最近的事件(Events)

1.4 查看资源信息

使用 kubectl get 命令可以查看资源的简要信息,通过添加 -o wide 或 -o yaml 参数可以输出更详细的信息或导出 YAML 文件。

  • 命令:kubectl get <资源类型> <资源名称> //-o wide、-o yaml

-o wide 输出详细信息

-o yaml 导出YAML文件

bash 复制代码
kubectl get pod my-pod
NAME      READY   STATUS    RESTARTS   AGE
my-pod   1/1     Running   0          5m

kubectl get pod my-pod -o wide    ## 详细信息
NAME      READY   STATUS    RESTARTS   AGE   IP           NODE             NOMINATED NODE   READINESS GATES
my-pod   1/1     Running   0          5m    10.244.1.2   k8s-node1-1-72   <none>           <none>

kubectl get pod my-pod -o yaml    ## 导出 YAML 文件
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
  namespace: default
  ...
spec:
  containers:
  - name: my-container
    image: my-image:latest
    ...
status:
  phase: Running
  ...

1.5 查看集群组件命令的缩写

通过使用 kubectl api-resources 命令可以查看 Kubernetes 中所有资源的缩写和详细信息。

bash 复制代码
kubectl api-resources
NAME                              SHORTNAMES   APIVERSION                             NAMESPACED   KIND
bindings                                       v1                                     true         Binding
componentstatuses                 cs           v1                                     false        ComponentStatus
configmaps                        cm           v1                                     true         ConfigMap
endpoints                         ep           v1                                     true         Endpoints
events                            ev           v1                                     true         Event
limitranges                       limits       v1                                     true         LimitRange
namespaces                        ns           v1                                     false        Namespace
nodes                             no           v1                                     false        Node
persistentvolumeclaims            pvc          v1                                     true         PersistentVolumeClaim
persistentvolumes                 pv           v1                                     false        PersistentVolume
pods                              po           v1                                     true         Pod
...

该命令列出所有 Kubernetes 资源的名称、缩写、API 版本、是否命名空间化以及资源类型

2、监控集群资源利用率

在 Kubernetes 集群中,监控集群资源利用率是非常重要的,可以帮助你了解集群中各个节点和 Pod 的资源消耗情况。kubectl top 命令是一个非常有用的工具,但默认情况下,Kubernetes 集群并不会自动安装 Metrics Server,因此需要手动部署。


2.1 查看 Node 和 Pod 资源消耗

① 查看Node资源消耗:

  • 命令:kubectl top node <node name>

② 查看Pod资源消耗:

  • 命令:kubectl top pod <pod name>

注意:执行时会提示错误 " error: Metrics API not available ",因该命令需要由metric-server服务提供数据,而这个服务默认没 有安装,还需要手动部署下。


2.2 metric-server

Metrics Server 是一个集群范围的资源使用情况的数据聚合器,作为一 个应用部署在集群中。Metric Server从每个节点上Kubelet API收集指 标,通过Kubernetes聚合器注册在Master APIServer中,为集群提供Node、Pods资源利用率指标。

项目地址:https://github.com/kubernetes-sigs/metrics-server

1)Metrics Server工作流程:

kubectl top -> apiserver -> metric-server(pod) -> kubelet(cadvisor)

备注:实质上采集数据的是由kubelet上的内嵌的(cadvisor)进行收集,而容器化部署的metric-server主要负责数据聚合,metric-server携带CA证书通过内网访问kubelet的cadvisor采集,需要声明取消证书验证

2)Metrics Server部署:

增加 kubelet-insecure-tls 参数,作用是告诉metrics-server不验证kubelet提供的https证书

bash 复制代码
下载 Metrics Server 的 YAML 文件:
[root@k8s-master-1-71 ~]# wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.3.7/components.yaml


编辑 YAML 文件,添加 kubelet-insecure-tls 参数:
[root@k8s-master-1-71 ~]# vi components.yaml
...
      containers:
      - args:
        - --cert-dir=/tmp
        - --secure-port=4443
        - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
        - --kubelet-use-node-status-port
        - --metric-resolution=15s
        - --kubelet-insecure-tls    //不验证kubelet提供的https证书
        image: lizhenliang/metrics-server:v0.6.1     //转存国内镜像地址
...

应用 YAML 文件:
[root@k8s-master-1-71 ~]# kubectl apply -f metrics-server.yaml

检查是否部署成功:

bash 复制代码
[root@k8s-master-1-71 ~]# kubectl get apiservices |grep metrics
v1beta1.metrics.k8s.io                 kube-system/metrics-server   True        4m13s

[root@k8s-master-1-71 ~]# kubectl get --raw /apis/metrics.k8s.io/v1beta1/nodes
{
  "kind": "NodeMetricsList",
  "apiVersion": "metrics.k8s.io/v1beta1",
  "metadata": {},
  "items": [
    {
      "metadata": {
        "name": "k8s-master",
        "creationTimestamp": "2023-04-03T06:30:53Z",
        "labels": {
          "beta.kubernetes.io/arch": "amd64",
          "beta.kubernetes.io/os": "linux",
          "kubernetes.io/arch": "amd64",
          "kubernetes.io/hostname": "k8s-master",
          "kubernetes.io/os": "linux",
          "node-role.kubernetes.io/control-plane": "",
          "node.kubernetes.io/exclude-from-external-load-balancers": ""
        }
      },
      "timestamp": "2023-04-03T06:30:45Z",
      "window": "11.07s",
      "usage": {
        "cpu": "230752793n",
        "memory": "1218328Ki"
      }
    },
    {
      "metadata": {
        "name": "k8s-node1",
        "creationTimestamp": "2023-04-03T06:30:53Z",
        "labels": {
          "beta.kubernetes.io/arch": "amd64",
          "beta.kubernetes.io/os": "linux",
          "kubernetes.io/arch": "amd64",
          "kubernetes.io/hostname": "k8s-node1",
          "kubernetes.io/os": "linux"
        }
      },
      "timestamp": "2023-04-03T06:30:45Z",
      "window": "11.059s",
      "usage": {
        "cpu": "131423522n",
        "memory": "960948Ki"
      }
    },
    {
      "metadata": {
        "name": "k8s-node2",
        "creationTimestamp": "2023-04-03T06:30:53Z",
        "labels": {
          "beta.kubernetes.io/arch": "amd64",
          "beta.kubernetes.io/os": "linux",
          "kubernetes.io/arch": "amd64",
          "kubernetes.io/hostname": "k8s-node2",
          "kubernetes.io/os": "linux"
        }
      },
      "timestamp": "2023-04-03T06:30:46Z",
      "window": "21.871s",
      "usage": {
        "cpu": "150204652n",
        "memory": "975844Ki"
      }
    }
  ]
}

如果状态True并能返回数据说明Metrics Server服务工作正常。

3、管理K8s组件日志

在 Kubernetes 集群中,管理和查看组件日志是非常重要的,这有助于诊断和解决集群中的问题。以下是一些常见的日志管理方法和命令。

3.1 K8S 系统的组件日志

Kubernetes 系统的组件日志,包括 Master 节点上的组件(如 API Server、Controller Manager、Scheduler)和 Worker 节点上的组件(如 kubelet、kube-proxy)。

1)systemd 守护进程管理的组件 查看相关日志

对于由 systemd 守护进程管理的组件(如 kubelet),可以使用 journalctl 命令查看相关日志

bash 复制代码
journalctl -u kubelet
journalctl -u kubelet -f    //-f实时查看
# kublete 如果有问题,可以重启kubelete服务
systemctl restart kubelet

2)Pod部署的组件 查看相关日志:

对于以 Pod 形式部署的组件(如 kube-proxy、etcd 等),可以使用 kubectl logs 命令查看相关日志

bash 复制代码
kubectl logs kube-proxy-btz4p -n kube-system

kube-proxy-btz4p 是 kube-proxy 的 Pod 名称。

-n kube-system 指定命名空间为 kube-system。

3)系统日志 查看相关日志:

系统日志通常存储在 /var/log/messages 文件中

bash 复制代码
/var/log/messages

3.2 K8S Cluster 里面部署的应用程序日志

Kubernetes 集群中部署的应用程序日志可以分为两种类型:标准输出(stdout)和日志文件。

1)标准输出(stdout)日志:

应用程序的标准输出日志可以通过 kubectl logs 命令查看

  • 查看 Pod 的标准输出日志:kubectl logs <pod-name>
bash 复制代码
kubectl logs my-app-pod

2)日志文件:

如果应用程序将日志写入文件,可以通过挂载 Volume 的方式将日志文件存储到宿主机或共享存储中,然后通过 kubectl exec 命令进入容器查看日志文件。

挂载 Volume 示例:

apiVersion: v1
kind: Pod
metadata:
  name: my-app-pod
spec:
  containers:
  - name: my-app
    image: my-app-image
    volumeMounts:
    - name: log-volume
      mountPath: /var/log/my-app
  volumes:
  - name: log-volume
    hostPath:
      path: /var/log/my-app
      type: DirectoryOrCreate

查看日志文件:

kubectl exec -it my-app-pod -- cat /var/log/my-app/app.log

4、管理K8s应用日志

在 Kubernetes 集群中,管理和查看应用程序日志是非常重要的,这有助于监控应用程序的运行状态和排查问题。以下是一些常见的日志管理方法和命令。

1)查看容器标准输出日志:

  • 命令:kubectl logs <Pod名称>
  • 命令:kubectl logs -f <Pod名称> //实时查看容器标准输出日志
bash 复制代码
kubectl logs my-pod
kubectl logs -f my-pod

2)标准输出在宿主机的路径:

标准输出日志在宿主机上的路径通常是 /var/lib/docker/containers/<container-id>/<container-id>-json.log。你可以通过 kubectl describe 命令查看容器的 ID。

  • 命令:kubectl describe pod <Pod名称>
  • cat /var/lib/docker/containers/<container-id>/<container-id>-json.log
bash 复制代码
kubectl describe pod my-pod    //在输出中找到 Container ID
Containers:
  my-container:
    Container ID:   docker://abcdef123456...

## 查看标准输出日志文件:
cat /var/lib/docker/containers/abcdef123456/abcdef123456-json.log

3)查看日志文件,进入到终端日志目录查看:

如果你的应用程序将日志写入到文件中,可通过 kubectl exec 命令进入容器的终端,然后查看日志文件。

  • 命令:kubectl exec -it <Pod名称> -- bash
  • cat /var/log/myapp.log
bash 复制代码
kubectl exec -it my-pod -- bash
cat /var/log/myapp.log

4)使用日志收集工具

在生产环境中,通常会使用日志收集工具(如 Fluentd、Fluent Bit、ELK Stack 等)来集中管理和分析日志。这些工具可以将日志从各个节点和容器中收集起来,并存储到中央日志存储系统中,方便查询和分析。

  • Fluentd: 一个开源的数据收集器,可以收集、处理和转发日志数据。
  • Fluent Bit: Fluentd 的轻量级版本,适用于资源受限的环境。
  • ELK Stack: 由 Elasticsearch、Logstash 和 Kibana 组成的日志分析平台。

5、收集K8s日志思路

收集 Kubernetes 日志的思路包括:确定日志源、选择合适的日志收集工具、配置日志收集、选择日志存储和分析平台、配置日志监控和报警机制,以及制定日志保留和清理策略。通过这些步骤,可以有效地收集、存储、分析和监控 Kubernetes 集群中的日志,确保系统的稳定性和可维护性。

需要明确收集的日志类型和来源,Kubernetes 中的日志主要分为以下几类:

  • 容器日志:每个容器的标准输出(stdout)和标准错误(stderr)日志。
  • Pod 日志:Pod 级别的日志,通常是容器日志的集合。
  • 节点日志:Kubernetes 节点(Node)上的系统日志,包括 kubelet、kube-proxy 等组件的日志。
  • API 服务器日志:Kubernetes API 服务器的日志,记录 API 请求和响应。
  • 控制器管理器日志:Kubernetes 控制器管理器的日志,记录控制器的行为。
  • 调度器日志:Kubernetes 调度器的日志,记录 Pod 的调度决策。
  • 应用程序日志:应用程序自定义的日志,通常通过文件或网络输出。

扩展实践

1、查看pod日志,并将日志中Error的行记录到指定文件

  • pod名称:web
  • 文件:/opt/web

2、查看指定标签使用cpu最高的pod,并记录到到指定文件

  • 标签:app=web
  • 文件:/opt/cpu

小结:

本篇为 【Kubernetes CKA认证 Day2】的学习笔记,希望这篇笔记可以让您初步了解到 K8s内部监控与日志,课后还有扩展实践,不妨跟着我的笔记步伐亲自实践一下吧!


Tip:毕竟两个人的智慧大于一个人的智慧,如果你不理解本章节的内容或需要相关笔记、视频,可私信小安,请不要害羞和回避,可以向他人请教,花点时间直到你真正的理解。

相关推荐
少陽君10 分钟前
服务器显卡和桌面pc显卡有什么不同
运维·服务器
daizikui19 分钟前
Linux文件目录命令
linux·运维·服务器
叫我龙翔1 小时前
【项目日记】仿mudou的高并发服务器 --- 整体框架搭建 ,实现时间轮模块
运维·服务器·网络·c++·github
花生的酱2 小时前
Shell编程之正则表达式与文本处理器
linux·运维·正则表达式
想学习java初学者2 小时前
Docker Compose部署Kafka(非Zookeeper)
docker·容器·kafka
Ujimatsu2 小时前
虚拟机安装Ubuntu 24.04服务器版(命令行版)
linux·运维·服务器·ubuntu·运维开发
綦枫Maple3 小时前
Jmeter基础篇(22)服务器性能监测工具Nmon的使用
运维·服务器·jmeter·性能监控·nmon
眷怀3 小时前
网卡绑定bonding
linux·运维·服务器·网络·云计算
qq_道可道3 小时前
K8S升级到1.24后,切换运行时导致 dind 构建镜像慢根因定位与解决
云原生·容器·kubernetes
SONGW20183 小时前
k8s拓扑域 :topologyKey
kubernetes