Kubernetes集群部署好后,就可以部署相关业务服务了,各个容器的日志可以帮助排错,问题快速定位,ELK太繁琐,但是速度快,一般loki就够用了,loki可以较快的安装调试,占用很少的服务器资源,安装的loki日志会默认存储在/var/log/docker里面,一直保留,本次也是使用helm安装loki日志采集器,不用繁琐的过程

1、什么是Helm

Helm 是一个 Kubernetes 包管理工具,它可以帮助你定义、安装和升级复杂的 Kubernetes 应用程序。Helm 使用一组名为 "Charts" 的包来简化应用程序的部署和管理。

关键概念

1.Charts:Helm Chart 是一组描述 Kubernetes 资源的文件集合。它们定义了一个应用程序的资源,如 Deployments、Services、ConfigMaps 等。Chart 可以包含参数化的配置,使得同一个 Chart 可以在不同的环境中使用不同的配置。

2.Repositories:Helm Chart 可以托管在公共或私有的 Chart 仓库中。类似于 Linux 包管理中的软件仓库,Helm Chart 仓库是存储和分发 Charts 的地方。

3.Releases:当你使用 Helm 部署一个 Chart 时,会创建一个 Release。Release 是 Chart 的运行实例,可以理解为 Chart 在 Kubernetes 集群中的一个部署实例。每次部署、升级或回滚一个 Chart,都会生成一个新的 Release 版本。

简单使用

安装,使用 Helm 安装预先配置好的应用程序 Chart

helm install <release-name> <chart>

升级和回滚,Helm 允许升级已经部署的应用程序,并且可以回滚到之前的版本

helm upgrade <release-name> <chart>
helm rollback <release-name> <revision>

查看已安装的

helm list --all-namespaces

2、安装NFS

NFS(Network File System,网络文件系统)是一种分布式文件系统协议,允许用户通过网络访问远程计算机上的文件系统,就像访问本地存储一样,也是通过挂载(mount)方式

创建好需要的路径,并放开权限,NFS的服务需要关闭防火墙等等

mkdir -p /data/kubernetes
chown nobody.nobody /data/kubernetes/
chmod -R /data/kubernetes

安装

yum install nfs-utils -y

systemctl stop rpcbind.service
systemctl stop nfs-utils.service
systemctl stop nfs-server.service

systemctl start nfs-server.service
systemctl start nfs-utils.service
systemctl start rpcbind.service
systemctl enable nfs-server.service

showmount -e 127.0.0.1

在NFS服务器端使用命令 showmount -e 127.0.0.1 报错, 提示:clnt_create: RPC: Program not registered 在服务器上先停止rpcbind 然后在停止nfs 最后在重启rpcbind和nfs,一定要按顺序启动和停止

权限加进去

vim /etc/exports

/data/kubernetes *(rw,sync,no_root_squash)

好后可以使用exportfs -rv查看,正常就会显示

[root@nfs ~]# exportfs -rv
exporting *:/data/kubernetes

去每一台的集群节点上执行挂载的命令,挂载完成后通过df -hT查看磁盘空间,里面就有已挂载的

mount -o rw NFSip:/data/kubernetes/ /data/kubernetes/

3、安装loki设置存储

首先,确保你已经安装了 Helm。如果没有安装,可以通过以下命令安装:

curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash

然后,添加 Loki 的 Helm 仓库:

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

创建PV和PVC

这里就不赘述概念了,先有PV,后有PVC

提前创建一个loki的namespace
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: loki-pv
spec:
  capacity:
    storage: 500Gi
  accessModes:
    - ReadWriteMany
  nfs:
    path: /data/kubernetes
    server: <NFS_SERVER_IP>
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: loki-pvc
  namespace: loki
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 500Gi
  volumeName: loki-pv

安装自定义的loki

创建一个 values.yaml 文件,自定义一些 Loki 的配置:

image:
  repository: grafana/loki     #docker.io被限制,镜像地址自行调整
  tag: "2.7.1"  # Loki的版本可以根据需要调整

persistence:
  enabled: true
  storageClassName: ""   #storageClass,回收策略是Delete
  accessModes:
    - ReadWriteMany
  size: 500Gi            #大小根据pv自己控制
  existingClaim: loki-pvc    #pvc的名字
  annotations: {}
  finalizers:
    - kubernetes.io/pvc-protection

storage:
  type: filesystem
  filesystem:
    directory: /data/loki

loki:
  config:
    schema_config:
      configs:
        - from: 2020-10-24
          store: boltdb-shipper
          object_store: filesystem
          schema: v11
          index:
            prefix: index_
            period: 24h
    storage_config:
      boltdb_shipper:
        shared_store: filesystem
      filesystem:
        directory: /data/loki
    limits_config:
      retention_period: 168h     #保留时长
nfs:
  enabled: true
  server: NFSip
  path: /data/kubernetes  #替换为NFS服务器共享的路径

安装

helm install loki grafana/loki-stack --namespace loki -f values.yaml

需要修改Loki的yaml,在 Loki 的 StatefulSet 中,volumes 部分定义了 Loki 容器将使用的存储卷。有三个卷:tmpconfigstorage。其中,tmpstorage 都被定义为 emptyDir,这意味着它们是在节点本地存储的临时目录,并且当 Pod 重新启动时,这些数据将会丢失。对于持久化存储来说,emptyDir 并不适合,因为不能保证数据在 Pod 重启后的持久性。需要将 storage 卷替换为一个指向 PVC 的持久化卷

    spec:

      volumes:

        - name: tmp

          emptyDir: {}

        - name: config

          secret:

            secretName: loki

            defaultMode: 420

        - name: storage

          emptyDir: {}          #原本的

---    

spec:

      volumes:

        - name: tmp

          emptyDir: {}

        - name: config

          secret:

            secretName: loki

            defaultMode: 420

        - name: storage

          persistentVolumeClaim:

            claimName: loki-pvc    #加上我们的pvc

重启容器即可

使用及其路由

使用Helm创建的时候,Service已经创建完成,我们只需要创建一个ingress来代理Service,不通版本的K8s创建yaml不一样,要根据具体的版本调整

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: loki-ingress
  namespace: loki
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/client-max-body-size: 10M
    nginx.ingress.kubernetes.io/proxy-body-size: 10M
    nginx.ingress.kubernetes.io/proxy-connect-timeout: '300'
    nginx.ingress.kubernetes.io/proxy-read-timeout: '300'
    nginx.ingress.kubernetes.io/proxy-send-timeout: '300'
spec:
  ingressClassName: nginx
  rules:
    - host: loki.local
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: loki
                port:
                  number: 3100

完成后正常访问域名给到的反馈是404 page not found

4、接入Grafana

登录Grafana,接入Data Source,添加一个Loki

 在URL一项填入Ingress的域名

查看日志,已经采集到了

 随便找一台节点,查看日志存储的信息

报错盘点

容器loki-0启动报错err="mkdir /data/loki: permission denied"

需要授权777,或者重新挂载

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