本文介绍使用容器服务ACK涉及的服务授权、访问、调度及资源分配等常见问题。
如何部署集群的第一个应用?

- 通过Dockerfile将代码构建为镜像。具体操作,请参见在Dockerfile中使用多阶段构建打包Java应用。
- 若镜像在本地,可以上传到私有镜像仓库ACR中。具体操作,请参见使用私有镜像仓库创建应用。
- 从ACR拉取镜像,部署到ACK集群中。具体操作,请参见创建无状态工作负载Deployment。
集群中的应用A如何访问应用B ?
应用部署后成为容器组(Pod),每个Pod都有自己的IP地址,但是这些Pod并非永久性资源,在应用新版本发布或动态扩容等操作后,ECS实例将重新分配资源,Pod IP地址同时会发生变化。关于应用发布的滚动更新原理,请参见执行滚动更新。
Kubernetes通过服务(Service)这个抽象概念实现Pod之间的相互通信。Service是Kubernetes对应用服务的一层抽象封装,一个Service对应多个具有相同功能的应用(Pod),为外界访问服务提供统一的入口,将请求负载均衡分发到多个Pod上。

场景 | Service实现方式 |
---|---|
集群内部服务互相访问 | 虚拟集群IP(ClusterIP) |
同一VPC内不同集群之间服务互相访问 | 负载均衡(私网SLB) |
服务对外暴露,需外网访问,例如Ingress | 负载均衡(公网SLB) |
关于Service的更多信息,请参见服务或Service视频讲解。
如何将集群内的各节点资源合理的分配给不同容器组?
- requests请求量(最小分配资源数):确保有足够的资源可以使Pod正常运行。如果Pod所在的节点具有足够的可用资源,容器可能使用超出对应资源request属性所设置的资源量。
- limits约束(最大分配资源数):防止某个Pod无限制的使用资源,导致其他Pod崩溃。当容器中进程尝试使用超出所允许内存量的资源时,系统内核会将尝试申请内存的进程终止,并引发内存不足(OOM)的错误提示。约束值以被动方式来实现(系统会在发现违例时干预),或者通过强制生效的方式实现(系统会避免容器用量超出约束值)。不同的容器运行时采用不同方式实现相同的资源限制。如果是Java类型的应用,建议将
JAVA_OPTS -Xmx
参数的值设置为Pod limit值的70%~80%。
您可查看集群中所有ECS节点的CPU与内存具体分配情况。具体操作,请参见查看节点列表。
从CPU(请求/限制/使用量)和内存(请求/限制/使用量)字段可以得出,请求资源使用率≤资源限制使用率。
如何将Pod调度到指定ECS节点?
- 亲和性:约束Pod只能在指定节点上运行,或者优先运行在指定节点上。可通过在YAML中配置nodeSelector参数实现。更多信息,请参见node-affinity。
- 容忍度(Tolerations):应用在Pod上,允许Pod调度到与之匹配的污点节点上。污点和容忍度可以用来避免Pod被分配到不合适的节点上。 每个节点上都可以应用一个或多个污点,这表示对于那些不能容忍这些污点的Pod,不会被调度到该节点上。更多信息,请参见taint-and-toleration。
创建容器组时,在高级配置配置向导页面可进行调度设置。具体操作,请参见调度设置。
管理目标集群的标签与污点。具体操作,请参见通过设置节点标签、配置模板等操作,将Pod调度到指定节点上。具体操作,请参见调度应用Pod至指定节点。
如何获取服务Service的基本信息?
关于如何获取服务的名称、类型、创建时间、集群IP以及外部端点等信息,请参见管理服务。
如何对外暴露容器化服务?
Service可以对外暴露服务,需要配置公网SLB或内网SLB+EIP。更多信息,请参见通过使用自动创建SLB的服务公开应用或通过使用已有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集群轻松获得极大的弹性能力,而不必受限于集群的节点计算容量。具体操作,请参见通过部署ACK虚拟节点组件创建ECI Pod。
- 若只选择ECS服务器作为计算资源,集群的自动伸缩能力是通过节点自动伸缩组件实现的,可以按需扩展普通实例、GPU实例及竞价付费实例,支持多可用区、多实例规格及多种伸缩模式,满足不同的节点伸缩场景。更多信息,请参见节点自动伸缩。
- 容器层
阿里云弹性伸缩提供通用应用弹性模型(例如,HPA容器水平伸缩、CronHPA定时伸缩、VPA纵向伸缩和组件水平调整),也提供领域应用弹性模型(例如,事件驱动伸缩、Knative无服务器弹性框架、ElasticWorkload精细化调度弹性及Spark Presto的弹性CRD)。更多信息,请参见弹性伸缩概述。
如何实现存储扩容?
目前只有云盘可以扩容。具体操作,请参见在线扩容云盘数据卷。
如何访问集群?
- 方式一:通过阿里云容器服务管理控制台连接集群
- 方式二:通过kubectl连接Kubernetes集群
若您需要从客户端计算机连接到Kubernetes集群,请使用Kubernetes命令行客户端kubectl。具体操作,请参见通过kubectl工具连接集群。
- 方式三:在CloudShell上通过kubectl管理Kubernetes集群
相比方式二,无需安装kubectl。具体操作,请参见在CloudShell上通过kubectl管理Kubernetes集群。
- 方式四:通过SSH访问Kubernetes集群
若您在创建集群时,选择不开放公网SSH访问,您将无法SSH访问Kubernetes集群,且无法通过kubectl连接Kubernetes集群。如果创建集群后,您需要SSH访问您的集群,可以手动为ECS实例绑定EIP,并配置安全组规则,开放SSH(22)端口。具体操作,请参见通过SSH连接ACK专有版集群的Master节点。
- 方式五:使用ServiceAccount Token访问Kubernetes集群
具体操作,请参见使用ServiceAccount Token访问Kubernetes集群。
- 方式六:其他方式
例如通过API Server、SSH密钥等方式访问集群。
如何获取集群的公网IP?
- 登录容器服务管理控制台。
- 在控制台左侧导航栏中,单击集群。
- 在集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情。
- 在集群信息页面中,单击基本信息页签,在集群信息区域的API Server公网连接端点可获取公网IP。
若当前未绑定EIP,可在创建集群时或创建集群后绑定EIP。具体操作,请参见控制集群API Server的公网访问能力。
本地机器如何通过公网及内网访问ACK集群?
需要通过集群暴露的API Server来连接集群。
公网访问
- 首先要确认集群是否已经开启了公网访问。
- 关于创建集群时如何开启公网访问,请参见创建集群时绑定EIP。
- 关于已有集群如何开启访问,请参见创建集群后绑定EIP。
- 连接集群。
可通过以下三种方式连接集群:
- 方式一:若您需要从客户端计算机连接到Kubernetes集群,请先安装kubectl工具并配置集群凭证。具体操作,请参见通过kubectl工具连接集群。
- 方式二:通过阿里云CloudShell连接到Kubernetes集群。具体操作,请参见在CloudShell上通过kubectl管理Kubernetes集群。
- 方式三:通过使用ServiceAccount Token连接到Kubernetes集群。具体操作,请参见使用ServiceAccount Token访问Kubernetes集群。
内网访问
在生产环境中不建议公开API Server访问Kubernetes集群,建议您采用内网访问。
kubectl客户端机器必须与集群位于同一VPC,且需要安装kubectl工具并配置集群凭证后才可连接Kubernetes集群。具体操作,请参见通过kubectl工具连接集群。
如何为各个角色授予不同的ACK集群权限?
通过阿里云账号对目标RAM用户进行授权,然后通过RBAC可以将权限与集群角色相关联,从而为不同角色成员配置不同资源(例如,特定集群的特定命名空间)的权限策略。