servidor tftp en conexión minikube no funciona

Estoy en el proceso de convertir mi configuración de pólvora en minikube, esta es la primera vez que estoy usando minikube/kubernetes así que podría ser algo obvio

Una de mis imágenes de docker era un servidor tftp para una bota de pxe. Estoy tratando de conseguir que el puerto UDP reenvíe funcionando pero no tener mucho éxito.

Tengo minikube corriendo con el addon de entrada habilitado y el siguiente config:

implementación yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: pxe
  name: pxe
  namespace: home
spec:
  replicas: 1
  selector:
    matchLabels:
      app: pxe
  template:
    metadata:
      labels:
        app: pxe
    spec:
      volumes:
      - name: pxe-storage
        hostPath:
          path: /storage/pxe/tftp
          type: Directory
      containers:
      - image: pghalliday/tftp:latest
        name: pxe
        ports:
        - containerPort: 69
          protocol: UDP
          name: pxe
        volumeMounts:
        - name: pxe-storage
          mountPath: /var/tftpboot

servicio yaml:

apiVersion: v1
kind: Service
metadata:
  name: pxe
  namespace: home
spec:
  selector:
    app: pxe
  type: ClusterIP
  ports:
    - name: udp-port
      port: 69
      targetPort: 69
      protocol: UDP

ingress patch:

spec:
  template:
    spec:
      containers:
      - name: controller
        ports:
         - containerPort: 69
           hostPort: 69
           protocol: UDP

Haciendo lo siguiente:

kubectl create namespace home
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
kubectl patch configmap udp-services -n kube-system --patch '{"data":{"69":"home/pxe:69"}}'
kubectl patch deployment ingress-nginx-controller --patch "$(cat patch.yaml)" -n kube-system

La conexión nunca funciona:

$ tftp `minikube ip`
tftp> get test.txt
Transfer timed out.

La cápsula del servidor tftp funciona, puede acceder desde dentro del cluster:

$ minikube ssh
$ $ tftp -g -r test.txt  172.17.0.2
tftp: server error: (1) File not found

Editar:

En respuesta a @mario sus preguntas:

