在 Linux 上部署示例应用程序
在本主题中,您在 Linux 节点上的集群中部署一个示例应用程序。
先决条件
-
现有的 Kubernetes 集群至少有一个节点。如果没有现有 Amazon EKS 集群,可以根据 开始使用 Amazon EKS 中的指南之一部署一个集群。
-
安装在计算机上的
Kubectl
。有关更多信息,请参阅 设置 kubectl 和 eksctl。 -
Kubectl
配置为与集群通信。有关更多信息,请参阅 通过创建 kubeconfig 文件将 kubectl 连接到 EKS 集群。 -
如果计划将示例工作负载部署到 Fargate,现有 Fargate 配置文件必须包含本教程创建的相同命名空间,即
eks-sample-app
,除非更改名称。如果使用开始使用 Amazon EKS中的指南之一创建集群,则必须创建新配置文件或将命名空间添加到现有配置文件,因为在入门指南中创建的配置文件没有指定本教程使用的命名空间。您的 VPC 还必须具有至少一个私有子网。
尽管下列步骤中有许多变量都可以更改,但我们建议仅在指定的情况下更改变量值。更深入了解 Kubernetes Pods、部署和服务后,可以尝试更改其他值。
创建 命名空间
命名空间允许您在 Kubernetes 中对资源进行分组。有关更多信息,请参阅 Kubernetes 文档中的命名空间eks-sample-app
。
kubectl create namespace eks-sample-app
创建 Kubernetes 部署
创建 Kubernetes 部署。此示例部署从公共存储库中提取容器镜像,并将其三个副本(各个 Pods)部署到您的集群中。有关更多信息,请参阅 Kubernetes 文档中的部署
-
将以下内容保存到名为
eks-sample-deployment.yaml
的文件中。示例应用程序中的容器不使用网络存储,但可能有需要的应用程序。有关更多信息,请参阅 存储集群的应用程序数据。-
kubernetes.io/arch
键下的amd64
或arm64
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
-
-
将部署清单应用于集群。
kubectl apply -f eks-sample-deployment.yaml
创建服务
服务允许您通过单个 IP 地址或名称访问所有副本。有关更多信息,请参阅 Kubernetes 文档中的服务
-
将以下内容保存到一个名为
eks-sample-service.yaml
的文件中。Kubernetes 为服务分配其自己的 IP 地址,该 IP 地址只能从集群内部访问。要从集群外部访问服务,请部署 AWS Load Balancer Controller 以负载均衡服务的应用程序或网络流量。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
-
将服务清单应用于集群。
kubectl apply -f eks-sample-service.yaml
审核已创建的资源
-
查看
eks-sample-app
命名空间中存在的所有资源。kubectl get all -n eks-sample-app
示例输出如下。
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 Autoscaler 调整容器组(pod)资源和使用 Vertical Pod Autoscaler 调整容器组(pod)资源进行此操作。
-
查看已部署服务的详细信息。
kubectl -n eks-sample-app describe service eks-sample-linux-service
示例输出如下。
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 的详细信息。将
776d8f8fd8-78w66
替换为针对其中一个 Pods 返回的值。kubectl -n eks-sample-app describe pod eks-sample-linux-deployment-65b7669776-m6qxz
缩减的输出示例
Name: eks-sample-linux-deployment-65b7669776-m6qxz Namespace: eks-sample-app Priority: 0 Node: ip-192-168-45-132.us-west-2.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.us-west-2.compute.internal [...]
在之前的输出中,
IP:
值是一个唯一的 IP 地址,该 IP 地址从分配给节点所在子网的 CIDR 块中分配给 Pod。如果您希望从其他 CIDR 块中为 Pods 分配 IP 地址,则可以更改默认行为。有关更多信息,请参阅 使用自定义网络在备用子网中部署 pods。您还可以看到 Kubernetes 调度器在 IP 地址为192.168.45.132
的Node
上计划 Pod。提示
无需使用命令行,即可在 AWS Management Console 中查看 Pods、服务、部署和其他 Kubernetes 资源的许多详细信息。有关更多信息,请参阅 在 AWS Management Console中查看 Kubernetes 资源。
在容器组(pod)上运行 shell
-
在上一步中描述的 Pod 上运行 shell,将
65b7669776-m6qxz
替换为其中一个 Pods 的 ID。kubectl exec -it eks-sample-linux-deployment-65b7669776-m6qxz -n eks-sample-app -- /bin/bash
-
在 Pod shell 中,查看上一步中随部署一起安装的 Web 服务器的输出。您只需指定服务名称。默认情况下,CoreDNS 将其解析为服务的 IP 地址,该地址与 Amazon EKS 集群一起部署。
curl eks-sample-linux-service
示例输出如下。
<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> [...]
-
在 Pod shell 中,查看 Pod 的 DNS 服务器。
cat /etc/resolv.conf
示例输出如下。
nameserver 10.100.0.10 search eks-sample-app.svc.cluster.local svc.cluster.local cluster.local us-west-2.compute.internal options ndots:5
在之前的输出中,
10.100.0.10
自动分配为部署到集群的所有 Pods 的nameserver
。 -
键入
exit
,与 Pod 断开连接。 -
使用完示例应用程序后,您可以使用以下命令删除示例命名空间、服务和部署。
kubectl delete namespace eks-sample-app
后续步骤
部署示例应用程序后,您可能想尝试以下其中一些练习: