尝试在 AWS Fargate 上安排 Pod 时,Pod 停留在 Pending 状态

Bak*_*vic 8 kubernetes aws-fargate amazon-eks

我有一个 EKS 集群,我添加了对在混合模式下工作的支持(换句话说,我向它添加了 Fargate 配置文件)。我的目的是只在 AWS Fargate 上运行特定的工作负载,同时为其他类型的工作负载保留 EKS 工作节点。

为了测试这一点,我的 Fargate 配置文件定义为:

  • 仅限于特定的命名空间(比方说:mynamespace
  • 具有特定标签,以便 pod 需要匹配它才能在 Fargate 上进行调度(标签是:fargate: myvalue

为了测试 k8s 资源,我正在尝试部署简单的 nginx 部署,如下所示:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: mynamespace
  labels:
    fargate: myvalue
spec:
  selector:
    matchLabels:
      app: nginx
      version: 1.7.9
      fargate: myvalue
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
        version: 1.7.9
        fargate: myvalue
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
Run Code Online (Sandbox Code Playgroud)

当我尝试应用此资源时,我得到以下信息:

$ kubectl get pods -n mynamespace -o wide
NAME                                                        READY   STATUS      RESTARTS   AGE     IP            NODE                          NOMINATED NODE                                READINESS GATES
nginx-deployment-596c594988-x9s6n                           0/1     Pending     0          10m     <none>        <none>                        07c651ad2b-7cf85d41b2424e529247def8bda7bf38   <none>
Run Code Online (Sandbox Code Playgroud)

Pod 保持 Pending 状态,并且永远不会安排到 AWS Fargate 实例。

这是一个 pod 描述输出:

$ kubectl describe pod nginx-deployment-596c594988-x9s6n -n mynamespace
Name:               nginx-deployment-596c594988-x9s6n
Namespace:          mynamespace
Priority:           2000001000
PriorityClassName:  system-node-critical
Node:               <none>
Labels:             app=nginx
                    eks.amazonaws.com/fargate-profile=myprofile
                    fargate=myvalue
                    pod-template-hash=596c594988
                    version=1.7.9
Annotations:        kubernetes.io/psp: eks.privileged
Status:             Pending
IP:
Controlled By:      ReplicaSet/nginx-deployment-596c594988
NominatedNodeName:  9e418415bf-8259a43075714eb3ab77b08049d950a8
Containers:
  nginx:
    Image:        nginx:1.7.9
    Port:         80/TCP
    Host Port:    0/TCP
    Environment:  <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-784d2 (ro)
Volumes:
  default-token-784d2:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-784d2
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:          <none>
Run Code Online (Sandbox Code Playgroud)

我可以从这个输出中得出的结论是选择了正确的 Fargate 配置文件:

eks.amazonaws.com/fargate-profile=myprofile
Run Code Online (Sandbox Code Playgroud)

另外,我看到一些值被添加到 NOMINATED NODE 字段,但不确定它代表什么。

在这种情况下,发生的任何想法或常见问题可能值得进行故障排除?谢谢

Bak*_*vic 8

事实证明,问题始终在于与 Fargate 配置文件关联的私有子网的网络设置。

为了提供更多信息,这是我最初拥有的:

  1. 具有多个工作节点的 EKS 集群,我仅将公共子网分配给 EKS 集群本身
  2. 当我尝试将 Fargate 配置文件添加到 EKS 集群时,由于 Fargate 当前的限制,无法将配置文件与公共子网关联。为了解决这个问题,我创建了与公共子网具有相同标签的私有子网,以便 EKS 集群知道它们
  3. 我忘记了我需要启用从 vpc 私有子网到外部世界的连接(我缺少 NAT 网关)。因此,我在与 EKS 关联的公共子网中创建了 NAT 网关,并在其关联的路由表中添加到私有子网的附加条目,如下所示:

    0.0.0.0/0 nat-xxxxxxxx

这解决了我上面遇到的问题,尽管我不确定 AWS Fargate 配置文件只需要与私有子网关联的真正原因。