kubernetes阿里云(阿里云broker)

admin 206 2023-05-19

阿里云服务器优惠多,折扣错,惊喜多,请咨询:www.wqiis.com

本文目录一览:

使用 Docker 快速搭建单机版的 Kubernetes 集群

随着容器化、微服务、服务网格、服务编排、DevOps 等云原生技术的流行,我们也要跟上时代的步伐,那么我们需要怎么上车呢?此时就需要一个易于在本地运行且 Kubernetes 的工具,可在你的笔记歼悉本电脑上的虚拟机内轻松创建单机版 Kubernetes 集群,便于我们使用 Kubernetes 进行日常开发与学习。那么接下让我们轻松地搭建一个更贴近真实的 K8s 环境。

对于本地实验,还可以使用各种 Kubernetes 实现以运行 Kubernetes 群集,如

使用上面任一液芦工具的目标都能快速运行一个本地学习的 Kubernetes 群集,其中我个人最喜欢的是 Kind。

下面分别尝试 Kind 与 Minikube 创建单机版 Kubernetes 集群。

无论使用哪个工具,都需要先正确安装 kubectl Kubernetes 命令行工具,否则安装完 Kind、Minikube 等环境后无法执行 kubectl 命令。

Kind 提供了多种安装方式,支持以下方式:

这里将在 Linux 环境下以 Installing From Release Binaries 方式进行安装:

选择不同环境下的安装方式,参考

国内网络环境,使用如下命令将自动使用阿里云闹改带服务来支持 minikube 的环境配置,参考

启动 K8s 控制台,参考

查看 minikube 支持的扩展列表,参考

nginx-pod.yml

nginx-svc.yml

执行命令:

Kubernetes GPU 共享技术调研

资源隔离主要采用的是虚拟化的解决思路,目前NVIDIA有两种 GPU 虚拟化的解决方案:

目前社区的GPU调度方案:

1.Nvidia 贡献的调度方案,只支持按较粗粒度的调度,按GPU块数调度。

Nvidia GPU Device Plugin

2.阿里云服务团队贡献的 GPU 共享的调度方案,其目的在于解决用户共享 GPU 调度的需求Kubernetes GPU共享实践

gpushare-scheduler-extender

gpushare-device-plugin

由于资源隔离主要采用的是虚拟化技术,并且NVIDIA提供的两种GPU虚拟化解决方案都没有开源,GPU共享在资源隔离方面的实践资料相对较少,大多关注GPU资源的调度。

相关资料: Kubernetes的共享GPU集群调度

优点:

缺点:

前提条件:

实现思路:

依赖于Kubernetes的现有工作机制:

相关资料: AI 在 K8S 中的实践:云智天枢 AI 中台架构揭秘

实现思路:

相关资料: 基于 Kubernetes 的 GPU 类型调度实现

实现思路:

利用kubernetes现有的工作机制:

优点:

缺点:

1. 通过CRD(CustomResourceDefinition)定义两种资源:ExtendedResource 和 ResourceClass

ExtendedResource 描述了一种扩展资源,比如 NVIDIA GPU;

ResourceClass 定义了容器选择哪种扩展资源,它的使用方式和 Kubernetes 中的 Extended Resource类似,用户可以直接在容器中指定,就像使用 CPU 和 Memory 一样。

2. 利用 Scheduler 的扩展机制扩展Scheduler,负责调度容器中使用了ResourceClass资源对象的Pod

通过查询 ResourceClass 对象的定义过滤选择节点上的 ExtendedResource 资源,从而找到合适的节点并绑定,并将合适的 ExtendedResource 写到 Pod Annotation 中,供 Kubelet 组件使用。

3. 利用Nvidia Device Plugin插件,扩展NVIDIA GPU资源,负责与kubelet组件通信以及创建和维护 ExtendedResource 资源对象

ExtendedResource 资源中包含着 GPU 的频率、显存等信息,当多个容器想使用同一块 GPU 时,我们可以定义一个 ResourceClass 资源对象,在 ResourceClass 中声明使用多少显存(这里共享的是显存)。这样,应用部署时,我们只要在容器中声明使用该 ResourceClass 资源即可,之后 Scheduler Extender 会过滤符合条件的 ExtendedResource 对象,绑定到合适的节点上。

如果要实现资源共享,我们可能需要在 ExtendedResource 中记录显存的用量情况,供调度参考。

相关资料: 在 Kubernetes 中使用 vGPU 实现机器学习任务共享 GPU

实现思路:

利用GPU厂家、雀碰蠢虚拟化厂商等提供的GPU虚拟化技术,对吵轿GPU进行虚拟顷陪化,把完整的GPU进行分割。然后按照调度物理GPU一样在k8s中调度GPU。

优点:

缺点:

k8s官网对GPU调度的说明 提供了Nvidia GPU容器调度能力,但是只能将一个GPU卡分配给一个容器

从零开始入门 K8s:GPU 管理和 Device Plugin 工作机制

如何在Kubernetes实现GPU调度及共享

Kubernetes GPU使用指南

Kubernetes如何通过Device Plugins来使用NVIDIA GPU

你真的了解多个docker容器如何共享GPU么?

Kubeflow 使用 Kubernetes 进行机器学习

kubernetes pod设置静态IP或者IP池

Pod一般不建议设置静态IP地址,若想要实现设置静态IP,可以参考下面的方法。像亚马逊、阿里云等厂家是支持静态IP的,但如果是自己的私有云,可以参考下面的方法。这里使用的是calico网络方案,其他的网络方案,好像并不支持,更详细的操作,可以看看calico的官方文档。

IP Pool资源定义

IPPool资源yaml定义

字段说明

metadata:

