27.B站薪享宏福笔记——第十一章(1)镜像仓库Harbor && 日志收集Loki

11 B站薪享宏福笔记——第十一章

                                                                                                                   —— kubernetes 中的必备的工具组件

11.1 镜像仓库方案

                                                  —— Harbor - 超融合镜像管理

11.1.1 Harbor 介绍说明

Harbor 的目标是帮助用户迅速搭建一个企业级的 Docker registry 服务。它以 Docker 公司开源的 仓库registry 为基础,额外提供了如下功能:

  基于角色的访问控制(Role Based Access Control)(不同用户)

  基于策略的镜像复制(Policy based image replication)(不同仓库间复制拷贝)

  镜像的漏洞扫描(Vulnerability Scanning)

  AD/LDAP集成(LDAP/AD support)(域控制器集成)

  镜像的删除和空间清理(Image deletion & garbage collection)(没有标签的悬空镜像)

  友好的管理UI(Graphical user portal)

  审计日志(Audit logging)(日志记录,便于事后分析)

  RESTful API(接口调用实现自动化)

  部署简单(Easy deployment )(安装方式:Helm、docker-compose、kubernetes)

11.1.2 Harbor 架构图

image

1.通过 镜像验证服务Notary Client 、Docker 客户端、浏览器Browser 等接入到 Nginx

2.如果是 镜像验证服务Notary Client 请求被 Nginx 转发接入到后端 Notary

3.如果是 Docker 客户端 请求被 Nginx 转发接入到后端 仓库Regisry(走 仓库Registry v2 版本接口)

4.如果是 浏览器Browser 请求被 Nginx 转发接入到后端 Admin Server 服务中,Admin Server 服务提供 UI、API 接口、Auth 认证服务,Admin Server 服务同时还支持接入 AD/LDAP集成 域控制器

5.日志控制器端 Log Collector,将各组件日志统一进行存储分析(可用于审计)

6.DB 可以用于存储元数据信息、用户验证信息等

7.通过 Replication Job Service 可以对远程的镜像实现自动化执行

11.1.3 Harbor 安装部署

(1)创建名称空间

# 创建 harbor 的名称空间
[root@k8s-master01 11.1]# cat harbor_ns.yaml apiVersion: v1 kind: Namespace metadata: name: harbor [root@k8s-master01 11.1]# kubectl apply -f harbor_ns.yaml namespace/harbor created [root@k8s-master01 11.1]# kubectl get namespace NAME STATUS AGE harbor Active 10s .........

(2)选择节点进行 harbor 安装(可选)

# 可选选项,通过定义标签,使 harbor 固定启动的服务节点(与selectnode效果相同)
[root@k8s-master helm]# kubectl edit ns harbor -o yaml
apiVersion: v1
kind: Namespace
metadata:
 annotations:
   scheduler.alpha.kubernetes.io/node-selector: harbor=env
 name: harbor
# 选择 node 进行标签设定
[root@k8s-master helm]# kubectl label node k8s-node3 harbor=env

(3)添加 Helm repo

# 添加 harbor 地址
[root@k8s-master01 11]# helm repo add harbor https://helm.goharbor.io
"harbor" has been added to your repositories
[root@k8s-master01 11.1]# helm repo ls
NAME       URL                                                   
bitnami    https://charts.bitnami.com/bitnami                    
aliyun     https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
harbor     https://helm.goharbor.io                        
[root@k8s-master01 11.1]# helm search repo
NAME                                            CHART VERSION    APP VERSION      DESCRIPTION                                       
.........
harbor/harbor                                   1.17.1           2.13.1           An open source trusted cloud native registry th...
# helm 默认下载最新稳定版本, 可以通过 --version 指定下载版本号,下载的 tgz 包保存到当前目录下
[root@k8s-master01 11.1]# helm pull harbor/harbor
[root@k8s-master01 11.1]# helm pull harbor/harbor --version 1.11.0
[root@k8s-master01 11.1]# ls -ltr
total 112
-rw-r--r-- 1 root root    55 Jul 25 14:49 harbor_ns.yaml
-rw-r--r-- 1 root root 50217 Jul 25 15:10 harbor-1.17.1.tgz
-rw-r--r-- 1 root root 54415 Jul 25 15:11 harbor-1.11.0.tgz

(4)Helm 安装 harbor

# tar 包解压
[root@k8s-master01 11.1]# tar -xvf harbor-1.11.0.tgz 
.........
[root@k8s-master01 11.1]# cd harbor/
[root@k8s-master01 harbor]# ls
Chart.yaml  LICENSE  README.md  cert  conf  templates  values.yaml
# 前面 存储章节保存的存储类,有类名 nfs-client 
[root@k8s-master01 11.1]# kubectl get storageclass
NAME         PROVISIONER                                   RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
nfs-client   k8s-sigs.io/nfs-subdir-external-provisioner   Delete          Immediate           false                  33d
# 将存储类名填写到存储中
[root@k8s-master01 harbor]# sed -i 's/storageClass: ""/storageClass: "nfs-client"/g' values.yaml
[root@k8s-master01 harbor]# grep 'storageClass: ' values.yaml 
      storageClass: "nfs-client"
      storageClass: "nfs-client"
        storageClass: "nfs-client"
        storageClass: "nfs-client"
      storageClass: "nfs-client"
      storageClass: "nfs-client"
      storageClass: "nfs-client"
# 漏扫下载镜像太慢,可以选择不下载漏扫,将 false 改为 true,如果是 false 可以将 timeout 时间加长,这是镜像下载超时时间
[root@k8s-master01 harbor]# grep 'skipUpdate:' values.yaml 
  skipUpdate: true
# 安装的 服务名为 harbor ,-f 可变文件 values.yaml ,基于 当前目录,-n harbor 指定名称空间
[root@k8s-master01 harbor]# helm install harbor -f values.yaml . -n harbor
NAME: harbor
LAST DEPLOYED: Fri Jul 25 15:37:39 2025
NAMESPACE: harbor
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Please wait for several minutes for Harbor deployment to complete.
Then you should be able to visit the Harbor portal at https://core.harbor.domain
For more details, please visit https://github.com/goharbor/harbor
[root@k8s-master01 harbor]# kubectl get pod -n harbor 
NAME                                    READY   STATUS    RESTARTS      AGE
harbor-chartmuseum-7574c876c5-j67xp     1/1     Running   0             2m11s
harbor-core-5bb65bcc78-kpvgz            1/1     Running   0             2m12s
harbor-database-0                       1/1     Running   0             2m12s
harbor-jobservice-6995ddf5fc-5rnnb      1/1     Running   3 (60s ago)   2m11s
harbor-notary-server-5578c446d9-m46b9   1/1     Running   1 (58s ago)   2m12s
harbor-notary-signer-7cbb97b788-d2w5s   1/1     Running   1 (58s ago)   2m12s
harbor-portal-64bb85667c-ks26r          1/1     Running   0             2m12s
harbor-redis-0                          1/1     Running   0             2m12s
harbor-registry-759849f995-kn8x5        2/2     Running   0             2m12s
harbor-trivy-0                          1/1     Running   0             2m12s
# 查看 域名
[root@k8s-master01 harbor]# kubectl get ingress -n harbor 
NAME                    CLASS   HOSTS                  ADDRESS   PORTS     AGE
harbor-ingress          nginx   core.harbor.domain               80, 443   4m43s
harbor-ingress-notary   nginx   notary.harbor.domain             80, 443   4m43s
# 电脑主机进入目录,在 hosts 文件中添加新的信息
C:\Windows\System32\drivers\etc

