快速创建一个具有弹性的容器集群(ACK+ECI)

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 通过本文的实操,我们可以得到一个生产可用的ACK容器集群,同时本环节是后续相关实操的基础,请大家尽量提前做好服务开通及授权等相关操作,本文主要用来指导用户快速创建一个ACK集群

阿里云容器服务Kubernetes版(Alibaba Cloud Container Service for Kubernetes,简称容器服务ACK)是全球首批通过Kubernetes一致性认证的服务平台,提供高性能的容器应用管理服务,支持企业级Kubernetes容器化应用的生命周期管理,让您轻松高效地在云端运行Kubernetes容器化应用。ACK包含了专有版Kubernetes(Dedicated Kubernetes)、托管版Kubernetes(Managed Kubernetes)、Serverless Kubernetes三种形态,本文我们将完成一个ACK托管集群的创建,同时,我们将把serverless kubernetes的能力以插件的方式装到这个ACK集群中,实现一个由ACK+ECI共同打造的弹性容器集群。


前提条件

  • 首次使用时,您需要开通容器服务ACK,并为其授权相应云资源的访问权限。
  1. 登录容器服务ACK开通页面
  2. 阅读并选中容器服务ACK服务协议
  3. 单击立即开通
  4. 登录容器服务管理控制台
  5. 容器服务需要创建默认角色页面,单击前往RAM进行授权进入云资源访问授权页面,然后单击同意授权完成以上授权后,刷新控制台即可使用容器服务ACK。
  • 请提前在一个阿里云一个region创建好VPC,同时选择1个可用区,并在其中创建2个vswitch,一个给node使用,一个给pod使用。


创建ACK集群

创建一个ACK集群可以由ACK控制台,OpenAPI, Terraform 等多种方式来完成,这里我们将提供一个控制台创建集群的配置方法,同时也会提供一个terraform脚本让大家体验下阿里云上的基础架构即代码的能力。

方式一(控制台UI创建):

  1. 创建集群时涉及到的配置项及其解释,可参考:https://help.aliyun.com/document_detail/95108.html
  2. 集群配置
  • 集群名称:bj-workshop
  • 集群规格:Pro版
  • 地域:北京
  • 付费类型:按量付费
  • kubernetes版本:1.20.11
  • 容器运行时:docker

image.png

  • 选择专有网络
  • 网络插件: Terway
  • 虚拟交换机:node vswitch
  • pod虚拟交换机: pod vswitch
  • service cidr:192.168.0.0/16

image.png

  • 配置SNAT
  • APIServer:内网+slb.s1.small
  • 安全组:自动创建企业安全组

image.png

3. 节点池配置

  • 实例规格:ecs.g6e.xlarge
  • 数量:2
  • 系统盘:essd,40G
  • 数据盘:essd, 120G

image.png

操作系统:Alibaba Cloud Linux

密码:Just4Test

image.png


  1. 组件配置
  • ingress:nginx Ingress+私网+slb规格slb.s1.small
  • 存储:取消 “创建默认NAS文件系统和CNFS容器网络文件系统动态存储类型”

image.png

image.png

5. 确认配置,如果有依赖检查未通过,请先行检查原因并通过依赖检查,勾选服务协议,开始创建

image.png

零比完绿煎在补业心,一日期两,可作

超务何设

ECA沙RLRKA

组.高全毛沈汽物正入热6c

桂饼

您阳庆个国实版品

::8wxemmmzmboommmm

香号药药结面南部司*心械****米

新州协:9证源ON

6. 托管集群创建大概需要15分钟


方式二(terraform创建):

采用terraform进行ACK集群的创建,本示例中,我们直接由terraform创建vpc,vswitch,ack等全部依赖的云资源

  1. 安装terraform,参考:https://learn.hashicorp.com/tutorials/terraform/install-cli
  2. 将下列文件拷贝到工作目录中:

main.tf

