K8S日志收集

本章主要讲解在 Kubernetes 集群中如何通过不同的技术栈收集容器的日志,包括程序直接输出到控制台日志、自定义文件日志等。

一、有哪些日志需要收集

为了更加方便的处理异常,日志的收集与分析极为重要,在学习日志收集之前,需要知道在集群内有哪些日志需要收集,在这里简单的总结一些比较重要的需要收集的日志:

  • 服务器系统日志
  • Kubernetes 组件日志
  • 应用程序日志

除了上面列出的日志外,可能还存在其他很多需要采集的日志,比如网关的日志、服务之间调用链的日志等。

二、日志采集工具有哪些

1.ELK 和 EFK

在传统的架构中,比较成熟且流行的日志收集平台是 ELK(Elasticsearch+Logstash+Kibana)其中 Logstash 负责采集日志,并输出给 Elasticsearch,之后用 Kibana 进行展示。

我们都知道,几乎所有的服务都可以进行容器化,ELK 技术栈同样可以部署到 Kubernetes 集群中,也可以进行相关的日志收集,但是由于 Logstash 比较消耗系统资源,并且配置稍微有点复杂,因此Kubernetes官方提出了 EFK(Elasticsearch+fluentd+Kibana)的解决方案,相对于 ELK 中的Logstash,Fluentd 采用一锅端的形式,可以直接将某些日志文件中的内容存储至 Elasticsearch,然后通过Kibana进行展示。

但是 Fluentd 也有缺陷,比如,它只能收集控制台日志(程序直接输出到控制台的日志),不能收集非控制台的日志,所以很难满足生产环境的需求,因为大部分情况下,没有遵循云原生理念开发的程序,往往会输出很多日志文件,这些容器内的日志无法采集,除非在每个 Pod 内添加一个 sidecar,将日志文件的内容进行 tail -f 转换成控制台日志,但这也是非常麻烦的。

另一个问题是,大部分公司内都有很成熟的 ELK 平台,如果再搭建一个 EFK 平台,属于重复,当然用来存储日志的 Elasticsearch 集群不建议搭建在 Kubernetes 集群中,因为会非常浪费 Kubernetes 集群的资源,所以大部分情况下通过 Fluentd 采集日志输出到外部的 Elasticsearch 集群中。

综上所述,Fluentd 功能有限,Logstash 太重,所以需要一个中和的工具进行日志的收集工作,此时就可以采用一个轻量化的收集工具:Filebeat。

2.Filebeat

在早期的 ELK 架构中,日志收集均以 Logstash 为主,Logstash 负责收集和解析日志,对内存、CPU、IO资源的消耗比较高,但是 Filebeat 所占系统的 CPU 和内存几乎可以忽略不计。

由于 Filebeat 本身是比较轻量级的日志采集工具,因此 Filebeat 经常被用于以 sidecar 的形式配置在 Pod 中,用来采集容器内冲虚输出的自定义日志文件。当然,Filebeat 同样可以采用 Daemonset 的形式部署在 Kubernetes 集群中,用于采集系统日志和程序控制台输出的日志。

Fluentd 和 Logstash 可以将采集的日志输出到 Elasticsearch 集群,Filebeat 同样可以将日志直接存储到 Elasticsearch 中,但是为了更好的分析日志或者减轻 Elasticsearch 的压力,一般都是将志先输出到 Kafka,再由 Logstash 进行简单的处理,最后输出到 Elasticsearch 中。

3.新贵 Loki

上述讲的无论是 ELK、EFK还是 Filebeat,都需要用到Elasticsearch 来存储数据,Elasticsearch本身就像一座大山,维护难度和资源使用都是偏高的。对于很多公司而言,热别是创新公司,可能并不想大费周章的去搭建一个 ELK、EFK 或者其他重量级的日志平台,刚开始的人力投入可能是大于收益的,所以就需要一个更轻量级的日志收集平台。

为了解决上述的问题和难点,一个基于 Kubernetes 平台的原生日志收集平台 Loki stack 应运而生,所以一经推出,就受到了用户的青睐。

Loki 是 Grafana Labs 开源的一个支持水平扩展、高可用、多租户的日志聚合系统。