192.168.66.12 core.harbor.domain

在浏览器中输入域名:https://core.harbor.domain,账户:admin,首次登录密码:Harbor12345

image

(5)Harbor 仓库介绍

image   image   image

image

概要:仓库的基本信息

镜像仓库:仓库中存储的镜像

Helm Charts:仓库中存储的 Helm 包,通过服务端供给

成员:项目由谁管理、添加用户、添加角色、添加组(注意:用户要先经过管理员创建后才可添加)

标签:给镜像添加标签,可以通过标签检索

扫描器:漏洞扫描(默认Trivy)

P2P 预热:集群上千节点时,将镜像 P2P 分发,减少原 harbor仓库 服务器压力

策略:保留镜像的策略

机器人账户:开发应用时,通过接口对当前仓库的某个项目名称做管理,可以执行的动作(可以设置权限)

Webhooks:钩子,在 Harbor 仓库内做了动作,可以对外发送一些对应设定的请求

日志:上传和下载镜像的日志

配置管理:项目是否公开、部署安全性,是否通过镜像验证、是否开启漏洞扫描、代码漏洞特赦白名单

image

用户管理:添加用户

机器人账户:添加机器人账户

仓库管理:可以创建多个仓库

复制管理:定时拉取某些仓库的镜像到本地仓库或推送本地镜像仓库到其他仓库(需要先添加仓库)

分布式分发:镜像的分布式传输、分布式下载

标签:定义标签(定义好后,上面项目中就可以应用标签)

项目定额:定义仓库可以使用的存储空间

审查服务:漏扫(默认集成 Trivy)

清理服务:垃圾清理以及日志保留时间

任务中心:那些用户在同步镜像

配置管理:1.认证模式:是否允许自注册、2.安全:添加漏扫白名单、3:系统设置:谁可以创建项目、令牌过期时间(CS结构,客户端访问服务端用用户名和密码,服务端返回一个复杂字符串,这个字符串和用户绑定,客户端再请求时使用字符串申请,可以对这个字符串设置有效时间)、会话过期时间(超时自动退出登录)、机器人账户名称前缀(通过前缀发现那些用户是机器人)、机器人账户令牌过期时间、镜像库根证书(使用镜像仓库需要信任,可以导入根证书)、仓库只读、开启 WEBHOOK、日志转发端点(可用其他组件集成监控)

主题颜色

Harbor API V2.0 接口的定义手册

(6)Harbor 仓库页面上传

# 将 harbor 域名添加解析到各节点
[root@k8s-master01 harbor]# echo "192.168.66.12 core.harbor.domain" >> /etc/hosts [root@k8s-node01 ~]# echo "192.168.66.12 core.harbor.domain" >> /etc/hosts [root@k8s-node02 ~]# echo "192.168.66.12 core.harbor.domain" >> /etc/hosts

镜像和Helm包 可以手动上传,可以使用命令上传(方便)

image

手动可以通过页面点击上传:

# 将 helm 下载的 tar 包下传到桌面
[root@k8s-master01 11.1]#  pwd
/root/11/11.1
[root@k8s-master01 11.1]# ls -ltr
total 112
-rw-r--r-- 1 root root    55 Jul 25 14:49 harbor_ns.yaml
-rw-r--r-- 1 root root 50217 Jul 25 15:10 harbor-1.17.1.tgz
-rw-r--r-- 1 root root 54415 Jul 25 15:11 harbor-1.11.0.tgz
drwxr-xr-x 5 root root   135 Jul 25 15:32 harbor
[root@k8s-master01 11.1]# sz harbor-1.17.1.tgz 
[root@k8s-master01 11.1]# sz harbor-1.11.0.tgz 

image

image

(7)Harbor 仓库命令行上传

# 拉取一个镜像用于测试(老师讲的仓库 myapp:v6.0 拉取有时访问失败)
[root@k8s-master01 ~]# docker pull mysql
.........
[root@k8s-master01 ~]# docker images|grep mysql
mysql                                                                          latest                245a6c909dc0   3 days ago      921MB
[root@k8s-master01 ~]# docker tag mysql:latest core.harbor.domain/library/mysql:test_harbor.v1.0
[root@k8s-master01 ~]# docker images|grep mysql
core.harbor.domain/library/mysql                                               test_harbor.v1.0      245a6c909dc0   3 days ago      921MB
mysql                                                                          latest                245a6c909dc0   3 days ago      921MB
a.添加信任的域名
# docker login 默认登录官网,后面加域名,指定登录仓库的网站
# 没有经过 docker 的认证所以会报错(两种方案:1.在docker配置文件中添加信任的域名、2.将 Harbor 仓库的ca证书给docker,使docker信任)
[root@k8s-master01 ~]# docker login core.harbor.domain
Username: admin
Password: 
Error response from daemon: Get "https://core.harbor.domain/v2/": tls: failed to verify certificate: x509: certificate signed by unknown authority
# 第一种,docker 信任域名的方式
[root@k8s-master01 ~]# cat /etc/docker/daemon.json
{
.........
  "insecure-registries": ["https://docker.m.daocloud.io","core.harbor.domain"],
.........
}
[root@k8s-master01 ~]# systemctl daemon-reload
[root@k8s-master01 ~]# systemctl restart docker
# 登录,输入域名,让 docker 加载配置重启生效,然后登录:账号:admin、密码:Harbor12345
[root@k8s-master01 ~]# docker login core.harbor.domain
Username: admin
Password: 

WARNING! Your credentials are stored unencrypted in '/root/.docker/config.json'.
Configure a credential helper to remove this warning. See
https://docs.docker.com/go/credential-store/

