本文介绍使用容器服务ACK涉及的服务授权、访问、调度及资源分配等常见问题。

如何部署集群的第一个应用?

将业务代码打包成容器镜像,存放到镜像仓库ACR中,再通过ACR拉取到对应容器集群ACK/ASK中。部署应用
  1. 通过Dockerfile将代码构建为镜像。具体操作,请参见在Dockerfile中使用多阶段构建打包Java应用
  2. 若镜像在本地,可以上传到私有镜像仓库ACR中。具体操作,请参见使用私有镜像仓库创建应用
  3. 从ACR拉取镜像,部署到ACK集群中。具体操作,请参见创建无状态工作负载Deployment

集群中的应用A如何访问应用B ?

应用部署后成为容器组(Pod),每个Pod都有自己的IP地址,但是这些Pod并非永久性资源,在应用新版本发布或动态扩容等操作后,ECS实例将重新分配资源,Pod IP地址同时会发生变化。关于应用发布的滚动更新原理,请参见执行滚动更新

Kubernetes通过服务(Service)这个抽象概念实现Pod之间的相互通信。Service是Kubernetes对应用服务的一层抽象封装,一个Service对应多个具有相同功能的应用(Pod),为外界访问服务提供统一的入口,将请求负载均衡分发到多个Pod上。

创建service不同场景下,可使用的Service类型如下表所示:
场景 Service实现方式
集群内部服务互相访问 虚拟集群IP(ClusterIP)
同一VPC内不同集群之间服务互相访问 负载均衡(私网SLB)
服务对外暴露,需外网访问,例如Ingress 负载均衡(公网SLB)

关于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请求/限制/使用量)和内存请求/限制/使用量)字段可以得出,请求资源使用率≤资源限制使用率。

说明 若在容器设置中requestlimit都没有限制资源数(不推荐的做法),节点的统计信息仅包含该节点上所有设置了requestlimit的Pod的总和与节点资源总量之间的比例。

如何将Pod调度到指定ECS节点?

说明 ASK集群不支持将Pod调度到指定ECS节点。
默认情况下,容器服务ACK集群中会尽量将Pod部署到不同的ECS节点上,实现负载均衡。如果想强行将某个Pod调度到某个节点,可以通过配置亲和性、污点/容忍度实现。
  • 亲和性:约束Pod只能在指定节点上运行,或者优先运行在指定节点上。可通过在YAML中配置nodeSelector参数实现。更多信息,请参见node-affinity
  • 容忍度(Tolerations):应用在Pod上,允许Pod调度到与之匹配的污点节点上。污点和容忍度可以用来避免Pod被分配到不合适的节点上。 每个节点上都可以应用一个或多个污点,这表示对于那些不能容忍这些污点的Pod,不会被调度到该节点上。更多信息,请参见taint-and-toleration

创建容器组时,在高级配置配置向导页面可进行调度设置。具体操作,请参见调度设置

在容器服务管理控制台节点管理 > 节点管理目标集群的标签与污点。具体操作,请参见管理节点标签管理污点

通过设置节点标签、配置模板等操作,将Pod调度到指定节点上。具体操作,请参见调度应用Pod至指定节点

如何获取服务Service的基本信息?

关于如何获取服务的名称、类型、创建时间、集群IP以及外部端点等信息,请参见管理服务

如何对外暴露容器化服务?

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集群轻松获得极大的弹性能力,而不必受限于集群的节点计算容量。具体操作,请参见通过部署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是整个ACK集群的数据总线和数据中心。集群的公网IP就是API Server的公网IP。您可以使用弹性公网IP EIP(Elastic IP Address)暴露Kubernetes集群的API Server。使用EIP暴露集群API Server后,集群API Server将具有公网访问能力。可通过以下步骤查看集群的公网IP:
  1. 登录容器服务管理控制台
  2. 在控制台左侧导航栏中,单击集群
  3. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
  4. 集群信息页面中,单击基本信息页签,在集群信息区域的API Server公网连接端点可获取公网IP。公网IP

若当前未绑定EIP,可在创建集群时或创建集群后绑定EIP。具体操作,请参见控制集群API Server的公网访问能力

本地机器如何通过公网及内网访问ACK集群?

需要通过集群暴露的API Server来连接集群。

公网访问

  1. 首先要确认集群是否已经开启了公网访问。
  2. 连接集群。
    可通过以下三种方式连接集群:

内网访问

在生产环境中不建议公开API Server访问Kubernetes集群,建议您采用内网访问。

kubectl客户端机器必须与集群位于同一VPC,且需要安装kubectl工具并配置集群凭证后才可连接Kubernetes集群。具体操作,请参见通过kubectl工具连接集群

如何为各个角色授予不同的ACK集群权限?

容器服务ACK的授权体系包含RAM授权和RBAC授权两部分:
  • 运维人员通过RAM用户管理云服务资源,当您需要对集群进行可见性、扩缩容、添加节点等操作时,需要进行RAM授权。更多信息,请参见RAM授权
  • 当RAM用户需要操作指定集群内资源时(例如,指定集群和命名空间),需要在容器服务管理控制台的授权管理页面对指定RAM用户授权数据资源。更多信息,请参见RBAC授权

通过阿里云账号对目标RAM用户进行授权,然后通过RBAC可以将权限与集群角色相关联,从而为不同角色成员配置不同资源(例如,特定集群的特定命名空间)的权限策略。

RAM用户登录集群后,在集群连接信息可获取授权的kubeconfig。更多信息,请参见步骤二:选择集群凭证类型
说明 RAM用户只能获取到属于自己的kubeconfig文件,且各个RAM用户获取的配置文件是不同的。RAM用户通过kubeconfig对集群的操作会记录对应RAM用户ID到审计日志中。