可以看到,Loki 主要包含如下组件:

  • Loki:主服务器,负责日志的存储和査询,参考了 prometheus 服务发现机制,将标签添加到日志流,而不是想其他平台一样进行全文索引。
  • Promtai1:负责收集日志并将其发送给 Loki,主要用于发现采集目标以及添加对应 Label,最终发送给 Loki。
  • Grafana:用来展示或查询相关日志,可以在页面査询指定标签 Pod 的日志。

和其他工具相比,虽然 Loki 不如其他技术栈功能灵活,但是 Loki 不对日志进行全文索引,仅索弓相关日志的元数据,所以 Loki 操作起来更简单、更省成本。而且 Loki 是基于 Kubernetes 进行设计的,可以很方便的部署在 Kubernetes 上,并且对集群的 Pod 进行日志采集,采集时会将 Kubernetes 集群中的一些元数据自动添加到日志中,让技术人员可以根据命名空间、标签字段进行日志的过滤,可以很快的定位到相关日志。

通过上述的了解,我们知道了在 Kubernetes 集群中,日志收集可以选择的技术栈有很多,不只局限于上述提到的。对于平台的选择,没有最好,只有最合适,比如公司内已经有了很成熟的 ELK 平台,那么我们可以直接采用 Fluentd 或 Filebeat,然后将 Kubernetes 的日志输出到已存在的 Elasticsearch集群中即可。如果公司并没有成熟的平台支持,又不想耗费很大的精力和成本去建立一个庞大的系统,那么 Loki stack 将会是一个很好的选择。

三、使用 EFK 收集控制台日志

首先我们使用 EFK 收集 Kubernetes 集群中的日志,本次实验讲解的是在 Kubernetes 集群中启动一个 Elasticsearch 集群,如果企业已经有了 Elasticsearch 集群,可以直接将日志输出到已有的Elasticsearch 集群中。

1.部署Elasticsearch+Fluentd+Kibana

(1)下载需要的部署文档
复制代码
[root@k8s-master ~]# get clone htps://github.com/dotbalo/k8s.git

备注:

本案例已经下载好,可以直接使用

(2)创建 EFK 所用的命名空间
复制代码
[root@master ~]# cd efk-7.10.2/
[root@master efk-7.10.2]# ls
create-logging-namespace.yaml  fluentd-es-configmap.yaml  kibana-service.yaml
es-service.yaml                fluentd-es-ds.yaml         nginx-service.yaml
es-statefulset.yaml            kafka
filebeat                       kibana-deployment.yaml
[root@master efk-7.10.2]# ku create -f create-logging-namespace.yaml 
namespace/logging created
(3)创建 Elasticsearch 群集(已有该平台可以不创建)
复制代码
[root@master efk-7.10.2]# ku create -f es-service.yaml 
service/elasticsearch-logging created

备注:

为 es 集群创建服务,以便为 Fluentd 提供数据传入的端口

复制代码
[root@master efk-7.10.2]# ku get svc -n logging
NAME                    TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)             AGE
elasticsearch-logging   ClusterIP   None         <none>        9200/TCP,9300/TCP   76s

备注:

  • 9208 端口:用于所有通过 HTTP 协议进行的 API 调用。包括搜索、聚合、监控、以及其他任何使用HTTP 协议的请求。所有的客户端库都会使用该端口与 Elasticsearch 进行交互。

  • 9308 端口:是一个自定义的二进制协议,用于集群中各节点之间的通信。用于诸如集群变更、主节点选举、节点加入/离开、分片分配等事项。

    [root@master efk-7.10.2]# ku create -f es-statefulset.yaml
    serviceaccount/elasticsearch-logging created
    clusterrole.rbac.authorization.k8s.io/elasticsearch-logging created
    clusterrolebinding.rbac.authorization.k8s.io/elasticsearch-logging created
    statefulset.apps/elasticsearch-logging created

备注:

创建 es 集群

复制代码
[root@master efk-7.10.2]# ku get pod -n logging
NAME                      READY   STATUS    RESTARTS   AGE
elasticsearch-logging-0   0/1     Pending   0          7m12s
(4)创建Kibana(已有该平台可以不创建)
复制代码
[root@master efk-7.10.2]# ku create -f kibana-deployment.yaml -f kibana-service.yaml 
deployment.apps/kibana-logging created
service/kibana-logging created
(5)修改 Fluentd 的部署文件

