

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 什麼是 Eksctl？
<a name="what-is-eksctl"></a>

eksctl 是一種命令列公用程式工具，可自動化和簡化建立、管理和操作 Amazon Elastic Kubernetes Service (Amazon EKS) 叢集的程序。eksctl 以 Go 編寫，透過 YAML 組態和 CLI 命令提供宣告式語法，以處理複雜的 EKS 叢集操作，否則需要跨不同 AWS 服務進行多個手動步驟。

對於需要持續大規模部署和管理 EKS 叢集的 DevOps 工程師、平台團隊和 Kubernetes 管理員來說，eksctl 特別重要。對於從自我管理的 Kubernetes 轉換到 EKS 或實作基礎設施即程式碼 (IaC) 實務的組織來說特別有用，因為它可以整合到現有的 CI/CD 管道和自動化工作流程中。此工具可抽象化 EKS 叢集設定所需的 AWS 服務之間的許多複雜互動，例如 VPC 組態、IAM 角色建立和安全群組管理。

eksctl 的主要功能包括能夠使用單一命令建立功能完整的 EKS 叢集、支援自訂聯網組態、自動化節點群組管理和 GitOps 工作流程整合。該工具透過宣告式方法管理叢集升級、擴展節點群組和處理附加元件管理。eksctl 還提供進階功能，例如 Fargate 設定檔組態、受管節點群組自訂和 Spot 執行個體整合，同時透過原生 AWS 開發套件整合維持與其他 AWS 工具和服務的相容性。

## 功能
<a name="_features"></a>

目前實作的功能如下：
+ 建立、取得、列出和刪除叢集
+ 建立、耗盡和刪除節點群組
+ 擴展節點群組
+ 更新 叢集
+ 使用自訂 AMIs
+ 設定 VPC 網路
+ 設定 API 端點的存取
+ 支援 GPU 節點群組
+ Spot 執行個體和混合執行個體
+ IAM 管理和附加元件政策
+ 列出叢集 Cloudformation 堆疊
+ 安裝 coredns
+ 為叢集寫入 kubeconfig 檔案

# Eksctl 常見問答集
<a name="faq"></a>

## 一般
<a name="_general"></a>

 **我可以使用 `eksctl`來管理 未建立的叢集`eksctl`嗎？** 

是！從版本`0.40.0`中，您可以`eksctl`針對任何叢集執行 ，無論它是否由 建立`eksctl`。如需詳細資訊，請參閱[非 eksctl 建立的叢集](unowned-clusters.md)。

## 節點群組
<a name="nodegroup-faq"></a>

 **如何變更節點群組的執行個體類型？** 

從 的觀點來看`eksctl`，節點群組是不可變的。這表示一旦建立 ，唯一`eksctl`可以做的就是向上或向下擴展節點群組。

若要變更執行個體類型，請使用所需的執行個體類型建立新的節點群組，然後耗盡它，讓工作負載移至新的節點群組。在該步驟完成後，您可以刪除舊的節點群組。

 **如何查看節點群組產生的使用者資料？** 

首先，您需要管理節點群組的 Cloudformation 堆疊名稱：

```
eksctl utils describe-stacks --region=us-west-2 --cluster NAME
```

您將看到類似 的名稱`eksctl-CLUSTER_NAME-nodegroup-NODEGROUP_NAME`。

您可以執行下列動作來取得 userdata。請注意從 base64 解碼和解壓縮 gziped 資料的最後一行。

```
NG_STACK=eksctl-scrumptious-monster-1595247364-nodegroup-ng-29b8862f # your stack here
LAUNCH_TEMPLATE_ID=$(aws cloudformation describe-stack-resources --stack-name $NG_STACK \
| jq -r '.StackResources | map(select(.LogicalResourceId == "NodeGroupLaunchTemplate") \
| .PhysicalResourceId)[0]')
aws ec2 describe-launch-template-versions --launch-template-id $LAUNCH_TEMPLATE_ID \
| jq -r '.LaunchTemplateVersions[0].LaunchTemplateData.UserData' \
| base64 -d | gunzip
```

