k3s重启后Ingress丢失一些设置

98次阅读
没有评论

问题描述

在使用k3s(版本1.25.3)时,安装了TrueCharts应用(https://truecharts.org/),但发现设置存在问题。用户已经配置了一个clusterissuer,但相关的设置没有出现在(traefik)Ingress中。因此,用户使用k3s kubectl edit手动更改了Ingress,并成功使用cert-manager.io发出了证书。在编辑后,Ingress的样子如下所示:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    cert-manager.io/cluster-issuer: lets-encrypt-xxxxxx
    meta.helm.sh/release-name: dokuwiki
    meta.helm.sh/release-namespace: ix-dokuwiki
    traefik.ingress.kubernetes.io/router.entrypoints: websecure
  creationTimestamp: "2023-03-29T14:08:05Z"
  generation: 13
  labels:
    app.kubernetes.io/instance: dokuwiki
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/name: dokuwiki
    app.kubernetes.io/version: "20220731.1"
    helm-revision: "6"
    helm.sh/chart: dokuwiki-5.0.25
  name: dokuwiki
  namespace: ix-dokuwiki
  resourceVersion: "6123797"
  uid: fab6a1dd-6edd-4f8f-9e83-d4f1ed72dd1c
spec:
  ingressClassName: traefik
  rules:
  - host: myhost.mydomain.com
    http:
      paths:
      - backend:
          service:
            name: dokuwiki
            port:
              name: main
        path: /
        pathType: Prefix
  tls:
  - hosts:
    - myhost.mydomain.com
    secretName: myhost-mydomain-com-tls
status:
  loadBalancer:
    ingress:
    - ip: 192.168.0.11

尽管添加的注释保留了下来,但当用户在TrueNAS UI中停止并重新启动应用程序时,secretName会出现问题,甚至会消失,这导致证书无法使用。更糟糕的是,secretName也被删除,因此在重新添加secretName时需要重新发出新的证书。用户希望在重启后保留设置,请问是什么原因导致了这种行为,如何解决?

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

在k3s中,Ingress的设置是存储在Kubernetes的etcd数据库中的。当应用程序重新启动时,etcd数据库中的数据将被清除,因此导致Ingress的设置丢失。为了解决这个问题,可以使用Kubernetes的持久化存储来保存Ingress的设置。下面是一种解决方案:
1. 首先,确保你的k3s集群已经配置了持久化存储。你可以使用Kubernetes的PersistentVolume和PersistentVolumeClaim来实现持久化存储。
2. 修改Ingress的配置,将其存储在持久化存储中。可以使用Kubernetes的ConfigMap或Secret来存储Ingress的配置。
3. 在应用程序启动时,从持久化存储中加载Ingress的配置,并将其应用到集群中。
这样,在应用程序重新启动时,Ingress的配置将从持久化存储中加载,而不会丢失。

方案2

请注意以下操作注意版本差异及修改前做好备份。
另一种解决方案是使用Helm来管理应用程序的部署。Helm是一个Kubernetes的包管理工具,可以帮助你轻松地部署、升级和管理应用程序。使用Helm,你可以将应用程序的配置保存在Helm的Chart中,并在应用程序重新启动时重新应用配置。以下是一种解决方案:
1. 首先,确保你已经安装了Helm。你可以参考Helm的官方文档来进行安装。
2. 创建一个Helm Chart,用于部署应用程序。在Chart的values.yaml文件中,将Ingress的配置添加为一个参数。
3. 使用Helm部署应用程序,并指定Ingress的配置参数。
4. 当应用程序重新启动时,使用Helm重新部署应用程序,并指定相同的Ingress的配置参数。这样,Ingress的配置将被重新应用,而不会丢失。
使用Helm管理应用程序的部署可以更方便地管理应用程序的配置,并确保在重新启动时配置不会丢失。

方案3

请注意以下操作注意版本差异及修改前做好备份。
另一种解决方案是使用Kubernetes的自定义资源定义(Custom Resource Definition,CRD)来管理Ingress的配置。CRD允许你定义自己的资源类型,并在Kubernetes中使用它们。以下是一种解决方案:
1. 首先,创建一个CRD,用于存储Ingress的配置。你可以使用Kubernetes的CustomResourceDefinition来创建CRD。
2. 创建一个自定义控制器,用于管理Ingress的配置。自定义控制器可以监听CRD的变化,并在应用程序重新启动时重新应用配置。
3. 在应用程序启动时,将Ingress的配置保存到CRD中。
4. 当应用程序重新启动时,自定义控制器将从CRD中加载Ingress的配置,并将其应用到集群中。
使用CRD来管理Ingress的配置可以更灵活地控制配置的存储和应用,并确保在重新启动时配置不会丢失。
以上是几种解决方案,你可以根据自己的需求选择适合的方法来解决问题。

正文完