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

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

部署示例 Linux 工作负载

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

Prerequisites

  • 您必须拥有现有 Kubernetes 群集才能部署示例应用程序。如果您没有现有群集,您可以使用Amazon EKS 入门指南。

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

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

部署示例应用程序

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

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

    1. 将以下内容保存到计算机上名为 sample-service.yaml 的文件中。如果您将部署到AmazonFargate窗格,然后确保namespace匹配您在AmazonFargate 配置。此示例部署将从公共存储库中提取容器映像,将其中的三个副本部署到您的集群,并使用其自己的 IP 地址创建一个 Kubernetes 服务,该服务只能从群集内部访问。要从群集外部访问服务,您需要部署网络负载均衡器或者ALB 入口控制器

      映像是一个多体系结构映像,因此如果您的集群同时包含 x86 和 Arm 节点,则可以在任一类型的硬件体系结构上调度容器。Kubernetes 将根据它调度容器的节点的硬件类型来部署相应的硬件映像。或者,如果您只希望部署在具有特定硬件体系结构的节点上运行,或者您的群集仅包含一个硬件体系结构,则删除amd64或者arm64来自下面的示例。

      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 的更多信息服务部署,请参阅库贝内特文档。示例清单中的容器不使用网络存储,但它们可能能够使用。有关更多信息,请参阅 Storage。虽然在本示例中没有实现,但我们建议您为您的窗格创建 Kubernetes 服务帐户,并将它们关联到AmazonIAM 账户。指定服务帐户使您的窗格具有与其他服务交互所需的最低权限。有关更多信息,请参阅 服务账户的 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

    在输出中,您可以看到在上一步中部署的示例清单中指定的服务和部署。您还会看到三个窗格,这是由于指定3对于 来说为replicas在示例清单中。有关 Pod 的更多信息,请参阅Pod在 Kubernetes 文档中。库贝内特自动创建replicaset资源,即使它没有在示例清单中指定。有关 ReplicaSets 的更多信息,请参阅ReplicaSet在 Kubernetes 文档中。

    注意

    Kubernetes 将维护清单中指定的副本数。如果这是一个生产部署,并且您希望 Kubernetes 水平扩展副本数量或垂直缩放容器的计算资源,则需要使用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 地址。

  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:是一个唯一 IP,默认情况下,从分配给节点所在子网的 CIDR 块中分配给容器。如果您希望从不同的 CIDR 块分配到节点所在子网的不同 CIDR 块中的 IP 地址,则可以更改默认行为。有关更多信息,请参阅 CNI 自定义网络。您还可以看到 Kubernetes 调度程序使用 IP 地址计划节点上的容器192.168.9.36

  6. 在其中一个窗格上执行 shell,方法是将 <value> 以下内容替换为步骤 3 中您的其中一个窗格返回的值。

    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是群集的名称服务器,并自动将其分配为部署到群集的任何容器的名称服务器。

  8. 通过键入与 Pod 的连接exit

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

    kubectl delete namespace <my-namespace>