部署示例应用程序 - 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.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 文档中的服务。虽然没有在示例应用程序中实施,但如果应用程序需要与其他 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 地址,后者是属于服务的一部分。

  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 地址,则可以更改默认行为。有关更多信息,请参阅 容器组(pod)的自定义网络。您还可以看到 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

后续步骤

部署示例应用程序后,您可能想尝试以下其中一些练习: