问题描述
在使用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的配置可以更灵活地控制配置的存储和应用,并确保在重新启动时配置不会丢失。
以上是几种解决方案,你可以根据自己的需求选择适合的方法来解决问题。