由于在 Kubernetes 集群中,可能不需要对所有的机器都采集日志,因此可以更改 Fluentd 的部署文

件。添加一个 Nodeselector,只部署至需要采集日志的主机即可。

复制代码
[root@master efk-7.10.2]# grep "nodeSelector" fluentd-es-ds.yaml -A 3
      nodeSelector:
        fluentd: "true"
      volumes:
      - name: varlog
(6)为需要采集日志的服务器设置标签
复制代码
[root@master efk-7.10.2]# ku label node node1 fluentd=true
node/node1 labeled
[root@master efk-7.10.2]# ku label node node2 fluentd=true
node/node2 labeled
[root@master efk-7.10.2]# ku label node master fluentd=true
node/master labeled

[root@master efk-7.10.2]# ku get node -l fluentd=true --show-labels
NAME     STATUS   ROLES                  AGE   VERSION   LABELS
master   Ready    control-plane,master   14d   v1.23.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,fluentd=true,kubernetes.io/arch=amd64,kubernetes.io/hostname=master,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node-role.kubernetes.io/master=,node.kubernetes.io/exclude-from-external-load-balancers=
node1    Ready    <none>                 14d   v1.23.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,fluentd=true,kubernetes.io/arch=amd64,kubernetes.io/hostname=node1,kubernetes.io/os=linux
node2    Ready    <none>                 14d   v1.23.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,fluentd=true,kubernetes.io/arch=amd64,kubernetes.io/hostname=node2,kubernetes.io/os=linux
(7)创建 Fluentd
复制代码
[root@master efk-7.10.2]# ku create -f fluentd-es-ds.yaml -f fluentd-es-configmap.yaml 
serviceaccount/fluentd-es created
clusterrole.rbac.authorization.k8s.io/fluentd-es created
clusterrolebinding.rbac.authorization.k8s.io/fluentd-es created
daemonset.apps/fluentd-es-v3.1.1 created
configmap/fluentd-es-config-v0.2.1 created

fluentd 的 ConfigMap 有一个字段需要注意,在 fluentd-es-configmap.yaml 文件的最后有一个output.conf:

host elasticsearch-logging

port 9200

此处的配置将收集到得数据输出到指定的 Elasticsearch 集群中,由于创建 Elasticsearch 集群时会自动创建一个名为 elasticsearch-logging 的 Service,因此默认 Fluentd 会将数据输出到前面创建的 Elasticsearch 集群中。如果企业已经存在一个成熟的 ELK 平台,可以创建一个同名的 service 指向该集群,然后就能输出到现有的 Elasticsearch 集群中。

例如:

apiVersion: v1

kind: Service

metadata:

name:elasticsearch-logging

namespace:logging

spec:

type:ExternalName

externalName:www.es.com

备注:

externalName:www.es.com

指向了外部 es 主机的地址或域名

备注:

<match **>

。。。

host elasticsearch-logging

port 9200

logstash format true

。。。

</match>

host elasticsearch-logging:指定 fluentd 获取的日志要发往的主机

port 9200:目标es 主机的端口号

logstash format true: 指定是否使用常规的 index 命名格式,(logstash-%v.%m.%d),默认为 false

2.Kibana 的使用

(1)确认创建的 Pod 已经成功启动
复制代码
[root@master efk-7.10.2]# ku get pod -n logging
NAME                              READY   STATUS             RESTARTS        AGE
elasticsearch-logging-0           0/1     Pending            0               25m
fluentd-es-v3.1.1-5bn6f           0/1     CrashLoopBackOff   5 (48s ago)     6m48s
fluentd-es-v3.1.1-p4vdn           0/1     CrashLoopBackOff   5 (48s ago)     6m48s
kibana-logging-7bf48fb7b4-k6cq9   0/1     CrashLoopBackOff   9 (2m25s ago)   17m
(2)查看kibana 暴露的端口
复制代码
[root@master efk-7.10.2]# ku get svc -n logging
NAME                    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)             AGE
elasticsearch-logging   ClusterIP   None            <none>        9200/TCP,9300/TCP   27m
kibana-logging          NodePort    10.97.250.231   <none>        5601:32726/TCP      17m
(3)访问 kibana

使用任意一个部署了 kube-proxy 服务的节点的 IP+32734 端口即可访问 kibana。

http://192.168.10.101:32734/kibana

3.创建一个Pod,进行日志采集

