我有一个EKS集群,我在其中添加了支持以在混合模式下工作(换句话说,我已经向其中添加了Fargate配置文件)。我的意图是仅在AWS Fargate上运行特定的工作负载,同时将EKS辅助节点保留用于其他类型的工作负载。

为了测试这一点,我的Fargate个人资料定义为:

  • 限于特定的 namespace (比方说: mynamespace )
  • 具有特定标签,以便 pods 需要与之匹配才能在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
    

    当我尝试应用此资源时,我得到以下信息:
    $ 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>
    

    Pod保持在Pending状态,并且从未调度到AWS Fargate实例。

    这是一个pod describe输出:
    $ 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>
    

    我可以从此输出得出的结论是,选择了正确的Fargate配置文件:
    eks.amazonaws.com/fargate-profile=myprofile
    

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

    在这种情况下,是否有任何想法或通常出现的问题值得我们进行故障排除?谢谢

    最佳答案

    事实证明,问题始终出在与Fargate配置文件关联的专用子网的网络设置中。

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

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

    0.0.0.0/0 nat-xxxxxxxx

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

    关于kubernetes - 尝试在AWS Fargate上安排Pod时,其停留在Pending状态,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59649086/

    10-11 07:16