Login Succeeded
[root@k8s-master01 ~]# docker logout core.harbor.domain
Removing login credentials for core.harbor.domain
b.添加信任的ca证书
# 第二种 Harbor 仓库的ca证书给docker,使docker信任(上面要是做了实验,可以修改回配置,再重启,保持变量)
[root@k8s-master01 11.1]# kubectl get secret harbor-ingress -n harbor -o yaml
apiVersion: v1
data:
  ca.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURGRENDQWZ5Z0F3SUJBZ0lSQUpGUG1SQ3RKTU4rdG0rWlhsYkVMMWt3RFFZSktvWklodmNOQVFFTEJRQXcKRkRFU01CQUdBMVVFQXhNSmFHRnlZbTl5TFdOaE1CNFhEVEkxTURjeU5UQTNNemMwTUZvWERUSTJNRGN5TlRBMwpNemMwTUZvd0ZERVNNQkFHQTFVRUF4TUphR0Z5WW05eUxXTmhNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DCkFROEFNSUlCQ2dLQ0FRRUFtckNGOHNGV3Y4OFUybm5SclBzZHlFeUlPdWtFRDgzZkYzVjQzd2RJTm1VcERpcFUKSGxIM1JHaFRhcGw2eXhiQnJPSFkxaGdIMjJJQzVpU1ZjTEQyaXBMSlF3dktkN0V2L25aWHJEQlNadkFTYXJuMwpWN2R0b05rWE91TmFYRGNPcWhuWnIvV2VoUWswK3BPdFBNWlgyK1VRT2czVnNOZEpMK2htdXJyQzJiTjkxbXVBCitGa0JuU1RJNEp6TXJRQkc0Yk55eXZLMGhXeG04WkZYaTc5T3A0YTlkTlNmS1VKRkRaalJrMmNQNnc2VkFLUEoKMVpyTTRVNmxSRmNPcHd3ZjBBNHE3aStZd3BBTG9zZ0hPVUd0c1RkQkovSWpML1IyNEtGaU9nSkxkWHJnWjJyeApmbTBrUDYvS3JDY2k3WFBPMlVtaHpIY2dNYWVmRTZhbCtrSXZRd0lEQVFBQm8yRXdYekFPQmdOVkhROEJBZjhFCkJBTUNBcVF3SFFZRFZSMGxCQll3RkFZSUt3WUJCUVVIQXdFR0NDc0dBUVVGQndNQ01BOEdBMVVkRXdFQi93UUYKTUFNQkFmOHdIUVlEVlIwT0JCWUVGT1k2NTVuNEd4ejl2UUM5bXY0b25sZ01WeTRHTUEwR0NTcUdTSWIzRFFFQgpDd1VBQTRJQkFRQjNzUWJPSGllcnozNkJmK3p1aHM0eW1WNVZBdVFtMnVicmJ5NlpPbUtUVzNSMFB1WjJZQ2dnCmppOHdaQlh5Wm1JTFNKNWs2cjB5WlhwVTFxeGZMM1pNT3VXdURSS252bUpHdXc1bFFOdjcwVHlpN25uUGF2M0QKRFh6Ulh1bEdjdDZraXRFaWFjdU8ySm1FSzdxMEVQMGhYTmNUZ2RNc3NHT3pDUEErZXFWd0tFeUw5OGpncFJQdAoyK0dzMXhhNW5POE1IdjJaNE5kaDhRamlCMEJuVkx1ZGFIZEF4ejVTUmJWUlljanQ5Z3dYVHcxd1VwbG5lRnF6Ckl1U0UveWxjRjBhUlpjaUpZMDlqemxDTTVVa1BXcXl2azlsb3duakVKQzNSMFZqdXFNMlJLcWNtYU02eXBjdUIKcjZLNTV0QjdndXd5Nks2NU0rajlGZkhtMGhnRXlId1kKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
  tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURVakNDQWpxZ0F3SUJBZ0lRSDNXUFRBWDRCdFJRcysyMmhkNExNREFOQmdrcWhraUc5dzBCQVFzRkFEQVUKTVJJd0VBWURWUVFERXdsb1lYSmliM0l0WTJFd0hoY05NalV3TnpJMU1EY3pOelF3V2hjTk1qWXdOekkxTURjegpOelF3V2pBZE1Sc3dHUVlEVlFRREV4SmpiM0psTG1oaGNtSnZjaTVrYjIxaGFXNHdnZ0VpTUEwR0NTcUdTSWIzCkRRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ204UFNxQk1hZVpta3lIbWpEbGhsQm4xOVRFcyt3UXRSK1Z3RFgKNkhEUUdaaU5FRlc0eGxXNTl0c25RMjdUT20yZ3RscC80aGlvWlhld0tGbXBZejBNbjBZRHM4RlE3UXFHUUcxRwpVYnFvUUVxQk5yUWo1MStqU2V3K0pKR2lnYVh3amRDVklKdWxJL0pVYVIvSGNBWDB4VVpLV0NnYlVXcFd4dVZSCkpyNUJkaGhRVHM2SCtyOUJPMTV1c1NVTzRCOFIzcWhqL01lTlJkQUgrbTFHQm5ER3p3YkJTK1BsQ01OU1NYVTkKQlVWUVUvM2VLbkRPSVFOZVY4STdxMjh4c2llQ0VoaTBiUmttRWRIVlpRUHY1ZUEyZGVER3BWZGJwSmhoR1FNQgpDLzZBQm1xRHQva28wQ09LdTROQXVaOGRyWVl0WlE4cVdGR3N5cm9scHJrZHpRUFBBZ01CQUFHamdaWXdnWk13CkRnWURWUjBQQVFIL0JBUURBZ1dnTUIwR0ExVWRKUVFXTUJRR0NDc0dBUVVGQndNQkJnZ3JCZ0VGQlFjREFqQU0KQmdOVkhSTUJBZjhFQWpBQU1COEdBMVVkSXdRWU1CYUFGT1k2NTVuNEd4ejl2UUM5bXY0b25sZ01WeTRHTURNRwpBMVVkRVFRc01DcUNFbU52Y21VdWFHRnlZbTl5TG1SdmJXRnBib0lVYm05MFlYSjVMbWhoY21KdmNpNWtiMjFoCmFXNHdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBSVNlZndtL3BqU2tIeGNPV3pIb2lXWERGaDNBbXV4NTlQVEUKZGF1TE1ZRUZJMHNXemE5Tmd2Mi9tUDZMYWpFdGNJNHk0cXpIamxWZThZQ2NMQmp1RWtsbXVsTW5vWFFHczl2RQpFdm95eE9FdmFIUFl1cFl1UDUzOThsV2FqVmEvL3lPUFNJcDZJZnRSUkM4RnhxTWpBY0xKbWxZMFgwM3JnY3kzCktvNk1ZU3QwNUF2WEhyUy9KMU1Da3VUeU9EM1JxSjNvV29ja1dvdU4rcm5WelczNnBlWjRqMmJwZy9QRFhaZVMKNzZmalptRm1EMmpWS3RjRnhpamxvenVaSjhpbi9FdlNJYnhNNGVDaW5DcERiQ1k4Vys3aVdWazU3ZVFqNTMwdgpzdmQ3SHdSbHFaZnFKbDV6Z3c3VGFtMGhQQzdJZ0FKaDFiZkRaa3JwOVNPRGhmamRUZDg9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
  tls.key: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb3dJQkFBS0NBUUVBcHZEMHFnVEdubVpwTWg1b3c1WVpRWjlmVXhMUHNFTFVmbGNBMStodzBCbVlqUkJWCnVNWlZ1ZmJiSjBOdTB6cHRvTFphZitJWXFHVjNzQ2hacVdNOURKOUdBN1BCVU8wS2hrQnRSbEc2cUVCS2dUYTAKSStkZm8wbnNQaVNSb29HbDhJM1FsU0NicFNQeVZHa2Z4M0FGOU1WR1NsZ29HMUZxVnNibFVTYStRWFlZVUU3TwpoL3EvUVR0ZWJyRWxEdUFmRWQ2b1kvekhqVVhRQi9wdFJnWnd4czhHd1V2ajVRakRVa2wxUFFWRlVGUDkzaXB3CnppRURYbGZDTzZ0dk1iSW5naElZdEcwWkpoSFIxV1VENytYZ05uWGd4cVZYVzZTWVlSa0RBUXYrZ0FacWc3ZjUKS05BamlydURRTG1mSGEyR0xXVVBLbGhSck1xNkphYTVIYzBEendJREFRQUJBb0lCQUUzRXZoVmQrRERlUUc4cQpuMTlOMHlJdzNqVlM5QkdHY0hzU2lNQUw5bEhiT3Flc1RtS3Zja3daWldwYkRZdTFFbERsNGk3azR0dS91UXdGCklBKzZ2VHZlRHIyMnhYMnZqMUdQUGRpZVJqZ1BDeVk2bDV5S01wRmM1SUxtZ2ptVDcvdXA5TnNqdjU0a3FzVUwKMjlRS3FadW5NdUY3UStQRi82WEJMaDZwejhPcVFYZU0zU2lsbDNNak1SQjYzbUw2Y2ZsRXI4NzV1TUFhRzd2UwpxM0RveVU2czlzb05hY01TVHI2bkdsWThERXJXSGJXNkF6NDJMcEh4NXFvUGJ5akF2b054dk9SbjR3aEtxd1R0CjMxRFRLR1F5cUZLMUVBMnRQVHBoazZVaUJVMTl1T0FGS0lIVjgrcERNbHVhMk41QVpQMFR5ZTBMN0l0VWNQRnEKRzhKend3RUNnWUVBelFzdWFRNTUwcHlJYVJrbUhHU2ZQbDF2ZFVDVXBhekdyVHJrOEV0NTlvM1F5QkcvaFNGagpyMHdZZlo3U1hkRTRQVGV0cFpTQTRVN3JyS2lncjg4Z1lhcmtYcGlkWVdPcWFwMTEzdVdDM3c5QzhoTEpJTnQ4CjljQ2dmRlpCVy9mWjI4M29OWkFJSndQSFMwZmpyN08zaGcrTnR0eGM3K0lPMXh3ZUEvRVZZUThDZ1lFQTBHMjEKUnlocG1KRTVKejdldm83WCtKSk5GR3IwQkRZcldqcFNwKzVqWjZtTndPcUM1WDVWRFN4L0FpTjRTN1Y5eWFQOQpzeC9KaEF4dTRUdjhicWFia3FmZUE3WngwenBRa1ZVUzJNZWVyaHlPeDR5T09XVkxhbXBwd0VqRmU1UVNpeVBvCnJqQi93aW9XUml0NDMxSm5uQVMvQlB0NUVBOHVzZFdKZUNSOHNVRUNnWUI4RHR2UnJIU0F2VHk3ZWYvWkJmaGoKWDF6a2NHSi9xdjI2S2Z3Q2QyZ2ZpTVpkaG45K0tTbUxFbHR2QmZ6NXpuQmNlYWVTbXpzdkZ2VDR6ajRLb1NOUwpkSGNmMU83RDBlMTEvRGNvMld4SlVZNkxzRm9JaTBRYjNLUTlGbU1OSmZTbVRQckdEWk1oSitRWTVESWFTSDR0Cm1wTi9vK3lISnhzYmcyT1Z0dlBjZVFLQmdGQzUzUmRGWUxpMXJvUXp4b1Bad1c1R0E5S2ZwZ2tuamR6eGIrZ1kKM2FsZHMwaC95OWprK0Q0VStOQTBPcmhmLytza04vT3pvUklpMnFNajM1NWZxeXUvRnE4cmI2U1hGbk5qbHR3ZApYS2trNkd3RFZXYUhoQkVnUy9zc2RFaHJ6azdUeHFBSXFzTGlHQ1J2Vys1cTlUUXBabTZnazRBVDBVc1JZS0FHCnljREJBb0dCQU10eDFtMUdxNXFEczE3SWo2MWhZQWR4V1lhNjVJZUxYcW9JRTUrNzlKSERzOE9rRWc3eWdrTUcKNkNBTVIzU3h0MTJZNnhEcnpzWHlITG5Wd0w0eGc4cWpzYjlvYUF4L0FPbWxZYmFGZEMvSFo4Sy9GcUJ0RHh3TgpxaHNiZVZCalREdk9tNFlLdGxvVk5HOEcrbmdhYUxrcVVGMGRHWUF0VmNBS3FIZkZ4U1F5Ci0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg==
