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

部署示例应用程序

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

先决条件

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

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

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

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

部署示例应用程序

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

  1. 创建命名空间。命名空间允许在 Kubernetes 中对资源进行分组。有关更多信息,请参阅 Kubernetes 文档中的命名空间。如果计划将示例应用程序部署到 Amazon Fargate,请确保 Amazon Fargate 配置文件 中的 namespace 值为 eks-sample-app

    kubectl create namespace eks-sample-app
  2. 创建 Kubernetes 部署。此示例部署从公共存储库中提取容器镜像,并将其三个副本(各个容器)部署到您的集群中。有关更多信息,请参阅 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 服务交互,我们建议为 Pod 创建 Kubernetes 服务帐户,然后将其关联到 Amazon IAM 账户。指定服务账户可使您的容器仅拥有为其指定的与其他服务交互的最低权限。有关更多信息,请参阅 服务账户的 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

    在输出中,可以看到之前步骤部署的示例清单中指定的服务和部署。您还可以看到三组容器。这是因为在示例清单 指定了 3 replicas。有关更多信息,请参阅 Kubernetes 文档中的 Pod。即使没有在示例清单中指定,Kubernetes 也会自动创建 replicaset 资源。有关 ReplicaSets 的更多信息,请参阅 Kubernetes 文档中的 ReplicaSet

    注意

    Kubernetes 保持清单中指定的副本数目。如果这是生产部署,并且希望 Kubernetes 为 Pod 横向扩展副本数量或纵向扩展计算资源,则使用 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 地址,可以从集群的任何节点或容器访问,但无法从集群外部访问。Endpoints 值是从 VPC 内分配给属于服务一部分的容器的 IP 地址。

  6. 在上一步查看命名空间时,查看输出列出的一个容器的详细信息。如果部署 Windows 应用程序,请将 linux 替换为 windows,将 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.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 块中为容器分配 IP 地址,则可以更改默认行为。有关更多信息,请参阅 CNI 自定义网络。您还可以看到 Kubernetes 调度器在 IP 地址为 192.168.45.132Node 上计划容器。

    提示

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

  7. 在上一步中描述的容器上运行 shell,将 65b7669776-m6qxz 替换为其中一个容器的 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. 在容器 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. 在容器 shell 中,查看容器的 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 自动分配为部署到集群的所有容器的 nameserver

    Windows
    Get-NetIPConfiguration

    缩减的输出

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

    在之前的输出中,10.100.0.10 自动分配为部署到集群的所有容器的 DNS 服务器。

  10. 通过键入 exit 与 Pod 断开连接。

  11. 使用完示例应用程序后,您可以使用以下命令删除示例命名空间、服务和部署。

    kubectl delete namespace eks-sample-app