在 Linux 上部署範例應用程式 - Amazon EKS

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

在 Linux 上部署範例應用程式

在本主題中,您可以將範例應用程式部署到 linux 節點上的叢集。

必要條件

  • 現有 Kubernetes 至少有一個節點的 叢集。如果您沒有現有的 Amazon EKS 叢集,您可以使用 中的其中一個指南來部署Amazon EKS 入門

  • 安裝在電腦上的 Kubectl。如需詳細資訊,請參閱設定 kubectl 和 eksctl

  • 設定好的 Kubectl,以便與叢集通訊。如需詳細資訊,請參閱建立 kubeconfig 檔案,將 kubectl 連接至 EKS 叢集

  • 如果打算將範例工作負載部署至 Fargate,則必須擁有現有的 Fargate 設定檔,其中包含在本教學課程中建立的相同命名空間,也就是 eks-sample-app,除非您變更名稱。如果您在 中建立具有其中一個 Gude 的叢集Amazon EKS 入門,則您必須建立新的設定檔,或將命名空間新增至現有的設定檔,因為入門指南中建立的設定檔不會指定本教學課程中所使用的命名空間。您的 VPC 還必須至少有一個私有子網路。

雖然許多變數可在下列步驟中變更,但建議只在指定的位置變更變值。一旦您更了解 Kubernetes Pods、部署和服務,您可以嘗試變更其他值。

建立命名空間

命名空間可讓您在 中將資源分組 Kubernetes。 如需詳細資訊,請參閱中的命名空間 Kubernetes 文件中)。如果您打算使用 AWS Fargate 部署範例應用程式以簡化運算管理,請確定 namespace中哪些 Pod 在啟動時使用 AWS Fargate 的值為 eks-sample-app

kubectl create namespace eks-sample-app

建立 Kubernetes 部署

建立 Kubernetes 部署。此範例部署會從公有儲存庫提取容器映像,並部署三個複本 (個別 Pods) 到您的叢集。若要進一步了解,請參閱中的部署 Kubernetes 文件中)。

  1. 將下列內容儲存到名為 eks-sample-deployment.yaml 的檔案中。範例應用程式中的容器不會使用網路儲存,但您可能需要的應用程式。如需詳細資訊,請參閱儲存叢集的應用程式資料

    • kubernetes.io/arch 金鑰下方的 amd64arm64 values 代表可以部署應用程式至其中一個硬體架構 (如果叢集中有兩個)。此操作可行,因為此映像是一個多架構映像,但並非所有映像都是。您可以在要從中提取映像的儲存庫中檢視映像詳細資訊,以判斷映像支援的硬體架構。部署不支援硬體架構類型的映像時,或您不希望將映像部署到其中時,請從資訊清單中移除該類型。如需詳細資訊,請參閱中的 Well-Known 標籤、註解和提示 Kubernetes 文件中)。

    • kubernetes.io/os: linux nodeSelector 這表示如果您有 Linux 以及 Windows 叢集中的節點 (例如),映像只會部署到 Linux 節點。如需詳細資訊,請參閱中的 Well-Known 標籤、註釋和提示 Kubernetes 文件中)。

      apiVersion: apps/v1 kind: Deployment metadata: name: eks-sample-linux-deployment namespace: eks-sample-app labels: app: eks-sample-linux-app spec: replicas: 3 selector: matchLabels: app: eks-sample-linux-app template: metadata: labels: app: eks-sample-linux-app spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/arch operator: In values: - amd64 - arm64 containers: - name: nginx image: public.ecr.aws/nginx/nginx:1.23 ports: - name: http containerPort: 80 imagePullPolicy: IfNotPresent nodeSelector: kubernetes.io/os: linux
  2. 將部署清單檔案套用至叢集。

    kubectl apply -f eks-sample-deployment.yaml

建立服務

服務可讓您透過單一 IP 地址或名稱存取所有複本。如需詳細資訊,請參閱中的服務 Kubernetes 文件中)。雖然未在範例應用程式中實作,但如果您有應用程式需要與其他 AWS 服務互動,建議您建立 Kubernetes 服務帳戶 Pods,並將其與 AWS IAM 帳戶建立關聯。透過指定服務帳戶,您的 Pods 只有您為他們指定與其他 服務互動的最低許可。如需詳細資訊,請參閱服務帳戶的 IAM 角色

  1. 將下列內容儲存到名為 eks-sample-service.yaml 的檔案中。Kubernetes 會指派服務自己的 IP 地址,該地址只能從叢集內存取。若要從叢集外部存取服務,請部署 AWS Load Balancer 控制器,以將應用程式網路流量負載平衡至服務。

    apiVersion: v1 kind: Service metadata: name: eks-sample-linux-service namespace: eks-sample-app labels: app: eks-sample-linux-app spec: selector: app: eks-sample-linux-app ports: - protocol: TCP port: 80 targetPort: 80
  2. 將服務資訊清單套用至叢集。

    kubectl apply -f eks-sample-service.yaml

