经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Kubernetes » 查看文章
详解K8s 镜像缓存管理kube-fledged
来源:cnblogs  作者:华为云开发者联盟  时间:2024/4/15 9:48:31  对本文有异议

本文分享自华为云社区《K8s 镜像缓存管理 kube-fledged 认知》,作者: 山河已无恙。

我们知道 k8s 上的容器调度需要在调度的节点行拉取当前容器的镜像,在一些特殊场景中,

  • 需要快速启动和/或扩展的应用程序。例如,由于数据量激增,执行实时数据处理的应用程序需要快速扩展。
  • 镜像比较庞大,涉及多个版本,节点存储有限,需要动态清理不需要的镜像
  • 无服务器函数通常需要在几分之一秒内立即对传入事件和启动容器做出反应。
  • 在边缘设备上运行的 IoT 应用程序,需要容忍边缘设备和镜像镜像仓库之间的间歇性网络连接。
  • 如果需要从专用仓库中拉取镜像,并且无法授予每个人从此镜像仓库拉取镜像的访问权限,则可以在群集的节点上提供镜像。
  • 如果集群管理员或操作员需要对应用程序进行升级,并希望事先验证是否可以成功拉取新镜像。

kube-fledged 是一个 kubernetes operator,用于直接在 Kubernetes 集群的 worker 节点上创建和管理容器镜像缓存。它允许用户定义镜像列表以及这些镜像应缓存到哪些工作节点上(即拉取)。因此,应用程序 Pod 几乎可以立即启动,因为不需要从镜像仓库中提取镜像。

kube-fledged 提供了 CRUD API 来管理镜像缓存的生命周期,并支持多个可配置的参数,可以根据自己的需要自定义功能。

Kubernetes 具有内置的镜像垃圾回收机制。节点中的 kubelet 会定期检查磁盘使用率是否达到特定阈值(可通过标志进行配置)。一旦达到这个阈值,kubelet 会自动删除节点中所有未使用的镜像。

需要在建议的解决方案中实现自动和定期刷新机制。如果镜像缓存中的镜像被 kubelet 的 gc 删除,下一个刷新周期会将已删除的镜像拉入镜像缓存中。这可确保镜像缓存是最新的。

设计流程

https://github.com/senthilrch/kube-fledged/blob/master/docs/kubefledged-architecture.png

部署 kube-fledged

Helm 方式部署

  1. ──[root@vms100.liruilongs.github.io]-[~/ansible]
  2. └─$mkdir kube-fledged
  3. ┌──[root@vms100.liruilongs.github.io]-[~/ansible]
  4. └─$cd kube-fledged
  5. ┌──[root@vms100.liruilongs.github.io]-[~/ansible/kube-fledged]
  6. └─$export KUBEFLEDGED_NAMESPACE=kube-fledged
  7. ┌──[root@vms100.liruilongs.github.io]-[~/ansible/kube-fledged]
  8. └─$kubectl create namespace ${KUBEFLEDGED_NAMESPACE}
  9. namespace/kube-fledged created
  10. ┌──[root@vms100.liruilongs.github.io]-[~/ansible/kube-fledged]
  11. └─$helm repo add kubefledged-charts https://senthilrch.github.io/kubefledged-charts/
  12. "kubefledged-charts" has been added to your repositories
  13. ┌──[root@vms100.liruilongs.github.io]-[~/ansible/kube-fledged]
  14. └─$helm repo update
  15. Hang tight while we grab the latest from your chart repositories...
  16. ...Successfully got an update from the "kubefledged-charts" chart repository
  17. ...Successfully got an update from the "kubescape" chart repository
  18. ...Successfully got an update from the "rancher-stable" chart repository
  19. ...Successfully got an update from the "skm" chart repository
  20. ...Successfully got an update from the "openkruise" chart repository
  21. ...Successfully got an update from the "awx-operator" chart repository
  22. ...Successfully got an update from the "botkube" chart repository
  23. Update Complete. ?Happy Helming!?
  24. ┌──[root@vms100.liruilongs.github.io]-[~/ansible/kube-fledged]
  25. └─$helm install --verify kube-fledged kubefledged-charts/kube-fledged -n ${KUBEFLEDGED_NAMESPACE} --wait

实际部署中发现,由于网络问题,chart 无法下载,所以通过 make deploy-using-yaml 使用 yaml 方式部署

