部署示例 Linux 工作负载 - Amazon EKS
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

部署示例 Linux 工作负载

在本主题中,您将创建一个 Kubernetes 清单并将其部署到您的集群。

Prerequisites

  • 您必须具有现有 Kubernetes 集群才能部署示例应用程序。如果您没有现有集群,则可以使用其中一个 Amazon EKS 指南部署 开始使用 Amazon EKS 集群。

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

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

部署示例应用程序

  1. 为示例应用程序创建 Kubernetes 命名空间。

    kubectl create namespace <my-namespace>
  2. 创建 Kubernetes 服务和部署。

    1. 将以下内容保存到计算机上名为 sample-service.yaml 的文件中。如果您要部署到 AWS Fargate Pod,请确保 namespace 的值与您在 AWS Fargate 配置文件 中定义的命名空间匹配。此示例部署将从公有存储库中拉取容器映像,将其三个副本部署到您的集群,并创建具有其自己的 IP 地址的 Kubernetes 服务,该服务只能从集群内访问。要从集群外部访问服务,您需要部署负载均衡器ALB 入口控制器

      映像是一个多架构映像,因此,如果您的集群同时包含 x86 和 Arm 节点,则 pod 可以在任一类型的硬件架构上安排。Kubernetes 将基于 Pod 在其上计划的节点的硬件类型部署适当的硬件映像。或者,如果您希望部署只在具有特定硬件架构的节点上运行,或者您的集群只包含一个硬件架构,请从后面的示例中删除 amd64arm64

      apiVersion: v1 kind: Service metadata: name: my-service namespace: my-namespace labels: app: my-app spec: selector: app: my-app ports: - protocol: TCP port: 80 targetPort: 80 --- apiVersion: apps/v1 kind: Deployment metadata: name: my-deployment namespace: my-namespace labels: app: my-app spec: replicas: 3 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: beta.kubernetes.io/arch operator: In values: - amd64 - arm64 containers: - name: nginx image: public.ecr.aws/z9d2n7e1/nginx:1.19.5 ports: - containerPort: 80

      要了解有关 Kubernetes 服务部署的更多信息,请参阅 Kubernetes 文档。示例清单中的容器不使用网络存储,但它们可能能够使用。有关更多信息,请参阅Storage。尽管此示例中未实施,但我们建议您为 Pod 创建 Kubernetes 服务账户并将其与 AWS IAM 账户关联。通过指定服务账户,您的 Pod 可以拥有与其他 服务交互所需的最低权限。有关更多信息,请参阅 服务账户的 IAM 角色

    2. 部署应用程序。

      kubectl apply -f <sample-service.yaml>
  3. 查看 my-namespace 命名空间中存在的所有资源。

    kubectl get all -n my-namespace

    输出

    NAME READY STATUS RESTARTS AGE pod/my-deployment-776d8f8fd8-78w66 1/1 Running 0 27m pod/my-deployment-776d8f8fd8-dkjfr 1/1 Running 0 27m pod/my-deployment-776d8f8fd8-wmqj6 1/1 Running 0 27m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/my-service ClusterIP 10.100.190.12 <none> 80/TCP 32m NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/my-deployment 3/3 3 3 27m NAME DESIRED CURRENT READY AGE replicaset.apps/my-deployment-776d8f8fd8 3 3 3 27m

    在输出中,您将看到在上一步中部署的示例清单中指定的服务和部署。您还会看到三个 Pod,这是由于在示例清单中为 3 指定 replicas 而造成的。有关 Pod 的更多信息,请参阅 Kubernetes 文档中的 Pods。Kubernetes 自动创建 replicaset 资源,即使该资源未在示例清单中指定。有关 ReplicaSets 的更多信息,请参阅 Kubernetes 文档中的 ReplicaSet

    注意

    Kubernetes 将保留清单中指定的副本数。如果这是生产部署,并且您希望 Kubernetes 水平扩展副本数量或垂直扩展 Pod 的计算资源,则需要使用 Horizontal Pod AutoscalerVertical Pod Autoscaler

  4. 查看已部署服务的详细信息。

    kubectl -n <my-namespace> describe service <my-service>

    缩减的输出

    Name: my-service Namespace: my-namespace Labels: app=my-app Annotations: kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app":"my-app"},"name":"my-service","namespace":"my-namespace"}... Selector: app=my-app Type: ClusterIP IP: 10.100.190.12 Port: <unset> 80/TCP TargetPort: 80/TCP ...

    在输出中,IP: 的值是一个唯一 IP 地址,可从集群中的任何 Pod 访问。

  5. 查看已部署的 Pod 之一的详细信息。

    kubectl -n <my-namespace> describe pod <my-deployment-776d8f8fd8-78w66>

    缩减的输出

    Name: my-deployment-776d8f8fd8-78w66 Namespace: my-namespace Priority: 0 Node: ip-192-168-9-36.us-west-2.compute.internal/192.168.9.36 ... IP: 192.168.16.57 IPs: IP: 192.168.16.57 Controlled By: ReplicaSet/my-deployment-776d8f8fd8 ... Conditions: Type Status Initialized True Ready True ContainersReady True PodScheduled True ... Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 3m20s default-scheduler Successfully assigned my-namespace/my-deployment-776d8f8fd8-78w66 to ip-192-168-9-36.us-west-2.compute.internal ...

    在输出中,默认情况下,IP: 的值是从分配给节点所在子网的 CIDR 块分配给 Pod 的唯一 IP。如果您希望从与节点所在的子网不同的 CIDR 块为 Pod 分配 IP 地址,您可以更改默认行为。有关更多信息,请参阅CNI 自定义网络。您还可以看到 Kubernetes 计划程序计划了 IP 地址为 192.168.9.36 的节点上的 Pod。

  6. 将下面的 <value> 替换为步骤 3 中为某个 Pod 返回的值,以在其中一个 Pod 上执行 shell。

    kubectl exec -it <my-deployment-776d8f8fd8-78w66> -n <my-namespace> -- /bin/bash
  7. 查看 DNS 解析程序配置文件。

    cat /etc/resolv.conf

    输出

    nameserver 10.100.0.10 search my-namespace.svc.cluster.local svc.cluster.local cluster.local us-west-2.compute.internal options ndots:5

    在前面的输出中,nameserver 的值是集群的名称服务器,并自动分配为部署到集群的任何 Pod 的名称服务器。

  8. 键入 exit 断开与 pod 的连接。

  9. 删除示例服务、部署、Pod 和命名空间。

    kubectl delete namespace <my-namespace>