檢閱已建立的資源

  1. 檢視 eks-sample-app 命名空間中存在的所有資源。

    kubectl get all -n eks-sample-app

    範例輸出如下。

    NAME READY STATUS RESTARTS AGE pod/eks-sample-linux-deployment-65b7669776-m6qxz 1/1 Running 0 27m pod/eks-sample-linux-deployment-65b7669776-mmxvd 1/1 Running 0 27m pod/eks-sample-linux-deployment-65b7669776-qzn22 1/1 Running 0 27m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/eks-sample-linux-service ClusterIP 10.100.74.8 <none> 80/TCP 32m NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/eks-sample-linux-deployment 3/3 3 3 27m NAME DESIRED CURRENT READY AGE replicaset.apps/eks-sample-linux-deployment-776d8f8fd8 3 3 3 27m

    在輸出中,您會看到在先前步驟中所部署範例清單檔案中指定的服務和部署。您也會看到三個 Pods。 這是因為 3 replicas 是在範例資訊清單中指定的。如需關於 Pods,請參閱 中的 Pod Kubernetes 文件中)。Kubernetes 會自動建立replicaset資源,即使未在範例資訊清單中指定。如需 的詳細資訊ReplicaSets,請參閱 中的 ReplicaSet Kubernetes 文件中)。

    注意

    Kubernetes 會維護清單清單中指定的複本數量。如果這是生產部署,而且您想要 Kubernetes 水平擴展複本數量,或垂直擴展 的運算資源 Pods,搭配水平 Pod Autoscaler 使用擴展 Pod 部署,並使用垂直 Pod Autoscaler 調整 Pod 資源來執行此操作。

  2. 檢視已部署服務的詳細資訊。

    kubectl -n eks-sample-app describe service eks-sample-linux-service

    範例輸出如下。

    Name: eks-sample-linux-service Namespace: eks-sample-app Labels: app=eks-sample-linux-app Annotations: <none> Selector: app=eks-sample-linux-app Type: ClusterIP IP Families: <none> IP: 10.100.74.8 IPs: 10.100.74.8 Port: <unset> 80/TCP TargetPort: 80/TCP Endpoints: 192.168.24.212:80,192.168.50.185:80,192.168.63.93:80 Session Affinity: None Events: <none>

    在先前的輸出中, 的值IP:是可從任何節點或 存取的唯一 IP 地址 Pod 在叢集內,但無法從叢集外部到達。的值Endpoints是從 VPC 內指派給 的 IP 地址 Pods 屬於 服務的一部分。

  3. 檢視其中一個 的詳細資訊 Pods 當您在上一個步驟中檢視命名空間時, 會列在輸出中。Replace (取代) 776d8f8fd8-78w66 傳回其中一個 的值 Pods.

    kubectl -n eks-sample-app describe pod eks-sample-linux-deployment-65b7669776-m6qxz

    縮寫範例輸出

    Name: eks-sample-linux-deployment-65b7669776-m6qxz Namespace: eks-sample-app Priority: 0 Node: ip-192-168-45-132.us-west-2.compute.internal/192.168.45.132 [...] IP: 192.168.63.93 IPs: IP: 192.168.63.93 Controlled By: ReplicaSet/eks-sample-linux-deployment-65b7669776 [...] Conditions: Type Status Initialized True Ready True ContainersReady True PodScheduled True [...] Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 3m20s default-scheduler Successfully assigned eks-sample-app/eks-sample-linux-deployment-65b7669776-m6qxz to ip-192-168-45-132.us-west-2.compute.internal [...]

    在先前的輸出中, 的值IP:是指派給 的唯一 IP Pod 從指派給節點所在的子網路的 CIDR 區塊。如果您想要指派 Pods 來自不同 CIDR 區塊的 IP 地址,您可以變更預設行為。如需詳細資訊,請參閱部署 pods 使用自訂聯網的替代子網路。您也可以看到 Kubernetes 排程器排程 Pod 在Node具有 IP 地址的 上 192.168.45.132.

    提示

    您可以檢視有關 的許多詳細資訊,而不是使用命令列 Pods、服務、部署和其他 Kubernetes 資源 AWS Management Console。如需詳細資訊,請參閱在 中檢視 Kubernetes 資源 AWS Management Console

在 Pod 上執行 Shell

  1. 在 上執行 Shell Pod 如上一步所述,取代 65b7669776-m6qxz 您的 之一的 ID Pods.

    kubectl exec -it eks-sample-linux-deployment-65b7669776-m6qxz -n eks-sample-app -- /bin/bash
  2. 從 Pod shell,檢視上一個步驟中與部署一起安裝的 Web 伺服器輸出。您只需要指定服務名稱。已透過 解析至服務的 IP 地址 CoreDNS,預設會與 Amazon EKS 叢集一起部署。

    curl eks-sample-linux-service

    範例輸出如下。

    <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> [...]
  3. 從 Pod shell,檢視 的 DNS 伺服器 Pod.

    cat /etc/resolv.conf

    範例輸出如下。

    nameserver 10.100.0.10 search eks-sample-app.svc.cluster.local svc.cluster.local cluster.local us-west-2.compute.internal options ndots:5

    在先前的輸出中, 10.100.0.10 會自動指派為所有 nameserver的 Pods 部署到叢集。

  4. 中斷與 的連線 Pod 透過輸入 exit

  5. 完成範例應用程式後,您可以使用下列命令移除範例命名空間、服務和部署。

    kubectl delete namespace eks-sample-app

後續步驟

部署範例應用程式之後,您可能想要嘗試下列一些練習: