karmada-io / karmada

Open, Multi-Cloud, Multi-Cluster Kubernetes Orchestration
https://karmada.io
Apache License 2.0
4.11k stars 805 forks source link

crds 资源丢失 #2157

Closed zzz-Uzi closed 1 year ago

zzz-Uzi commented 1 year ago

What happened: 重启服务器之后,,karmada下的crds 资源都丢失了 What you expected to happen:

How to reproduce it (as minimally and precisely as possible):

Anything else we need to know?:

Environment:

prodanlabs commented 1 year ago

只是crds的资源丢失吗

prodanlabs commented 1 year ago

etcd 有没有持久化数据呢

zzz-Uzi commented 1 year ago

etcd 有没有持久化数据呢

这是指??是指定crd资源的压缩包进行按安装的

prodanlabs commented 1 year ago

这是指??是指定crd资源的压缩包进行按安装的

karmada etcd 的数据有没有持久化,我记得默认是没有持久化的

RainbowMango commented 1 year ago

karmada etcd 的数据有没有持久化,我记得默认是没有持久化的

给个链接,别吓我 :)

prodanlabs commented 1 year ago

karmada etcd 的数据有没有持久化,我记得默认是没有持久化的

给个链接,别吓我 :)

init 安装默认就是没有持久化,helm安装好像也是,我回去看看

prodanlabs commented 1 year ago

只有init默认没持久化,可以改下。

RainbowMango commented 1 year ago

哪里设置的初始化,给个链接?

prodanlabs commented 1 year ago

哪里设置的初始化,给个链接?

pkg/karmadactl/cmdinit/cmdinit.go


flags.StringVarP(&opts.EtcdStorageMode, "etcd-storage-mode", "", "emptyDir",
        fmt.Sprintf("etcd data storage mode(%s). value is PVC, specify --storage-classes-name", strings.Join(kubernetes.SupportedStorageMode(), ",")))
prodanlabs commented 1 year ago

我觉得这是个 good first issue ,你觉得呢 @RainbowMango

RainbowMango commented 1 year ago

怎么改,你在这里说下,可以请@zzz-Uzi 确认一下能不能解决。

chaunceyjiang commented 1 year ago

把默认的emptyDir 修改成 默认 hostPathhttps://github.com/karmada-io/karmada/blob/a50e31ddaf2f5f1db8db051e933829af7166f929/pkg/karmadactl/cmdinit/cmdinit.go#L59-L61

https://github.com/karmada-io/karmada/blob/a50e31ddaf2f5f1db8db051e933829af7166f929/pkg/karmadactl/cmdinit/kubernetes/deploy.go#L50-L54

prodanlabs commented 1 year ago

把默认的emptyDir 修改成 默认 hostPath

https://github.com/karmada-io/karmada/blob/a50e31ddaf2f5f1db8db051e933829af7166f929/pkg/karmadactl/cmdinit/cmdinit.go#L59-L61

https://github.com/karmada-io/karmada/blob/a50e31ddaf2f5f1db8db051e933829af7166f929/pkg/karmadactl/cmdinit/kubernetes/deploy.go#L50-L54

是的

luoMonkeyKing commented 1 year ago

这个init模式没有持久化有点可怕啊,重启之后是不是只能重装了?通过init模式已经装过的在运行的集群,有什么补救方法吗? @prodanlabs

RainbowMango commented 1 year ago

先不要着急,谁可以在开发环境把这个问题复现出来,并验证上面的方案是否可行?

luoMonkeyKing commented 1 year ago

etcdStorageModeHostPath = "hostPath"

先不要着急,谁可以在开发环境把这个问题复现出来,并验证上面的方案是否可行?

我们这边可以在一台机器上重新部署测试一下,但是修改karmada源码后的镜像不一定能构建成功,服务器无法连接外网

RainbowMango commented 1 year ago

但是修改karmada源码后的镜像不一定能构建成功,服务器无法连接外网

感谢, 有基础image(alpine:3.15.1)就可以本地构建.

luoMonkeyKing commented 1 year ago

但是修改karmada源码后的镜像不一定能构建成功,服务器无法连接外网

感谢, 有基础image(alpine:3.15.1)就可以本地构建.

好的,我今天或者明天来测试一下,有结果我会在这下面回复

prodanlabs commented 1 year ago

这个init模式没有持久化有点可怕啊,重启之后是不是只能重装了?通过init模式已经装过的在运行的集群,有什么补救方法吗? @prodanlabs

有,先把正在运行的etcd数据备份出来,然后修改etcd statefulsets 持久化数据,最后再把数据还原就好了。

prodanlabs commented 1 year ago

因为etcd的镜像里没有tar命令,没办法通过 kubectl cp 命令备份的文件复制出来。所以我们需要先创建一个 etcdctl 的pod

cat >etcdctl.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
  name: etcdctl
  namespace: karmada-system
spec:
  containers:
  - name: etcdctl
    image: anldisr/etcdctl:latest
    command:
      - sleep
      - "6000"
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - mountPath: /etc/kubernetes/pki
      name: karmada-cert
      readOnly: true
  restartPolicy: Always
  volumes:
  - name: karmada-cert
    secret:
      defaultMode: 420
      secretName: karmada-cert
EOF

kubectl create -f etcdctl.yaml 

进入 etcdctl pod

kubectl -n karmada-system  exec -it etcdctl -- bash 

执行备份数据命令

export ETCDCTL_API=3

etcdctl --endpoints etcd-0.etcd.karmada-system.svc.cluster.local:2379 \
--cacert=/etc/kubernetes/pki/ca.crt \
--cert=/etc/kubernetes/pki/etcd-client.crt \
--key=/etc/kubernetes/pki/etcd-client.key \
snapshot save snapshot.db

