Dragonfly 在 Kubernetes 多集群环境下分发文件和镜像

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: Dragonfly 在 Kubernetes 多集群环境下分发文件和镜像

作者简介

戚文博(百蓦)

Dragonfly Maintainer,蚂蚁集团软件工程师

主要负责「基于 P2P 的文件分发以及镜像加速系统」。

本文 2036 字 阅读 8 分钟

Dragonfly 提供高效、稳定、安全的基于 P2P 技术的文件分发和镜像加速系统,并且是云原生架构中镜像加速领域的标准解决方案以及最佳实践。现在为云原生计算机基金会(CNCF)托管作为孵化级(Incubating)项目。

文章主要阐述如何在多集群环境下部署 Dragonfly。一个 Dragonfly 集群管理一个单独网络环境的集群,如果有两个集群是相互隔离的网络环境,就需要有两个 Dragonfly 集群管理各自的集群。

推荐用户在多 Kubernetes 集群场景下,使用一个 Dragonfly 集群管理一个 Kubernetes 集群,二者 1:1 关系。并且使用一个中心化的 Manager 服务去管理多个 Dragonfly 集群。因为对于 Dragonfly,一个 Dragonfly 集群中的所有 Peers 只能在当前 Dragonfly 集群内 P2P 传输数据,所以一定要保证一个 Dragonfly 集群中的所有 Peers 网络是互通的。那么如果一个 Dragonfly 集群管理一个 Kubernetes 集群,那么代表集群内的 Peers 只在 Kubernetes 集群维度进行 P2P 传输数据。

图片

准备 Kubernetes 集群

如果没有可用的 Kubernetes 集群进行测试,推荐使用 Kind[1]。

创建 Kind 多节点集群配置文件 kind-config.yaml,配置如下:

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
  - role: control-plane
  - role: worker
    extraPortMappings:
      - containerPort: 30950        
        hostPort: 8080    
    labels:      
      cluster: a  
  - role: worker    
    labels:      
      cluster: a  
  - role: worker    
    labels:      
      cluster: b  
  - role: worker    
    labels:      
      cluster: b

使用配置文件创建 Kind 集群:

    kind create cluster --config kind-config.yaml    

切换 Kubectl 的 context 到 Kind 集群:

    kubectl config use-context kind-kind

Kind 加载 Dragonfly 镜像

下载 Dragonfly latest 镜像:

    docker pull dragonflyoss/scheduler:latest
    docker pull dragonflyoss/manager:latest
    docker pull dragonflyoss/dfdaemon:latest

Kind 集群加载 Dragonfly latest 镜像:

    kind load docker-image dragonflyoss/scheduler:latest
    kind load docker-image dragonflyoss/manager:latest
    kind load docker-image dragonflyoss/dfdaemon:latest

创建 Dragonfly 集群 A

创建 Dragonfly 集群 A,应该使用 Helm 在当前集群内安装中心化的 Manager、Scheduler、Seed Peer、Peer。

基于 Helm Charts 创建 Dragonfly 集群 A

创建 Helm Charts 的 Dragonfly 集群 A 的配置文件 charts-config-cluster-a.yaml,配置如下:

    containerRuntime:
      containerd:
        enable: true
        injectConfigPath: true
        registries:     
          - 'https://ghcr.io'
    
    scheduler:  
      image: dragonflyoss/scheduler  
      tag: latest  
      nodeSelector:    
        cluster: a  
      replicas: 1  
      metrics:    
        enable: true  
      config:    
        verbose: true   
        pprofPort: 18066
    
    seedPeer:  
      image: dragonflyoss/dfdaemon  
      tag: latest  
      nodeSelector:    
        cluster: a  
      replicas: 1  
      metrics:    
        enable: true  
      config:    
        verbose: true   
        pprofPort: 18066
    
    dfdaemon:  
      image: dragonflyoss/dfdaemon  
      tag: latest  
      nodeSelector:    
        cluster: a  
      metrics:    
        enable: true  
      config:    
        verbose: true    
        pprofPort: 18066
    
    manager:  
      image: dragonflyoss/manager  
      tag: latest  
      nodeSelector:   
        cluster: a  
      replicas: 1  
      metrics:   
        enable: true 
      config:   
        verbose: true  
        pprofPort: 18066
    
    jaeger: 
      enable: true