## specify the cloud provider aliyun/alicloud version
terraform {
  required_providers {
    alicloud = {
      source  = "aliyun/alicloud"
      version = "1.141.0"
    }
  }
}
# If there is not specifying vpc_id, the module will launch a new vpc
resource "alicloud_vpc" "vpc" {
  count      = var.vpc_id == "" ? 1 : 0
  cidr_block = var.vpc_cidr
}
# According to the vswitch cidr blocks to launch several vswitches
resource "alicloud_vswitch" "vswitches" {
  count             = length(var.vswitch_ids) > 0 ? 0 : length(var.vswitch_cidrs)
  vpc_id            = var.vpc_id == "" ? join("", alicloud_vpc.vpc.*.id) : var.vpc_id
  cidr_block        = element(var.vswitch_cidrs, count.index)
  zone_id = element(var.zone_id, count.index)
}
# According to the vswitch cidr blocks to launch several vswitches
resource "alicloud_vswitch" "terway_vswitches" {
  count             = length(var.terway_vswitch_ids) > 0 ? 0 : length(var.terway_vswitch_cirds)
  vpc_id            = var.vpc_id == "" ? join("", alicloud_vpc.vpc.*.id) : var.vpc_id
  cidr_block        = element(var.terway_vswitch_cirds, count.index)
  zone_id = element(var.zone_id, count.index)
}
resource "alicloud_cs_managed_kubernetes" "k8s" {
  kube_config           = var.kube_config
  count                 = var.k8s_number
  # version can not be defined in variables.tf. Options: 1.18.8-aliyun.1|1.20.11-aliyun.1
  version               = "1.20.11-aliyun.1"
  # name_prefix           = "terraform_"
  name                  = "bj-workshop"
  is_enterprise_security_group = true
  cluster_spec = "ack.pro.small"
  worker_vswitch_ids    = length(var.vswitch_ids) > 0 ? split(",", join(",", var.vswitch_ids)): length(var.vswitch_cidrs) < 1 ? [] : split(",", join(",", alicloud_vswitch.vswitches.*.id))
  pod_vswitch_ids       = length(var.terway_vswitch_ids) > 0 ? split(",", join(",", var.terway_vswitch_ids)): length(var.terway_vswitch_cirds) < 1 ? [] : split(",", join(",", alicloud_vswitch.terway_vswitches.*.id))
  worker_instance_types = var.worker_instance_types
  worker_disk_category  = "cloud_essd"
  worker_disk_size      = 40
  worker_data_disks {
    category                     = "cloud_essd"
    size                         = "100" 
    encrypted                    = false
    performance_level            = "PL0" 
  }
  worker_number         = var.worker_number
  node_cidr_mask        = var.node_cidr_mask
  enable_ssh            = var.enable_ssh
  install_cloud_monitor = var.install_cloud_monitor
  cpu_policy            = var.cpu_policy
  proxy_mode            = var.proxy_mode
  password              = var.password
  service_cidr          = var.service_cidr
  dynamic "addons" {
      for_each = var.cluster_addons
      content {
        name                    = lookup(addons.value, "name", var.cluster_addons)
        config                  = lookup(addons.value, "config", var.cluster_addons)
      }
  }
#  runtime = {
#    name    = "docker"
#    version = "19.03.5"
#  }
}


variables.tf

