Amazon弹性Kubernetes服务(EKS)的使用方法(1/3)

亚马逊 Elastic Kubernetes Service (EKS) 是什么?

image.png

Kubernetes(K8s)是一個容器管理平台。
容器是一種輕量級的虛擬化技術,用於高效且靈活地運行應用程序和服務。Kubernetes提供了有效管理這些容器的機制。

Kubernetes 提供了一系列的 API 用于管理运行多个容器的集群,提供了自动部署、扩展、负载均衡、网络路由等功能,使得应用程序可以实现高可用性和可扩展性,同时也可以提高运维效率。

在AWS中,我们以托管方式提供这些服务。

以下是该文本的中文翻译:
本次内容
优点
资源分类(工作负载、服务、配置、存储)
构建流程
1. 创建Amazon EKS服务角色
2. 创建EKS集群VPC
3. 创建EKS集群
4. 部署工作节点
kubectl get nodes

优点

1. 操作的简化
EKS完全托管Kubernetes,简化了集群的设置和管理,从而最小化了集群操作所需的时间和资源。

2. 可扩展性
EKS提供自动扩展/缩减Kubernetes集群的功能,从而确保应用程序的可用性即使在负载增加的情况下也能保持。

3. 高可用性
EKS可以在多个可用区部署Kubernetes集群以实现高可用性。即使一个可用区发生故障,应用程序仍可以在其他可用区运行,提高应用程序的可用性。

4. 安全性
EKS由AWS管理Kubernetes集群控制平面,因此可以共享安全责任。此外,EKS提供与IAM和VPC等AWS服务的集成,以增强应用程序的安全性。

5. 与AWS服务的集成
EKS支持与AWS的其他服务无缝集成。例如,可以使用AWS服务如Amazon EBS或Amazon S3来启动在Amazon EC2实例上运行的Kubernetes工作节点。

通过使用VPCE(VPC Endpoint),Amazon EKS集群内的Pod可以通过VPC Endpoint安全地访问其他AWS服务。当Pod访问AWS服务时,无需通过VPC的NAT网关或IGW(Internet Gateway),可以实现更安全、更快速的连接。

使用VPCE连接到AWS的RDS的示例。

创建用于RDS的VPCE。

aws ec2 create-vpc-endpoint --vpc-id <VPC_ID> --service-name com.amazonaws.<REGION>.rds --vpc-endpoint-type Interface --subnet-ids <SUBNET_ID> --security-group-ids <SECURITY_GROUP_ID>

使用VPC端点连接到RDS的Pod清单示例(MySQL)
此示例中,我们指定使用awsvpc网络模式。同时,在env部分中定义了连接到MySQL所需的连接信息。此外,在metadata部分的annotations中,我们指定了RDS VPC端点的ARN。这样,Pod就能自动识别所需的VPC端点,以连接到RDS。

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: nginx
    ports:
    - containerPort: 80
  securityContext:
    allowPrivilegeEscalation: false
    capabilities:
      drop:
      - ALL
  # awsvpcネットワークモードを指定し、VPCエンドポイントを利用する
  networkMode: "awsvpc"
  # RDSに接続するための環境変数を定義する
  env:
  - name: MYSQL_HOST
    value: <RDSのエンドポイント>
  - name: MYSQL_USER
    value: <ユーザー名>
  - name: MYSQL_PASSWORD
    valueFrom:
      secretKeyRef:
        name: <シークレット名>
        key: <パスワードのキー>
  dnsPolicy: "ClusterFirst"
  dnsConfig:
    options:
    - name: "ndots"
      value: "2"
  # VPCエンドポイントの参照
  metadata:
    annotations:
      # RDSのVPCエンドポイントARN
      "aws/vpc-endpoint-id": "vpce-0123456789abcdef0"

部署Pod。

kubectl apply -f <MANIFEST_FILE>

通过这个,Pod可以通过VPCE访问RDS。

在EKS(Elastic Kubernetes Service)中,可以自动缩放Pod。
实现Pod的自动缩放需要使用Kubernetes的Horizontal Pod Autoscaler(HPA)。HPA是Kubernetes资源之一,它可以监控CPU使用率、API对象的指标等,并在需要扩展时对Replication Controller或Deployment等Pod数量进行扩展。无法像DaemonSet这样无法进行缩放的物体不能成为HPA的目标。

除了水平Pod自动缩放器(HPA)外,还可以使用Kubernetes的垂直Pod自动缩放器(VPA)和自定义指标API。垂直Pod自动缩放器通过自动调整Pod的资源需求(CPU,内存)来优化Pod的性能。VPA会收集Pod的资源使用统计信息,并根据这些信息自动调整Pod的资源需求。