## Ingress
<a name="_ingress"></a>

 **如何使用 設定輸入`eksctl`？** 

建議使用 [AWS Load Balancer 控制器](https://github.com/kubernetes-sigs/aws-load-balancer-controller)。您可以[在這裡](https://docs.aws.amazon.com/eks/latest/userguide/alb-ingress.html)找到如何將控制器部署到叢集的文件，以及如何從舊的 ALB 傳入控制器遷移的文件。

對於 Nginx 傳入控制器，設定會[與其他 Kubernetes 叢集上的](https://kubernetes.github.io/ingress-nginx/deploy/#aws)設定相同。

## kubectl
<a name="_kubectl"></a>

 **我使用的是 HTTPS 代理和叢集憑證驗證失敗，我該如何使用系統 CAs？** 

設定環境變數`KUBECONFIG_USE_SYSTEM_CA`以`kubeconfig`遵守系統憑證授權單位。

# 乾執行
<a name="dry-run"></a>

試轉功能可讓您檢查和變更執行個體選取器相符的執行個體，再繼續建立節點群組。

當 使用執行個體選取器選項 和 `eksctl create cluster`呼叫 時`--dry-run`，eksctl 將輸出包含節點群組的 ClusterConfig 檔案，該節點群組代表 CLI 選項和執行個體類型設定為符合執行個體選取器資源條件的執行個體。

```
eksctl create cluster --name development --dry-run


apiVersion: eksctl.io/v1alpha5
cloudWatch:
  clusterLogging: {}
iam:
  vpcResourceControllerPolicy: true
  withOIDC: false
kind: ClusterConfig
managedNodeGroups:
- amiFamily: AmazonLinux2
  desiredCapacity: 2
  disableIMDSv1: true
  disablePodIMDS: false
  iam:
    withAddonPolicies:
      albIngress: false
      appMesh: false
      appMeshPreview: false
      autoScaler: false
      certManager: false
      cloudWatch: false
      ebs: false
      efs: false
      externalDNS: false
      fsx: false
      imageBuilder: false
      xRay: false
  instanceSelector: {}
  instanceType: m5.large
  labels:
    alpha.eksctl.io/cluster-name: development
    alpha.eksctl.io/nodegroup-name: ng-4aba8a47
  maxSize: 2
  minSize: 2
  name: ng-4aba8a47
  privateNetworking: false
  securityGroups:
    withLocal: null
    withShared: null
  ssh:
    allow: false
    enableSsm: false
    publicKeyPath: ""
  tags:
    alpha.eksctl.io/nodegroup-name: ng-4aba8a47
    alpha.eksctl.io/nodegroup-type: managed
  volumeIOPS: 3000
  volumeSize: 80
  volumeThroughput: 125
  volumeType: gp3
metadata:
  name: development
  region: us-west-2
  version: "1.24"
privateCluster:
  enabled: false
vpc:
  autoAllocateIPv6: false
  cidr: 192.168.0.0/16
  clusterEndpoints:
    privateAccess: false
    publicAccess: true
  manageSharedNodeSecurityGroupRules: true
  nat:
    gateway: Single
```

然後，產生的 ClusterConfig 可以傳遞給 `eksctl create cluster`：

```
eksctl create cluster -f generated-cluster.yaml
```

當 ClusterConfig 檔案與 一起傳遞時`--dry-run`，eksctl 將輸出包含檔案中設定值的 ClusterConfig 檔案。

## eksctl 中的一次性選項
<a name="_one_off_options_in_eksctl"></a>

有些一次性選項無法在 `ClusterConfig` 檔案中表示，例如 `--install-vpc-controllers`。

預期：

```
eksctl create cluster --<options...> --dry-run > config.yaml
```

後面接著：

```
eksctl create cluster -f config.yaml
```

等同於在沒有 的情況下執行第一個命令`--dry-run`。

因此，eksctl 不允許傳遞在`--dry-run`傳遞時無法在組態檔案中表示的選項。

**重要**  
如果您需要傳遞 AWS 設定檔，請設定`AWS_PROFILE`環境變數，而不是傳遞 CLI `--profile` 選項。