mcpField
E
eks

eks

github.com/itsmostafa云与 DevOps1.2k147 次安装2 天前更新
代码仓库

关于 eks

面向在 AWS 上运行 Kubernetes 团队的 Amazon Elastic Kubernetes Service(EKS)参考技能。通过 AWS CLI 和 eksctl 示例,介绍托管控制平面、节点组、工作负载身份、插件、集群搭建及运维指导。

主要功能

  1. 01创建和配置 EKS 集群
  2. 02管理托管、自管及 Fargate 节点组
  3. 03通过 IRSA 授予 Pod 级 AWS 权限
  4. 04安装和更新 EKS 插件
  5. 05查看安全、高可用和故障排查实践

适用场景

  1. 01使用托管节点组搭建 Kubernetes 集群
  2. 02为应用 Pod 授予范围受限的 AWS 权限
  3. 03安装 CoreDNS 或 VPC CNI 插件
  4. 04排查节点接入、DNS 或 AWS 访问问题

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/itsmostafa/aws-agent-skills --skill eks

安装后在 Claude Code 中输入/eks确认已加载。

附带文件cluster-setup.md

详细介绍

AWS EKS

Amazon Elastic Kubernetes Service(EKS)无需安装和运维自己的控制平面即可运行 Kubernetes。EKS 管理控制平面,并与 AWS 服务集成。

目录

核心概念

控制平面

由 AWS 管理。在多个可用区中运行 Kubernetes API 服务器、etcd 和控制器。

节点组
类型描述
托管式AWS 管理置备和更新
自管理式你管理 EC2 实例
Fargate无服务器,按 Pod 计算
IRSA(服务账户的 IAM 角色)

将 Kubernetes 服务账户与 IAM 角色关联,以实现精细的 AWS 权限控制。

附加组件

运维软件:CoreDNS、kube-proxy、VPC CNI、EBS CSI 驱动程序。

常见模式

创建集群

AWS CLI:

# Create cluster role
aws iam create-role \
  --role-name eks-cluster-role \
  --assume-role-policy-document '{
    "Version": "2012-10-17",
    "Statement": [{
      "Effect": "Allow",
      "Principal": {"Service": "eks.amazonaws.com"},
      "Action": "sts:AssumeRole"
    }]
  }'

aws iam attach-role-policy \
  --role-name eks-cluster-role \
  --policy-arn arn:aws:iam::aws:policy/AmazonEKSClusterPolicy

# Create cluster
aws eks create-cluster \
  --name my-cluster \
  --role-arn arn:aws:iam::123456789012:role/eks-cluster-role \
  --resources-vpc-config subnetIds=subnet-12345678,subnet-87654321,securityGroupIds=sg-12345678

# Wait for cluster
aws eks wait cluster-active --name my-cluster

# Update kubeconfig
aws eks update-kubeconfig --name my-cluster --region us-east-1

eksctl(推荐):

# Create cluster with managed node group
eksctl create cluster \
  --name my-cluster \
  --region us-east-1 \
  --version 1.29 \
  --nodegroup-name standard-workers \
  --node-type t3.medium \
  --nodes 3 \
  --nodes-min 1 \
  --nodes-max 5 \
  --managed
添加托管节点组
# Create node role
aws iam create-role \
  --role-name eks-node-role \
  --assume-role-policy-document '{
    "Version": "2012-10-17",
    "Statement": [{
      "Effect": "Allow",
      "Principal": {"Service": "ec2.amazonaws.com"},
      "Action": "sts:AssumeRole"
    }]
  }'

aws iam attach-role-policy --role-name eks-node-role --policy-arn arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy
aws iam attach-role-policy --role-name eks-node-role --policy-arn arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly
aws iam attach-role-policy --role-name eks-node-role --policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy

# Create node group
aws eks create-nodegroup \
  --cluster-name my-cluster \
  --nodegroup-name standard-workers \
  --node-role arn:aws:iam::123456789012:role/eks-node-role \
  --subnets subnet-12345678 subnet-87654321 \
  --instance-types t3.medium \
  --scaling-config minSize=1,maxSize=5,desiredSize=3 \
  --ami-type AL2_x86_64
配置 IRSA
# Enable OIDC provider
eksctl utils associate-iam-oidc-provider \
  --cluster my-cluster \
  --approve

# Create IAM role for service account
eksctl create iamserviceaccount \
  --cluster my-cluster \
  --namespace default \
  --name my-app-sa \
  --attach-policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess \
  --approve

手动设置 IRSA:

# Get OIDC issuer
OIDC_ISSUER=$(aws eks describe-cluster --name my-cluster --query "cluster.identity.oidc.issuer" --output text)
OIDC_ID=${OIDC_ISSUER##*/}

# Create trust policy
cat > trust-policy.json << EOF
{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Principal": {
      "Federated": "arn:aws:iam::123456789012:oidc-provider/oidc.eks.us-east-1.amazonaws.com/id/${OIDC_ID}"
    },
    "Action": "sts:AssumeRoleWithWebIdentity",
    "Condition": {
      "StringEquals": {
        "oidc.eks.us-east-1.amazonaws.com/id/${OIDC_ID}:sub": "system:serviceaccount:default:my-app-sa",
        "oidc.eks.us-east-1.amazonaws.com/id/${OIDC_ID}:aud": "sts.amazonaws.com"
      }
    }
  }]
}
EOF