使用配置文件部署 Helm Charts 的 Dragonfly 集群 A:

    $ helm repo add dragonfly https://dragonflyoss.github.io/helm-charts/
    $ helm install --wait --create-namespace --namespace cluster-a dragonfly dragonfly/dragonfly -f charts-config-cluster-a.yaml
    NAME: dragonfly
    LAST DEPLOYED: Mon Aug  7 22:07:02 2023
    NAMESPACE: cluster-a
    STATUS: deployed
    REVISION: 1
    TEST SUITE: None
    NOTES:
    1. Get the scheduler address by running these commands:  
      export SCHEDULER_POD_NAME=$(kubectl get pods --namespace cluster-a -l "app=dragonfly,release=dragonfly,component=scheduler" -o jsonpath={.items[0].metadata.name})   
      export SCHEDULER_CONTAINER_PORT=$(kubectl get pod --namespace cluster-a $SCHEDULER_POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")  
      kubectl --namespace cluster-a port-forward $SCHEDULER_POD_NAME 8002:$SCHEDULER_CONTAINER_PORT  
      echo "Visit http://127.0.0.1:8002 to use your scheduler"
      
    2. Get the dfdaemon port by running these commands:  
      export DFDAEMON_POD_NAME=$(kubectl get pods --namespace cluster-a -l "app=dragonfly,release=dragonfly,component=dfdaemon" -o jsonpath={.items[0].metadata.name})  
      export DFDAEMON_CONTAINER_PORT=$(kubectl get pod --namespace cluster-a $DFDAEMON_POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}") 
      You can use $DFDAEMON_CONTAINER_PORT as a proxy port in Node.
      
    3. Configure runtime to use dragonfly:  
      https://d7y.io/docs/getting-started/quick-start/kubernetes/

    4. Get Jaeger query URL by running these commands:  
      export JAEGER_QUERY_PORT=$(kubectl --namespace cluster-a get services dragonfly-jaeger-query -o jsonpath="{.spec.ports[0].port}")  
      kubectl --namespace cluster-a port-forward service/dragonfly-jaeger-query 16686:$JAEGER_QUERY_PORT  
      echo "Visit http://127.0.0.1:16686/search?limit=20&lookback=1h&maxDuration&minDuration&service=dragonfly to query download events"

检查 Dragonfly 集群 A 是否部署成功:

    $ kubectl get po -n cluster-a
    NAME                                 READY   STATUS    RESTARTS      AGE
    dragonfly-dfdaemon-7t6wc             1/1     Running   0             3m18s
    dragonfly-dfdaemon-r45bk             1/1     Running   0             3m18s
    dragonfly-jaeger-84dbfd5b56-fmhh6    1/1     Running   0             3m18s
    dragonfly-manager-75f4c54d6d-tr88v   1/1     Running   0             3m18s
    dragonfly-mysql-0                    1/1     Running   0             3m18s
    dragonfly-redis-master-0             1/1     Running   0             3m18s
    dragonfly-redis-replicas-0           1/1     Running   1 (2m ago)    3m18s
    dragonfly-redis-replicas-1           1/1     Running   0             96s
    dragonfly-redis-replicas-2           1/1     Running   0             45s
    dragonfly-scheduler-0                1/1     Running   0             3m18s
    dragonfly-seed-peer-0                1/1     Running   1 (37s ago)   3m18s

创建 Manager REST 服务的 NodePort Service 资源

创建 Manager REST 服务的配置文件 manager-rest-svc.yaml,配置如下:

    apiVersion: v1
    kind: Service
    metadata:  
      name: manager-rest  
      namespace: cluster-a
    spec:  
      type: NodePort   
      ports:    
        - name: http     
        nodePort: 30950 
        port: 8080 
      selector:  
        app: dragonfly  
        component: manager 
        release: dragonfly

使用配置文件创建 Manager REST 服务的 Service 资源:

    kubectl apply -f manager-rest-svc.yaml -n cluster-a

访问 Manager 控制台

使用默认用户名 root,密码 dragonfly 访问 localhost:8080 的 Manager 控制台地址,并且进入控制台。

图片

图片

在 Dragonfly Manager 部署成功后,默认情况下 Dragonfly Manager 在第一次启动的时候,如果没有任何集群,那么会自动创建集群 A 的记录。用户可以点击 Manager 控制台看到集群 A 的详细信息。

图片

创建 Dragonfly 集群 B

创建 Dragonfly 集群 B,需要在 Manager 控制台首先创建 Dragonfly 集群记录,然后再使用 Helm 安装 Scheduler、Seed Peer 和 Peer。

Manager 控制台创建 Dragonfly 集群 B 的记录

点击 ADD CLUSTER 按钮创建集群 B 的记录,注意 IDC 设置为 cluster-2 使其能够跟后面 Peer 配置文件中 IDC 值为 cluster-2 的 Peer 相匹配。

图片

创建 Dragonfly 集群 B 记录成功。

图片

使用 Scopes 配置区分 不同 Dragonfly 集群

Cluster 管辖的 Scopes 信息。Peer 会根据 Dfdaemon 启动的配置文件 host.idc、host.location 以及 host.advertiseIP 的内容上报给 Manager。然后 Manager 选择跟 Cluster Scopes 中 IDC、Location 以及 CIDRs 匹配的 Cluster。被选中的 Cluster 会提供自身的 Scheduler Cluster 和 Seed Peer Cluster 对当前 Peer 进行服务。这样可以通过 Scopes 来区分不同 Cluster 服务的 Peer 群,在多集群场景中非常重要。Peer 的配置文件可以参考文档 dfdaemon config[2]。

如果 Peer 的 Scopes 信息和 Dragonfly 集群匹配,那么会优先使用当前 Dragonfly 集群的 Scheduler 和 Seed Peer 提供服务。也就是说当前 Dragonfly 集群内的 Peer 只能在集群内部进行 P2P 传输数据。如果没有匹配的 Dragonfly 集群,那么使用默认的 Dragonfly 集群提供服务。

Location: Cluster 需要为该 Location 的所有 Peer 提供服务。当对 Peer 配置中的 Location 与 Cluster 中的 Location 配时,Peer 将优先使用 Cluster 的 Scheduler 和 Seed Peer。用“|”分隔,例如“地区|国家|省|城市”。

IDC: Cluster 需要服务 IDC 内的所有 Peer。当 Peer 配置中的 IDC 与 Cluster 中的 IDC 匹配时,Peer 将优先使用 Cluster 的 Scheduler 和 Seed Peer。IDC 在 Scopes 内的优先级高于 Location。

CIDRs: Cluster 需要为 CIDR 中的所有 Peer 提供服务。当 Peer 启动时,将在 Peer 配置中使用 Advertise IP,如果 Peer 配置中的 Advertise IP 为空, 则 Peer 将自动获取 Expose IP 作为 Advertise IP。当 Peer 上报的 IP 与 Cluster 中的 CIDR 匹配时,Peer 将优先使用 Cluster 的 Scheduler 和 Seed Peer。CIDR 在 Scopes 内的优先级高于 IDC。

基于 Helm Charts 创建 Dragonfly 集群 B

创建 Helm Charts 文件的内容可以在 Manager 控制台对应的 Dragonfly 集群信息详情中查看。

图片

  • Scheduler.config.manager.schedulerClusterID 是 Manager 控制台的 cluster-2 集群信息中的 Scheduler cluster ID 值。
  • Scheduler.config.manager.addr 是 Manager 的 GRPC 服务地址。
  • seedPeer.config.scheduler.manager.seedPeer.clusterID 是 Manager 控制台的 cluster-2 集群信息中的 Seed peer cluster ID 值。
  • seedPeer.config.scheduler.manager.netAddrs[0].addr 是 Manager 的 GRPC 服务地址。
  • dfdaemon.config.host.idc 是 Manager 控制台的 cluster-2 集群信息中的 IDC 值。
  • dfdaemon.config.scheduler.manager.netAddrs[0].addr 是 Manager 的 GRPC 服务地址。
  • externalManager.host 是 Manager 的 GRPC 服务的 Host。
  • externalRedis.addrs[0] 是 Redis 的服务地址。

创建 Helm Charts 的 Dragonfly 集群 B 的配置文件 charts-config-cluster-b.yaml,配置如下:

containerRuntime:
  containerd:
    enable: true
    injectConfigPath: true
    registries:
      - 'https://ghcr.io'

scheduler:
  image: dragonflyoss/scheduler
  tag: latest
  nodeSelector:
    cluster: b
  replicas: 1
  config:
    manager:
      addr: dragonfly-manager.cluster-a.svc.cluster.local:65003
      schedulerClusterID: 2

seedPeer:
  image: dragonflyoss/dfdaemon
  tag: latest
  nodeSelector:
    cluster: b
  replicas: 1
  config:
    scheduler:
      manager:
        netAddrs:
          - type: tcp
            addr: dragonfly-manager.cluster-a.svc.cluster.local:65003
        seedPeer:
          enable: true
          clusterID: 2

dfdaemon:
  image: dragonflyoss/dfdaemon
  tag: latest
  nodeSelector:
    cluster: b
  config:
    host:
      idc: cluster-2
    scheduler:
      manager:
        netAddrs:
          - type: tcp
            addr: dragonfly-manager.cluster-a.svc.cluster.local:65003

manager:
  enable: false

externalManager:
  enable: true
  host: dragonfly-manager.cluster-a.svc.cluster.local
  restPort: 8080
  grpcPort: 65003

redis:
  enable: false

externalRedis:
  addrs:
    - dragonfly-redis-master.cluster-a.svc.cluster.local:6379
  password: dragonfly

mysql:
  enable: false

jaeger:
  enable: true

使用配置文件部署 Helm Charts 的 Dragonfly 集群 B:

$ helm install --wait --create-namespace --namespace cluster-b dragonfly dragonfly/dragonfly -f charts-config-cluster-b.yaml
NAME: dragonfly
LAST DEPLOYED: Mon Aug  7 22:13:51 2023
NAMESPACE: cluster-b
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
1. Get the scheduler address by running these commands:
  export SCHEDULER_POD_NAME=$(kubectl get pods --namespace cluster-b -l "app=dragonfly,release=dragonfly,component=scheduler" -o jsonpath={.items[0].metadata.name})
  export SCHEDULER_CONTAINER_PORT=$(kubectl get pod --namespace cluster-b $SCHEDULER_POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
  kubectl --namespace cluster-b port-forward $SCHEDULER_POD_NAME 8002:$SCHEDULER_CONTAINER_PORT
  echo "Visit http://127.0.0.1:8002 to use your scheduler"

2. Get the dfdaemon port by running these commands:
  export DFDAEMON_POD_NAME=$(kubectl get pods --namespace cluster-b -l "app=dragonfly,release=dragonfly,component=dfdaemon" -o jsonpath={.items[0].metadata.name})
  export DFDAEMON_CONTAINER_PORT=$(kubectl get pod --namespace cluster-b $DFDAEMON_POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
  You can use $DFDAEMON_CONTAINER_PORT as a proxy port in Node.

3. Configure runtime to use dragonfly:
  https://d7y.io/docs/getting-started/quick-start/kubernetes/


4. Get Jaeger query URL by running these commands:
  export JAEGER_QUERY_PORT=$(kubectl --namespace cluster-b get services dragonfly-jaeger-query -o jsonpath="{.spec.ports[0].port}")
  kubectl --namespace cluster-b port-forward service/dragonfly-jaeger-query 16686:$JAEGER_QUERY_PORT
  echo "Visit http://127.0.0.1:16686/search?limit=20&lookback=1h&maxDuration&minDuration&service=dragonfly to query download events"

检查 Dragonfly 集群 B 是否部署成功:

$ kubectl get po -n dragonfly-system
NAME                                READY   STATUS    RESTARTS   AGE
dragonfly-dfdaemon-q8bsg            1/1     Running   0          67s
dragonfly-dfdaemon-tsqls            1/1     Running   0          67s
dragonfly-jaeger-84dbfd5b56-rg5dv   1/1     Running   0          67s
dragonfly-scheduler-0               1/1     Running   0          67s
dragonfly-seed-peer-0               1/1     Running   0          67s

创建 Dragonfly 集群 B 成功。

图片

使用 Dragonfly 在多集群环境下分发镜像

集群 A 中 Containerd 通过 Dragonfly 首次回源拉镜像

在 kind-worker Node 下载 ghcr.io/dragonflyoss/dragonfly2/scheduler:v2.0.5 镜像:

    docker exec -i kind-worker /usr/local/bin/crictl pull ghcr.io/dragonflyoss/dragonfly2/scheduler:v2.0.5

暴露 Jaeger 16686 端口:

    kubectl --namespace cluster-a port-forward service/dragonfly-jaeger-query 16686:16686

进入 Jaeger 页面 \<http://127.0.0.1:16686/search >,搜索 Tags 值为 http.url="/v2/dragonflyoss/dragonfly2/scheduler/blobs/sha256:82cbeb56bf8065dfb9ff5a0c6ea212ab3a32f413a137675df59d496e68eaf399?ns=ghcr.io" Tracing:

图片

Tracing 详细内容:

图片

集群 A 内首次回源时,下载 82cbeb56bf8065dfb9ff5a0c6ea212ab3a32f413a137675df59d496e68eaf399 层需要消耗时间为 1.47s

集群 A 中 Containerd 下载镜像命中 Dragonfly 远程 Peer 的缓存

在 kind-worker2 Node 下载 ghcr.io/dragonflyoss/dragonfly2/scheduler:v2.0.5 镜像:

    docker exec -i kind-worker2 /usr/local/bin/crictl pull ghcr.io/dragonflyoss/dragonfly2/scheduler:v2.0.5

暴露 Jaeger 16686 端口:

    kubectl --namespace cluster-a port-forward service/dragonfly-jaeger-query 16686:16686

进入 Jaeger 页面 \<http://127.0.0.1:16686/search >,搜索 Tags 值为 http.url="/v2/dragonflyoss/dragonfly2/scheduler/blobs/sha256:82cbeb56bf8065dfb9ff5a0c6ea212ab3a32f413a137675df59d496e68eaf399?ns=ghcr.io" Tracing:

图片

Tracing 详细内容:

图片

集群 A 中命中远程 Peer 缓存时,下载 82cbeb56bf8065dfb9ff5a0c6ea212ab3a32f413a137675df59d496e68eaf399 层需要消耗时间为 37.48ms

集群 B 中 Containerd 通过 Dragonfly 首次回源拉镜像

在 kind-worker3 Node 下载 ghcr.io/dragonflyoss/dragonfly2/scheduler:v2.0.5 镜像:

    docker exec -i kind-worker3 /usr/local/bin/crictl pull ghcr.io/dragonflyoss/dragonfly2/scheduler:v2.0.5

暴露 Jaeger 16686 端口:

    kubectl --namespace cluster-b port-forward service/dragonfly-jaeger-query 16686:16686

进入 Jaeger 页面 \<http://127.0.0.1:16686/search >,搜索 Tags 值为 http.url="/v2/dragonflyoss/dragonfly2/scheduler/blobs/sha256:82cbeb56bf8065dfb9ff5a0c6ea212ab3a32f413a137675df59d496e68eaf399?ns=ghcr.io" Tracing:

图片

Tracing 详细内容:

图片

集群 B 中命中远程 Peer 缓存时,下载 82cbeb56bf8065dfb9ff5a0c6ea212ab3a32f413a137675df59d496e68eaf399 层需要消耗时间为 4.97s

集群 B 中 Containerd 下载镜像命中 Dragonfly 远程 Peer 的缓存

在 kind-worker4 Node 下载 ghcr.io/dragonflyoss/dragonfly2/scheduler:v2.0.5 镜像:

    docker exec -i kind-worker4 /usr/local/bin/crictl pull ghcr.io/dragonflyoss/dragonfly2/scheduler:v2.0.5

暴露 Jaeger 16686 端口:

    kubectl --namespace cluster-b port-forward service/dragonfly-jaeger-query 16686:16686

进入 Jaeger 页面 \<http://127.0.0.1:16686/search > ,搜索 Tags 值为 http.url="/v2/dragonflyoss/dragonfly2/scheduler/blobs/sha256:82cbeb56bf8065dfb9ff5a0c6ea212ab3a32f413a137675df59d496e68eaf399?ns=ghcr.io" Tracing:

图片

Tracing 详细内容:

图片

集群 B 中命中远程 Peer 缓存时,下载 82cbeb56bf8065dfb9ff5a0c6ea212ab3a32f413a137675df59d496e68eaf399 层需要消耗时间为 14.53ms

Dragonfly Star 一下✨:

https://github.com/dragonflyoss/Dragonfly2

相关链接

[1]Kind:https://kind.sigs.k8s.io/

[2]dfdaemon config:[https: //d7y.io/zh/docs/next/reference/configuration/dfdaemon/]
[3]Dragonfly 官网:https://d7y.io/

[4]Dragonfly Github 仓库:https://github.com/dragonflyoss/Dragonfly2

[5]Dragonfly Slack Channel( #dragonfly on CNCF Slack):https://cloud-native.slack.com/?redir=%2Fmessages%2Fdragonfly%2F

[6]Dragonfly Discussion Group:  dragonfly-discuss@googlegroups.com

[7]Dragonfly Twitter( @dragonfly\_oss):https://twitter.com/dragonfly_oss

[8]Nydus Github 仓库: https://github.com/dragonflyoss/image-service

[9]Nydus 官网: https://nydus.dev/

推荐阅读

Dragonfly 发布 v2.1.0 版本!

Dragonfly 中 P2P 传输协议优化

蚂蚁 SOFAServerless 微服务新架构的探索与实践

超越边界:FaaS 的应用实践和未来展望

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
5天前
|
缓存 Kubernetes Docker
GitLab Runner 全面解析:Kubernetes 环境下的应用
GitLab Runner 是 GitLab CI/CD 的核心组件,负责执行由 `.gitlab-ci.yml` 定义的任务。它支持多种执行方式(如 Shell、Docker、Kubernetes),可在不同环境中运行作业。本文详细介绍了 GitLab Runner 的基本概念、功能特点及使用方法,重点探讨了流水线缓存(以 Python 项目为例)和构建镜像的应用,特别是在 Kubernetes 环境中的配置与优化。通过合理配置缓存和镜像构建,能够显著提升 CI/CD 流水线的效率和可靠性,助力开发团队实现持续集成与交付的目标。
|
6天前
|
缓存 容灾 网络协议
ACK One多集群网关:实现高效容灾方案
ACK One多集群网关可以帮助您快速构建同城跨AZ多活容灾系统、混合云同城跨AZ多活容灾系统,以及异地容灾系统。
|
16天前
|
Kubernetes Ubuntu 网络安全
ubuntu使用kubeadm搭建k8s集群
通过以上步骤,您可以在 Ubuntu 系统上使用 kubeadm 成功搭建一个 Kubernetes 集群。本文详细介绍了从环境准备、安装 Kubernetes 组件、初始化集群到管理和使用集群的完整过程,希望对您有所帮助。在实际应用中,您可以根据具体需求调整配置,进一步优化集群性能和安全性。
67 12
|
19天前
|
Prometheus Kubernetes 监控
OpenAI故障复盘 - 阿里云容器服务与可观测产品如何保障大规模K8s集群稳定性
聚焦近日OpenAI的大规模K8s集群故障,介绍阿里云容器服务与可观测团队在大规模K8s场景下我们的建设与沉淀。以及分享对类似故障问题的应对方案:包括在K8s和Prometheus的高可用架构设计方面、事前事后的稳定性保障体系方面。
|
21天前
|
Kubernetes 网络协议 应用服务中间件
Kubernetes Ingress:灵活的集群外部网络访问的利器
《Kubernetes Ingress:集群外部访问的利器-打造灵活的集群网络》介绍了如何通过Ingress实现Kubernetes集群的外部访问。前提条件是已拥有Kubernetes集群并安装了kubectl工具。文章详细讲解了Ingress的基本组成(Ingress Controller和资源对象),选择合适的版本,以及具体的安装步骤,如下载配置文件、部署Nginx Ingress Controller等。此外,还提供了常见问题的解决方案,例如镜像下载失败的应对措施。最后,通过部署示例应用展示了Ingress的实际使用方法。
45 2
|
1月前
|
存储 Kubernetes 关系型数据库
阿里云ACK备份中心,K8s集群业务应用数据的一站式灾备方案
本文源自2024云栖大会苏雅诗的演讲,探讨了K8s集群业务为何需要灾备及其重要性。文中强调了集群与业务高可用配置对稳定性的重要性,并指出人为误操作等风险,建议实施周期性和特定情况下的灾备措施。针对容器化业务,提出了灾备的新特性与需求,包括工作负载为核心、云资源信息的备份,以及有状态应用的数据保护。介绍了ACK推出的备份中心解决方案,支持命名空间、标签、资源类型等维度的备份,并具备存储卷数据保护功能,能够满足GitOps流程企业的特定需求。此外,还详细描述了备份中心的使用流程、控制台展示、灾备难点及解决方案等内容,展示了备份中心如何有效应对K8s集群资源和存储卷数据的灾备挑战。
|
2月前
|
运维 Kubernetes 数据安全/隐私保护
K8S 拉取私有仓库镜像
在Kubernetes中从私有仓库拉取镜像时,需先创建包含认证信息的Secret,然后在Pod或Deployment中引用此Secret。本文通过具体步骤演示了如何创建Secret、更新Kubernetes资源配置文件以引用Secret,并验证了镜像拉取及应用运行的成功。
145 6
|
2月前
|
Kubernetes 监控 Cloud Native
Kubernetes集群的高可用性与伸缩性实践
Kubernetes集群的高可用性与伸缩性实践
83 1
|
3月前
|
JSON Kubernetes 容灾
ACK One应用分发上线:高效管理多集群应用
ACK One应用分发上线,主要介绍了新能力的使用场景
|
3月前
|
Kubernetes 持续交付 开发工具
ACK One GitOps:ApplicationSet UI简化多集群GitOps应用管理
ACK One GitOps新发布了多集群应用控制台,支持管理Argo CD ApplicationSet,提升大规模应用和集群的多集群GitOps应用分发管理体验。