kind: Secret
metadata:
  annotations:
    meta.helm.sh/release-name: harbor
    meta.helm.sh/release-namespace: harbor
  creationTimestamp: "2025-07-25T07:37:44Z"
  labels:
    app: harbor
    app.kubernetes.io/managed-by: Helm
    chart: harbor
    heritage: Helm
    release: harbor
  name: harbor-ingress
  namespace: harbor
  resourceVersion: "2214732"
  uid: 4be5b280-fe90-49fa-9cf3-bce20ce21a57
type: kubernetes.io/tls
[root@k8s-master01 11.1]# echo "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURGRENDQWZ5Z0F3SUJBZ0lSQUpGUG1SQ3RKTU4rdG0rWlhsYkVMMWt3RFFZSktvWklodmNOQVFFTEJRQXcKRkRFU01CQUdBMVVFQXhNSmFHRnlZbTl5TFdOaE1CNFhEVEkxTURjeU5UQTNNemMwTUZvWERUSTJNRGN5TlRBMwpNemMwTUZvd0ZERVNNQkFHQTFVRUF4TUphR0Z5WW05eUxXTmhNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DCkFROEFNSUlCQ2dLQ0FRRUFtckNGOHNGV3Y4OFUybm5SclBzZHlFeUlPdWtFRDgzZkYzVjQzd2RJTm1VcERpcFUKSGxIM1JHaFRhcGw2eXhiQnJPSFkxaGdIMjJJQzVpU1ZjTEQyaXBMSlF3dktkN0V2L25aWHJEQlNadkFTYXJuMwpWN2R0b05rWE91TmFYRGNPcWhuWnIvV2VoUWswK3BPdFBNWlgyK1VRT2czVnNOZEpMK2htdXJyQzJiTjkxbXVBCitGa0JuU1RJNEp6TXJRQkc0Yk55eXZLMGhXeG04WkZYaTc5T3A0YTlkTlNmS1VKRkRaalJrMmNQNnc2VkFLUEoKMVpyTTRVNmxSRmNPcHd3ZjBBNHE3aStZd3BBTG9zZ0hPVUd0c1RkQkovSWpML1IyNEtGaU9nSkxkWHJnWjJyeApmbTBrUDYvS3JDY2k3WFBPMlVtaHpIY2dNYWVmRTZhbCtrSXZRd0lEQVFBQm8yRXdYekFPQmdOVkhROEJBZjhFCkJBTUNBcVF3SFFZRFZSMGxCQll3RkFZSUt3WUJCUVVIQXdFR0NDc0dBUVVGQndNQ01BOEdBMVVkRXdFQi93UUYKTUFNQkFmOHdIUVlEVlIwT0JCWUVGT1k2NTVuNEd4ejl2UUM5bXY0b25sZ01WeTRHTUEwR0NTcUdTSWIzRFFFQgpDd1VBQTRJQkFRQjNzUWJPSGllcnozNkJmK3p1aHM0eW1WNVZBdVFtMnVicmJ5NlpPbUtUVzNSMFB1WjJZQ2dnCmppOHdaQlh5Wm1JTFNKNWs2cjB5WlhwVTFxeGZMM1pNT3VXdURSS252bUpHdXc1bFFOdjcwVHlpN25uUGF2M0QKRFh6Ulh1bEdjdDZraXRFaWFjdU8ySm1FSzdxMEVQMGhYTmNUZ2RNc3NHT3pDUEErZXFWd0tFeUw5OGpncFJQdAoyK0dzMXhhNW5POE1IdjJaNE5kaDhRamlCMEJuVkx1ZGFIZEF4ejVTUmJWUlljanQ5Z3dYVHcxd1VwbG5lRnF6Ckl1U0UveWxjRjBhUlpjaUpZMDlqemxDTTVVa1BXcXl2azlsb3duakVKQzNSMFZqdXFNMlJLcWNtYU02eXBjdUIKcjZLNTV0QjdndXd5Nks2NU0rajlGZkhtMGhnRXlId1kKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo="|base64 -d > ca.crt
# 将证书保存在docker目录下,各节点添加创建根域名相同的子目录
[root@k8s-master01 11.1]# mkdir -p /etc/docker/certs.d/core.harbor.domain
[root@k8s-node01 ~]# mkdir -p /etc/docker/certs.d/core.harbor.domain
[root@k8s-node02 ~]# mkdir -p /etc/docker/certs.d/core.harbor.domain
[root@k8s-master01 11.1]# cp ca.crt /etc/docker/certs.d/core.harbor.domain/
[root@k8s-master01 11.1]# scp ca.crt n1:/etc/docker/certs.d/core.harbor.domain/
root@n1's password: 
ca.crt                                                                                                                                                     100% 1127   209.8KB/s   00:00    
[root@k8s-master01 11.1]# scp ca.crt n2:/etc/docker/certs.d/core.harbor.domain/
root@n2's password: 
ca.crt                                                                                                                                                     100% 1127   423.0KB/s   00:00    
# 登录仓库服务器,可以登录成功了
[root@k8s-master01 11.1]# docker login core.harbor.domain
Username: admin
Password: 