Yaml 文件部署

  1. ┌──[root@vms100.liruilongs.github.io]-[~/ansible/kube-fledged]
  2. └─$git clone https://github.com/senthilrch/kube-fledged.git
  3. 正克隆到 'kube-fledged'...
  4. remote: Enumerating objects: 10613, done.
  5. remote: Counting objects: 100% (1501/1501), done.
  6. remote: Compressing objects: 100% (629/629), done.
  7. remote: Total 10613 (delta 845), reused 1357 (delta 766), pack-reused 9112
  8. 接收对象中: 100% (10613/10613), 34.58 MiB | 7.33 MiB/s, done.
  9. 处理 delta 中: 100% (4431/4431), done.
  10. ┌──[root@vms100.liruilongs.github.io]-[~/ansible/kube-fledged]
  11. └─$ls
  12. kube-fledged
  13. ┌──[root@vms100.liruilongs.github.io]-[~/ansible/kube-fledged]
  14. └─$cd kube-fledged/
  15. ┌──[root@vms100.liruilongs.github.io]-[~/ansible/kube-fledged/kube-fledged]
  16. └─$make deploy-using-yaml
  17. kubectl apply -f deploy/kubefledged-namespace.yaml

第一次部署,发现镜像拉不下来

  1. ┌──[root@vms100.liruilongs.github.io]-[~]
  2. └─$kubectl get all -n kube-fledged
  3. NAME READY STATUS RESTARTS AGE
  4. pod/kube-fledged-controller-df69f6565-drrqg 0/1 CrashLoopBackOff 35 (5h59m ago) 21h
  5. pod/kube-fledged-webhook-server-7bcd589bc4-b7kg2 0/1 Init:CrashLoopBackOff 35 (5h58m ago) 21h
  6. pod/kubefledged-controller-55f848cc67-7f4rl 1/1 Running 0 21h
  7. pod/kubefledged-webhook-server-597dbf4ff5-l8fbh 0/1 Init:CrashLoopBackOff 34 (6h ago) 21h
  8. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  9. service/kube-fledged-webhook-server ClusterIP 10.100.194.199 <none> 3443/TCP 21h
  10. service/kubefledged-webhook-server ClusterIP 10.101.191.206 <none> 3443/TCP 21h
  11. NAME READY UP-TO-DATE AVAILABLE AGE
  12. deployment.apps/kube-fledged-controller 0/1 1 0 21h
  13. deployment.apps/kube-fledged-webhook-server 0/1 1 0 21h
  14. deployment.apps/kubefledged-controller 0/1 1 0 21h
  15. deployment.apps/kubefledged-webhook-server 0/1 1 0 21h
  16. NAME DESIRED CURRENT READY AGE
  17. replicaset.apps/kube-fledged-controller-df69f6565 1 1 0 21h
  18. replicaset.apps/kube-fledged-webhook-server-7bcd589bc4 1 1 0 21h
  19. replicaset.apps/kubefledged-controller-55f848cc67 1 1 0 21h
  20. replicaset.apps/kubefledged-webhook-server-597dbf4ff5 1 1 0 21h
  21. ┌──[root@vms100.liruilongs.github.io]-[~]
  22. └─$

这里我们找一下要拉取的镜像

  1. ┌──[root@vms100.liruilongs.github.io]-[~/ansible/kube-fledged/kube-fledged/deploy]
  2. └─$cat *.yaml | grep image:
  3. - image: senthilrch/kubefledged-controller:v0.10.0
  4. - image: senthilrch/kubefledged-webhook-server:v0.10.0
  5. - image: senthilrch/kubefledged-webhook-server:v0.10.0

单独拉取一些,当前使用 ansible 在所有工作节点批量操作

  1. ┌──[root@vms100.liruilongs.github.io]-[~/ansible]
  2. └─$ansible k8s_node -m shell -a "docker pull docker.io/senthilrch/kubefledged-cri-client:v0.10.0" -i host.yaml

其他相关的镜像都拉取一下