现在,可以把备份的数据拷贝出来了。

 kubectl -n karmada-system cp etcdctl:/snapshot.db ./snapshot.db

修改 etcd statefulsets , 根据实际情况,加入持久化声明

kubectl edit sts -n karmada-system etcd 

进入 etcdctl pod 还原数据

export ETCDCTL_API=3

etcdctl --endpoints etcd-0.etcd.karmada-system.svc.cluster.local:2379 \
--cacert=/etc/kubernetes/pki/ca.crt \
--cert=/etc/kubernetes/pki/etcd-client.crt \
--key=/etc/kubernetes/pki/etcd-client.key \
snapshot restore snapshot.db --data-dir=/var/lib/etcd-tmp

@zzz-Uzi @luoMonkeyKing @RainbowMango 可以先在测试环境测试,然后再改。正式环境可以先备份了。

有问题call我

prodanlabs commented 1 year ago

我的错,还原数据哪一步有问题。我再试试另一种办法。

luoMonkeyKing commented 1 year ago

有一个问题,上午 @zzz-Uzi 帮忙在一台新的服务器上重新部署了karmada,然后重启了服务器,发现karmada的crd还在,但是在其他的环境上已经遇到过两次crd资源丢失的问题了。 测试环境配置: 节点数:1个 karmada版本:1.2 安装命令:kubectl karmada init --crds /$HOME/crds.tar.gz

prodanlabs commented 1 year ago

kubectl karmada init --crds /$HOME/crds.tar.gz

现在默认是 emptyDir

      --etcd-storage-mode string                         etcd data storage mode(emptyDir,hostPath,PVC). value is PVC, specify --storage-classes-name (default "emptyDir")
luoMonkeyKing commented 1 year ago

kubectl karmada init --crds /$HOME/crds.tar.gz

现在默认是 emptyDir

      --etcd-storage-mode string                         etcd data storage mode(emptyDir,hostPath,PVC). value is PVC, specify --storage-classes-name (default "emptyDir")

是的,看了下etcd的配置是 emptyDir,但是服务器重启之后,crd竟然还在,和之前的环境出现的情况不一样

prodanlabs commented 1 year ago

但是服务器重启之后,crd竟然还在

有点奇怪,按理说重启服务器后,用emptyDir存储的pod数据应该是丢失的才对。

我测试了几次,没复现

luoMonkeyKing commented 1 year ago

但是服务器重启之后,crd竟然还在

有点奇怪,按理说重启服务器后,用emptyDir存储的pod数据应该是丢失的才对。

我测试了几次,没复现

是的,但是我们的另外两套环境,已经遇到过两次crd丢失问题,和 @zzz-Uzi 讨论了下,好像区别就是,之前遇到问题的k8s环境,都是1个以上的节点,然后etcd是跑在node节点上的,我们今天测试的环境只有一个节点,不知道和这个有没有关系,你测试的环境几个节点

prodanlabs commented 1 year ago

你测试的环境几个节点

我在一个节点和6个节点集群上都测试了,没复现

prodanlabs commented 1 year ago

之前遇到问题的k8s环境,都是1个以上的节点,然后etcd是跑在node节点上的

是不是etcd所在的node节点没有重启过呢

luoMonkeyKing commented 1 year ago

奇怪了!!我们有问题的环境现在不方便重启,不然可以再定位下,我看etcd的配置都一样的

luoMonkeyKing commented 1 year ago

之前遇到问题的k8s环境,都是1个以上的节点,然后etcd是跑在node节点上的

是不是etcd所在的node节点没有重启过呢

master和node都重启了

prodanlabs commented 1 year ago

那就有些奇怪了。 容器运行时是一样的吗

luoMonkeyKing commented 1 year ago

那就有些奇怪了。 容器运行时是一样的吗

都一样的,同一个脚本部署的k8s

prodanlabs commented 1 year ago

etcd没有持久化数据的重要,还是先备份下数据,数据安全第一。

prodanlabs commented 1 year ago

都一样的,同一个脚本部署的k8s

那就很奇怪了。

luoMonkeyKing commented 1 year ago

化数据的重要,还是先备份下数据,数据安全第一。

嗯,好的,先备份下,如果还复现不了的话,等后面我们那个环境能够重启了,我们再试下,到时候再发出来

prodanlabs commented 1 year ago

@luoMonkeyKing 默认应该是hostPath,你可以提个PR改下吗

luoMonkeyKing commented 1 year ago

@luoMonkeyKing 默认应该是hostPath,你可以提个PR改下吗

@luoMonkeyKing 默认应该是hostPath,你可以提个PR改下吗

好的

prodanlabs commented 1 year ago

thank.

/assign @luoMonkeyKing

RainbowMango commented 1 year ago

@prodanlabs @luoMonkeyKing Does #2191 fix this issue?

And @zzz-Uzi Can you help to confirm it?

zzz-Uzi commented 1 year ago

@prodanlabs @luoMonkeyKing Does #2191 fix this issue?

And @zzz-Uzi Can you help to confirm it?

no reproduction

RainbowMango commented 1 year ago

no reproduction

OK, I would take that as fixed. Thanks for reaching us though. /close

karmada-bot commented 1 year ago

@RainbowMango: Closing this issue.

In response to [this](https://github.com/karmada-io/karmada/issues/2157#issuecomment-1185137998): >> no reproduction > >OK, I would take that as fixed. Thanks for reaching us though. >/close Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md). If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository.
prodanlabs commented 1 year ago

@prodanlabs @luoMonkeyKing Does #2191 fix this issue?

yes