部署示例应用程序 - Amazon EKS
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

部署示例应用程序

在本主题中,您在集群中部署一个示例应用程序。

先决条件
  • 现有的 Kubernetes 集群至少有一个节点。如果没有现有 Amazon EKS 集群,可以根据 开始使用 Amazon EKS 指南部署一个集群。如果您正在部署 Windows 应用程序,必须为您的集群和至少一个 Amazon EC2 Windows 节点启用 Windows 支持

  • 安装在计算机上的 Kubectl。有关更多信息,请参阅 安装或更新 kubectl

  • Kubectl 配置为与集群通信。有关更多信息,请参阅为 Amazon EKS 集群创建或更新 kubeconfig 文件

  • 如果计划将示例工作负载部署到 Fargate,现有 Fargate 配置文件必须包含本教程创建的相同命名空间,即 eks-sample-app,除非更改名称。如果使用入门指南创建集群,则必须创建新配置文件或将命名空间添加到现有配置文件,因为在入门指南中创建的配置文件没有指定本教程使用的命名空间。您的 VPC 还必须具有至少一个私有子网。

部署示例应用程序

尽管下列步骤中有许多变量都可以更改,但我们建议仅在指定的情况下更改变量值。更深入了解 Kubernetes pods、部署和服务后,可以尝试更改其他值。

  1. 创建命名空间。命名空间允许您在 Kubernetes 中对资源进行分组。有关更多信息,请参阅 Kubernetes 文档中的命名空间。如果您计划将示例应用程序部署到 Amazon Fargate,请确保 Amazon 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.21 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 文档中的服务。虽然没有在示例应用程序中实施,但如果应用程序需要与其他 Amazon 服务交互,我们建议为 pods 创建 Kubernetes 服务账户,然后将其关联到 Amazon IAM 账户。指定服务账户可使您的 pods 仅拥有为其指定的与其他服务交互的最低权限。有关更多信息,请参阅服务账户的 IAM 角色

    1. 将以下内容保存到一个名为 eks-sample-service.yaml 的文件中。Kubernetes 为服务分配其自己的 IP 地址,该 IP 地址只能从集群内部访问。要从集群外部访问服务,请部署 Amazon 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。这是因为在示例清单中指定了 3 replicas。有关 pods 的更多信息,请参阅 Kubernetes 文档中的容器组(pod)。即使没有在示例清单中指定,Kubernetes 也会自动创建 replicaset 资源。有关 ReplicaSets 的更多信息,请参阅 Kubernetes 文档中的 ReplicaSet

    注意

    Kubernetes 保持清单中指定的副本数目。如果这是生产部署,并且您希望 Kubernetes 为 pods 横向扩展副本数量或纵向扩展计算资源,则使用 Horizontal Pod AutoscalerVertical Pod Autoscaler 进行此操作。

  5. 查看已部署服务的详细信息。如果您部署了 Windows 服务,请将 linux 替换为 windows

    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: 值是一个唯一的 IP 地址,可以从集群内的任何节点或 pod 访问,但无法从集群外部访问。Endpoints 的值是从 VPC 内分配给 pods 的 IP 地址,其中,pods 属于服务的一部分。

  6. 在上一步查看命名空间时,查看输出中列出的一个 pods 的详细信息。如果部署了 Windows 应用程序,请将 linux 替换为 windows,将 776d8f8fd8-78w66 替换为其中一个 pods 返回的值。

    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.cn-north-1.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.cn-north-1.compute.internal ...

    在之前的输出中,IP: 值是一个唯一的 IP 地址,该 IP 地址从分配给节点所在子网的 CIDR 块中分配给 pod。如果您希望从其他 CIDR 块中为 pods 分配 IP 地址,则可以更改默认行为。有关更多信息,请参阅教程:自定义联网。您还可以看到 Kubernetes 调度器在 IP 地址为 192.168.45.132Node 上计划 pod。

    提示

    无需使用命令行,即可在 Amazon Web Services Management Console 中查看 pods、服务、部署和其他 Kubernetes 资源的许多详细信息。有关更多信息,请参阅查看 Kubernetes 资源

  7. 在上一步中描述的 pod 上运行 shell,将 65b7669776-m6qxz 替换为其中一个 pods 的 ID。

    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 cn-north-1.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