操作完成之后容器状态全部正常

  1. ┌──[root@vms100.liruilongs.github.io]-[~/ansible]
  2. └─$kubectl -n kube-fledged get all
  3. NAME READY STATUS RESTARTS AGE
  4. pod/kube-fledged-controller-df69f6565-wdb4g 1/1 Running 0 13h
  5. pod/kube-fledged-webhook-server-7bcd589bc4-j8xxp 1/1 Running 0 13h
  6. pod/kubefledged-controller-55f848cc67-klxlm 1/1 Running 0 13h
  7. pod/kubefledged-webhook-server-597dbf4ff5-ktbsh 1/1 Running 0 13h
  8. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  9. service/kube-fledged-webhook-server ClusterIP 10.100.194.199 <none> 3443/TCP 36h
  10. service/kubefledged-webhook-server ClusterIP 10.101.191.206 <none> 3443/TCP 36h
  11. NAME READY UP-TO-DATE AVAILABLE AGE
  12. deployment.apps/kube-fledged-controller 1/1 1 1 36h
  13. deployment.apps/kube-fledged-webhook-server 1/1 1 1 36h
  14. deployment.apps/kubefledged-controller 1/1 1 1 36h
  15. deployment.apps/kubefledged-webhook-server 1/1 1 1 36h
  16. NAME DESIRED CURRENT READY AGE
  17. replicaset.apps/kube-fledged-controller-df69f6565 1 1 1 36h
  18. replicaset.apps/kube-fledged-webhook-server-7bcd589bc4 1 1 1 36h
  19. replicaset.apps/kubefledged-controller-55f848cc67 1 1 1 36h
  20. replicaset.apps/kubefledged-webhook-server-597dbf4ff5 1 1 1 36h

验证是否安装成功

  1. ┌──[root@vms100.liruilongs.github.io]-[~/ansible/kube-fledged/kube-fledged]
  2. └─$kubectl get pods -n kube-fledged -l app=kubefledged
  3. NAME READY STATUS RESTARTS AGE
  4. kubefledged-controller-55f848cc67-klxlm 1/1 Running 0 16h
  5. kubefledged-webhook-server-597dbf4ff5-ktbsh 1/1 Running 0 16h
  6. ┌──[root@vms100.liruilongs.github.io]-[~/ansible/kube-fledged/kube-fledged]
  7. └─$kubectl get imagecaches -n kube-fledged
  8. No resources found in kube-fledged namespace.

使用 kubefledged

创建镜像缓存对象

根据 Demo 文件,创建镜像缓存对象

  1. ┌──[root@vms100.liruilongs.github.io]-[~/ansible/kube-fledged/kube-fledged]
  2. └─$cd deploy/
  3. ┌──[root@vms100.liruilongs.github.io]-[~/ansible/kube-fledged/kube-fledged/deploy]
  4. └─$cat kubefledged-imagecache.yaml
  5. ---
  6. apiVersion: kubefledged.io/v1alpha2
  7. kind: ImageCache
  8. metadata:
  9. # Name of the image cache. A cluster can have multiple image cache objects
  10. name: imagecache1
  11. namespace: kube-fledged
  12. # The kubernetes namespace to be used for this image cache. You can choose a different namepace as per your preference
  13. labels:
  14. app: kubefledged
  15. kubefledged: imagecache
  16. spec:
  17. # The "cacheSpec" field allows a user to define a list of images and onto which worker nodes those images should be cached (i.e. pre-pulled).
  18. cacheSpec:
  19. # Specifies a list of images (nginx:1.23.1) with no node selector, hence these images will be cached in all the nodes in the cluster
  20. - images:
  21. - ghcr.io/jitesoft/nginx:1.23.1
  22. # Specifies a list of images (cassandra:v7 and etcd:3.5.4-0) with a node selector, hence these images will be cached only on the nodes selected by the node selector
  23. - images:
  24. - us.gcr.io/k8s-artifacts-prod/cassandra:v7
  25. - us.gcr.io/k8s-artifacts-prod/etcd:3.5.4-0
  26. nodeSelector:
  27. tier: backend
  28. # Specifies a list of image pull secrets to pull images from private repositories into the cache
  29. imagePullSecrets:
  30. - name: myregistrykey

官方的 Demo 中对应的 镜像拉取不下来,所以换一下

  1. ┌──[root@vms100.liruilongs.github.io]-[~/ansible/kube-fledged/kube-fledged/deploy]
  2. └─$docker pull us.gcr.io/k8s-artifacts-prod/cassandra:v7
  3. Error response from daemon: Get "https://us.gcr.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
  4. ┌──[root@vms100.liruilongs.github.io]-[~/ansible/kube-fledged/kube-fledged/deploy]
  5. └─$

为了测试选择器标签的使用,我们找一个节点的标签单独做镜像缓存

  1. ┌──[root@vms100.liruilongs.github.io]-[~/ansible/kube-fledged/kube-fledged/deploy]
  2. └─$kubectl get nodes --show-labels

同时我们直接从公有仓库拉取镜像,所以不需要 imagePullSecrets 对象

  1. ┌──[root@vms100.liruilongs.github.io]-[~/ansible/kube-fledged/kube-fledged/deploy]
  2. └─$vim kubefledged-imagecache.yaml

