关键字:

WSL、istio、ctr -n=k8s.io、elasticsearch、minio、ServiceEntry、Ingress、Gateway、istio-egressgateway、istio-ingressgateway、ServiceEntry、VirtualService、NetworkPolicy

tip:

README中介绍兼容各类异构数据源:

  • 支持丰富的文件类型,包括 Word 文档、PPT、excel 表格、txt 文件、图片、PDF、影印件、复印件、结构化数据、网页等。实际测试PPT一解析就失败,需要转换成PDF;另xps也是一解析就失败。

镜像push到core.harbor.domain / 宿主机之间拷贝镜像

ctr -n k8s.io i ls |grep goharbor/harbor-db:v2.6.1
ctr -n k8s.io i tag docker.io/goharbor/harbor-core:v2.6.1  core.harbor.domain/mizy/harbor-core:v2.6.1
ctr -n k8s.io i export harbor-core-v2.6.1.tar core.harbor.domain/mizy/harbor-core:v2.6.1
ctr -n k8s.io i del core.harbor.domain/mizy/harbor-db:v2.6.1 
scp harbor-core-v2.6.1.tar 192.168.31.211:/home/
--->因为使用ctr push 到core.harbor.domain失败,所以使用docker push
docker load < harbor-core-v2.6.1.tar
docker push  core.harbor.domain/mizy/harbor-core:v2.6.1
k -n harbor edit sts atc-harbor-database  #修改image源到core.harbor.domain
          image: core.harbor.domain/mizy/harbor-db:v2.6.1
 
--->宿主机之间拷贝镜像
ctr -n k8s.io i export chartmuseum-photon.tar docker.io/goharbor/chartmuseum-photon:v2.6.1
scp chartmuseum-photon.tar 192.168.31.220:/home/
ctr -n k8s.io i import chartmuseum-photon.tar

1、要将 WSL 中的文件拷贝到 Windows 中的其他文件夹,可以使用以下两种方法:

  • 通过\\wsl$访问:在文件资源管理器的地址栏中输入\\wsl$,然后找到对应的 Linux 分发版,进入其文件系统,将文件拷贝到相应的位置。
  • 使用 cp 命令:在 WSL 中使用cp命令将文件拷贝到 Windows 中的某个文件夹。例如,要将 WSL 中的文件file.txt拷贝到 Windows 中的D:\盘下,可以在 WSL 中执行以下命令:cp /home/user/file.txt /mnt/d/。其中,/home/user是 WSL 中文件的路径,/mnt/d/是 Windows 中目标文件夹的路径。

在拷贝文件时,需要注意以下几点:

  • 文件路径中的盘符要与实际情况相匹配,例如D:盘对应的是/mnt/d
  • 如果文件路径中包含空格或特殊字符,需要使用引号将路径括起来;
  • 确保在 WSL 中有足够的权限来读取和写入目标文件。

2、RAGFlow镜像导入harbor。

docker load -i ragflow-dev.tar
   docker.elastic.co/elasticsearch/elasticsearch:8.11.3
   quay.io/minio/minio:RELEASE.2023-12-20T01-00-02Z
   mysql:5.7.18
   redis:7.2.4
docker login <Harbor 仓库的地址> -u <用户名> -p <密码>

docker tag docker.elastic.co/elasticsearch/elasticsearch:8.11.3  core.harbor.domain/mizy/elasticsearch:8.11.3
docker tag quay.io/minio/minio:RELEASE.2023-12-20T01-00-02Z      core.harbor.domain/mizy/minio:RELEASE.2023-12-20T01-00-02Z
docker tag mysql:5.7.18                                          core.harbor.domain/mizy/mysql:5.7.18
docker tag redis:7.2.4                                           core.harbor.domain/mizy/redis:7.2.4
docker tag infiniflow/ragflow:dev                                core.harbor.domain/mizy/ragflow:dev

