本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
部署示例 Linux 工作负载
在本主题中,您将创建一个 Kubernetes 清单并将其部署到您的集群。
Prerequisites
-
您必须具有现有 Kubernetes 集群才能部署示例应用程序。如果您没有现有集群,则可以使用其中一个 Amazon EKS 指南部署 开始使用 Amazon EKS 集群。
-
您必须在计算机上安装
kubectl
。有关更多信息,请参阅安装kubectl。 -
kubectl
必须配置为与您的集群通信。有关更多信息,请参阅为 Amazon EKS 创建 kubeconfig。
部署示例应用程序
-
为示例应用程序创建 Kubernetes 命名空间。
kubectl create namespace <my-namespace>
-
创建 Kubernetes 服务和部署。
-
将以下内容保存到计算机上名为
sample-service.yaml
的文件中。如果您要部署到 AWS Fargate Pod,请确保namespace
的值与您在 AWS Fargate 配置文件 中定义的命名空间匹配。此示例部署将从公有存储库中拉取容器映像,将其三个副本部署到您的集群,并创建具有其自己的 IP 地址的 Kubernetes 服务,该服务只能从集群内访问。要从集群外部访问服务,您需要部署负载均衡器或 ALB 入口控制器。映像是一个多架构映像,因此,如果您的集群同时包含 x86 和 Arm 节点,则 pod 可以在任一类型的硬件架构上安排。Kubernetes 将基于 Pod 在其上计划的节点的硬件类型部署适当的硬件映像。或者,如果您希望部署只在具有特定硬件架构的节点上运行,或者您的集群只包含一个硬件架构,请从后面的示例中删除
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 服务
和部署 的更多信息,请参阅 Kubernetes 文档。示例清单中的容器不使用网络存储,但它们可能能够使用。有关更多信息,请参阅Storage。尽管此示例中未实施,但我们建议您为 Pod 创建 Kubernetes 服务账户并将其与 AWS IAM 账户关联。通过指定服务账户,您的 Pod 可以拥有与其他 服务交互所需的最低权限。有关更多信息,请参阅 服务账户的 IAM 角色。 -
部署应用程序。
kubectl apply -f <sample-service.yaml>
-
-
查看
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 Autoscaler 和 Vertical Pod Autoscaler。
-
查看已部署服务的详细信息。
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 访问。 -
查看已部署的 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。 -
将下面的 <value> 替换为步骤 3 中为某个 Pod 返回的值,以在其中一个 Pod 上执行 shell。
kubectl exec -it <my-deployment-776d8f8fd8-78w66> -n <my-namespace> -- /bin/bash
-
查看 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 的名称服务器。 -
键入
exit
断开与 pod 的连接。 -
删除示例服务、部署、Pod 和命名空间。
kubectl delete namespace <my-namespace>