修改后的 yaml 文件

  • 添加了一个所有节点的 liruilong/my-busybox:latest 镜像缓存
  • 添加了一个 kubernetes.io/hostname: vms105.liruilongs.github.io 对应标签选择器的 liruilong/hikvision-sdk-config-ftp:latest 镜像缓存
  1. ┌──[root@vms100.liruilongs.github.io]-[~/ansible/kube-fledged/kube-fledged/deploy]
  2. └─$cat kubefledged-imagecache.yaml
  3. ---
  4. apiVersion: kubefledged.io/v1alpha2
  5. kind: ImageCache
  6. metadata:
  7. # Name of the image cache. A cluster can have multiple image cache objects
  8. name: imagecache1
  9. namespace: kube-fledged
  10. # The kubernetes namespace to be used for this image cache. You can choose a different namepace as per your preference
  11. labels:
  12. app: kubefledged
  13. kubefledged: imagecache
  14. spec:
  15. # The "cacheSpec" field allows a user to define a list of images and onto which worker nodes those images should be cached (i.e. pre-pulled).
  16. cacheSpec:
  17. # Specifies a list of images (nginx:1.23.1) with no node selector, hence these images will be cached in all the nodes in the cluster
  18. - images:
  19. - liruilong/my-busybox:latest
  20. # Specifies a list of images (cassandra:v7 and etcd:3.5.4-0) with a node selector, hence these images will be cached only on the nodes selected by the node selector
  21. - images:
  22. - liruilong/hikvision-sdk-config-ftp:latest
  23. nodeSelector:
  24. kubernetes.io/hostname: vms105.liruilongs.github.io
  25. # Specifies a list of image pull secrets to pull images from private repositories into the cache
  26. #imagePullSecrets:
  27. #- name: myregistrykey
  28. ┌──[root@vms100.liruilongs.github.io]-[~/ansible/kube-fledged/kube-fledged/deploy]
  29. └─$

直接创建报错了

  1. ┌──[root@vms100.liruilongs.github.io]-[~/ansible/kube-fledged/kube-fledged/deploy]
  2. └─$kubectl create -f kubefledged-imagecache.yaml
  3. Error from server (InternalError): error when creating "kubefledged-imagecache.yaml": Internal error occurred: failed calling webhook "validate-image-cache.kubefledged.io": failed to call webhook: Post "https://kubefledged-webhook-server.kube-fledged.svc:3443/validate-image-cache?timeout=1s": x509: certificate signed by unknown authority (possibly because of "crypto/rsa: verification error" while trying to verify candidate authority certificate "kubefledged.io")
  4. ┌──[root@vms100.liruilongs.github.io]-[~/ansible/kube-fledged/kube-fledged/deploy]
  5. └─$kubectl get imagecaches -n kube-fledged
  6. No resources found in kube-fledged namespace.
  7. ┌──[root@vms100.liruilongs.github.io]-[~/ansible/kube-fledged/kube-fledged/deploy]
  8. └─$

解决办法,删除对应的对象,重新创建

我在当前项目的一个 issues 下面找到了解决办法 https://github.com/senthilrch/kube-fledged/issues/76

看起来这是因为 Webhook CA 是硬编码的,但是当 webhook 服务器启动时,会生成一个新的 CA 捆绑包并更新 webhook 配置。当发生另一个部署时,将重新应用原始 CA 捆绑包,并且 Webhook 请求开始失败,直到再次重新启动 Webhook 组件以修补捆绑包init-server

  1. ┌──[root@vms100.liruilongs.github.io]-[~/ansible/kube-fledged/kube-fledged]
  2. └─$make remove-kubefledged-and-operator
  3. # Remove kubefledged
  4. kubectl delete -f deploy/kubefledged-operator/deploy/crds/charts.helm.kubefledged.io_v1alpha2_kubefledged_cr.yaml
  5. error: resource mapping not found for name: "kube-fledged" namespace: "kube-fledged" from "deploy/kubefledged-operator/deploy/crds/charts.helm.kubefledged.io_v1alpha2_kubefledged_cr.yaml": no matches for kind "KubeFledged" in version "charts.helm.kubefledged.io/v1alpha2"
  6. ensure CRDs are installed first
  7. ┌──[root@vms100.liruilongs.github.io]-[~/ansible/kube-fledged/kube-fledged]
  8. └─$make deploy-using-yaml
  9. kubectl apply -f deploy/kubefledged-namespace.yaml
  10. namespace/kube-fledged created
  11. kubectl apply -f deploy/kubefledged-crd.yaml
  12. customresourcedefinition.apiextensions.k8s.io/imagecaches.kubefledged.io unchanged
  13. ....................
  14. kubectl rollout status deployment kubefledged-webhook-server -n kube-fledged --watch
  15. Waiting for deployment "kubefledged-webhook-server" rollout to finish: 0 of 1 updated replicas are available...
  16. deployment "kubefledged-webhook-server" successfully rolled out
  17. kubectl get pods -n kube-fledged
  18. NAME READY STATUS RESTARTS AGE
  19. kubefledged-controller-55f848cc67-76c4v 1/1 Running 0 112s
  20. kubefledged-webhook-server-597dbf4ff5-56h6z 1/1 Running 0 66s

