本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
部署和调试 Amazon EKS 集群
由 Svenja Raether (AWS) 和 Mathew George () 创作 AWS
摘要
容器正在成为云原生应用程序开发中的重要组成部分。Kubernetes 提供了一种有效方法来管理和编排容器。Amazon Elastic Kubernetes Servic EKS e(亚马逊)是一项完全托管、经过认证的 Kubernetes 兼容服务,用于在亚马逊网络服务上构建、保护、运营和维护 Kubernetes 集群()。AWS它支持在 AWS Fargate 上运行 pod,以提供按需、大小合适的计算容量。
对于开发人员和管理员来说,了解运行容器化工作负载时的调试选项非常重要。此模式将引导您使用 AWSFar gate 在亚马逊EKS上部署和调试容器。它包括创建、部署、访问、调试和清理 Amazon EKS 工作负载。
先决条件和限制
先决条件
限制
使用的产品版本
架构
技术堆栈
应用程序负载均衡器
Amazon EKS
AWS Fargate
目标架构
图中显示的所有资源都是通过使用从本地计算机发出的 eksctl
和 kubectl
命令来调配的。私有集群必须从私有集群内部的实例运行VPC。
目标架构由使用 Fargate 启动类型的EKS集群组成。这可以提供按需、大小合适的计算能力,而无需指定服务器类型。集EKS群具有控制平面,用于管理集群节点和工作负载。Pod 被配置到跨多个可用区的私有VPC子网中。引用 Amazon ECR 公共库来检索 NGINX Web 服务器映像并将其部署到集群的 pod 中。
该图显示了如何使用kubectl
命令访问 Amazon EKS 控制平面以及如何使用 Application Load Balancer 访问应用程序。
.
AWS云外的一台本地计算机向亚马逊托管的 Kubernetes 控制平面发送命令。EKS VPC
亚马逊根据 Fargate 个人资料中的选择器来EKS安排吊舱。
本地计算机在浏览器中打开 Application Load Balan URL cer。
应用程序负载均衡器在跨多个可用区的私有子网中部署的 Fargate 集群节点中的 Kubernetes 容器组(pod)之间分配流量。
AWS 服务
其他工具
Helm 是 Kubernetes 的开源软件包管理器。在这种模式中,Helm 用于安装 Loa AWS d Balancer 控制器。
Kubernetes 是一个用于实现容器化应用程序的部署、扩缩和管理自动化的开源系统。
NGINX是一款高性能的 Web 和反向代理服务器。
操作说明
任务 | 描述 | 所需技能 |
---|
创建文件。 | 使用其他信息部分中的代码,创建以下文件: | 应用程序开发者、AWS管理员、AWS DevOps |
设置环境变量。 | 如果命令由于之前的任务未完成而失败,请等待几秒钟,然后再次运行该命令。 此模式使用文件中定义的AWS区域和集群名称clusterconfig-fargate.yaml 。设置与环境变量相同的值以在进一步的命令中引用它们。 export AWS_REGION="us-east-1"
export CLUSTER_NAME="my-fargate"
| 应用程序开发人员AWS DevOps、AWS系统管理员 |
创建 EKS 集群。 | 要创建使用clusterconfig-fargate.yaml 文件中规格的EKS集群,请运行以下命令。 eksctl create cluster -f clusterconfig-fargate.yaml
该文件包含ClusterConfig ,它预置了一个在us-east-1 区域my-fargate-cluster 中名为的新EKS集群和一个默认 Fargate 配置文件 () fp-default 。 默认 Fargate 配置文件配置有两个选择器(default 和 kube-system )。 | 应用程序开发者AWS DevOps、AWS管理员 |
检查已创建集群。 | 使用以下命令查看已创建的集群。 eksctl get cluster --output yaml
输出应为以下内容。 - Name: my-fargate
Owned: "True"
Region: us-east-1
使用 CLUSTER_NAME 检查已创建的 Fargate 配置文件。 eksctl get fargateprofile --cluster $CLUSTER_NAME --output yaml
此命令显示有关资源的信息。您可使用这些信息来验证已创建的集群。输出应为以下内容。 - name: fp-default
podExecutionRoleARN: arn:aws:iam::<YOUR-ACCOUNT-ID>:role/eksctl-my-fargate-cluster-FargatePodExecutionRole-xxx
selectors:
- namespace: default
- namespace: kube-system
status: ACTIVE
subnets:
- subnet-aaa
- subnet-bbb
- subnet-ccc
| 应用程序开发人员AWS DevOps、AWS系统管理员 |
任务 | 描述 | 所需技能 |
---|
部署 NGINX Web 服务器。 | 要在群集上应用 NGINX Web 服务器部署,请运行以下命令。 kubectl apply -f ./nginx-deployment.yaml
输出应为以下内容。 deployment.apps/nginx-deployment created
该部署包括从 Amazon ECR 公共画廊拍摄的NGINX图像的三个副本。映像部署到默认命名空间,并在正在运行的容器组(pod)的端口 80 上公开。 | 应用程序开发人员AWS DevOps、AWS系统管理员 |
检查部署和容器组(pod)。 | (可选)检查部署。可使用以下命令验证部署的状态。 kubectl get deployment
输出应为以下内容。 NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 3 7m14s
容器组(pod)是 Kubernetes 中的可部署对象,包含一个或多个容器。运行以下命令以获取全部容器组(pod)的列表。 kubectl get pods
输出应为以下内容。 NAME READY STATUS RESTARTS AGE
nginx-deployment-xxxx-aaa 1/1 Running 0 94s
nginx-deployment-xxxx-bbb 1/1 Running 0 94s
nginx-deployment-xxxx-ccc 1/1 Running 0 94s
| 应用程序开发者AWS DevOps、AWS管理员 |
扩展部署。 | 要将部署从 deployment.yaml 中指定的三个副本扩展到四个副本,请使用以下命令。 kubectl scale deployment nginx-deployment --replicas 4
输出应为以下内容。 deployment.apps/nginx-deployment scaled
| 应用程序开发人员AWS DevOps、AWS系统管理员 |
任务 | 描述 | 所需技能 |
---|
设置环境变量。 | 描述集群的 CloudFormation 堆栈以检索有关其的信息VPC。 aws cloudformation describe-stacks --stack-name eksctl-$CLUSTER_NAME-cluster --query "Stacks[0].Outputs[?OutputKey==\`VPC\`].OutputValue"
输出应为以下内容。 [
"vpc-<YOUR-VPC-ID>"
]
复制 VPC ID 并将其导出为环境变量。 export VPC_ID="vpc-<YOUR-VPC-ID>"
| 应用程序开发人员AWS DevOps、AWS系统管理员 |
IAM为群集服务帐户进行配置。 | 使用之前长篇故事CLUSTER_NAME 中的AWS_REGION 和为集群创建 Ope IAM n ID Connect 提供程序。 eksctl utils associate-iam-oidc-provider \
--region $AWS_REGION \
--cluster $CLUSTER_NAME \
--approve
| 应用程序开发人员AWS DevOps、AWS系统管理员 |
下载并创建IAM策略。 | 下载 AWS Load Balancer Controller 的IAM策略,该策略允许它AWSAPIs代表你拨打电话。 curl -o iam-policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/install/iam_policy.json
使用在您的AWS账户中创建保单AWSCLI。 aws iam create-policy \
--policy-name AWSLoadBalancerControllerIAMPolicy \
--policy-document file://iam-policy.json
您应当看到如下输出。 {
"Policy": {
"PolicyName": "AWSLoadBalancerControllerIAMPolicy",
"PolicyId": "<YOUR_POLICY_ID>",
"Arn": "arn:aws:iam::<YOUR-ACCOUNT-ID>:policy/AWSLoadBalancerControllerIAMPolicy",
"Path": "/",
"DefaultVersionId": "v1",
"AttachmentCount": 0,
"PermissionsBoundaryUsageCount": 0,
"IsAttachable": true,
"CreateDate": "<YOUR-DATE>",
"UpdateDate": "<YOUR-DATE>"
}
}
将策略的 Amazon 资源名称 (ARN) 另存为$POLICY_ARN 。 export POLICY_ARN=”arn:aws:iam::<YOUR-ACCOUNT-ID>:policy/AWSLoadBalancerControllerIAMPolicy”
| 应用程序开发人员AWS DevOps、AWS系统管理员 |
创建IAM服务帐号。 | 在命名kube-system 空间aws-load-balancer-controller 中创建名为的IAM服务帐号。使用您之前配置的 CLUSTER_NAME 、AWS_REGION 和 POLICY_ARN 。 eksctl create iamserviceaccount \
--cluster=$CLUSTER_NAME \
--region=$AWS_REGION \
--attach-policy-arn=$POLICY_ARN \
--namespace=kube-system \
--name=aws-load-balancer-controller \
--override-existing-serviceaccounts \
--approve
验证创建。 eksctl get iamserviceaccount \
--cluster $CLUSTER_NAME \
--name aws-load-balancer-controller \
--namespace kube-system \
--output yaml
输出应为以下内容。 - metadata:
name: aws-load-balancer-controller
namespace: kube-system
status:
roleARN: arn:aws:iam::<YOUR-ACCOUNT-ID>:role/eksctl-my-fargate-addon-iamserviceaccount-ku-Role1-<YOUR-ROLE-ID>
wellKnownPolicies:
autoScaler: false
awsLoadBalancerController: false
certManager: false
ebsCSIController: false
efsCSIController: false
externalDNS: false
imageBuilder: false
| 应用程序开发人员AWS DevOps、AWS系统管理员 |
安装AWS负载均衡器控制器。 | 更新 Helm 存储库。 helm repo update
将亚马逊EKS图表存储库添加到 Helm 存储库中。 helm repo add eks https://aws.github.io/eks-charts
在后台应用 Loa AWSd Balancer Controller eks- chart 使用的 Kubernetes 自定义资源定义 (CRDs)。 kubectl apply -k "github.com/aws/eks-charts/stable/aws-load-balancer-controller//crds?ref=master"
输出应为以下内容。 customresourcedefinition.apiextensions.k8s.io/ingressclassparams.elbv2.k8s.aws created
customresourcedefinition.apiextensions.k8s.io/targetgroupbindings.elbv2.k8s.aws created
使用之前设置的环境变量安装 Helm 图表。 helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
--set clusterName=$CLUSTER_NAME \
--set serviceAccount.create=false \
--set region=$AWS_REGION \
--set vpcId=$VPC_ID \
--set serviceAccount.name=aws-load-balancer-controller \
-n kube-system
输出应为以下内容。 NAME: aws-load-balancer-controller
LAST DEPLOYED: <YOUR-DATE>
NAMESPACE: kube-system
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
AWS Load Balancer controller installed!
| 应用程序开发人员AWS DevOps、AWS系统管理员 |
创建 NGINX 服务。 | 使用nginx-service.yaml 文件创建用于公开 NGINX pod 的服务。 kubectl apply -f nginx-service.yaml
输出应为以下内容。 service/nginx-service created
| 应用程序开发人员AWS DevOps、AWS系统管理员 |
创建 Kubernetes 入口资源。 | 使用该文件创建一个用于公开 Kubernetes NGINX 入口的服务。nginx-ingress.yaml kubectl apply -f nginx-ingress.yaml
输出应为以下内容。 ingress.networking.k8s.io/nginx-ingress created
| 应用程序开发人员AWS DevOps、AWS系统管理员 |
获取负载均衡器URL。 | 若要检索入口信息,请使用以下命令。 kubectl get ingress nginx-ingress
输出应为以下内容。 NAME CLASS HOSTS ADDRESS PORTS AGE
nginx-ingress <none> * k8s-default-nginxing-xxx.us-east-1.elb.amazonaws.com 80 80s
从输出中复制 ADDRESS (例如 k8s-default-nginxing-xxx.us-east-1.elb.amazonaws.com ),然后将其粘贴到浏览器中以访问该 index.html 文件。 | 应用程序开发人员AWS DevOps、AWS系统管理员 |
任务 | 描述 | 所需技能 |
---|
选择容器组(pod)。 | 列出所有容器组(pod),然后复制所需容器组(pod)的名称。 kubectl get pods
输出应为以下内容。 NAME READY STATUS RESTARTS AGE
nginx-deployment-xxxx-aaa 1/1 Running 0 55m
nginx-deployment-xxxx-bbb 1/1 Running 0 55m
nginx-deployment-xxxx-ccc 1/1 Running 0 55m
nginx-deployment-xxxx-ddd 1/1 Running 0 42m
此命令列出了现有的容器组(pod)和其他信息。 如果您对特定的容器组(pod)感兴趣,请为 POD_NAME 变量填写您感兴趣的容器组(pod)的名称或将其设置为环境变量。否则,请省略此参数,以查找所有资源。 export POD_NAME="nginx-deployment-<YOUR-POD-NAME>"
| 应用程序开发人员AWS DevOps、AWS系统管理员 |
访问日志。 | 从要调试的容器组(pod)获取日志。 kubectl logs $POD_NAME
| 应用程序开发人员、AWS系统管理员、AWS DevOps |
转发NGINX端口。 | 使用端口转发将用于访问 NGINX Web 服务器的 pod 端口映射到本地计算机上的端口。 kubectl port-forward deployment/nginx-deployment 8080:80
在浏览器中,打开以下内容URL。 http://localhost:8080
该 port-forward 命令提供对 index.html 文件的访问权限,而无需通过负载均衡器将其公开。这非常适用于在调试时访问正在运行的应用程序。您可以通过按键盘命令 Ctrl+C 来停止端口转发。 | 应用程序开发人员AWS DevOps、AWS系统管理员 |
在容器组(pod)中运行命令。 | 要查看当前 index.html 文件,请使用以下命令。 kubectl exec $POD_NAME -- cat /usr/share/nginx/html/index.html
您可以使用 exec 命令直接在容器组(pod)中发出任何命令。这对于调试正在运行的应用程序非常有用。 | 应用程序开发人员AWS DevOps、AWS系统管理员 |
将文件复制到容器组(pod)。 | 移除此容器组(pod)上的默认 index.html 文件。 kubectl exec $POD_NAME -- rm /usr/share/nginx/html/index.html
将自定义的本地文件 index.html 上传到容器组(pod)。 kubectl cp index.html $POD_NAME:/usr/share/nginx/html/
您可以使用 cp 命令将文件直接更改或添加至任何容器组(pod)。 | 应用程序开发人员AWS DevOps、AWS系统管理员 |
使用端口转发显示更改。 | 使用端口转发验证您对此容器组(pod)所做的更改。 kubectl port-forward pod/$POD_NAME 8080:80
在浏览器URL中打开以下内容。 http://localhost:8080
对 index.html 文件所做的更改应在浏览器中可见。 | 应用程序开发人员AWS DevOps、AWS系统管理员 |
任务 | 描述 | 所需技能 |
---|
删除负载均衡器。 | 删除入口。 kubectl delete ingress/nginx-ingress
输出应为以下内容。 ingress.networking.k8s.io "nginx-ingress" deleted
删除服务。 kubectl delete service/nginx-service
输出应为以下内容。 service "nginx-service" deleted
删除负载均衡器控制器。 helm delete aws-load-balancer-controller -n kube-system
输出应为以下内容。 release "aws-load-balancer-controller" uninstalled
删除服务账户。 eksctl delete iamserviceaccount --cluster $CLUSTER_NAME --namespace kube-system --name aws-load-balancer-controller
| 应用程序开发人员AWS DevOps、AWS系统管理员 |
删除部署。 | 使用以下命令删除部署资源。 kubectl delete deploy/nginx-deployment
输出应为以下内容。 deployment.apps "nginx-deployment" deleted
| 应用程序开发人员AWS DevOps、AWS系统管理员 |
请删除集群。 | 使用以下命令删除EKS集群,其中my-fargate 是集群名称。 eksctl delete cluster --name $CLUSTER_NAME
此命令删除整个集群,包括所有关联资源。 | 应用程序开发人员AWS DevOps、AWS系统管理员 |
删除该IAM策略。 | 使用删除先前创建的策略AWSCLI。 aws iam delete-policy --policy-arn $POLICY_ARN
| 应用程序开发者、AWS管理员、AWS DevOps |
故障排除
事务 | 解决方案 |
---|
创建集群时收到一条错误消息,指出您的目标可用区没有足够的容量来支持集群。您应该看到类似于以下内容的消息。 Cannot create cluster 'my-fargate' because us-east-1e, the targeted availability zone, does not currently have sufficient capacity to support the cluster. Retry and choose from these availability zones: us-east-1a, us-east-1b, us-east-1c, us-east-1d, us-east-1f
| 根据错误消息使用推荐的可用区重新创建集群。在 clusterconfig-fargate.yaml 文件的最后一行指定可用区列表(例如 availabilityZones: ["us-east-1a", "us-east-1b", "us-east-1c"] )。 |
相关资源
其他信息
clusterconfig-fargate.yaml
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: my-fargate
region: us-east-1
fargateProfiles:
- name: fp-default
selectors:
- namespace: default
- namespace: kube-system
nginx-deplooment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: "nginx-deployment"
namespace: "default"
spec:
replicas: 3
selector:
matchLabels:
app: "nginx"
template:
metadata:
labels:
app: "nginx"
spec:
containers:
- name: nginx
image: public.ecr.aws/nginx/nginx:latest
ports:
- containerPort: 80
nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
annotations:
alb.ingress.kubernetes.io/target-type: ip
name: "nginx-service"
namespace: "default"
spec:
ports:
- port: 80
targetPort: 80
protocol: TCP
type: NodePort
selector:
app: "nginx"
nginx-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
namespace: "default"
name: "nginx-ingress"
annotations:
kubernetes.io/ingress.class: alb
alb.ingress.kubernetes.io/scheme: internet-facing
spec:
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: "nginx-service"
port:
number: 80
index.html
<!DOCTYPE html>
<html>
<body>
<h1>Welcome to your customized nginx!</h1>
<p>You modified the file on this running pod</p>
</body>
</html>