(1)编写nginx部署文件
复制代码
[root@master efk-7.10.2]# vim nginx-service.yaml 

apiVersion: v1
kind: Service
metadata:
  name: mynginx
  namespace: default
  labels:
    app: mynginx
spec:
  type: LoadBalancer
  ports:
    - port: 80
      targetPort: http
      protocol: TCP
      name: http
  selector:
    app: mynginx

---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mynginx-deployment
  namespace: default
  labels:
    app: mynginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: mynginx
  template:
    metadata:
      labels:
        app: mynginx
    spec:
      containers:
      - name: mynginx
        image: nginx:1.15.2
        ports:
          - name: http
            containerPort: 80
              protocol: TCP
(2)部署该Deployment
复制代码
[root@master efk-7.10.2]# ku create -f nginx-service.yaml 
service/mynginx created
deployment.apps/mynginx-deployment created
(3)查看pod状态
(4)查看暴露的端口
复制代码
[root@master efk-7.10.2]# ku get svc -n default
NAME         TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP      10.96.0.1       <none>        443/TCP        14d
mynginx      LoadBalancer   10.105.213.83   <pending>     80:32710/TCP   29s
(5)客户端访问测试
复制代码
[root@master efk-7.10.2]# curl 192.168.10.101:32710
(6)到kibana上查看

四、使用Filebeat收集自定义文件日志

基于云原生 12 要素开发的程序,一般会将日志直接输出到控制台,并非是指定一个文件存储日志,这一点和传统架构还是有区别的。但是公司内的程序并非都是基于云原生要素开发的,比如一些年代已久的程序,这类程序如果部署至 Kubernetes 集群中,就需要考虑如何将输出至本地文件的日志采集到Elasticsearch。

之前我们了解到 Filebeat 是一个非常轻量级的日志收集工具,可以将其和应用程序部署至一个 Pod中,通过 Volume 进行日志文件的共享,之后 Filebeat 就可以采集里面的数据,并推送到日志平台。

为了减轻 Elasticsearch 的压力。本案例将引入 Kafka 消息队列来缓存日志数据,之后通过Logstash 简单处理一下日志,最后再输出到 Elasticsearch 集群。这种架构在生产环境中也是常用的架构,因为日志数量可能比较多,同时也需要对其进行加工。当然 Fluentd 也可以将日志输出到 Kafka。

1.安装 helm 客户端(如果已有此工具,可跳过该步骤)

(1)下载安装包
复制代码
[root@k8s-master ~]#wget https://get.helm.sh/helm-v3.6.2-linux-amd64.tar.gz
(2)解压
复制代码
[root@k8s-master ~]# tar zxvf helm-v3.6.2-linux-amd64.tar.gz
(3)安装
复制代码
[root@k8s-master ~]# mv linux-amd64/helm /usr/local/bin/
(4)查看版本
复制代码
[root@master ~]# helm version
version.BuildInfo{Version:"v3.9.4", GitCommit:"dbc6d8e20fe1d58d50e6ed30f09a04a77e4c68db", GitTreeState:"clean", GoVersion:"go1.17.13"}

2.创建卡Kafka和 Logstash