重新创建缓存对象,创建成功

  1. ┌──[root@vms100.liruilongs.github.io]-[~/ansible/kube-fledged/kube-fledged/deploy]
  2. └─$kubectl create -f kubefledged-imagecache.yaml
  3. imagecache.kubefledged.io/imagecache1 created
  4. ┌──[root@vms100.liruilongs.github.io]-[~/ansible/kube-fledged/kube-fledged/deploy]
  5. └─$kubectl get imagecaches -n kube-fledged
  6. NAME AGE
  7. imagecache1 10s
  8. ┌──[root@vms100.liruilongs.github.io]-[~/ansible/kube-fledged/kube-fledged/deploy]
  9. └─$

查看当前被纳管的镜像缓存

  1. ┌──[root@vms100.liruilongs.github.io]-[~/ansible/kube-fledged]
  2. └─$kubectl get imagecaches imagecache1 -n kube-fledged -o json
  3. {
  4. "apiVersion": "kubefledged.io/v1alpha2",
  5. "kind": "ImageCache",
  6. "metadata": {
  7. "creationTimestamp": "2024-03-01T15:08:42Z",
  8. "generation": 83,
  9. "labels": {
  10. "app": "kubefledged",
  11. "kubefledged": "imagecache"
  12. },
  13. "name": "imagecache1",
  14. "namespace": "kube-fledged",
  15. "resourceVersion": "20169836",
  16. "uid": "3a680a57-d8ab-444f-b9c9-4382459c5c72"
  17. },
  18. "spec": {
  19. "cacheSpec": [
  20. {
  21. "images": [
  22. "liruilong/my-busybox:latest"
  23. ]
  24. },
  25. {
  26. "images": [
  27. "liruilong/hikvision-sdk-config-ftp:latest"
  28. ],
  29. "nodeSelector": {
  30. "kubernetes.io/hostname": "vms105.liruilongs.github.io"
  31. }
  32. }
  33. ]
  34. },
  35. "status": {
  36. "completionTime": "2024-03-02T01:06:47Z",
  37. "message": "All requested images pulled succesfully to respective nodes",
  38. "reason": "ImageCacheRefresh",
  39. "startTime": "2024-03-02T01:05:33Z",
  40. "status": "Succeeded"
  41. }
  42. }
  43. ┌──[root@vms100.liruilongs.github.io]-[~/ansible/kube-fledged]
  44. └─$

通过 ansible 来验证

  1. ┌──[root@vms100.liruilongs.github.io]-[~/ansible]
  2. └─$ansible all -m shell -a "docker images | grep liruilong/my-busybox" -i host.yaml
  3. 192.168.26.102 | CHANGED | rc=0 >>
  4. liruilong/my-busybox latest 497b83a63aad 11 months ago 1.24MB
  5. 192.168.26.101 | CHANGED | rc=0 >>
  6. liruilong/my-busybox latest 497b83a63aad 11 months ago 1.24MB
  7. 192.168.26.103 | CHANGED | rc=0 >>
  8. liruilong/my-busybox latest 497b83a63aad 11 months ago 1.24MB
  9. 192.168.26.105 | CHANGED | rc=0 >>
  10. liruilong/my-busybox latest 497b83a63aad 11 months ago 1.24MB
  11. 192.168.26.100 | CHANGED | rc=0 >>
  12. liruilong/my-busybox latest 497b83a63aad 11 months ago 1.24MB
  13. 192.168.26.106 | CHANGED | rc=0 >>
  14. liruilong/my-busybox latest 497b83a63aad 11 months ago 1.24MB
  15. ┌──[root@vms100.liruilongs.github.io]-[~/ansible]
  16. └─$
  17. ┌──[root@vms100.liruilongs.github.io]-[~/ansible]
  18. └─$ansible all -m shell -a "docker images | grep liruilong/hikvision-sdk-config-ftp" -i host.yaml
  19. 192.168.26.102 | FAILED | rc=1 >>
  20. non-zero return code
  21. 192.168.26.100 | FAILED | rc=1 >>
  22. non-zero return code
  23. 192.168.26.103 | FAILED | rc=1 >>
  24. non-zero return code
  25. 192.168.26.105 | CHANGED | rc=0 >>
  26. liruilong/hikvision-sdk-config-ftp latest a02cd03b4342 4 months ago 830MB
  27. 192.168.26.101 | FAILED | rc=1 >>
  28. non-zero return code
  29. 192.168.26.106 | FAILED | rc=1 >>
  30. non-zero return code
  31. ┌──[root@vms100.liruilongs.github.io]-[~/ansible]
  32. └─$