WARNING! Your credentials are stored unencrypted in '/root/.docker/config.json'.
Configure a credential helper to remove this warning. See
https://docs.docker.com/go/credential-store/

Login Succeeded

(8)Harbor 仓库测试上传镜像

[root@k8s-master01 11.1]# docker images|grep mysql
core.harbor.domain/library/mysql                                               test_harbor.v1.0      245a6c909dc0   3 days ago      921MB
mysql                                                                          latest                245a6c909dc0   3 days ago      921MB
[root@k8s-master01 11.1]# docker push core.harbor.domain/library/mysql:test_harbor.v1.0
The push refers to repository [core.harbor.domain/library/mysql]
01e9866faf54: Pushed 
51fea2595c3a: Pushed 
177861a3cc8a: Pushed 
d05bf5af5bed: Pushed 
6b3d0258f752: Pushed 
6ac6e1662376: Pushed 
0fcc1ad8e1e5: Pushed 
ba998149d8e6: Pushed 
36a144bfa009: Pushed 
1ab2dc8eb50e: Pushed 
test_harbor.v1.0: digest: sha256:c89bf9446f2d2386d36151178098d64594897a44dc6125f7efd5e70440102888 size: 2412

image

image

[root@k8s-node01 ~]# docker images|grep mysql
[root@k8s-node01 ~]# docker pull core.harbor.domain/library/mysql:test_harbor.v1.0
test_harbor.v1.0: Pulling from library/mysql
62efe2b176c9: Pull complete 
736f5014e23e: Pull complete 
d8cbbf99b1d8: Pull complete 
42dcfa514f37: Pull complete 
0f4e1544ec0b: Pull complete 
2702f0bc0b03: Pull complete 
3933202e133d: Pull complete 
408de5f91115: Pull complete 
8cf481282f11: Pull complete 
77a166a67589: Pull complete 
Digest: sha256:c89bf9446f2d2386d36151178098d64594897a44dc6125f7efd5e70440102888
Status: Downloaded newer image for core.harbor.domain/library/mysql:test_harbor.v1.0
core.harbor.domain/library/mysql:test_harbor.v1.0
[root@k8s-node01 ~]# docker images|grep mysql
core.harbor.domain/library/mysql                                                                       test_harbor.v1.0       245a6c909dc0   3 days ago      921MB