(1)部署zookeeper
复制代码
[root@k8s-master ~l# cd efk-7.10.2/filebeat
[root@k8s-master filebeat]# helm install zookeeper zookeeper/ -n logging
(2)查看zookeeper 状态
复制代码
[root@k8s-master filebeat]# kubectl get pod-n logging -l app.kubernetes.io/name=zookeeper

备注:

-l:指定标签

等一会,部署好显示状态为 Running

(3)部署 kafka
复制代码
[root@master filebeat]# helm install kafka kafka/ -n logging
(4)查看 kafka 状态
复制代码
[root@k8s-master filebeat]# kubectl get pod -n logging -l app.kubernetes.io/component=kafka

备注:

等一会,部署好显示状态为 Running

(5)创建 logstash 服务
复制代码
[root@master filebeat]# ku create -f logstash-service.yaml -f logstash-cm.yaml -f logstash.yaml -n logging
service/logstash-service created
configmap/logstash-configmap created
deployment.apps/logstash-deployment created

3.注入Filebeat sidecar

(1)创建一个模拟程序
复制代码
[root@master filebeat]# ku create -f filebeat-cm.yaml -f app-filebeat.yaml -n logging
configmap/filebeatconf created
service/mynginx created
deployment.apps/app2 created
(2)查看pod状态
复制代码
[root@master filebeat]# ku get pod -n logging
NAME                                   READY   STATUS    RESTARTS       AGE
app2-666cd8b58f-pdrtp                  2/2     Running   0              33s
elasticsearch-logging-0                1/1     Running   1 (28m ago)    47m
fluentd-es-v3.1.1-5bn6f                1/1     Running   16 (28m ago)   70m
fluentd-es-v3.1.1-p4vdn                1/1     Running   16 (27m ago)   70m
kafka-0                                1/1     Running   0              23m
kibana-logging-7bf48fb7b4-k6cq9        1/1     Running   21 (28m ago)   80m
logstash-deployment-6485f5d5b5-cpndc   1/1     Running   0              14m
zookeeper-0                            1/1     Running   0              25m
[root@master filebeat]# ku get svc -n logging
NAME                    TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
elasticsearch-logging   ClusterIP      None             <none>        9200/TCP,9300/TCP            90m
kafka                   ClusterIP      10.97.94.74      <none>        9092/TCP                     23m
kafka-headless          ClusterIP      None             <none>        9092/TCP,9093/TCP            23m
kibana-logging          NodePort       10.97.250.231    <none>        5601:32726/TCP               80m
logstash-service        ClusterIP      10.101.139.254   <none>        5044/TCP                     14m
mynginx                 LoadBalancer   10.98.250.245    <pending>     80:30022/TCP                 43s
zookeeper               ClusterIP      10.97.171.172    <none>        2181/TCP,2888/TCP,3888/TCP   25m
zookeeper-headless      ClusterIP      None             <none>        2181/TCP,2888/TCP,3888/TCP   25m
[root@master filebeat]# ku get svc
NAME         TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP      10.96.0.1       <none>        443/TCP        15d
mynginx      LoadBalancer   10.105.213.83   <pending>     80:32710/TCP   58m

注意:这个 mynginx的 svc 是创建在了 default 的命名空间的。

(3)查看日志中的内容
复制代码
[root@k8s-master filebeat]# kubectl exec app-ddf4b6db9-thtbs -n logging 
-- tail/opt/date.log

五、Loki

1.安装 Loki stack(如果已安装,忽略此步骤)

复制代码
[root@k8s-master ~]# tar zxvf helm-v3.6.2-linux-amd64.tar.gz
[root@k8s-master ~]# cp linux-amd64/helm /usr/bin

2.添加安装源并下载 1oki-stack(如已有离线包,忽略此步骤)

复制代码
[root@k8s-master ~]# helm repo add grafana https://grafana.github.io/helm-charts
[root@k8s-master ~]# helm repo update

备注:

其他安装源

helm repo add loki https://grafana.github.io/loki/charts && helm repo update

复制代码
[root@k8s-master ~]# helm repo list
复制代码
[root@k8s-master ~l# helm pull grafana/loki-stack --version 2.8.3

3.创建 Loki 命名空间

复制代码
[root@k8s-master ~#kubectl create ns loki
namespace/loki created

4. 创建 Loki stack

复制代码
[root@k8s-master ~]# tar xf loki-stack-2.8.3.tgz

[root@master loki]# helm upgrade --install loki loki-stack --set grafana.enabled=true --set grafana.service.type=NodePort -n loki
Release "loki" does not exist. Installing it now.
W0903 11:51:46.761749   48521 warnings.go:70] policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
W0903 11:51:46.765865   48521 warnings.go:70] policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
W0903 11:51:46.769012   48521 warnings.go:70] policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
W0903 11:51:46.937041   48521 warnings.go:70] policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
W0903 11:51:46.937366   48521 warnings.go:70] policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
W0903 11:51:46.937414   48521 warnings.go:70] policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
NAME: loki
LAST DEPLOYED: Tue Sep  3 11:51:45 2024
NAMESPACE: loki
STATUS: deployed
REVISION: 1
NOTES:
The Loki stack has been deployed to your cluster. Loki can now be added as a datasource in Grafana.

See http://docs.grafana.org/features/datasources/loki/ for more detail.

5.查看Pod状态