开启自动刷新

  1. ┌──[root@vms100.liruilongs.github.io]-[~/ansible]
  2. └─$kubectl annotate imagecaches imagecache1 -n kube-fledged kubefledged.io/refresh-imagecache=
  3. imagecache.kubefledged.io/imagecache1 annotated
  4. ┌──[root@vms100.liruilongs.github.io]-[~/ansible]
  5. └─$

添加镜像缓存

添加一个新的镜像缓存

  1. ┌──[root@vms100.liruilongs.github.io]-[~/ansible]
  2. └─$kubectl get imagecaches.kubefledged.io -n kube-fledged imagecache1 -o json
  3. {
  4. "apiVersion": "kubefledged.io/v1alpha2",
  5. "kind": "ImageCache",
  6. "metadata": {
  7. "creationTimestamp": "2024-03-01T15:08:42Z",
  8. "generation": 92,
  9. "labels": {
  10. "app": "kubefledged",
  11. "kubefledged": "imagecache"
  12. },
  13. "name": "imagecache1",
  14. "namespace": "kube-fledged",
  15. "resourceVersion": "20175233",
  16. "uid": "3a680a57-d8ab-444f-b9c9-4382459c5c72"
  17. },
  18. "spec": {
  19. "cacheSpec": [
  20. {
  21. "images": [
  22. "liruilong/my-busybox:latest",
  23. "liruilong/jdk1.8_191:latest"
  24. ]
  25. },
  26. {
  27. "images": [
  28. "liruilong/hikvision-sdk-config-ftp:latest"
  29. ],
  30. "nodeSelector": {
  31. "kubernetes.io/hostname": "vms105.liruilongs.github.io"
  32. }
  33. }
  34. ]
  35. },
  36. "status": {
  37. "completionTime": "2024-03-02T01:43:32Z",
  38. "message": "All requested images pulled succesfully to respective nodes",
  39. "reason": "ImageCacheUpdate",
  40. "startTime": "2024-03-02T01:40:34Z",
  41. "status": "Succeeded"
  42. }
  43. }
  44. ┌──[root@vms100.liruilongs.github.io]-[~/ansible]
  45. └─$

通过 ansible 确认

  1. ┌──[root@vms100.liruilongs.github.io]-[~/ansible]
  2. └─$ansible all -m shell -a "docker images | grep liruilong/jdk1.8_191" -i host.yaml
  3. 192.168.26.101 | FAILED | rc=1 >>
  4. non-zero return code
  5. 192.168.26.100 | FAILED | rc=1 >>
  6. non-zero return code
  7. 192.168.26.102 | FAILED | rc=1 >>
  8. non-zero return code
  9. 192.168.26.103 | FAILED | rc=1 >>
  10. non-zero return code
  11. 192.168.26.105 | FAILED | rc=1 >>
  12. non-zero return code
  13. 192.168.26.106 | FAILED | rc=1 >>
  14. non-zero return code
  15. ┌──[root@vms100.liruilongs.github.io]-[~/ansible]
  16. └─$ansible all -m shell -a "docker images | grep liruilong/jdk1.8_191" -i host.yaml
  17. 192.168.26.101 | CHANGED | rc=0 >>
  18. liruilong/jdk1.8_191 latest 17dbd4002a8c 5 years ago 170MB
  19. 192.168.26.102 | CHANGED | rc=0 >>
  20. liruilong/jdk1.8_191 latest 17dbd4002a8c 5 years ago 170MB
  21. 192.168.26.100 | CHANGED | rc=0 >>
  22. liruilong/jdk1.8_191 latest 17dbd4002a8c 5 years ago 170MB
  23. 192.168.26.103 | CHANGED | rc=0 >>
  24. liruilong/jdk1.8_191 latest 17dbd4002a8c 5 years ago 170MB
  25. 192.168.26.105 | CHANGED | rc=0 >>
  26. liruilong/jdk1.8_191 latest 17dbd4002a8c 5 years ago 170MB
  27. 192.168.26.106 | CHANGED | rc=0 >>
  28. liruilong/jdk1.8_191 latest 17dbd4002a8c 5 years ago 170MB
  29. ┌──[root@vms100.liruilongs.github.io]-[~/ansible]
  30. └─$