(9)Harbor 仓库镜像扫描

# 上传漏扫的软件包
[root@k8s-master01 11.1]# rz -E
rz waiting to receive.
[root@k8s-master01 11.1]# ls
ca.crt  harbor  harbor-1.11.0.tgz  harbor-1.17.1.tgz  trivy.tar.gz
# 漏扫中文件存放的位置
[root@k8s-master01 11.1]# grep /trivy/db/ harbor/values.yaml 
  # in the local file system (`/home/scanner/.cache/trivy/db/trivy.db`). In addition, the database contains the update
  # `/home/scanner/.cache/trivy/db/trivy.db` path.
[root@k8s-master01 11.1]# kubectl get pod -n harbor 
NAME                                    READY   STATUS    RESTARTS       AGE
harbor-chartmuseum-7574c876c5-j67xp     1/1     Running   1 (15h ago)    20h
harbor-core-5bb65bcc78-kpvgz            1/1     Running   12 (15m ago)   20h
harbor-database-0                       1/1     Running   17 (20m ago)   20h
harbor-jobservice-6995ddf5fc-5rnnb      1/1     Running   11 (15m ago)   20h
harbor-notary-server-5578c446d9-m46b9   1/1     Running   16 (19m ago)   20h
harbor-notary-signer-7cbb97b788-d2w5s   1/1     Running   5              20h
harbor-portal-64bb85667c-ks26r          1/1     Running   1 (15h ago)    20h
harbor-redis-0                          1/1     Running   1 (15h ago)    20h
harbor-registry-759849f995-kn8x5        2/2     Running   2 (15h ago)    20h
harbor-trivy-0                          1/1     Running   1 (15h ago)    20h
# pod 中没有存放对应的包,是因为前面关闭了自动下载,默认去github官网下载
[root@k8s-master01 11.1]# kubectl exec -it harbor-trivy-0 -n harbor -- /bin/bash
scanner [ / ]$ ls /home/scanner/.cache/trivy/db/trivy.db
ls: /home/scanner/.cache/trivy/db/trivy.db: No such file or directory
scanner [ / ]$ exit
exit
command terminated with exit code 1
[root@k8s-master01 11.1]# kubectl cp trivy.tar.gz harbor-trivy-0:/home/scanner/ -n harbor
[root@k8s-master01 11.1]# kubectl exec -it harbor-trivy-0 -n harbor -- /bin/bash
scanner [ / ]$ cd /home/scanner/ 
scanner [ ~ ]$ ls
bin  ca-bundle.crt.original  entrypoint.sh  install_cert.sh  trivy.tar.gz
scanner [ ~ ]$ mv trivy.tar.gz .cache/
cscanner [ ~ ]$ cd .cache/
scanner [ ~/.cache ]$ ls
reports  trivy  trivy.tar.gz
scanner [ ~/.cache ]$ rm -rf trivy
scanner [ ~/.cache ]$ tar -xf trivy.tar.gz 
scanner [ ~/.cache ]$ ls
reports  trivy  trivy.tar.gz

image

image

11.2 日志方案

                                       —— loki 云原生的日志服务器,可能是目前最具性价比的方案 

11.2.1 日志归集

(1)归集日志原因

当 节点数 和 Pod数量 过多时,查看日志将变成一个繁琐的事,且 Pod 具有 "动态维稳性" ,可能刚查看过,就"挂掉了",需要去看 新Pod,因此需要一个分布式存储的框架

image

(2)归集应有架构

image

1.每个节点上安装 agent 端,收集当前节点的所有容器日志,推送到 共享存储 storage 中

2.基于 共享存储storage 创建 GUI 为用户提供图像化访问的接口,同时要拥有数据筛选能力,能够筛选或检索不同 Pod 日志,以作区分

11.2.2 传统 VS 新兴

(1)常见 EFK/ELK 分布式方案

image

EFK:Fluentd、Elastic Search、Kibana

ELK:Logstash、Elastic Search、Kibana

Fluentd、Logstash 类似 agent 端,负责收集日志

Elastic Search 类似 storage 端,存储日志并提供对应检索接口(Elastic Search 主要由开源 JAVA 提供的搜索引擎库,在库上开发了接口)

Kibana 类似 GUI 端,提供检索日志Web页面

优势:

  功能完善

  具有丰富的案例(行业应用使用案例丰富)

image

构建 CDN:

  1.智能 DNS 服务器,可根据用户IP源地址,智能返回不同解析结果(例如:北京用户访问,就近返回北京IDC机房负载的IP)

  2.缓存服务器,缓存服务器向原服务器访问,缓存原服务器中的静态资源到本地IDC,以减轻原服务器压力和加快用户访问速度(定时同步静态资源,再由访问就近分配缓存服务器IP)

  3.因为数据日志分布全国各地,所以需要查看很麻烦,可以使用 Logstash 归集,再通过公网推送到 Elasticsearch 的机房IDC,通过 Kibana 进行日志检索和统计

image Squid(章鱼怪):数据在硬盘中,在网络中作为缓存服务器来提高访问速度和减少带宽使用

image Varnish Software:数据在内存中,高速缓存网页内容,以减少对后端服务器的负载,并显著提高网站的响应速度和性能

劣势:

  资源消耗量大(Logstash、Elastic Search、Kibana都是由 JAVA 语言编写,但JAVA因为跨平台需要虚拟机JVM,所以会很"大")

  灵活性差(容器化之前使用多,已经定型了,而现在需要的是更适用于云原生的日志收集工具)

(2)云原生 Loki 分布式方案

image

Promtail 类似 agent 端,负责收集日志

Grafana loki 类似 storage 端,存储日志并提供对应检索接口

Grafana 类似 GUI 端,提供检索日志Web页面

优势:

  资源消耗低

  灵活性强 (适用云原生)

  搜索速度快

劣势:

  案例相对较少(出现时间还较短,相对不够成熟)

(3)详细对比

存储方式:Loki 使用类似于散列表的内存数据结构,不需要进行索引,查询速度快;ELK 和 EFK 使用 Elastic Search 进行索引,查询速度可能比较慢(相同数据量时)

数据收集和处理:Loki 使用 Promtail 进行数据收集和处理,EFK 使用 Fluentd 进行数据收集和处理,ELK 使用 Logstash 进行数据收集和处理,Fluentd 相对于 Logstash 更轻量级,拥有更好的可扩展性;Logstash 可以处理大量数据源,但可能需要更多的资源;Promtail 是为 Loki 设计的,它的性能通常会优于 Logstash,特别是在大规模日志收集场景下,Promtail 可以有效地处理大量的日志数据,并且具有良好的水平扩展性