spec:

blockSize说明慎档

请在 V3.3.0 版本后使用blockSize

IPv4 26和IPv6 122的默认块大小为64个地址的块。这允许将地薯腔址按组分配给在同一主机上运行的工作负载。通过对地址进行分组,主机之间以及与其他BGP对等方之间交换的路由更少。如果主机在一个块中分配所有地址,则将为其分配一个附加块。如果没有更多可用的块,则主机可以从分配给其他主机的块中获取地址。为借用的地址添加了特定的路由,这会影响路由表的大小。

将块大小从默认值增加(例如,使用24IPv4为每个块提供256个地址)意味着每个主机更少的块,并且可能会减少路由。但是,请尝试确保池中至少有与主机一样多的块。

从默认值减小块大小(例如,使用28IPv4为每个块提供16个地址)意味着每个主机有更多块,因此可能有更多路由。如果它允许块在主机之间更公平地分布,那么这将是有益的。

关于cidr和blockSize设置

比如你新增一个IPPool,cidr设置为192.169.0.0/29,在没有设置blockSize情况下,默认是/26的blockSize,这样是不允许的,192.169.0.0/29可用地址为8个,而默认blockSize为26将会把IP段分为64块,没有足够的IP,所以是无效的,所以blockSize应该等于大于子网掩码。

新创建的IPPool,可以在原有的IPPool中某一子网,比如

nodeSelector说明

以下所有的语法,都可以使用或||进行组合

kubernetes设置指定IP的场景及方法:

主要通过annotations指定。

基于namespace或者每个pod指定IP池

指定静态IP地址

说明:cni.projectcalico.org/ipAddrsNoIpam:绕过IPAM分配给Pod的IPv4和/或IPv6地址的列表。任何IP冲突和路由都必须手动或由其他系统来处理。Calico仅在其IP地址属于Calico IP池内时才将路由分配到Pod。如果分配的IP地址不在Calico IP池中,则必须确保通过另一种机制来处理到该IP地址的路由。

申请浮动IP

基于node节点标签分配IP

IPPool生效优先顺序

如果将这些方法中的一种以上用于IP地址分配,则它们将具有以下优先级,其中1为最高优先级:

基于namespace指定IP池

查看当前存在的IP池

创建新的IP池

创建新的namespace,并指定IP池

创建应用测试

注意namespace设置test-ippool

为pod指定静态IP地址或地址范围

指定地址范围

创建IP地址池

创建应用测试

注意spec.template.metadata.annotations指定了使用的IPPool

Pod设置静态IP

创建应用

虽然官方说名cni.projectcalico.org/ipAddrs:后面是IPv4或IPv6列表,实际并不支持,仅可以设置一个IP地址宽手乱。所以Pod副本数超过1个是不行的。

设置的IP地址必须包含在已存在的IPPool中

根据节点标签分配IP

删除或禁用已存在的IPPool

如果不禁用或删除,创建的Pod也有可能分配到其他IPPool中的地址段

禁用IPPool

删除IPPool

给节点打上标签

创建IPPool

创建应用测试

kubernetes cloud-provider for aliyun

CloudProvider 提供kubernetes与云厂商基础服务的对接能力,由 cloud-controller-manager组件实现(lb,云盘,安全组等等)。

aliyun-cloud-provider这个组件主要是aliyun平台的对接插件,可以让用户在创建k8s LoadBalancer 类型的service的时候自动的为用户创建一个阿里云SLB,同时动态的绑定与解绑SLB后端,并且提供了丰富的配置允许用户自定义生成的LoadBalancer.

其他cloud-provider比如aws可提供elb,ebs,安全组等能力,阿里云这里实现了service_controller和route_controller,所以暂时只提供了对接slb资源,其他资源需要单独插件在cloud-provider上层实现,比如cluster-autoscaler需依赖cloud-provider完成node初始化.

所以cloud-provider的能力仅仅对接云厂商基础服陵和历务给kubernetes集群使用,我们使用aliyun-cloud-provider 主要也是对接aliyun ess资源,使用cluster-autoscaler动态/定时伸缩kubernetes node节点。

集群环境:

kubele 启动参数添加--cloud-provider=external --hostname override= instance id--provider id= instance id参数并重启kubelet。棚扮格式为 Instance。

以下命令可找到REGION_ID 和INSTANCE_ID

然后重启kubelet kubectl get node 查看hostname是否生效,也可以delete node,重新注册到集群。

cloud-provider需要一定的权限才能访问阿里云,需要为ECS实例创建一些RAM策尺搜略,或者直接使用accesskeyidsecret,由于我们容器部署cloud-provider所以这里采用AK。

1.配置aliyun-cloud-provider AK(access key) 权限

创建自定义策略,然后将策略绑定到k8s-cloud-provider用户,创建其AK提供给aliyun-cloud-provider使用,保证只能访问我们授权的资源。或者参考地址:

创建cloud-config configmap 为cloud-provider提供配置,主要存放AK信息

替换$CA_DATA 为cat /etc/kubernetes/pki/ca.crt|base64 -w 0输出结果或者kubectl config view --flatten=true可查看CA data ,以及将apiserver替换自己kubernetes apiserver的服务器地址. 我们通过configmap 挂载到cloud-provider容器中.

一旦云控制器管理器启动并运行,运行一个示例nginx部署:

然后使用以下类型创建服务:LoadBalancer:

其他SLB相关创建annotation参考:

cloud-provider注意事项 :

通过cloud-provider动态管理SLB最佳实践:

FAQ:

参考链接:

上一篇:如何做网站推广及优化(怎么做网站优化推广)
下一篇:云阿里云服务器(阿里云服务器百度百科)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~