删除镜像缓存

  1. ┌──[root@vms100.liruilongs.github.io]-[~/ansible]
  2. └─$kubectl edit imagecaches imagecache1 -n kube-fledged
  3. imagecache.kubefledged.io/imagecache1 edited
  4. ┌──[root@vms100.liruilongs.github.io]-[~/ansible]
  5. └─$kubectl get imagecaches.kubefledged.io -n kube-fledged imagecache1 -o json
  6. {
  7. "apiVersion": "kubefledged.io/v1alpha2",
  8. "kind": "ImageCache",
  9. "metadata": {
  10. "creationTimestamp": "2024-03-01T15:08:42Z",
  11. "generation": 94,
  12. "labels": {
  13. "app": "kubefledged",
  14. "kubefledged": "imagecache"
  15. },
  16. "name": "imagecache1",
  17. "namespace": "kube-fledged",
  18. "resourceVersion": "20175766",
  19. "uid": "3a680a57-d8ab-444f-b9c9-4382459c5c72"
  20. },
  21. "spec": {
  22. "cacheSpec": [
  23. {
  24. "images": [
  25. "liruilong/jdk1.8_191:latest"
  26. ]
  27. },
  28. {
  29. "images": [
  30. "liruilong/hikvision-sdk-config-ftp:latest"
  31. ],
  32. "nodeSelector": {
  33. "kubernetes.io/hostname": "vms105.liruilongs.github.io"
  34. }
  35. }
  36. ]
  37. },
  38. "status": {
  39. "message": "Image cache is being updated. Please view the status after some time",
  40. "reason": "ImageCacheUpdate",
  41. "startTime": "2024-03-02T01:48:03Z",
  42. "status": "Processing"
  43. }
  44. }

通过 Ansible 确认,可以看到无论是 mastere 上的节点还是 work 的节点,对应的镜像缓存都被清理

  1. ┌──[root@vms100.liruilongs.github.io]-[~/ansible]
  2. └─$ansible all -m shell -a "docker images | grep liruilong/my-busybox" -i host.yaml
  3. 192.168.26.102 | CHANGED | rc=0 >>
  4. liruilong/my-busybox latest 497b83a63aad 11 months ago 1.24MB
  5. 192.168.26.101 | CHANGED | rc=0 >>
  6. liruilong/my-busybox latest 497b83a63aad 11 months ago 1.24MB
  7. 192.168.26.105 | FAILED | rc=1 >>
  8. non-zero return code
  9. 192.168.26.100 | CHANGED | rc=0 >>
  10. liruilong/my-busybox latest 497b83a63aad 11 months ago 1.24MB
  11. 192.168.26.103 | FAILED | rc=1 >>
  12. non-zero return code
  13. 192.168.26.106 | FAILED | rc=1 >>
  14. non-zero return code
  15. ┌──[root@vms100.liruilongs.github.io]-[~/ansible]
  16. └─$ansible all -m shell -a "docker images | grep liruilong/my-busybox" -i host.yaml
  17. 192.168.26.105 | FAILED | rc=1 >>
  18. non-zero return code
  19. 192.168.26.102 | FAILED | rc=1 >>
  20. non-zero return code
  21. 192.168.26.103 | FAILED | rc=1 >>
  22. non-zero return code
  23. 192.168.26.101 | FAILED | rc=1 >>
  24. non-zero return code
  25. 192.168.26.100 | FAILED | rc=1 >>
  26. non-zero return code
  27. 192.168.26.106 | FAILED | rc=1 >>
  28. non-zero return code
  29. ┌──[root@vms100.liruilongs.github.io]-[~/ansible]
  30. └─$