扩展性:ELK 和 EFK 具有广泛的扩展性和适应性,可以对多种数据源进行处理;Loki 的扩展性相对较弱

学习曲线:ELK 和 EFK 想较于 Loki 具有更陡峭的学习曲线,因为它们具有更多的组件和功能

可视化工具:ELK 和 EFK 使用 Kibana 进行数据可视化,Kibana 提供了丰富的图表、表格和仪表盘等可视化工具;Loki 使用 Grafana(GUI平台) 进行数据可视化,Grafana 也是一个强大的可视化工具,但它可能需要更多的配置和调整

11.2.3 Loki

(1)Loki 概念

Loki 是 Grafana Labs 团队最新的开源项目,是一个集水平可扩展性、高可用性、多租户的日志聚合系统

Like Prometheus,but for logs(照抄 Prometheus,但是只为了日志服务)

与其他日志聚合系统相比,Loki 具有下面的一些特性:

  不对日志进行全文索引,通过存储压缩非结构化日志和仅索引元数据,Loki 操作起来会更简单,更省成本(logQL:日志查询语言)

  通过使用与 Prometheus 想同的标签记录流对日志进行索引和分组,这使得日志的扩展和操作效率更高

  特别适合储存 Kubernetes Pod 日志,诸如 Pod 标签之类的元数据会被自动删除和编入索引(Pod 标签等元数据自动进入日志,对Pod日志中标签自动编入索引)

  受 Grafana 原生支持(页面能够通过 Loki 获取)

(2)Loki 组成

image

Promtail(数据获取端,类似 agent)

  用来将容器日志发送到 Loki 或 Grafana 服务上的日志收集工具

  该工具主要包括发现采集目标以及给日志流添加上 Label标签(与 Prometheus 想同,通过标签进行数据分层),然后发送给 Loki

  Promtail 的服务发现是基于 Prometheus 的服务发现机制实现的(有自动服务发现规则)

image

Loki

  受 Prometheus 启发的可以水平扩展、高可用以及支持多租户的日志聚合系统

  使用了和 Prometheus 相同的服务发现机制,将标签添加到日志流中而不是构建全文索引(速度更快)

  从 Promtail 接收到的日志和应用的 metrics 指标就具有相同的标签集

  不仅提供了更好的日志和指标之间的上下文切换,还避免了对日志进行全文索引

image

Grafana

  一个用于监控和可视化观测的开源平台

  支持非常丰富的数据源

  在 Loki 技术栈中它专门用来展示来自 Prometheus 和 Loki 等数据源的时间序列数据

  可进行查询、可视化、报警等操作

  可以用于创建、探索和共享数据 Dashboard

  鼓励数据驱动

(3)Loki 架构

image

Distributor:

  用来将容器日志发送到 Loki 或者 Grafana 服务上的日志收集工具

Ingester:

  摄取服务负责在写入路径上将日志数据写入长期存储后端(DynamoDB、S3、Cassandra等),并在读取路径上返回内存中查询的日志数据

  如果写入被3个摄取器中的2个确认,我们可以容忍一个摄取器丢失,但不能容忍2个,因为这回导致数据丢失

  Loki 默认配置为接受无序写入

写过程:

1.从上至下,数据由 写路径Write Path 写入 到 Distributor(Loki 中的 Promtail)

2.当写入到 Distributor 中,数据会进入到 摄取器Ingester,摄取器Ingester 会进行一定过滤的功能(容忍1个丢失)

3.摄取器Ingester 中数据获取完成写入到数据持久化中(DynamoDB、S3、Cassandra等)

4.将数据切成两块,一块是索引,对元信息进行索引,另一块是真实数据

读过程:

1.读前端Query Frontend (Loki 中的 Grafana)进行展示,查询语言Q-querier(Loki 中的 Grafana)从数据中读取

2.规则Ruler(Prometheus 中 Altermanager)支持报警策略

11.2.4 Loki 部署

(1)Loki 安装部署

[root@k8s-master01 11.2]# rz -E
rz waiting to receive.
[root@k8s-master01 11.2]# ls
loki-stack-2.9.11-wangyang.xinxianghf.tgz
[root@k8s-master01 11.2]# tar -xvf loki-stack-2.9.11-wangyang.xinxianghf.tgz 
.........
[root@k8s-master01 11.2]# ls -ltr
total 132
drwxr-xr-x 4 root root    208 Nov 14  2023 loki-stack
-rw-r--r-- 1 root root 133606 Mar 28  2024 loki-stack-2.9.11-wangyang.xinxianghf.tgz
[root@k8s-master01 11.2]# cd loki-stack/
[root@k8s-master01 loki-stack]# ls
Chart.yaml  README.md  charts  loki-ingress.yaml  requirements.lock  requirements.yaml  templates  values-pre.yaml  values.yaml
[root@k8s-master01 loki-stack]# cat values-pre.yaml 
loki:
  enabled: true
  persistence:
    enabled: true
    accessModes:
    - ReadWriteOnce
    size: 2Gi
    storageClassName: nfs-client
promtail:
  enabled: true
  defaultVolumes:
    - name: run
      hostPath:
        path: /run/promtail
    - name: containers
      hostPath:
        path: /data/docker/containers
    - name: pods
      hostPath:
        path: /var/log/pods
  defaultVolumeMounts:
    - name: run
      mountPath: /run/promtail
    - name: containers
      mountPath: /data/docker/containers
      readOnly: true
    - name: pods
      mountPath: /var/log/pods
      readOnly: true
grafana:
  enabled: true
  persistence:
    enabled: true
    accessModes:
    - ReadWriteOnce
    size: 2Gi
    storageClassName: nfs-client
# 下面的卷挂载中 containers 路径 要与 /etc/docker/daemon.json 中 "data-root": "/data/docker" 路径一致
loki:
    安装:开启
    持久卷:
        安装:开启
        读写策略:
            单点读写
        存储大小:2G
        存储类名称:nfs-client
promtail:
    安装:开启
    默认的卷:
        卷名:run
        主机路径:
           路径:/run/promtail
        卷名:containers
        主机路径:
           路径: /data/docker/containers
        卷名:pods
        主机路径:
            路径:/var/log/pods
    默认的卷挂载:
        卷名:run
        挂载路径:/run/promtail
        卷名:containers
        挂载路径:/data/docker/containers
        只读:开启
        卷名:pods
        挂载路径:/var/logs/pods
        只读:开启
grafana:
    安装:开启        
    持久卷:
        安装:开启
        读写策略:
            单点读写
        存储大小:2G
        存储类名称:nfs-client       
