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:
yaml spec: selector: app: pxe
- 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:
bash kubectl logs
- Verificar la Conectividad desde el Exterior del Cluster:
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 tipoClusterIP
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
- containerPort: 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