Custom Metrics API允许用户使用自定义定义的度量标准来自动调整Pod的规模。用户可以从支持的度量存储解决方案(如Prometheus或CloudWatch Metrics)收集自定义度量标准,并使用Custom Metrics API根据这些度量标准来调整Pod的规模。

资源分类(工作负载、服务、配置、存储)

◆工作负载
Kubernetes的工作负载是指用于运行应用程序的对象,包括Pod、ReplicaSet、Deployment、StatefulSet、DaemonSet等。这些对象定义了执行容器所需的资源。

◆服务
Kubernetes的服务是一种对象,为一系列Pod提供唯一的DNS名称和IP地址,通常可以允许从外部访问。服务可以在Pod动态创建和删除的环境中提供一致的访问目标。服务类型包括ClusterIP、NodePort、LoadBalancer和ExternalName。

◆设置
Kubernetes的设置是存储应用程序配置信息的对象,包括ConfigMap和Secret。ConfigMap是以键值对形式存储应用程序配置信息的对象,而Secret是存储加密机密信息的对象。

◆存储
Kubernetes的存储是用于容器持久化的对象。存储提供了持久化空间来存储数据。存储由两个对象组成,即持久卷(Persistent Volume,PV)和持久卷声明(Persistent Volume Claim,PVC)。通过使用StorageClass对象,可以简化动态创建持久卷的过程。

在Kubernetes中,有「集群网络」和「外部网络」两种类型。由于Kubernetes内部会构建一个与外部网络不同的网络,因此无法直接访问位于「集群网络」中的Pod。

在Kubernetes集群内部,根据每个节点被分配的IP地址,构建了集群网络。该网络用于节点上运行的Pod之间的通信。与此同时,外部网络指的是位于Kubernetes集群外部的网络,通常是指互联网。

集群网络被优化用于在集群中的Pod之间的通信,但对外部访问受限。这是因为集群网络使用的是仅分配给集群内节点和Pod的私有IP地址。要允许外部访问,需要使用Kubernetes的服务将Pod暴露在集群网络上。

建構的流程

这个步骤可以大致分为4个阶段。

1. 创建 Amazon EKS 服务角色
2. 创建 EKS 集群 VPC
3. 创建 EKS 集群
4. 部署工作节点

1. 创建 Amazon EKS 服务角色

创建用于EKS集群访问其他AWS资源的角色。

登录AWS管理控制台,转到IAM仪表板。
从左侧菜单栏中选择“角色”。
点击“创建角色”按钮。
选择“AWS服务”,然后选择“EKS”。
点击“下一步”。
在“权限”页面上,添加以下两个托管策略:
AmazonEKSServicePolicy
AmazonEKSClusterPolicy
点击“下一步”。
跳过“标签”页面,输入“角色名称”。
点击“创建角色”。
现在,EKS服务角色已创建。
此角色具有EKS集群访问其他AWS资源所需的权限。在创建EKS集群时,您可以使用此角色为集群授予权限。

创建一个EKS集群VPC。

创建EKS集群的VPC

1)登录AWS管理控制台,进入Amazon VPC仪表板。
从左侧菜单中选择“VPC”,点击“启动VPC向导”。
输入VPC的名称和CIDR块。CIDR块应包含EKS集群中要使用的Pod IP地址范围。

2) 用户可以选择创建公共子网和私有子网,或者使用现有的子网。您需要指定要在EKS集群中使用的子网。

如果EKS集群需要接入互联网,您可以选择创建一个互联网网关。

在EKS集群中,您需要选择创建路由表还是使用现有的路由表。您需要指定要在EKS集群中使用的路由表。

选择创建安全组或使用现有安全组。
您需要指定在EKS集群中使用的安全组。

创建 VPC 并完成向导。

通过创建VPC,您可以为EKS集群提供基础设施。通过正确配置VPC的子网、路由表和安全组等资源,您可以构建EKS集群所需的基础设施。

创建 EKS 集群

创建一个Amazon Elastic Kubernetes Service(EKS)集群。

登录AWS管理控制台,转到EKS仪表板。
点击”创建集群”。
在”集群配置”中,指定集群名称、区域和版本。
此外,选择要使用的VPC和子网,以及用于访问控制的IAM角色。
在”节点组配置”中,指定节点组名称、实例类型、AMI类型和要包含在节点组中的实例数量。
在”节点组详细信息”中,指定要在节点组中使用的安全组、角色和密钥对。
在”确认集群配置”中,确认要创建的集群和节点组的配置。
点击”创建”,创建集群。

创建EKS集群所需的时间取决于集群的规模、配置和区域等因素,但通常需要几分钟到约10分钟不等。

