How to solve the issue if the 404 default backend is in the Kubernetes cluster?
I am currently working on a particular task that is related to the Kubernetes cluster. While going through the workflow I have noticed that requests to my application sometimes return a 404 error. This error message usually indicates that the “default backend” is serving these requests. Explain to me how can I troubleshoot and resolve this particular issue.
In the context of DevOps, here are the steps given for how you can troubleshoot and resolve this particular issue:-
Checking ingress rules
First, you would need to inspect the ingress resources to ensure that the path and also the host rules are correctly defined or not.
Kubectl get ingress -n -o yaml
Verify the hostnames and paths
You should also ensure that the requested URL hostnames and path should match the ingress rules.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
spec:
rules:
Host: “example.com”
http:
paths:
Path: /app
pathType: Prefix
backend:
service:
name: example-service
port:
number: 80
Checking service Configuration
You should try to ensure that the service band endpoint is correctly Configured and try service points to the right pods.
Kubectl get svc -n
Kubectl get endpoints -n
Inspect Ingress controller logs
You should check the logs for the ingress controller to see if there are any errors or issues.
Kubectl logs -l app= -n
Testing the connectivity
You can test the connectivity to the service from within the cluster.
Kubectl exec -it -- curl http://..svc.cluster.local:
DNS and hostname verification
You should try to verify the DNS settings and try to ensure that the domain name points to the correct IP address of the ingress controller.
Here is a java based example given below which would demonstrate how you can troubleshoot and resolve the issue:-
Import io.kubernetes.client.openapi.ApiClient;
Import io.kubernetes.client.openapi.ApiException;
Import io.kubernetes.client.openapi.Configuration;
Import io.kubernetes.client.openapi.apis.CoreV1Api;
Import io.kubernetes.client.openapi.models.V1Service;
Import io.kubernetes.client.openapi.models.V1ServiceList;
Import io.kubernetes.client.util.Config;
Import java.io.IOException;
Import java.util.List;
Public class KubernetesIngressTroubleshooting {
Public static void main(String[] args) {
String namespace = “default”;
String ingressName = “example-ingress”;
String serviceName = “example-service”;
Try {
// Initialize Kubernetes client
ApiClient client = Config.defaultClient();
Configuration.setDefaultApiClient(client);
// Retrieve and print Ingress resource
String ingressYaml = getIngressYaml(namespace, ingressName);
System.out.println(“Current Ingress YAML:”);
System.out.println(ingressYaml);
// Check services in the namespace
List services = listServices(namespace);
System.out.println(“
Services in namespace “ + namespace + “:”);
For (V1Service service : services) {
System.out.println(“ – “ + service.getMetadata().getName());
}
// Troubleshoot by checking logs of the Ingress controller
String ingressControllerPodLabel = “ingress-nginx-controller”;
String controllerLogs = getIngressControllerLogs(namespace, ingressControllerPodLabel);
System.out.println(“
Ingress Controller Logs:”);
System.out.println(controllerLogs);
// Test connectivity to the service from within a pod
String podName = “example-pod”;
String curlCommand = “kubectl exec -it “ + podName + “ – curl http://” + serviceName + “.” + namespace + “.svc.cluster.local”;
System.out.println(“
Command to test connectivity:”);
System.out.println(curlCommand);
} catch (IOException | ApiException e) {
System.err.println(“Exception occurred: “ + e.getMessage());
e.printStackTrace();
}
}
Private static String getIngressYaml(String namespace, String ingressName) throws ApiException {
Return executeCommand(“kubectl get ingress “ + ingressName + “ -n “ + namespace + “ -o yaml”);
}
Private static List listServices(String namespace) throws ApiException {
CoreV1Api api = new CoreV1Api();
V1ServiceList serviceList = api.listNamespacedService(namespace, null, null, null, null, null, null, null, null);
Return serviceList.getItems();
}
Private static String getIngressControllerLogs(String namespace, String podLabel) throws ApiException {
Return executeCommand(“kubectl logs -l app=” + podLabel + “ -n “ + namespace);
}
Private static String executeCommand(String command) {
// Placeholder for executing shell commands, e.g., using ProcessBuilder
// For simplicity, this example assumes command execution and returns output as String
Return “Command execution result for: “ + command;
}
}