本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
在 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。 如需詳細資訊,請參閱中的命名空間namespace
中哪些 Pod 在啟動時使用 AWS Fargate 的值為 eks-sample-app
。
kubectl create namespace eks-sample-app
建立 Kubernetes 部署
建立 Kubernetes 部署。此範例部署會從公有儲存庫提取容器映像,並部署三個複本 (個別 Pods) 到您的叢集。若要進一步了解,請參閱中的部署
-
將下列內容儲存到名為
eks-sample-deployment.yaml
的檔案中。範例應用程式中的容器不會使用網路儲存,但您可能需要的應用程式。如需詳細資訊,請參閱儲存叢集的應用程式資料。-
在
kubernetes.io/arch
金鑰下方的amd64
或arm64
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
-
-
將部署清單檔案套用至叢集。
kubectl apply -f eks-sample-deployment.yaml
建立服務
服務可讓您透過單一 IP 地址或名稱存取所有複本。如需詳細資訊,請參閱中的服務
-
將下列內容儲存到名為
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
-
將服務資訊清單套用至叢集。
kubectl apply -f eks-sample-service.yaml
檢閱已建立的資源
-
檢視
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,請參閱 中的 PodKubernetes 文件中)。Kubernetes 會自動建立 replicaset
資源,即使未在範例資訊清單中指定。如需 的詳細資訊ReplicaSets
,請參閱 中的 ReplicaSetKubernetes 文件中)。 注意
Kubernetes 會維護清單清單中指定的複本數量。如果這是生產部署,而且您想要 Kubernetes 水平擴展複本數量,或垂直擴展 的運算資源 Pods,搭配水平 Pod Autoscaler 使用擴展 Pod 部署,並使用垂直 Pod Autoscaler 調整 Pod 資源來執行此操作。
-
檢視已部署服務的詳細資訊。
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 屬於 服務的一部分。 -
檢視其中一個 的詳細資訊 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
-
在 上執行 Shell Pod 如上一步所述,取代
65b7669776-m6qxz
您的 之一的 ID Pods.kubectl exec -it eks-sample-linux-deployment-65b7669776-m6qxz -n eks-sample-app -- /bin/bash
-
從 Pod shell,檢視上一個步驟中與部署一起安裝的 Web 伺服器輸出。您只需要指定服務名稱。已透過 解析至服務的 IP 地址 CoreDNS,預設會與 Amazon EKS 叢集一起部署。
curl eks-sample-linux-service
範例輸出如下。
<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> [...]
-
從 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 部署到叢集。 -
中斷與 的連線 Pod 透過輸入
exit
。 -
完成範例應用程式後,您可以使用下列命令移除範例命名空間、服務和部署。
kubectl delete namespace eks-sample-app
後續步驟
部署範例應用程式之後,您可能想要嘗試下列一些練習: