whoogle-search

我在周刊项目第003期 (08-30~09-03)中介绍了一个开源的元搜索引擎项目whoogle-search,这个项目有几个非常吸引我的特性:

  • 没有广告以及赞助内容
  • 不追踪个人IP
  • Tor & HTTP/SOCKS 支持
  • 设置 No JS&Cookie
  • 易部署
  • 更多特性去项目地址查看

到目前我差不多用了三个月,完全满足我日常使用需求,也很少用Google了,这次将Whoogle正式部署到了我的k3s集群,中间踩了不少坑,输出这篇文章以作记录。

部署

所谓元数据搜索引擎就是基于其他搜索引擎的基础上做一些基础功能,whoogle-search就是在Google搜索结果的基础上增加了上述功能,所以对于检索质量来说是和谷歌一致的。

如果你有自己的服务器(海外优先),我推荐你使用Whoogle作为自己的搜索引擎。如果没有服务器,也没关系,目前有很多免费资源供开发者日常使用,如:

单机部署

单机部署的话非常简单,推荐直接使用Docker,一行命令搞定:

1
docker run -d -it -p 5000:5000 --restart=always --name whoogle-search benbusby/whoogle-search:latest

如果你有域名且希望上https,可以考虑结合Caddy使用Letsencrypt来实现。

集群部署

我个人的话在自己购买的几台服务器上有部署一套k3s集群(开源、极轻量的 Kubernetes 发行版),所以我准备直接在集群上部署whoogle-search并绑定域名上https,这件事花了我一整天的时间才做完,写这篇文章的目的也完全是为了记录我踩的坑,接下来直接放出可行的解决方案。

k3s集群相关依赖版本如下:

k3s集群安装搭建这里先不提,后面等我玩熟了会出一篇文章聊聊,提一句,如果你不熟悉k8s但又感兴趣的话,可以看看我之前学习k8s过程中产出的开源笔记:

先安装cert-manager

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
kubectl create namespace cert-manager
kubectl apply --validate=false -f  https://github.com/jetstack/cert-manager/releases/download/v1.6.1/cert-manager.yaml

# 查看状态
kubectl get pods --namespace cert-manager

# 输出
NAME                                      READY   STATUS    RESTARTS   AGE
cert-manager-55658cdf68-4m5r5             1/1     Running   0          25h
cert-manager-cainjector-967788869-x5cpk   1/1     Running   0          25h
cert-manager-webhook-6668fbb57d-4cv2c     1/1     Running   0          25h

一旦运行成功,我们将使用ClusterIssuer资源类型来支持Letsencrypt为我们颁发证书,创建文件letsencrypt.yaml,输入内容:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-issuer
spec:
  acme:
    email: <your>@<email>.<com> # input your email
    privateKeySecretRef:
      name: letsencrypt-issuer-account-key
    server: https://acme-v02.api.letsencrypt.org/directory
    solvers:
      - http01:
          ingress:
            ingressTemplate:
              metadata:
                annotations:
                  kubernetes.io/ingress.class: traefik

在终端执行:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
kubectl apply -f letsencrypt.yaml

# 查看状态
kubectl get clusterissuers

# 输出
NAME                 READY   AGE
letsencrypt-issuer   True    114m

# 更详细的信息可查看
kubectl describe clusterissuers letsencrypt

# 输出
Status:
  Acme:
    Last Registered Email:  
    Uri:                    https://acme-v02.api.letsencrypt.org/acme/acct/
  Conditions:
    Last Transition Time:  2021-12-01T07:08:43Z
    Message:               The ACME account was registered with the ACME server
    Observed Generation:   1
    Reason:                ACMEAccountRegistered
    Status:                True
    Type:                  Ready
Events:                    <none>

接下来我们直接在k3s部署whoogle,创建文件whoogle.yaml,输入内容:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
apiVersion: v1
kind: Service
metadata:
  name: whoogle
spec:
  ports:
  - name: whoogle-5000-tcp
    port: 5000
    protocol: TCP
    targetPort: 5000
  selector:
    app: whoogle
---
kind: Deployment
apiVersion: apps/v1
metadata:
  name: whoogle
  labels:
    app: whoogle
spec:
  replicas: 1
  selector:
    matchLabels:
      app: whoogle
  template:
    metadata:
      labels:
        app: whoogle
    spec:
      containers:
        - name: whoogle
          image: benbusby/whoogle-search:latest
          resources:
            limits:
              cpu: '1'
              memory: 512M
            requests:
              cpu: '1'
              memory: 512M
          ports:
              - containerPort: 5000

在终端执行:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
kubectl apply -f ./whoogle.yaml

# 查看 pod 状态
kubectl get pods

# 输出
NAME                       READY   STATUS    RESTARTS   AGE
whoogle-7c95b49ddd-dqgs7   1/1     Running   0          25h

# 查看 svc 状态
kubectl get svc

# 输出
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
whoogle      ClusterIP   10.42.163.248   <none>        5000/TCP   25h

此时whoogle服务已经正常启动,接下来要做的就是利用traefikcert-manager进行域名绑定和https,这个过程我踩了好几个坑,如果你也遇到了Waiting for HTTP-01 challenge propagation: wrong status code '404', expected '200',可以参考我的配置示例,创建文件whoogle-ingress-tls.yaml,输入配置如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: whoogle-ingress
  annotations:
    kubernetes.io/ingress.class: "traefik"
    cert-manager.io/cluster-issuer: "letsencrypt-issuer"
    traefik.ingress.kubernetes.io/frontend-entry-points: http, https
    traefik.ingress.kubernetes.io/redirect-entry-point: https
spec:
  tls:
    - secretName: s-demo-cn
      hosts:
        - s-demo-cn
  rules:
    - host: s-demo-cn
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: whoogle
                port:
                  number: 5000

等待片刻,在终端执行以下命令查看状态:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
kubectl apply -f whoogle-ingress-tls.yaml

# 查看 ingress
kubectl get ingress

# 输出
NAME              CLASS    HOSTS             ADDRESS            PORTS     AGE
whoogle-ingress   <none>   s.demo.cn          1.2.3.4           80, 443   123m

# 查看证书
kubectl get cert

# 输出
NAME                  READY   SECRET                AGE
s-demo-cn             True    s-demo-cn            125m

# 查看密钥
kubectl describe secret s-demo-cn

# 输出
Name:         s-demo-cn
Namespace:    default
Labels:       <none>
Annotations:  cert-manager.io/alt-names: s.demo.cn
              cert-manager.io/certificate-name: s-demo-cn
              cert-manager.io/common-name: s.demo.cn
              cert-manager.io/ip-sans:
              cert-manager.io/issuer-group: cert-manager.io
              cert-manager.io/issuer-kind: ClusterIssuer
              cert-manager.io/issuer-name: letsencrypt-issuer
              cert-manager.io/uri-sans:
Type:  kubernetes.io/tls
Data
====
tls.crt:  5603 bytes
tls.key:  1675 bytes

# 如果有问题,可以查看详情进行排查
kubectl describe certificate s-demo-cn
kubectl describe certificaterequest s-demo-cn
kubectl describe challenges s-demo-cn

至此,问题解决,留此记录,本文主要提供了一种在k3s集群下利用traefik&cert-manager让服务https化的方法。