# 引入阿里云 Terraform Provider
provider "alicloud" {
  # 填入想创建的 Region
  region     = "cn-beijing"
}
variable "k8s_number" {
  description = "The number of kubernetes cluster."
  default     =  1
}
variable "zone_id" {
    description = "The availability zones of vswitches."
    default = ["cn-beijing-h","cn-beijing-i","cn-beijing-j"]
}
# leave it to empty would create a new one
variable "vpc_id" {
  description = "Existing vpc id used to create several vswitches and other resources."
  default     = ""
}
variable "vpc_cidr" {
  description = "The cidr block used to launch a new vpc when 'vpc_id' is not specified."
  default     = "10.0.0.0/8"
}
# leave it to empty then terraform will create several vswitches
variable "vswitch_ids" {
  description = "List of existing vswitch id."
  type        = list(string)
  default     = []
}
variable "vswitch_cidrs" {
  description = "List of cidr blocks used to create several new vswitches when 'vswitch_ids' is not specified."
  type        = list(string)
  default     = ["10.1.0.0/16","10.2.0.0/16","10.3.0.0/16"]
}
variable "new_nat_gateway" {
  description = "Whether to create a new nat gateway. In this template, a new nat gateway will create a nat gateway, eip and server snat entries."
  default     = "true"
}
# 3 masters is default settings,so choose three appropriate instance types in the availability zones above.
# variable "master_instance_types" {
#   description = "The ecs instance types used to launch master nodes."
#   default     = ["ecs.n4.xlarge","ecs.n4.xlarge","ecs.sn1ne.xlarge"]
# }
variable "worker_instance_types" {
  description = "The ecs instance types used to launch worker nodes."
  default     = ["ecs.g6e.xlarge"]
  #default     = ["ecs.g5ne.2xlarge","ecs.sn1ne.xlarge","ecs.n4.xlarge"]
}
# options: between 24-28
variable "node_cidr_mask" {
    description = "The node cidr block to specific how many pods can run on single node."
    default = 24
}
variable "enable_ssh" {
    description = "Enable login to the node through SSH."
    default = true
}
variable "install_cloud_monitor" {
    description = "Install cloud monitor agent on ECS."
    default = true
}
# options: none|static
variable "cpu_policy" {
    description = "kubelet cpu policy.default: none."
    default = "none"
}
# options: ipvs|iptables
variable "proxy_mode" {
    description = "Proxy mode is option of kube-proxy."
    default = "ipvs"
}
variable "password" {
  description = "The password of ECS instance."
  default     = "Just4Test"
}
variable "worker_number" {
  description = "The number of worker nodes in kubernetes cluster."
  default     = 2
}
variable "service_cidr" {
  description = "The kubernetes service cidr block. It cannot be equals to vpc's or vswitch's or pod's and cannot be in them."
  default     = "172.21.0.0/20"
}
variable "terway_vswitch_ids" {
  description = "List of existing vswitch ids for terway."
  type        = list(string)
  default     = []
}
variable "terway_vswitch_cirds" {
  description = "List of cidr blocks used to create several new vswitches when 'terway_vswitch_ids' is not specified."
  type        = list(string)
  default     = ["10.4.0.0/16","10.5.0.0/16","10.6.0.0/16"]
}
variable "cluster_addons" {
    type = list(object({
        name      = string
        config    = string
    }))
    default = [
        {
            "name"     = "terway-eniip",  # terway 默认模式
            #"name"     = "terway-eni", # terway eni独享模式
            "config"   = "",
        },
        {
            "name"     = "csi-plugin",
            "config"   = "",
        },
        {
            "name"     = "csi-provisioner",
            "config"   = "",
        },
        {
            "name"     = "alicloud-disk-controller",
            "config"   = "",
        },
        {
            "name"     = "logtail-ds",
            "config"   = "{\"IngressDashboardEnabled\":\"true\"}",
        },
        {
            "name"     = "nginx-ingress-controller",
            "config"   = "{\"IngressSlbNetworkType\":\"internet\"}",
        },
        {
            "name"     = "arms-prometheus",
            "config"   = "",
        },
        {
            "name"     = "ack-node-problem-detector",
            "config"   = "",
        },
        {
            "name"     = "ack-kubernetes-cronhpa-controller", 
            "config"   = "",
        },
        {
            "name"     = "ack-node-local-dns", 
            "config"   = "",
        }
    ]
}
variable "kube_config" {
    description = "kubeconfig path since 1.105.0"
    default = "~/.kube/config-terraform"
}


  1. 配置阿里云cloud provider,并初始化项目
exportALICLOUD_ACCESS_KEY="xxxxxx"exportALICLOUD_SECRET_KEY="xxxxxx"exportALICLOUD_REGION="cn-hangzhou"#init phase    terraform init
#Planning phase    terraform plan
#Apply phase    terraform apply


  1. 删除创建云资源
#Destroyterraform destroy


创建ECI虚拟节点

前提条件:

  1. ACK集群创建成功
  2. 需要开通弹性容器实例服务。登录弹性容器实例控制台开通相应的服务。
  3. 需要确认集群所在区域在ECI支持的地域列表内。登录弹性容器实例控制台查看已经支持的地域和可用区。