Modificó el parche para incluir el protocolo como por defecto era TCP y debería haber sido UDP, pero incluso después del cambio no hay suerte :(

$ kubectl get configmaps udp-services -o yaml -n kube-system
apiVersion: v1
data:
  "69": home/pxe:69
kind: ConfigMap
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","kind":"ConfigMap","metadata":{"annotations":{},"labels":{"addonmanager.kubernetes.io/mode":"EnsureExists"},"name":"udp-services","namespace":"kube-system"}}
  creationTimestamp: "2020-12-17T16:30:41Z"
  labels:
    addonmanager.kubernetes.io/mode: EnsureExists
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:metadata:
        f:annotations:
          .: {}
          f:kubectl.kubernetes.io/last-applied-configuration: {}
        f:labels:
          .: {}
          f:addonmanager.kubernetes.io/mode: {}
    manager: kubectl-client-side-apply
    operation: Update
    time: "2020-12-17T16:30:41Z"
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:data:
        .: {}
        f:69: {}
    manager: kubectl-patch
    operation: Update
    time: "2020-12-17T16:31:58Z"
  name: udp-services
  namespace: kube-system
  resourceVersion: "601"
  selfLink: /api/v1/namespaces/kube-system/configmaps/udp-services
  uid: c913188f-3390-4b09-a1ab-e2f4105744fa

Espero que esto no sea demasiado largo:

$ kubectl get deployment ingress-nginx-controller -o yaml -n kube-system
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "3"
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"labels":{"addonmanager.kubernetes.io/mode":"Reconcile","app.kubernetes.io/component":"controller","app.kubernetes.io/instance":"ingress-nginx","app.kubernetes.io/name":"ingress-nginx","app.kubernetes.io/part-of":"kube-system"},"name":"ingress-nginx-controller","namespace":"kube-system"},"spec":{"replicas":1,"selector":{"matchLabels":{"app.kubernetes.io/component":"controller","app.kubernetes.io/instance":"ingress-nginx","app.kubernetes.io/name":"ingress-nginx"}},"strategy":{"rollingUpdate":{"maxSurge":1,"maxUnavailable":1},"type":"RollingUpdate"},"template":{"metadata":{"labels":{"addonmanager.kubernetes.io/mode":"Reconcile","app.kubernetes.io/component":"controller","app.kubernetes.io/instance":"ingress-nginx","app.kubernetes.io/name":"ingress-nginx","gcp-auth-skip-secret":"true"}},"spec":{"containers":[{"args":["/nginx-ingress-controller","--configmap=$(POD_NAMESPACE)/nginx-load-balancer-conf","--report-node-internal-ip-address","--tcp-services-configmap=$(POD_NAMESPACE)/tcp-services","--udp-services-configmap=$(POD_NAMESPACE)/udp-services","--validating-webhook=:8443","--validating-webhook-certificate=/usr/local/certificates/cert","--validating-webhook-key=/usr/local/certificates/key"],"env":[{"name":"POD_NAME","valueFrom":{"fieldRef":{"fieldPath":"metadata.name"}}},{"name":"POD_NAMESPACE","valueFrom":{"fieldRef":{"fieldPath":"metadata.namespace"}}}],"image":"us.gcr.io/k8s-artifacts-prod/ingress-nginx/controller:v0.40.2","imagePullPolicy":"IfNotPresent","lifecycle":{"preStop":{"exec":{"command":["/wait-shutdown"]}}},"livenessProbe":{"failureThreshold":3,"httpGet":{"path":"/healthz","port":10254,"scheme":"HTTP"},"initialDelaySeconds":10,"periodSeconds":10,"successThreshold":1,"timeoutSeconds":1},"name":"controller","ports":[{"containerPort":80,"hostPort":80,"name":"http","protocol":"TCP"},{"containerPort":443,"hostPort":443,"name":"https","protocol":"TCP"},{"containerPort":8443,"name":"webhook","protocol":"TCP"}],"readinessProbe":{"failureThreshold":3,"httpGet":{"path":"/healthz","port":10254,"scheme":"HTTP"},"initialDelaySeconds":10,"successThreshold":1,"timeoutSeconds":1},"resources":{"requests":{"cpu":"100m","memory":"90Mi"}},"securityContext":{"allowPrivilegeEscalation":true,"capabilities":{"add":["NET_BIND_SERVICE"],"drop":["ALL"]},"runAsUser":101},"volumeMounts":[{"mountPath":"/usr/local/certificates/","name":"webhook-cert","readOnly":true}]}],"serviceAccountName":"ingress-nginx","volumes":[{"name":"webhook-cert","secret":{"secretName":"ingress-nginx-admission"}}]}}}}
  creationTimestamp: "2020-12-17T16:30:41Z"
  generation: 3
  labels:
    addonmanager.kubernetes.io/mode: Reconcile
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: kube-system
  managedFields:
  - apiVersion: apps/v1
    fieldsType: FieldsV1
    fieldsV1:
      f:metadata:
        f:annotations:
          .: {}
          f:kubectl.kubernetes.io/last-applied-configuration: {}
        f:labels:
          .: {}
          f:addonmanager.kubernetes.io/mode: {}
          f:app.kubernetes.io/component: {}
          f:app.kubernetes.io/instance: {}
          f:app.kubernetes.io/name: {}
          f:app.kubernetes.io/part-of: {}
      f:spec:
        f:progressDeadlineSeconds: {}
        f:replicas: {}
        f:revisionHistoryLimit: {}
        f:selector:
          f:matchLabels:
            .: {}
            f:app.kubernetes.io/component: {}
            f:app.kubernetes.io/instance: {}
            f:app.kubernetes.io/name: {}
        f:strategy:
          f:rollingUpdate:
            .: {}
            f:maxSurge: {}
            f:maxUnavailable: {}
          f:type: {}
        f:template:
          f:metadata:
            f:labels:
              .: {}
              f:addonmanager.kubernetes.io/mode: {}
              f:app.kubernetes.io/component: {}
              f:app.kubernetes.io/instance: {}
              f:app.kubernetes.io/name: {}
              f:gcp-auth-skip-secret: {}
          f:spec:
            f:containers:
              k:{"name":"controller"}:
                .: {}
                f:args: {}
                f:env:
                  .: {}
                  k:{"name":"POD_NAME"}:
                    .: {}
                    f:name: {}
                    f:valueFrom:
                      .: {}
                      f:fieldRef:
                        .: {}
                        f:apiVersion: {}
                        f:fieldPath: {}
                  k:{"name":"POD_NAMESPACE"}:
                    .: {}
                    f:name: {}
                    f:valueFrom:
                      .: {}
                      f:fieldRef:
                        .: {}
                        f:apiVersion: {}
                        f:fieldPath: {}
                f:image: {}
                f:imagePullPolicy: {}
                f:lifecycle:
                  .: {}
                  f:preStop:
                    .: {}
                    f:exec:
                      .: {}
                      f:command: {}
                f:livenessProbe:
                  .: {}
                  f:failureThreshold: {}
                  f:httpGet:
                    .: {}
                    f:path: {}
                    f:port: {}
                    f:scheme: {}
                  f:initialDelaySeconds: {}
                  f:periodSeconds: {}
                  f:successThreshold: {}
                  f:timeoutSeconds: {}
                f:name: {}
                f:ports:
                  .: {}
                  k:{"containerPort":80,"protocol":"TCP"}:
                    .: {}
                    f:containerPort: {}
                    f:hostPort: {}
                    f:name: {}
                    f:protocol: {}
                  k:{"containerPort":443,"protocol":"TCP"}:
                    .: {}
                    f:containerPort: {}
                    f:hostPort: {}
                    f:name: {}
                    f:protocol: {}
                  k:{"containerPort":8443,"protocol":"TCP"}:
                    .: {}
                    f:containerPort: {}
                    f:name: {}
                    f:protocol: {}
                f:readinessProbe:
                  .: {}
                  f:failureThreshold: {}
                  f:httpGet:
                    .: {}
                    f:path: {}
                    f:port: {}
                    f:scheme: {}
                  f:initialDelaySeconds: {}
                  f:periodSeconds: {}
                  f:successThreshold: {}
                  f:timeoutSeconds: {}
                f:resources:
                  .: {}
                  f:requests:
                    .: {}
                    f:cpu: {}
                    f:memory: {}
                f:securityContext:
                  .: {}
                  f:allowPrivilegeEscalation: {}
                  f:capabilities:
                    .: {}
                    f:add: {}
                    f:drop: {}
                  f:runAsUser: {}
                f:terminationMessagePath: {}
                f:terminationMessagePolicy: {}
                f:volumeMounts:
                  .: {}
                  k:{"mountPath":"/usr/local/certificates/"}:
                    .: {}
                    f:mountPath: {}
                    f:name: {}
                    f:readOnly: {}
            f:dnsPolicy: {}
            f:restartPolicy: {}
            f:schedulerName: {}
            f:securityContext: {}
            f:serviceAccount: {}
            f:serviceAccountName: {}
            f:terminationGracePeriodSeconds: {}
            f:volumes:
              .: {}
              k:{"name":"webhook-cert"}:
                .: {}
                f:name: {}
                f:secret:
                  .: {}
                  f:defaultMode: {}
                  f:secretName: {}
    manager: kubectl-client-side-apply
    operation: Update
    time: "2020-12-17T16:30:41Z"
  - apiVersion: apps/v1
    fieldsType: FieldsV1
    fieldsV1:
      f:metadata:
        f:annotations:
          f:deployment.kubernetes.io/revision: {}
      f:status:
        f:conditions:
          .: {}
          k:{"type":"Available"}:
            .: {}
            f:lastTransitionTime: {}
            f:lastUpdateTime: {}
            f:message: {}
            f:reason: {}
            f:status: {}
            f:type: {}
          k:{"type":"Progressing"}:
            .: {}
            f:lastTransitionTime: {}
            f:lastUpdateTime: {}
            f:message: {}
            f:reason: {}
            f:status: {}
            f:type: {}
        f:observedGeneration: {}
        f:replicas: {}
        f:unavailableReplicas: {}
        f:updatedReplicas: {}
    manager: kube-controller-manager
    operation: Update
    time: "2020-12-17T16:42:08Z"
  - apiVersion: apps/v1
    fieldsType: FieldsV1
    fieldsV1:
      f:spec:
        f:template:
          f:spec:
            f:containers:
              k:{"name":"controller"}:
                f:ports:
                  k:{"containerPort":69,"protocol":"UDP"}:
                    .: {}
                    f:containerPort: {}
                    f:hostPort: {}
                    f:protocol: {}
    manager: kubectl-patch
    operation: Update
    time: "2020-12-17T16:42:08Z"
  name: ingress-nginx-controller
  namespace: kube-system
  resourceVersion: "1178"
  selfLink: /apis/apps/v1/namespaces/kube-system/deployments/ingress-nginx-controller
  uid: cfead3f0-f9ae-4887-a4fe-5741a8681e39
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app.kubernetes.io/component: controller
      app.kubernetes.io/instance: ingress-nginx
      app.kubernetes.io/name: ingress-nginx
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        addonmanager.kubernetes.io/mode: Reconcile
        app.kubernetes.io/component: controller
        app.kubernetes.io/instance: ingress-nginx
        app.kubernetes.io/name: ingress-nginx
        gcp-auth-skip-secret: "true"
    spec:
      containers:
      - args:
        - /nginx-ingress-controller
        - --configmap=$(POD_NAMESPACE)/nginx-load-balancer-conf
        - --report-node-internal-ip-address
        - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
        - --udp-services-configmap=$(POD_NAMESPACE)/udp-services
        - --validating-webhook=:8443
        - --validating-webhook-certificate=/usr/local/certificates/cert
        - --validating-webhook-key=/usr/local/certificates/key
        env:
        - name: POD_NAME
          valueFrom:
            fieldRef:
              apiVersion: v1
              fieldPath: metadata.name
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              apiVersion: v1
              fieldPath: metadata.namespace
        image: us.gcr.io/k8s-artifacts-prod/ingress-nginx/controller:v0.40.2
        imagePullPolicy: IfNotPresent
        lifecycle:
          preStop:
            exec:
              command:
              - /wait-shutdown
        livenessProbe:
          failureThreshold: 3
          httpGet:
            path: /healthz
            port: 10254
            scheme: HTTP
          initialDelaySeconds: 10
          periodSeconds: 10
          successThreshold: 1
          timeoutSeconds: 1
        name: controller
        ports:
        - containerPort: 69
          hostPort: 69
          protocol: UDP
        - containerPort: 80
          hostPort: 80
          name: http
          protocol: TCP
        - containerPort: 443
          hostPort: 443
          name: https
          protocol: TCP
        - containerPort: 8443
          name: webhook
          protocol: TCP
        readinessProbe:
          failureThreshold: 3
          httpGet:
            path: /healthz
            port: 10254
            scheme: HTTP
          initialDelaySeconds: 10
          periodSeconds: 10
          successThreshold: 1
          timeoutSeconds: 1
        resources:
          requests:
            cpu: 100m
            memory: 90Mi
        securityContext:
          allowPrivilegeEscalation: true
          capabilities:
            add:
            - NET_BIND_SERVICE
            drop:
            - ALL
          runAsUser: 101
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /usr/local/certificates/
          name: webhook-cert
          readOnly: true
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      serviceAccount: ingress-nginx
      serviceAccountName: ingress-nginx
      terminationGracePeriodSeconds: 30
      volumes:
      - name: webhook-cert
        secret:
          defaultMode: 420
          secretName: ingress-nginx-admission