创建集群后,您可以使用kubectl等Kubernetes工具访问集群。另外,您还可以通过AWS管理控制台的EKS仪表板来查看集群的状态、日志和节点组的详细信息。

Amazon EKS提供了节点组的自动缩放、补丁管理、安全补丁应用、日志收集等功能。

4. 部署工作节点

在EKS EC2集群中部署工作节点。

创建所需的IAM角色。
工作节点需要三个IAM角色,分别是AmazonEKSWorkerNodePolicy、AmazonEC2ContainerRegistryReadOnly和AmazonEKS_CNI_Policy。
这些角色将提供EKS工作节点所需的AWS服务访问权限。

2)选择在工作节点上使用的亚马逊机器镜像(AMI)。
需要选择用于EKS节点的AMI。AWS提供了专用于EKS的优化AMI。

创建工作节点组。

◆创建安全组
创建一个用于工作节点组的安全组。安全组用于控制入站和出站流量。
例如,您可以使用以下AWS CLI命令创建安全组。

aws ec2 create-security-group --group-name my-security-group --description "My security group" --vpc-id <vpc-id> 

◆创建启动模板
在工作节点组中创建要使用的启动模板。启动模板用于定义EC2实例的设置,您可以指定AMI、实例类型、用户数据等参数。
下面的示例是使用AWS CLI创建启动模板的命令。

aws ec2 create-launch-template --launch-template-name my-launch-template --version-description "My version" --instance-type t3.small --image-id ami-0xxxxxx 

◆创建自动扩缩容组
最后,创建自动扩缩容组以管理工作节点组。自动扩缩容组将使用指定的启动模板来启动和管理EC2实例。
以下示例显示了使用AWS CLI创建自动扩缩容组的命令。

aws autoscaling create-auto-scaling-group --auto-scaling-group-name my-asg --launch-template "LaunchTemplateName=my-launch-template,Version=1" --min-size 2 --max-size 10 --desired-capacity 2 --vpc-zone-identifier <subnet-ids> --tags "Key=Name,Value=my-node-group,PropagateAtLaunch=true" 

创建的工作节点组将自动注册到 EKS 集群中。

4). 更新kubelet的设置
创建kubelet-config-1.18.yaml文件。该文件用于定制kubelet的设置。

cat <<EOF > kubelet-config-1.18.yaml kind: KubeletConfiguration apiVersion: kubelet.config.k8s.io/v1beta1 cgroupDriver: systemd EOF 

创建kubelet的ConfigMap。

kubectl create configmap kubelet-config-1.18 --from-file=kubelet-config-1.18.yaml 

使用AWS CLI工具将节点组与EKS集群关联。

aws eks update-kubeconfig --name <cluster_name> 

创建Node组的kubeconfig。

aws eks describe-cluster --name <cluster_name> --query "cluster.status.endpoint" --output text aws eks describe-cluster --name <cluster_name> --query "cluster.certificateAuthority.data" --output text | base64 -d > ca.crt aws eks update-kubeconfig --name <cluster_name> --kubeconfig aws-auth.yaml 

使用以下命令编辑aws-auth ConfigMap以进行更新。

kubectl edit configmap aws-auth -n kube-system 

在编辑的aws-auth ConfigMap中,添加节点组的ARN。

apiVersion: v1 data: mapRoles: | - rolearn: <worker_node_role_arn> username: system:node:{{EC2PrivateDNSName}} groups: - system:bootstrappers - system:nodes 

6). 使用以下命令确认工作节点是否成功注册到EKS集群中。

kubectl get nodes

将显示已注册在集群中的节点列表。您可以确认每个节点的状态(Ready 等)以及资源使用情况等。
以下是执行命令时的输出示例。

$ kubectl get nodes

NAME        STATUS   ROLES    AGE     VERSION
node-1      Ready    <none>   1d      v1.21.3
node-2      Ready    <none>   1d      v1.21.3
node-3      Ready    <none>   1d      v1.21.3

在这个例子中,我们可以看到一个集群中有三个节点:node-1、node-2、node-3,并且它们都处于 Ready 状态。
此外,我们还可以确认这些节点中没有分配任何特定的角色,并可以查看节点的运行时间(AGE)等信息。

亚马逊弹性Kubernetes服务(Amazon EKS)的使用方法(1/3)
https://qiita.com/kimuni-i/items/656ca4d314a8982e70cb

亚马逊弹性Kubernetes服务 (EKS) 的使用方法(2/3)
https://qiita.com/kimuni-i/items/06c70de226cf074d8b23

在中国使用亚马逊弹性容器服务(EKS)的方法(3/3)
https://qiita.com/kimuni-i/items/b2b3d07c2c76c95884a1

广告
将在 10 秒后关闭
bannerAds