安装步骤:

  1. 登录ACK控制台,点击集群名称进入该集群
  2. 在“运维管理”中,进入"组件管理"

image.png

集群信息

节点管理

命名空间与配额

工作负载

无状态

有状态

守护进程集

任务

定时任务

容器组

自定义资源

网络

配置管理

存储

应用

运维管理

事件中心

Prometheus监控

成本分析

报警配置

日志中心

集群拓扑

组件管理

集群检查C

集群升级

运行时升级

应用备份(公测)

安全管理

  1. 找到"ack-virtual-node"组件,点击"安装"

image.png

ack-virtual-node

[可选组件]使用虚拟节点和ECI极致弹性能

组件介绍它

安装

  1. 安装成功后,在集群“节点管理”中的节点列表中,可以看到多出现一个virtual-kubelet这样一个虚拟节点

image.png

Worker

virtual-kubelet-cn-hangzhou-h

运行中

10.1.126.221

virtual-kubelet-cn-hangzhou-h

可调度

给ingress Controller的私网SLB绑定一个公网eip

因为实验条件所限,前面我们没有直接给nginx ingress controller自动创建一个公网slb作为入口,但为了后续实验可以顺利进行,我们需要到slb的控制台上手动给nginx ingress controller的私网slb绑定一个eip,(如体验用户账户中有超过100元余额,可直接购买公网slb用于实验)

  1. 给ingress controller对应的slb关闭修改保护

image.png

  1. 在slb控制台上给该slb实例绑定eip


部署一个简单的应用(可选)

该示例中,将采用yaml部署一个deploy,并通过一个loadbalancer类型的service对外暴露服务,另外,该示例中,我们通过ECI profile将集群中不可调度的节点调度至ECI虚拟节点上

cat << EOF | kubectl apply -f-apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx
spec:
  replicas: 2  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
      annotations:
        alibabacloud.com/burst-resource: eci #选择弹性调度的资源类型,当前集群ECS资源不足时,使用ECI弹性资源。    spec:
      containers:
- image: 'registry-vpc.cn-beijing.aliyuncs.com/haoshuwei/nginx:latest'          imagePullPolicy: Always
          name: nginx
          resources:
            limits:
              cpu: '4'              memory: 8Gi
            requests:
              cpu: '4'              memory: 8Gi
---apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
  namespace: default
spec:
  ports:
- name: '80'      port: 80      protocol: TCP
      targetPort: 80  selector:
    app: nginx
  sessionAffinity: None
  type: ClusterIP
---apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/service-weight: ''  name: nginx-ingress
  namespace: default
spec:
  rules:
- host: alibj.workshop.com
      http:
        paths:
- backend:
              serviceName: nginx-svc
              servicePort: 80            path: /
            pathType: ImplementationSpecific
EOF


验证:

  1. 使用kubectl命令来查看当前pod的调度情况,可以看到由于集群中资源不足以调度请求规格的pod,自动创建出了ECI的pod,可以看到pod位于虚拟节点上
kubectl get po -o wide
NAME                    READY   STATUS    RESTARTS   AGE   IP             NODE                            NOMINATED NODE   READINESS GATES
nginx-7797c877f-cfxjh   1/1     Running   0          74s   10.1.126.225   virtual-kubelet-cn-hangzhou-h   <none>           <none>
nginx-7797c877f-rjk4v   1/1     Running   0          74s   10.1.126.224   virtual-kubelet-cn-hangzhou-h   <none>           <none>

2. 登录到一台ECS worker节点上,用curl命令看下是否可以访问刚刚部署的nginx服务

curl-H"Host: alibj.workshop.com" http://ingress-controller-eip/ 


清理:

使用kubectl来删除上面的示例

kubectl delete deploy nginx
kubectl delete service nginx-svc
kubectl delete ingress nginx-ingress

小结:

至此,我们快速的完成了一个ACK集群的创建,同时为该集群添加了一个具有海量弹性扩展能力的ECI虚拟节点。