[root@k8s-master01 loki-stack]# kubectl create namespace loki
namespace/loki created
[root@k8s-master01 loki-stack]# helm install loki -f values-pre.yaml . -n loki
NAME: loki
LAST DEPLOYED: Tue Jul 29 21:58:10 2025
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.
[root@k8s-master01 loki-stack]# kubectl get pod -n loki -o wide 
NAME                            READY   STATUS    RESTARTS   AGE    IP              NODE           NOMINATED NODE   READINESS GATES
loki-0                          1/1     Running   0          102s   10.244.85.231   k8s-node01     <none>           <none>
loki-grafana-65ff68b754-zv6nc   2/2     Running   0          102s   10.244.58.193   k8s-node02     <none>           <none>
loki-promtail-6mgwq             1/1     Running   0          102s   10.244.85.230   k8s-node01     <none>           <none>
loki-promtail-hdc6t             1/1     Running   0          102s   10.244.32.157   k8s-master01   <none>           <none>
loki-promtail-ntfmj             1/1     Running   0          102s   10.244.58.195   k8s-node02     <none>           <none>
# 视频中将 svc 的 type 改为了 NodePort,下面使用了第十章 ingress-nginx 知识,视频:kubectl edit svc loki-grafana -n loki 修改大概 39行内容 type: NodePort
[root@k8s-master01 loki-stack]# kubectl get svc -n loki NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE loki ClusterIP 10.1.168.251 <none> 3100/TCP 17m loki-grafana ClusterIP 10.8.245.61 <none> 80/TCP 17m loki-headless ClusterIP None <none> 3100/TCP 17m loki-memberlist ClusterIP None <none> 7946/TCP 17m [root@k8s-master01 loki-stack]# cat grafana_ingress.yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: grafana-ingress namespace: loki spec: ingressClassName: nginx rules: - host: www.grafanatest.com http: paths: - path: / pathType: Prefix backend: service: name: loki-grafana port: number: 80 [root@k8s-master01 loki-stack]# kubectl apply -f grafana_ingress.yaml ingress.networking.k8s.io/grafana-ingress created [root@k8s-master01 loki-stack]# kubectl get ingress -n loki NAME CLASS HOSTS ADDRESS PORTS AGE grafana-ingress nginx www.grafanatest.com 80 7s
# 电脑主机进入目录,在 hosts 文件中添加新的信息
C:\Windows\System32\drivers\etc

192.168.66.12 www.grafanatest.com
# 获取账号和密码
[root@k8s-master01 loki-stack]# kubectl get secret -n loki
NAME                         TYPE                 DATA   AGE
loki                         Opaque               1      48m
loki-grafana                 Opaque               3      48m
loki-promtail                Opaque               1      48m
sh.helm.release.v1.loki.v1   helm.sh/release.v1   1      48m
[root@k8s-master01 loki-stack]# kubectl get secret loki-grafana -n loki -o yaml
.........
  admin-password: OGJtOHJvWXR6Q3JsU1FXcDVNMVhsd2tEcFI0YmRLdGRqTkpyTnhxeQ==
  admin-user: YWRtaW4=
.........
[root@k8s-master01 loki-stack]# echo -n "YWRtaW4="|base64 -d
admin[root@k8s-master01 loki-stack]# echo -n "OGJtOHJvWXR6Q3JsU1FXcDVNMVhsd2tEcFI0YmRLdGRqTkpyTnhxeQ=="|base64 -d
8bm8roYtzCrlSQWp5M1XlwkDpR4bdKtdjNJrNxqy[root@k8s-master01 loki-stack]# 
# 下面如果登录成功不用做,如果密码提示错误,则是因为之前安装然后卸载了,但是 grafana.db 中会记录首次安装账户、密码的数据,所以要删除,然后重新安装 helm install loki -f values-pre.yaml . -n loki
[root@k8s-master01 loki-stack]# helm uninstall loki -n loki
[root@k8s-master01 loki-stack]# kubectl delete pvc --all -n loki
[root@k8s
-master01 loki-stack]# df -h|grep nfs-client 192.168.66.11:/nfsdata/share 96G 14G 83G 14% /var/lib/kubelet/pods/cec96439-4905-4ebf-8bec-ed4f09ac3447/volumes/kubernetes.io~nfs/nfs-client-root [root@k8s-master01 ~]# cd /var/lib/kubelet/pods/cec96439-4905-4ebf-8bec-ed4f09ac3447/volumes/kubernetes.io~nfs/nfs-client-root
[root@k8s-master01 nfs-client-root]# ls
default  harbor  loki
[root@k8s
-master01 nfs-client-root]# rm -rf loki/
[root@k8s-master01 loki-stack]# kubectl get secret loki-grafana -n loki -o yaml
..........
  admin-password: dEh4Z1E1eTZSNFFPdk9EQXBFeFdDWVBrZVFOTkdET09sY1d2dE40RQ==
  admin-user: YWRtaW4=
..........
[root@k8s-master01 loki-stack]# echo 'YWRtaW4='|base64 -d
admin[root@k8s-master01 loki-stack]# 
[root@k8s-master01 loki-stack]# echo 'dEh4Z1E1eTZSNFFPdk9EQXBFeFdDWVBrZVFOTkdET09sY1d2dE40RQ=='|base64 -d
tHxgQ5y6R4QOvODApExWCYPkeQNNGDOOlcWvtN4E[root@k8s-master01 loki-stack]# 

在浏览器中输入域名 www.grafanatest.com ,可以访问,输入通过 base64 转义后的账号、密码

image

(2)Loki 使用

Grafana 自动打标签,可以查看日志

image

Ctrl + f 可以搜索,下方匹配的日志会高亮显示;绿色是 info 日志,红色是 error 日志;下方日志中匹配的结果高亮显示

image

# 模拟生产后台生成日志
[root@k8s-master01 loki-stack]# kubectl create deployment myapp --image=myapp:v1.0 --replicas=3 deployment.apps/myapp created [root@k8s-master01 loki-stack]# kubectl create svc clusterip myapp --tcp=80:80 service/myapp created [root@k8s-master01 loki-stack]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE myapp ClusterIP 10.14.72.100 <none> 80/TCP 5s [root@k8s-master01 loki-stack]# for i in `seq 20`;do curl 10.14.72.100/hostname.html;curl 10.14.72.100/index.html;sleep 1s; done myapp-77d465c645-gjpv8 Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a> .........

image

———————————————————————————————————————————————————————————————————————————

                                                                                                                         无敌小马爱学习

posted on 2025-07-08 23:27  马俊南  阅读(140)  评论(5)    收藏  举报