这里需要注意如果清除所有的镜像缓存,那么需要把 images 下的数组 写成 "".

  1. ┌──[root@vms100.liruilongs.github.io]-[~/ansible]
  2. └─$kubectl edit imagecaches imagecache1 -n kube-fledged
  3. imagecache.kubefledged.io/imagecache1 edited
  4. ┌──[root@vms100.liruilongs.github.io]-[~/ansible]
  5. └─$ansible all -m shell -a "docker images | grep liruilong/jdk1.8_191" -i host.yaml
  6. 192.168.26.102 | FAILED | rc=1 >>
  7. non-zero return code
  8. 192.168.26.101 | FAILED | rc=1 >>
  9. non-zero return code
  10. 192.168.26.100 | FAILED | rc=1 >>
  11. non-zero return code
  12. 192.168.26.105 | FAILED | rc=1 >>
  13. non-zero return code
  14. 192.168.26.103 | FAILED | rc=1 >>
  15. non-zero return code
  16. 192.168.26.106 | FAILED | rc=1 >>
  17. non-zero return code
  18. ┌──[root@vms100.liruilongs.github.io]-[~/ansible]
  19. └─$kubectl get imagecaches.kubefledged.io -n kube-fledged imagecache1 -o json
  20. {
  21. "apiVersion": "kubefledged.io/v1alpha2",
  22. "kind": "ImageCache",
  23. "metadata": {
  24. "creationTimestamp": "2024-03-01T15:08:42Z",
  25. "generation": 98,
  26. "labels": {
  27. "app": "kubefledged",
  28. "kubefledged": "imagecache"
  29. },
  30. "name": "imagecache1",
  31. "namespace": "kube-fledged",
  32. "resourceVersion": "20176849",
  33. "uid": "3a680a57-d8ab-444f-b9c9-4382459c5c72"
  34. },
  35. "spec": {
  36. "cacheSpec": [
  37. {
  38. "images": [
  39. ""
  40. ]
  41. },
  42. {
  43. "images": [
  44. "liruilong/hikvision-sdk-config-ftp:latest"
  45. ],
  46. "nodeSelector": {
  47. "kubernetes.io/hostname": "vms105.liruilongs.github.io"
  48. }
  49. }
  50. ]
  51. },
  52. "status": {
  53. "completionTime": "2024-03-02T01:52:16Z",
  54. "message": "All cached images succesfully deleted from respective nodes",
  55. "reason": "ImageCacheUpdate",
  56. "startTime": "2024-03-02T01:51:47Z",
  57. "status": "Succeeded"
  58. }
  59. }
  60. ┌──[root@vms100.liruilongs.github.io]-[~/ansible]
  61. └─$

如果通过下面的方式删除,直接注释调对应的标签

  1. ┌──[root@vms100.liruilongs.github.io]-[~/ansible/kube-fledged/kube-fledged/deploy]
  2. └─$cat kubefledged-imagecache.yaml
  3. ---
  4. apiVersion: kubefledged.io/v1alpha2
  5. kind: ImageCache
  6. metadata:
  7. # Name of the image cache. A cluster can have multiple image cache objects
  8. name: imagecache1
  9. namespace: kube-fledged
  10. # The kubernetes namespace to be used for this image cache. You can choose a different namepace as per your preference
  11. labels:
  12. app: kubefledged
  13. kubefledged: imagecache
  14. spec:
  15. # The "cacheSpec" field allows a user to define a list of images and onto which worker nodes those images should be cached (i.e. pre-pulled).
  16. cacheSpec:
  17. # Specifies a list of images (nginx:1.23.1) with no node selector, hence these images will be cached in all the nodes in the cluster
  18. #- images:
  19. #- liruilong/my-busybox:latest
  20. # Specifies a list of images (cassandra:v7 and etcd:3.5.4-0) with a node selector, hence these images will be cached only on the nodes selected by the node selector
  21. - images:
  22. - liruilong/hikvision-sdk-config-ftp:latest
  23. nodeSelector:
  24. kubernetes.io/hostname: vms105.liruilongs.github.io
  25. # Specifies a list of image pull secrets to pull images from private repositories into the cache
  26. #imagePullSecrets:
  27. #- name: myregistrykey
  28. ┌──[root@vms100.liruilongs.github.io]-[~/ansible/kube-fledged/kube-fledged/deploy]
  29. └─$

那么会报下面的错

  1. ┌──[root@vms100.liruilongs.github.io]-[~/ansible/kube-fledged/kube-fledged/deploy]
  2. └─$kubectl edit imagecaches imagecache1 -n kube-fledged
  3. error: imagecaches.kubefledged.io "imagecache1" could not be patched: admission webhook "validate-image-cache.kubefledged.io" denied the request: Mismatch in no. of image lists
  4. You can run `kubectl replace -f /tmp/kubectl-edit-4113815075.yaml` to try this update again.

博文部分内容参考

? 文中涉及参考链接内容版权归原作者所有,如有侵权请告知,如果你认可它不要吝啬星星哦 :)

https://github.com/senthilrch/kube-fledged

 

点击关注,第一时间了解华为云新鲜技术~

 

原文链接:https://www.cnblogs.com/huaweiyun/p/18135137

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号