docker push core.harbor.domain/mizy/mysql:5.7.18
docker push core.harbor.domain/mizy/redis:7.2.4
docker push core.harbor.domain/mizy/minio:RELEASE.2023-12-20T01-00-02Z
docker push core.harbor.domain/mizy/elasticsearch:8.11.3
docker push core.harbor.domain/mizy/ragflow:dev

3、istio镜像更新问题:绕道上网后使用WSL版docker命令下载镜像,导出为tar文件,拷贝到宿主机,再使用ctr命令导入k8s.io命名空间。

docker pull  docker.io/istio/pilot:1.20.1  【临时改成pilot:1.20.0也能用】
docker save -o pilot1.20.1.tar docker.io/istio/pilot:1.20.1 
ctr -n=k8s.io images  import pilot1.20.1.tar
docker pull  docker.io/jaegertracing/all-in-one:1.46    
【临时改成all-in-one:1.35也能用】ctr -n=k8s.io images export all-in-one.tar docker.io/jaegertracing/all-in-one:1.35
docker save -o all-in-one1.46.tar docker.io/jaegertracing/all-in-one:1.46 
ctr -n=k8s.io images  import all-in-one1.46.tar

4、Docker Desktop部署存储的使用情况参考

k8s部署:RAGFlow & 加入服务网格_elasticsearch

5、实际测试:通过K8S的istio显示:

  • “文件管理”中“新增文件”上传时,到MinIO的流量激增,没有到ES的流量——文件管理上传使用MinIO!
  • “知识库”中对自“文件管理”“链接知识库”的文件运行“解析”时,到ES和MinIO的流量激增,但不是持续的,有突发的特征。
  • “知识库”中“新增文件”上传时,到MinIO的流量激增,没有到ES的流量——知识库上传使用MinIO!
  • “知识库”中对非链接知识库”的文件运行“解析”时,同样到ES和MinIO的流量激增,但不是持续的,有突发的特征。
  • --->说明“解析”时才使用ES存储
  • RagFlow使用MySQL存储:用户信息、系统配置信息(比如配置知识库名称)、任务定义、执行状态、结果等,所以MySQL持续有流量。
  • “聊天”问答时,有到ES流量,没有到MinIO的流量
  • “知识库”检索测试时,只有到ES的流量,没有使用MinIO——说明ES是向量数据库!

