Amazon弹性Kubernetes服务(EKS)的使用方法(1/3)
亚马逊 Elastic Kubernetes Service (EKS) 是什么?
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