status:
  conditions:
  - lastTransitionTime: "2020-12-17T16:30:41Z"
    lastUpdateTime: "2020-12-17T16:30:41Z"
    message: Deployment has minimum availability.
    reason: MinimumReplicasAvailable
    status: "True"
    type: Available
  - lastTransitionTime: "2020-12-17T16:30:41Z"
    lastUpdateTime: "2020-12-17T16:42:08Z"
    message: ReplicaSet "ingress-nginx-controller-c9b778c5c" is progressing.
    reason: ReplicaSetUpdated
    status: "True"
    type: Progressing
  observedGeneration: 3
  replicas: 1
  unavailableReplicas: 1
  updatedReplicas: 1

Pregunta hecha hace 3 años, 5 meses, 6 días - Por stackscripter


2 Respuestas:

  • El problema podría estar en la configuración en el servicio y en la patch de UDP. Aquí hay algunas sugerencias para solucionar el problema:

    • Corregir el YAML del Servicio:
    En el YAML del servicio, asegúrate de que el selector coincida con las etiquetas de la implementación. Actualmente, estás utilizando 'app: pxe' como selector en la implementación, por lo que el selector en el servicio debe ser:
    yaml
       spec:
         selector:
           app: pxe
       

    • Actualizar la Configuración de UDP en el ConfigMap:
    Parece que estás intentando configurar la redirección de UDP en un ConfigMap. Puedes intentar actualizar la configuración de UDP en el ConfigMap udp-services para que apunte al servicio correcto. Asegúrate de que estés utilizando el nombre de servicio y puerto correcto en la configuración.
    bash
       kubectl patch configmap udp-services -n kube-system --patch '{"data":{"69":"home/pxe:udp-port"}}'
       

    • Revisar los Pods Desplegados:
    Verifica que el pod de tu servidor TFTP está funcionando correctamente y que no muestra ningún error en los registros. Puedes verificar los registros del pod ejecutando:
    bash
       kubectl logs 
       

    • Verificar la Conectividad desde el Exterior del Cluster:
    Intente conectarse al servidor TFTP desde fuera del cluster utilizando el comando tftp en tu máquina local. Asegúrate de que estás utilizando la IP correcta de Minikube para la conexión:
    bash
       tftp 
       tftp> get test.txt
       

    Intenta seguir estos pasos y verifica si puedes resolver el problema con el servidor TFTP en tu implementación de Minikube. Si sigues teniendo problemas, proporciona más información sobre los errores o mensajes de registro específicos para que pueda ayudarte mejor.

    Respondida el Dec 17, 2020 a las 21:45 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Problema:

    El servidor TFTP en Minikube no responde a las conexiones UDP.

    Posibles soluciones:

    1. Verifica la configuración de la entrada:

    Asegúrate de que el servicio pxe de tipo ClusterIP esté expuesto a través de un ingreso. Verifica que el puerto UDP 69 esté incluido en el parche de ingreso.

    2. Verifica la configuración de los puertos:

    Confirma que el contenedor TFTP está escuchando en el puerto UDP 69, como se indica en el manifiesto de implementación. Verifica que el servicio pxe esté configurado para redirigir el tráfico al puerto UDP 69 del pod TFTP.

    3. Comprueba la conectividad de red:

    Asegúrate de que los pods de TFTP y Nginx-Ingress puedan comunicarse entre sí en el clúster de Minikube. Verifica si hay reglas o políticas de firewall que bloqueen el tráfico UDP entre los pods.

    4. Actualiza el parche de ingreso:

    Intenta cambiar el parche de ingreso a:

    
    spec:
      template:
        spec:
          containers:
             
    • name: controller
    ports:
    • containerPort: 69
    protocol: UDP hostPort: 69

    5. Reinicia los pods:

    Elimina y vuelve a crear los pods de TFTP y Nginx-Ingress para descartar cualquier problema de estado. Puedes hacer esto ejecutando los siguientes comandos:

    
    kubectl delete pod -l app=pxe
    kubectl delete pod -l app.kubernetes.io/name=ingress-nginx
    kubectl apply -f deployment.yaml
    kubectl apply -f service.yaml
    

    6. Comprueba los registros:

    Revisa los registros de los pods de TFTP y Nginx-Ingress para obtener información sobre errores o anomalías.

    Nota:

    Asegúrate de utilizar la versión correcta del manifiesto de ingreso, ya que las versiones anteriores pueden tener problemas con los puertos UDP. Si estás utilizando un registro DNS externo, verifica que esté configurado correctamente y que apunte a la dirección IP correcta de Minikube.

    Respondida el Dec 17, 2020 a las 21:52 - por Gemini

    Votos positivos: 0 | Votos negativos: 0