部署範例應用程式 - Amazon EKS

協助改善此頁面

想要為此使用者指南做出貢獻嗎? 捲動至此頁面底部,然後選取 [編輯此頁面於] GitHub。您的貢獻將有助於使我們的用戶指南更適合所有人。

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

部署範例應用程式

在這個主題中,您要部署範例應用程式至叢集。

必要條件
  • 一個現有的 Kubernetes 叢集至少會有一個節點。如果尚無現有 Amazon EKS 叢集,可以使用 Amazon EKS 入門 指南之一部署叢集。如果您正在部署 Windows 應用程式,則必須為叢集啟用 Windows 支援,以及啟用至少一個 Amazon EC2 Windows 節點。

  • 安裝在電腦上的 Kubectl。如需詳細資訊,請參閱 安裝或更新 kubectl

  • 設定好的 Kubectl,以便與叢集通訊。如需詳細資訊,請參閱 建立或更新 Amazon EKS 叢集的 kubeconfig 檔案

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

部署範例應用程式

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

  1. 建立 命名空間。命名空間可讓您將 Kubernetes 中的資源分組。如需詳細資訊,請參閱 Kubernetes 文件中的命名空間。如果打算將範例應用程式部署至 AWS Fargate,請確定您 AWS Fargate 設定檔 中的 namespace 值是 eks-sample-app

    kubectl create namespace eks-sample-app
  2. 建立 Kubernetes 部署。此範例部署會從公有儲存庫提取容器映像,並將其三個複本 (個別 Pods) 部署至您的叢集。若要進一步了解,請參閱 Kubernetes 文件中的部署。您可以將應用程式部署至 Linux 或 Windows 節點。如果要部署至 Fargate,則只能部署 Linux 應用程式。

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

      Linux

      kubernetes.io/arch 金鑰下方的 amd64arm64 values 代表可以部署應用程式至其中一個硬體架構 (如果叢集中有兩個)。此操作可行,因為此映像是一個多架構映像,但並非所有映像都是。透過檢視要從中提取映像的儲存庫中的映像詳細資訊,可以確定支援該映像的硬體架構。部署不支援硬體架構類型的映像時,或者不希望部署映像時,請從清單檔案中移除該類型。如需詳細資訊,請參閱 Kubernetes 文件中的已知標籤、註釋和污點

      kubernetes.io/os: linux nodeSelector 表示,如果叢集中有 Linux 和 Windows 節點 (舉例來說),則該映像只會部署至 Linux 節點。如需詳細資訊,請參閱 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
      Windows

      kubernetes.io/os: windows nodeSelector 表示,如果叢集中有 Windows 和 Linux 節點 (舉例來說),則該映像只會部署至 Windows 節點。如需詳細資訊,請參閱 Kubernetes 文件中的已知標籤、註釋和污點

      apiVersion: apps/v1 kind: Deployment metadata: name: eks-sample-windows-deployment namespace: eks-sample-app labels: app: eks-sample-windows-app spec: replicas: 3 selector: matchLabels: app: eks-sample-windows-app template: metadata: labels: app: eks-sample-windows-app spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: beta.kubernetes.io/arch operator: In values: - amd64 containers: - name: windows-server-iis image: mcr.microsoft.com/windows/servercore:ltsc2019 ports: - name: http containerPort: 80 imagePullPolicy: IfNotPresent command: - powershell.exe - -command - "Add-WindowsFeature Web-Server; Invoke-WebRequest -UseBasicParsing -Uri 'https://dotnetbinaries.blob.core.windows.net/servicemonitor/2.0.1.6/ServiceMonitor.exe' -OutFile 'C:\\ServiceMonitor.exe'; echo '<html><body><br/><br/><marquee><H1>Hello EKS!!!<H1><marquee></body><html>' > C:\\inetpub\\wwwroot\\default.html; C:\\ServiceMonitor.exe 'w3svc'; " nodeSelector: kubernetes.io/os: windows
    2. 將部署清單檔案套用至叢集。

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

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

      Linux
      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
      Windows
      apiVersion: v1 kind: Service metadata: name: eks-sample-windows-service namespace: eks-sample-app labels: app: eks-sample-windows-app spec: selector: app: eks-sample-windows-app ports: - protocol: TCP port: 80 targetPort: 80
    2. 將服務清單檔案套用至叢集。

      kubectl apply -f eks-sample-service.yaml
  4. 檢視 eks-sample-app 命名空間中存在的所有資源。

    kubectl get all -n eks-sample-app

    範例輸出如下。

    如果部署了 Windows 資源,則下列輸出中的所有 linux 執行個體都為 windows。其他 example values 可能與輸出不同。

    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。這是因為範例清單檔案中指定了 3replicas。如需有關 Pods 的詳細資訊,請參閱 Kubernetes 文件中的 Pod。Kubernetes 會自動創建 replicaset 資源,即使未在範例清單檔案指定也一樣。如需相關資訊ReplicaSets,請參閱Kubernetes文件ReplicaSet中的。

    注意

    Kubernetes 會維護清單檔案中指定的複本數量。如果這是生產部署,並且您希望 Kubernetes 橫向擴展複本數量或垂直擴展 Pods 的運算資源,請使用 Horizontal Pod AutoscalerVertical Pod Autoscaler 來執行此作業。

  5. 檢視已部署服務的詳細資訊。如果已部署 Windows 服務,請使用 windows 取代 linux

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

    範例輸出如下。

    如果部署了 Windows 資源,則下列輸出中的所有 linux 執行個體都為 windows。其他 example values 可能與輸出不同。

    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: 值是可從叢集內的任一個節點或 Pod 連線的唯一 IP 地址,但無法從叢集外部連線。Endpoints 值是從 VPC 內指派至服務一部分的 Pods 的 IP 地址。

  6. 在先前步驟中檢視命名空間時,請檢視輸出中列出的其中一個 Pods 詳細資訊。如果部署了 Windows 應用程式,請使用 windows 取代 linux,並用您的 Pods 中一個返回的值取代 776d8f8fd8-78w66

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

    縮寫輸出

    如果部署了 Windows 資源,則下列輸出中的所有 linux 執行個體都為 windows。其他 example values 可能與輸出不同。

    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,從指派給節點所在子網路的 CIDR 區塊指派給 Pod。如果希望從不同的 CIDR 區塊指派 Pods IP 地址,則可以變更預設行為。如需詳細資訊,請參閱 Pod 的自訂聯網。您也可以看到 Kubernetes 排程器使用 IP 地址 192.168.45.132 排定了 Node 上的 Pod。

    提示

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

  7. 在先前步驟中描述的 Pod 上執行 Shell,使用您 Pods 中的一個 ID 取代 65b7669776-m6qxz

    Linux
    kubectl exec -it eks-sample-linux-deployment-65b7669776-m6qxz -n eks-sample-app -- /bin/bash
    Windows
    kubectl exec -it eks-sample-windows-deployment-65b7669776-m6qxz -n eks-sample-app -- powershell.exe
  8. 在 Pod Shell 中,檢視在先前步驟中與部署一起安裝的 Web 伺服器輸出。您只需要指定服務名稱。CoreDNS 會將服務名稱解析為服務的 IP 地址;其預設會與 Amazon EKS 叢集一起部署。

    Linux
    curl eks-sample-linux-service

    範例輸出如下。

    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    [...]
    Windows
    Invoke-WebRequest -uri eks-sample-windows-service/default.html -UseBasicParsing

    範例輸出如下。

    StatusCode        : 200
    StatusDescription : OK
    Content           : < h t m l > < b o d y > < b r / > < b r / > < m a r q u e e > < H 1 > H e l l o  
                          E K S ! ! ! < H 1 > < m a r q u e e > < / b o d y > < h t m l >
  9. 從 Pod Shell 中檢視 Pod 的 DNS 伺服器。

    Linux
    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 會自動指派為讓所有 Pods 部署至叢集的 nameserver

    Windows
    Get-NetIPConfiguration

    縮寫輸出

    InterfaceAlias       : vEthernet
    [...]
    IPv4Address          : 192.168.63.14
    [...]
    DNSServer            : 10.100.0.10

    在先前的輸出中,10.100.0.10 會自動指派為讓所有 Pods 部署至叢集的 DNS 伺服器。

  10. 透過輸入 exit 中斷從 Pod 的連線。

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

    kubectl delete namespace eks-sample-app

後續步驟

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