本文介绍使用容器服务ACK涉及的服务授权、访问、调度及资源分配等常见问题。
如何部署集群的第一个应用?
将业务代码打包成容器镜像,存放到镜像仓库ACR中,再通过ACR拉取到对应容器集群ACK/ACK Serverless中。
通过Dockerfile将代码构建为镜像。具体操作,请参见在Dockerfile中使用构建打包镜像并运行。
若镜像在本地,可以上传到私有镜像仓库ACR中。具体操作,请参见使用私有镜像仓库创建应用。
从ACR拉取镜像,部署到ACK集群中。具体操作,请参见创建无状态工作负载Deployment。
集群中的应用A如何访问应用B ?
应用部署后成为容器组(Pod),每个Pod都有自己的IP地址,但是这些Pod并非永久性资源,在应用新版本发布或动态扩容等操作后,ECS实例将重新分配资源,Pod IP地址同时会发生变化。关于应用发布的滚动更新原理,请参见执行滚动更新。
Kubernetes通过服务(Service)这个抽象概念实现Pod之间的相互通信。Service是Kubernetes对应用服务的一层抽象封装,一个Service对应多个具有相同功能的应用(Pod),为外界访问服务提供统一的入口,将请求负载均衡分发到多个Pod上。
不同场景下,可使用的Service类型如下表所示:
场景 | Service实现方式 |
集群内部服务互相访问 | 虚拟集群IP(ClusterIP) |
同一VPC内不同集群之间服务互相访问 | 负载均衡(私网SLB) |
服务对外暴露,需外网访问,例如Ingress | 负载均衡(公网SLB) |
关于Service的更多信息,请参见服务或Service视频讲解。
您可以通过控制台或命令行方式创建Service。
方式一:部署应用时在高级配置配置向导页面创建Service。具体操作,请参见完成高级配置。
方式二:若已部署应用但未关联Service,可通过控制台创建服务。具体操作,请参见使用Service对外暴露应用。
方式三:通过命令行方式直接将Deployment暴露为Service。
执行以下命令将Nginx Deployment暴露给服务。
kubectl expose deployment/nginx --type="LoadBalancer" --port 80
如何将集群内的各节点资源合理地分配给不同容器组?
您在定义容器组Pod时,需要为每个容器设定所需资源,最常见的是CPU和内存资源,您可以设定所需资源的最小值与最大值。
requests请求量(最小分配资源数):确保有足够的资源可以使Pod正常运行。如果Pod所在的节点具有足够的可用资源,容器可能使用超出对应资源request属性所设置的资源量。
limits约束(最大分配资源数):防止某个Pod无限制的使用资源,导致其他Pod崩溃。当容器中进程尝试使用超出所允许内存量的资源时,系统内核会将尝试申请内存的进程终止,并引发内存不足(OOM)的错误提示。约束值以被动方式来实现(系统会在发现违例时干预),或者通过强制生效的方式实现(系统会避免容器用量超出约束值)。不同的容器运行时采用不同方式实现相同的资源限制。如果是Java类型的应用,建议将
JAVA_OPTS -Xmx
参数的值设置为Pod limit值的70%~80%。
您可查看集群中所有ECS节点的CPU与内存具体分配情况。具体操作,请参见查看节点列表。
从CPU(请求/限制/使用量)和内存(请求/限制/使用量)字段可以得出,请求资源使用率≤资源限制使用率。
若在容器设置中request和limit都没有限制资源数(不推荐的做法),节点的统计信息仅包含该节点上所有设置了request及limit的Pod的总和与节点资源总量之间的比例。
如何将Pod调度到指定ECS节点?
ACK Serverless集群不支持将Pod调度到指定ECS节点。
默认情况下,容器服务ACK集群中会尽量将Pod部署到不同的ECS节点上,实现负载均衡。如果想强行将某个Pod调度到某个节点,可以通过配置亲和性、污点/容忍度实现。
亲和性:约束Pod只能在指定节点上运行,或者优先运行在指定节点上。可通过在YAML中配置nodeSelector参数实现。更多信息,请参见node-affinity。
容忍度(Tolerations):应用在Pod上,允许Pod调度到与之匹配的污点节点上。污点和容忍度可以用来避免Pod被分配到不合适的节点上。 每个节点上都可以应用一个或多个污点,这表示对于那些不能容忍这些污点的Pod,不会被调度到该节点上。更多信息,请参见taint-and-toleration。
创建容器组时,在高级配置配置向导页面可进行调度设置。具体操作,请参见调度设置。
管理目标集群的标签与污点。具体操作,请参见通过设置节点标签、配置模板等操作,将Pod调度到指定节点上。具体操作,请参见调度应用至指定节点。
如何获取服务Service的基本信息?
关于如何获取服务的名称、类型、创建时间、集群IP以及外部端点等信息,请参见使用Service对外暴露应用。
如何对外暴露容器化服务?
Service可以对外暴露服务,需要配置公网SLB或内网SLB+EIP。更多信息,请参见通过使用自动创建SLB的服务公开应用或通过使用已有SLB的服务公开应用。
若存在很多服务模块,例如微服务场景下,可以对不同服务分配不同的端口,但是使用同一个EIP,可以更加节省EIP与SLB。
创建Service前需要安装Nginx Ingress Controller组件,安装方式请参见以下操作:
若需要创建集群,请在组件配置配置向导页面的Ingress字段选中安装Ingress组件。具体操作,请参见创建Kubernetes托管版集群。
若使用已有集群,可通过组件管理安装Nginx Ingress Controller组件。具体操作,请参见管理组件。
如何实现弹性伸缩?
阿里云容器服务提供弹性伸缩,可以根据业务需求和策略,合理地调整弹性计算资源。
资源层
采用ECS服务器+ECI服务器组合的形式,将常规业务放在ECS,高峰流量由ECI承载。关于ECI的使用,请参见ACK使用ECI。关于ECS的使用,请参见什么是云服务器ECS。
ACK集群通过虚拟节点(Virtual Node)实现了Kubernetes与弹性容器实例ECI的无缝连接,让Kubernetes集群轻松获得极大的弹性能力,而不必受限于集群的节点计算容量。具体操作,请参见通过虚拟节点将Pod调度到ECI上运行。
若只选择ECS服务器作为计算资源,集群的自动伸缩能力是通过节点自动伸缩组件实现的,可以按需扩展普通实例、GPU实例及竞价付费实例,支持多可用区、多实例规格及多种伸缩模式,满足不同的节点伸缩场景。更多信息,请参见节点自动伸缩。
容器层
阿里云弹性伸缩提供通用应用弹性模型(例如,HPA容器水平伸缩、CronHPA定时伸缩、VPA纵向伸缩和组件水平调整),也提供领域应用弹性模型(例如,事件驱动伸缩、Knative无服务器弹性框架、ElasticWorkload精细化调度弹性及Spark Presto的弹性CRD)。更多信息,请参见弹性伸缩概述。
可以只选择资源层的弹性伸缩,不进行容器层的弹性伸缩。若资源利用率不高或资源充足,也可以只进行容器层的弹性伸缩。
如何实现存储扩容?
目前只有云盘可以扩容。具体操作,请参见动态在线扩容云盘数据卷。
如何访问集群?
可通过以下方式访问集群:
方式一:通过阿里云容器服务管理控制台连接集群
方式二:通过kubectl连接Kubernetes集群
若您需要从客户端计算机连接到Kubernetes集群,请使用Kubernetes命令行客户端kubectl。具体操作,请参见获取集群KubeConfig并通过kubectl工具连接集群。
方式三:在CloudShell上通过kubectl管理Kubernetes集群
相比方式二,无需安装kubectl。具体操作,请参见在CloudShell上通过kubectl管理Kubernetes集群。
方式四:通过SSH访问Kubernetes集群
若您在创建集群时,选择不开放公网SSH访问,您将无法SSH访问Kubernetes集群,且无法通过kubectl连接Kubernetes集群。如果创建集群后,您需要SSH访问您的集群,可以手动为ECS实例绑定EIP,并配置安全组规则,开放SSH(22)端口。具体操作,请参见通过SSH连接ACK专有版集群的Master节点。
方式五:其他方式
例如通过API Server、SSH密钥等方式访问集群。
如何获取集群的公网IP?
API Server是整个ACK集群的数据总线和数据中心。集群的公网IP就是API Server的公网IP。您可以使用弹性公网IP EIP(Elastic IP Address)暴露Kubernetes集群的API Server。使用EIP暴露集群API Server后,集群API Server将具有公网访问能力。可通过以下步骤查看集群的公网IP:
登录容器服务管理控制台。
在控制台左侧导航栏中,单击集群。
在集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情。
在集群信息页面中,单击基本信息页签,在集群信息区域的API server 公网连接端点可获取公网IP。
若当前未绑定EIP,可在创建集群时或创建集群后绑定EIP。具体操作,请参见控制集群API Server的公网访问能力。
本地机器如何通过公网及内网访问ACK集群?
需要通过集群暴露的API Server来连接集群。
公网访问
首先要确认集群是否已经开启了公网访问。
关于创建集群时如何开启公网访问,请参见创建集群时绑定EIP。
关于已有集群如何开启访问,请参见创建集群后绑定公网IP。
连接集群。
可通过以下两种方式连接集群:
方式一:若您需要从客户端计算机连接到Kubernetes集群,请先安装kubectl工具并配置集群凭证。具体操作,请参见获取集群KubeConfig并通过kubectl工具连接集群。
方式二:通过阿里云CloudShell连接到Kubernetes集群。具体操作,请参见在CloudShell上通过kubectl管理Kubernetes集群。
内网访问
在生产环境中不建议公开API Server访问Kubernetes集群,建议您采用内网访问。
kubectl客户端机器必须与集群位于同一VPC,且需要安装kubectl工具并配置集群凭证后才可连接Kubernetes集群。具体操作,请参见获取集群KubeConfig并通过kubectl工具连接集群。
如何为各个角色授予不同的ACK集群权限?
容器服务ACK的授权体系包含RAM授权和RBAC授权两部分:
通过阿里云账号对目标RAM用户进行授权,然后通过RBAC可以将权限与集群角色相关联,从而为不同角色成员配置不同资源(例如,特定集群的特定命名空间)的权限策略。
RAM用户登录集群后,在集群连接信息可获取授权的kubeconfig。更多信息,请参见步骤二:选择集群凭证类型。
RAM用户只能获取到属于自己的kubeconfig文件,且各个RAM用户获取的配置文件是不同的。RAM用户通过kubeconfig对集群的操作会记录对应RAM用户ID到审计日志中。
如何通过公网访问工作负载?
ACK支持五种公网访问方式:
节点访问(NodePort)
DNAT网关(DNAT)
同个集群中的多个工作负载,如何进行互相访问?
集群内多个工作负载间如需相互访问,可以通过集群内部域名或者ClusterIP的方式。
例如,同个集群中的A工作负载需要访问B工作负载,您需要为B工作负载添加ClusterIP(集群内访问)型的服务。具体操作,请参见使用Service对外暴露应用。A工作负载可以通过以下两种方式访问B工作负载:
<自定义的服务名称>.<工作负载所在命名空间>.svc.cluster.local:<端口号>
ClusterIP:<端口号>
使用负载均衡暴露服务时需要注意些什么?
当Service的类型设置为Type=LoadBalancer时,ACK的CCM(Cloud Controller Manager)组件会为该Service自动创建或配置阿里云负载均衡SLB(Server Load Balancer)。如果手动在SLB控制台配置SLB可能会导致Service不可访问。更多信息,请参见Service的负载均衡配置注意事项。