部署示例应用程序
在本主题中,您在集群中部署一个示例应用程序。
先决条件
-
现有的 Kubernetes 集群至少有一个节点。如果没有现有 Amazon EKS 集群,可以根据 开始使用 Amazon EKS 指南部署一个集群。如果您正在部署 Windows 应用程序,必须为您的集群和至少一个 Amazon EC2 Windows 节点启用 Windows 支持。
-
安装在计算机上的
Kubectl
。有关更多信息,请参阅 安装或更新 kubectl。 -
Kubectl
配置为与集群通信。有关更多信息,请参阅为 Amazon EKS 集群创建或更新 kubeconfig 文件。 -
如果计划将示例工作负载部署到 Fargate,现有 Fargate 配置文件必须包含本教程创建的相同命名空间,即
eks-sample-app
,除非更改名称。如果使用入门指南创建集群,则必须创建新配置文件或将命名空间添加到现有配置文件,因为在入门指南中创建的配置文件没有指定本教程使用的命名空间。您的 VPC 还必须具有至少一个私有子网。
部署示例应用程序
尽管下列步骤中有许多变量都可以更改,但我们建议仅在指定的情况下更改变量值。更深入了解 Kubernetes pods、部署和服务后,可以尝试更改其他值。
-
创建命名空间。命名空间允许您在 Kubernetes 中对资源进行分组。有关更多信息,请参阅 Kubernetes 文档中的命名空间
。如果您计划将示例应用程序部署到 Amazon Fargate,请确保 Amazon Fargate 配置文件 中的 namespace
值为eks-sample-app
。kubectl create namespace eks-sample-app
-
创建 Kubernetes 部署。此示例部署从公共存储库中提取容器镜像,并将其三个副本(各个 pods)部署到您的集群中。有关更多信息,请参阅 Kubernetes 文档中的部署
。您可以将应用程序部署到 Linux 或 Windows 节点。如果部署到 Fargate,则只能部署 Linux 应用程序。 -
将以下内容保存到名为
eks-sample-deployment.yaml
的文件中。示例应用程序中的容器不使用网络存储,但可能有需要的应用程序。有关更多信息,请参阅存储。 -
将部署清单应用于集群。
kubectl apply -f eks-sample-deployment.yaml
-
-
创建服务。服务允许您通过单个 IP 地址或名称访问所有副本。有关更多信息,请参阅 Kubernetes 文档中的服务
。虽然没有在示例应用程序中实施,但如果应用程序需要与其他 Amazon 服务交互,我们建议为 pods 创建 Kubernetes 服务账户,然后将其关联到 Amazon IAM 账户。指定服务账户可使您的 pods 仅拥有为其指定的与其他服务交互的最低权限。有关更多信息,请参阅服务账户的 IAM 角色。 -
将以下内容保存到一个名为
eks-sample-service.yaml
的文件中。Kubernetes 为服务分配其自己的 IP 地址,该 IP 地址只能从集群内部访问。要从集群外部访问服务,请部署 Amazon Load Balancer Controller 以负载均衡服务的应用程序或网络流量。 -
将服务清单应用于集群。
kubectl apply -f eks-sample-service.yaml
-
-
查看
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 ClusterIP10.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 Autoscaler 和 Vertical Pod Autoscaler 进行此操作。
-
查看已部署服务的详细信息。如果您部署了 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 地址,其中,pods 属于服务的一部分。 -
在上一步查看命名空间时,查看输出中列出的一个 pods 的详细信息。如果部署了 Windows 应用程序,请将
替换为linux
windows
,将
替换为其中一个 pods 返回的值。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 块中为 pods 分配 IP 地址,则可以更改默认行为。有关更多信息,请参阅教程:自定义联网。您还可以看到 Kubernetes 调度器在 IP 地址为
的192.168.45.132
Node
上计划 pod。提示
无需使用命令行,即可在 Amazon Web Services Management Console 中查看 pods、服务、部署和其他 Kubernetes 资源的许多详细信息。有关更多信息,请参阅查看 Kubernetes 资源。
-
在上一步中描述的 pod 上运行 shell,将
替换为其中一个 pods 的 ID。65b7669776-m6qxz
-
在 pod shell 中,查看上一步中随部署一起安装的 Web 服务器的输出。您只需指定服务名称。默认情况下,CoreDNS 将其解析为服务的 IP 地址,该地址与 Amazon EKS 集群一起部署。
-
在 pod shell 中,查看 pod 的 DNS 服务器。
-
键入
exit
,与 pod 断开连接。 -
使用完示例应用程序后,您可以使用以下命令删除示例命名空间、服务和部署。
kubectl delete namespace eks-sample-app