复制代码
[root@master loki]# ku get pod -n loki
NAME                           READY   STATUS    RESTARTS   AGE
loki-0                         0/1     Running   0          3m24s
loki-grafana-fd49f9d86-jgspv   1/2     Running   0          3m24s
loki-promtail-b7jl2            1/1     Running   0          3m24s
loki-promtail-h7jjt            1/1     Running   0          3m24s
loki-promtail-szgd9            1/1     Running   0          3m24s

6.查看暴露的端口

复制代码
[root@master loki]# ku get svc -n loki
NAME              TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
loki              ClusterIP   10.104.80.31     <none>        3100/TCP       115s
loki-grafana      NodePort    10.100.211.151   <none>        80:32393/TCP   115s
loki-headless     ClusterIP   None             <none>        3100/TCP       115s
loki-memberlist   ClusterIP   None             <none>        7946/TCP       115s

7.查看grafana的密码

复制代码
[root@master loki]# ku get secret loki-grafana --namespace loki -o jsonpath="{.data.admin-password}" | base64 --decode && echo
mDrZEfY8CSZwjMpbaKziqaCzUUZRt8Ku23hnFOCC

修改密码

复制代码
[root@master loki]# ku exec -it loki-grafana-fd49f9d86-jgspv -n loki -c grafana grafana-cli admin reset-admin-password admin

备注:

账号为 admin

8.登录

http://192.168.10.101:32734/

9.创建一个 Pod,进行日志采集(还是前面的 pod)

(1)编写 nginx 部署文件
复制代码
[root@master loki]# vim nginx-service.yaml 

apiVersion: v1
kind: Service
metadata:
  name: mynginx
  namespace: default
  labels:
    app: mynginx
spec:
  type: LoadBalancer
  ports:
    - port: 80
      targetPort: http
      protocol: TCP
      name: http
  selector:
    app: mynginx

---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mynginx-deployment
  namespace: default
  labels:
    app: mynginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: mynginx
  template:
    metadata:
      labels:
        app: mynginx
    spec:
      containers:
      - name: mynginx
        image: nginx:1.15.2
        ports:
          - name: http
            containerPort: 80
            protocol: TCP
(2)部署该Dployment
复制代码
[root@master loki]# ku create -f nginx-service.yaml
(3)查看 pod 状态
复制代码
[root@master loki]# ku get pod
NAME                                  READY   STATUS    RESTARTS      AGE
mynginx-deployment-668d5454cb-9lwgx   1/1     Running   2 (25m ago)   118m
mynginx-deployment-668d5454cb-bdg8v   1/1     Running   1 (89m ago)   118m
(4)查看暴露的端口
复制代码
[root@master loki]# ku get svc -n default
NAME         TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP      10.96.0.1       <none>        443/TCP        15d
mynginx      LoadBalancer   10.105.213.83   <pending>     80:32710/TCP   111m
(5)客户端访问测试
复制代码
[root@master loki]# curl 192.168.10.101:32710
(6)在 Loki 中查看此 Pod 的日志
复制代码
{namespace="default",pod="mynginx-deployment-668d5454cb-lldng"}
{namespace="kube-system"}
{namespace="kube-system",pod="calico-node-gwtqw"}
相关推荐
lichenyang45320 小时前
Docker 学习笔记(四):Dockerfile,把项目打成自己的镜像
docker·容器
lichenyang45320 小时前
Docker 学习笔记(三):Docker 网络、bridge、子网和容器互通
docker·容器
lichenyang45320 小时前
Docker 学习笔记(二):docker run 的参数到底在控制什么?
docker·容器
运维开发故事4 天前
基于 Arthas 的多集群在线诊断系统设计与实现
kubernetes
Patrick_Wilson5 天前
从「改个端口」到 502:Next.js on k8s 的容器端口、Service 映射与 env 覆盖
docker·kubernetes·next.js
探索云原生6 天前
K8s 1.36 这个 GA 特性,把 initContainer 拉模型的 hack 干掉了
ai·云原生·kubernetes
云恒要逆袭6 天前
运行你的第一个Docker容器
后端·docker·容器
Java之美7 天前
一次k8s升级引发的DevicePlugin注册失败
云原生·kubernetes
程序员老赵8 天前
10 分钟部署 OpenCode:Docker 一键安装,浏览器打开就能用 AI 写代码(附完整命令与排错)
docker·容器·ai编程