6、ollama提供本地LLM,以外部服务ollama.ai接入istio--->192.168.31.1

  • 使用 Service Entry 将一个可访问的外部服务注册到网格中。使用 Istio ServiceEntry 配置,可以从 Istio 集群中访问任何公开的服务。 在不丢失 Istio 的流量监控和控制特性的情况下,配置对外部 HTTP 服务(192.168.31.1 的访问。
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: external-ollama-serviceentry
  namespace: ragflow 
spec:
  hosts:
  - ollama.ai
  ports:
  - number: 11434
    name: http
    protocol: HTTP
  location: MESH_EXTERNAL  
  resolution: STATIC
  endpoints:
  - address: 192.168.31.1

k8s部署:RAGFlow & 加入服务网格_elasticsearch_02

7、通过ingress配置域名访问ragflow

  • !在C:\Windows\System32\drivers\etc\hosts中配置域名ragflow.atc.com,对应的IP必须是atc-ingress-nginx-controller这个pod所在的宿主机的IP:192.168.31.218。
C:\Windows\System32\drivers\etc\hosts
192.168.31.218 ragflow.atc.com
[root@k8s-master01 home]# k -n ingress get pod -owide
NAME                                  IP               NODE         
atc-ingress-nginx-controller-t7qhg  192.168.31.218   k8s-node05   
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-test
  namespace: study
spec:
  ingressClassName: nginx
  rules: 
  - host: ragflow.atc.com
    http:
      paths:
      - backend:
          service:
            name: ragflow-ext         
            port:
              number: 80
        path: /
        pathType: ImplementationSpecific      
---
apiVersion: v1
kind: Service
metadata:
  name: ragflow-ext
  namespace: study
spec:
  externalName: ragflow.ragflow.svc.cluster.local
  sessionAffinity: None
  type: ExternalName

8、通过istio/ingressgateway配置域名访问ragflow;浏览器域名后需加istio-ingressgateway服务的端口号。

[root@k8s-master01 home]# kubectl get svc -n istio-system
NAME                    TYPE        CLUSTER-IP     PORT(S)                                                                                                                       199d
istio-ingressgateway    NodePort    10.16.128.248 15021:17910/TCP,80:21932/TCP,443:23319/TCP,31400:30937/TCP,15443:28170/TCP
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: ingressgateway
  namespace: istio-system
spec:
  selector:
    istio: ingressgateway 
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "book.atc.com" 
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ragflow-vs
  namespace: ragflow   
spec:
  hosts:
  - "book.atc.com"
  gateways:
  - istio-system/ingressgateway
  http:
  - match:
    - uri:
        prefix: /
    route:
    - destination:
        host: ragflow.ragflow.svc.cluster.local
        port:
          number: 80

9、配置 Istio 以通过专用的 Egress 网关服务间接调用外部服务(Egress 网关允许将 Istio 的功能例如,监视和路由规则应用于网格的出站流量):Windows主机上ollama的大模型。使用80端口即可调用。

  • 首先创建一个 ServiceEntry,允许流量直接访问一个外部服务;
  • 为 egress.ollama.ai 端口 80 的出口流量创建一个 Gateway
  • 将 DestinationRule 中的 subset 字段重用于其他主机(ServiceEntry:egress-ollama-serviceentry)。
  • VirtualService配置路由规则,将流量从边车导向到 Egress 网关(将流量从 80 端口重定向到 Egress 网关),再从 Egress 网关导向到外部服务。
# 为 egress.ollama.ai 定义 ServiceEntry,不配置VirtualService时 ,通过 Sidecar 直接调用的外部服务:
# curl -sSL -o /dev/null -D - http://egress.ollama.ai:11434  --->ok
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: egress-ollama-serviceentry
  namespace: ragflow 
spec:
  hosts:
  - egress.ollama.ai
  ports:
  - number: 11434
    name: http-port
    protocol: HTTP
  location: MESH_EXTERNAL  
  resolution: STATIC
  endpoints:
  - address: 192.168.31.1 
---
# 配置 Istio 以通过专用的 Egress 网关服务间接调用外部服务;为 egress.ollama.ai 端口 80 的出口流量创建一个 Gateway。    
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: istio-egressgateway
  namespace: istio-system
spec:
  selector:
    istio: egressgateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - egress.ollama.ai   //通过 Egress 网关引导多个主机列表,或使用 * 匹配所有主机
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: egressgateway-for-ollama
  namespace: ragflow     
spec:
  host: istio-egressgateway.istio-system.svc.cluster.local
  subsets:
  - name: egress-ollama-serviceentry
---  
# 将流量从边车导向到 Egress 网关,再从 Egress 网关导向到外部服务:curl -sSL -o /dev/null -D - http://egress.ollama.ai:80  --->ok
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: direct-ollama-through-egress-gateway
  namespace: ragflow    
spec:
  hosts:
  - egress.ollama.ai
  gateways:
  - istio-system/istio-egressgateway
  - mesh
  http:
  - match:
    - gateways:
      - mesh
      port: 80            //将流量从 80 端口重定向到 Egress 网关
    route:
    - destination:        //将流量从边车导向到 Egress 网关
        host: istio-egressgateway.istio-system.svc.cluster.local
        subset: egress-ollama-serviceentry
        port:
          number: 80
      weight: 100
  - match:
    - gateways:
      - istio-system/istio-egressgateway
      port: 80
    route:
    - destination:       //再从 Egress 网关导向到外部服务
        host: egress.ollama.ai
        port:
          number: 11434
      weight: 100

发送 HTTP 请求到http://egress.ollama.ai ,检查 Egress 网关 Pod 的日志,找到与请求对应的那一行,类似于下面这样的内容:ragflow-server-65f9cd44dc-ksnjj:172.29.115.140

root@ragflow-server-65f9cd44dc-ksnjj:/ragflow# curl -sSL -o /dev/null -D - http://egress.ollama.ai
HTTP/1.1 200 OK
# kubectl logs -l istio=egressgateway -c istio-proxy -n istio-system | tail
[2024-07-04T06:40:58.294Z] "GET / HTTP/2" 200 - via_upstream - "-" 0 17 1 0 "172.29.115.140" "curl/7.81.0" "dc51bf54-e6a8-421e-9f42-a57f621887cd" "egress.ollama.ai" "192.168.31.1:11434" outbound|11434||egress.ollama.ai 172.26.54.243:53756 172.26.54.243:8080 172.29.115.140:37672 - -

——另外要注意的是,Istio 无法强制让所有出站流量都经过 Egress 网关, Istio 只是通过 Sidecar 代理实现了这种流向。gong击者只要绕过 Sidecar 代理, 就可以不经 Egress 网关直接与网格外的服务进行通信,从而避开了 Istio 的控制和监控。 出于安全考虑,集群管理员必须确保网格所有的出站流量都要经过 Egress 网关。 需要通过 Istio 之外的机制来满足这一要求。例如,集群管理员可以配置防火墙, 拒绝 Egress 网关以外的所有流量。 Kubernetes 网络策略也能禁止所有不是从 Egress 网关发起的出站流量。

——Istio 提供了两种模式来配置对外部请求的访问策略,并通过配置项 outboundTrafficPolicy.mode 来指定。默认的模式是 ALLOW_ANY,也就是允许在网格内请求所有外部的未知服务;另外一个模式是 REGISTRY_ONLY,表示只允许请求注册到服务网格注册表中的服务。

——创建 Kubernetes 网络策略来阻止绕过 Egress 网关的出站流量。创建一个 NetworkPolicy,来限制某命名空间的出站流量, 只允许目标为控制平面、网关和 kube-system DNS 服务(端口 53)的所有请求。这种配置表明,即使一些恶意的 Pod 绕过了 Sidecar,也会被网络策略拦截,而无法访问到外部站点。外部服务的流量策略并不在 Istio 服务网格中,如果不进行相关配置把外部服务注册到服务网格内,经过 Envoy 一系列出口流量治理动作后将会返回错误信息。因此这里我们需要配置 ServiceEntry,把外部服务纳入服务网格中,然后通过 Envoy 的流量治理后可以继续发送外部请求,访问外部请求时又会被 iptables 拦截转发至出口流量 OUTPUT 链。(https://zhuanlan.zhihu.com/p/537993739):应用以下NetworkPolicy后只有配置 ServiceEntry的外部服务可以继续发送外部请求。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-egress-to-istio-system-and-kube-dns
  namespace: ragflow   
spec:
  podSelector: {}
  policyTypes:
  - Egress
  egress:
  - to:
    - namespaceSelector:
        matchLabels:
          kube-system: "true"
    ports:
    - protocol: UDP
      port: 53
  - to:
    - namespaceSelector:
        matchLabels:
          istio: system
//  egress.ollama.ai配置为ServiceEntry所以OK! 
root@ragflow-server-65f9cd44dc-ksnjj:/ragflow# curl -sSL -o /dev/null -D - http://egress.ollama.ai
HTTP/1.1 200 OK
//http://www.baidu.com 没有配ServiceEntry所以不行!
root@ragflow-server-65f9cd44dc-ksnjj:/ragflow# curl -sSL -o /dev/null -D - http://www.baidu.com
curl: (6) Could not resolve host: www.baidu.com

10、博客使用 edge 浏览器,安装 markdownload - markdown web clipper 插件,通过该插件可将网页内容下载保存为 markdown 文件。ragflow知识库解析必须是General,其它的解析失败。