aws iam create-role --role-name my-app-role --assume-role-policy-document file://trust-policy.json
Kubernetes 服务账户
apiVersion: v1
kind: ServiceAccount
metadata:
  name: my-app-sa
  namespace: default
  annotations:
    eks.amazonaws.com/role-arn: arn:aws:iam::123456789012:role/my-app-role
安装附加组件
# CoreDNS
aws eks create-addon \
  --cluster-name my-cluster \
  --addon-name coredns \
  --addon-version v1.11.1-eksbuild.4

# VPC CNI
aws eks create-addon \
  --cluster-name my-cluster \
  --addon-name vpc-cni \
  --addon-version v1.16.0-eksbuild.1

# kube-proxy
aws eks create-addon \
  --cluster-name my-cluster \
  --addon-name kube-proxy \
  --addon-version v1.29.0-eksbuild.1

# EBS CSI Driver
aws eks create-addon \
  --cluster-name my-cluster \
  --addon-name aws-ebs-csi-driver \
  --addon-version v1.27.0-eksbuild.1 \
  --service-account-role-arn arn:aws:iam::123456789012:role/ebs-csi-role
部署应用程序
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      serviceAccountName: my-app-sa
      containers:
      - name: app
        image: 123456789012.dkr.ecr.us-east-1.amazonaws.com/my-app:latest
        ports:
        - containerPort: 8080
        resources:
          requests:
            cpu: 100m
            memory: 128Mi
          limits:
            cpu: 500m
            memory: 512Mi
---
apiVersion: v1
kind: Service
metadata:
  name: my-app
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-type: nlb
spec:
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: my-app

CLI 参考

集群管理
命令描述
aws eks create-cluster创建集群
aws eks describe-cluster获取集群详情
aws eks update-cluster-config更新集群设置
aws eks delete-cluster删除集群
aws eks update-kubeconfig配置 kubectl
节点组
命令描述
aws eks create-nodegroup创建节点组
aws eks describe-nodegroup获取节点组详情
aws eks update-nodegroup-config更新节点组
aws eks delete-nodegroup删除节点组
附加组件
命令描述
aws eks create-addon安装附加组件
aws eks describe-addon获取附加组件详情
aws eks update-addon更新附加组件
aws eks delete-addon移除附加组件

最佳实践

安全性
  • 使用 IRSA 设置 Pod 级别的 AWS 权限
  • 启用集群加密,使用 KMS
  • 为 API 服务器使用私有端点
  • 启用审计日志记录,并发送到 CloudWatch
  • 为 Pod 使用安全组
  • 实施网络策略
# Enable secrets encryption
aws eks create-cluster \
  --name my-cluster \
  --encryption-config '[{
    "provider": {"keyArn": "arn:aws:kms:us-east-1:123456789012:key/..."},
    "resources": ["secrets"]
  }]' \
  ...
高可用性
  • 跨多个可用区部署
  • 使用托管节点组
  • 设置 Pod 中断预算
  • 配置水平 Pod 自动扩缩
成本优化
  • 对非关键工作负载使用 Spot 实例
  • 合理配置节点和 Pod 的规格
  • 对工作负载变化较大的场景使用 Fargate
  • 实施集群自动扩缩器
  • 使用 Karpenter 高效扩缩

故障排除

无法连接到集群
# Verify kubeconfig
aws eks update-kubeconfig --name my-cluster --region us-east-1

# Check IAM identity
aws sts get-caller-identity

# Verify cluster status
aws eks describe-cluster --name my-cluster --query 'cluster.status'
节点无法加入集群

检查:

  • 节点 IAM 角色是否具有所需策略
  • 安全组是否允许节点与控制平面通信
  • 节点是否可以通过网络访问 API 服务器
# Check node status
kubectl get nodes

# Check aws-auth ConfigMap
kubectl describe configmap aws-auth -n kube-system

# Check node logs (SSH to node)
journalctl -u kubelet
Pod 无法访问 AWS 服务
# Verify IRSA setup
kubectl describe sa my-app-sa

# Check pod environment
kubectl exec my-pod -- env | grep AWS

# Test credentials
kubectl exec my-pod -- aws sts get-caller-identity
DNS 问题
# Check CoreDNS pods
kubectl get pods -n kube-system -l k8s-app=kube-dns

# Test DNS resolution
kubectl run test --image=busybox:1.28 --rm -it -- nslookup kubernetes

# Check CoreDNS logs
kubectl logs -n kube-system -l k8s-app=kube-dns

参考资料

评论

支持 Markdown