相关实践学习
巧用云服务器ECS制作节日贺卡
本场景带您体验如何在一台CentOS 7操作系统的ECS实例上,通过搭建web服务器,上传源码到web容器,制作节日贺卡网页。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
12天前
|
人工智能 弹性计算 运维
ACK Edge与IDC:高效容器网络通信新突破
本文介绍如何基于ACK Edge以及高效的容器网络插件管理IDC进行容器化。
|
14天前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
151 77
|
1天前
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
16 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
13天前
|
人工智能 运维 监控
阿里云ACK容器服务生产级可观测体系建设实践
本文整理自2024云栖大会冯诗淳(花名:行疾)的演讲,介绍了阿里云容器服务团队在生产级可观测体系建设方面的实践。冯诗淳详细阐述了容器化架构带来的挑战及解决方案,强调了可观测性对于构建稳健运维体系的重要性。文中提到,阿里云作为亚洲唯一蝉联全球领导者的容器管理平台,其可观测能力在多项关键评测中表现优异,支持AI、容器网络、存储等多个场景的高级容器可观测能力。此外,还介绍了阿里云容器服务在多云管理、成本优化等方面的最新进展,以及即将推出的ACK AI助手2.0,旨在通过智能引擎和专家诊断经验,简化异常数据查找,缩短故障响应时间。
阿里云ACK容器服务生产级可观测体系建设实践
|
1天前
|
Kubernetes 网络协议 应用服务中间件
Kubernetes Ingress:灵活的集群外部网络访问的利器
《Kubernetes Ingress:集群外部访问的利器-打造灵活的集群网络》介绍了如何通过Ingress实现Kubernetes集群的外部访问。前提条件是已拥有Kubernetes集群并安装了kubectl工具。文章详细讲解了Ingress的基本组成(Ingress Controller和资源对象),选择合适的版本,以及具体的安装步骤,如下载配置文件、部署Nginx Ingress Controller等。此外,还提供了常见问题的解决方案,例如镜像下载失败的应对措施。最后,通过部署示例应用展示了Ingress的实际使用方法。
14 2
|
13天前
|
运维 Kubernetes 调度
阿里云容器服务 ACK One 分布式云容器企业落地实践
阿里云容器服务ACK提供强大的产品能力,支持弹性、调度、可观测、成本治理和安全合规。针对拥有IDC或三方资源的企业,ACK One分布式云容器平台能够有效解决资源管理、多云多集群管理及边缘计算等挑战,实现云上云下统一管理,提升业务效率与稳定性。
|
13天前
|
存储 Kubernetes 关系型数据库
阿里云ACK备份中心,K8s集群业务应用数据的一站式灾备方案
本文源自2024云栖大会苏雅诗的演讲,探讨了K8s集群业务为何需要灾备及其重要性。文中强调了集群与业务高可用配置对稳定性的重要性,并指出人为误操作等风险,建议实施周期性和特定情况下的灾备措施。针对容器化业务,提出了灾备的新特性与需求,包括工作负载为核心、云资源信息的备份,以及有状态应用的数据保护。介绍了ACK推出的备份中心解决方案,支持命名空间、标签、资源类型等维度的备份,并具备存储卷数据保护功能,能够满足GitOps流程企业的特定需求。此外,还详细描述了备份中心的使用流程、控制台展示、灾备难点及解决方案等内容,展示了备份中心如何有效应对K8s集群资源和存储卷数据的灾备挑战。
|
25天前
|
运维 Kubernetes Docker
深入理解容器化技术:Docker与Kubernetes的协同工作
深入理解容器化技术:Docker与Kubernetes的协同工作
44 1
|
25天前
|
Kubernetes Cloud Native 持续交付
容器化、Kubernetes与微服务架构的融合
容器化、Kubernetes与微服务架构的融合
44 1
|
存储 弹性计算 资源调度
带你读《弹性计算—无处不在的算力》第三章:计算产品和技术3.7容器服务与弹性容器实例(二)
《弹性计算—无处不在的算力》第三章:计算产品和技术3.7容器服务与弹性容器实例(二)
169 0
带你读《弹性计算—无处不在的算力》第三章:计算产品和技术3.7容器服务与弹性容器实例(二)

相关产品

  • 容器服务Kubernetes版