Services & Networking - Kubernetes Network Abstraction

Tổng quan

Services provide stable networking interface cho pods. Networking cho phép communication giữa pods và external traffic.

Services

ClusterIP (Default)

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
  - port: 80
    targetPort: 80
  type: ClusterIP

NodePort

Expose service trên static port của mỗi node.

LoadBalancer

Cloud provider load balancer.

ExternalName

Map service đến external DNS name.

Java Example: Creating a Service

Bạn có thể tạo một Kubernetes Service bằng Java sử dụng Fabric8 Kubernetes Client.

import io.fabric8.kubernetes.api.model.Service;
import io.fabric8.kubernetes.api.model.ServiceBuilder;
import io.fabric8.kubernetes.client.DefaultKubernetesClient;
import io.fabric8.kubernetes.client.KubernetesClient;

public class ServiceCreator {

    public static void main(String[] args) {
        try (KubernetesClient client = new DefaultKubernetesClient()) {
            String serviceName = "my-java-service";
            String appLabel = "my-app";

            Service service = new ServiceBuilder()
                    .withNewMetadata().withName(serviceName).endMetadata()
                    .withNewSpec()
                        .addNewPort()
                            .withProtocol("TCP")
                            .withPort(80)
                            .withTargetPort(new io.fabric8.kubernetes.api.model.IntOrString(8080))
                        .endPort()
                        .addToSelector("app", appLabel)
                        .withType("ClusterIP") // Can be LoadBalancer, NodePort, ExternalName
                    .endSpec()
                    .build();

            client.services().inNamespace("default").createOrReplace(service);
            System.out.println("Service " + serviceName + " created successfully!");

        } catch (Exception e) {
            System.err.println("Error creating service: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

Ingress

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx-service
            port:
              number: 80

Java Example: Creating an Ingress

import io.fabric8.kubernetes.api.model.networking.v1.Ingress;
import io.fabric8.kubernetes.api.model.networking.v1.IngressBuilder;
import io.fabric8.kubernetes.client.DefaultKubernetesClient;
import io.fabric8.kubernetes.client.KubernetesClient;

public class IngressCreator {

    public static void main(String[] args) {
        try (KubernetesClient client = new DefaultKubernetesClient()) {
            String ingressName = "my-java-ingress";
            String host = "my-app.example.com";
            String serviceName = "my-java-service";

            Ingress ingress = new IngressBuilder()
                    .withNewMetadata().withName(ingressName).endMetadata()
                    .withNewSpec()
                        .addNewRule()
                            .withHost(host)
                            .withNewHttp()
                                .addNewPath()
                                    .withPath("/")
                                    .withPathType("Prefix")
                                    .withNewBackend()
                                        .withNewService()
                                            .withName(serviceName)
                                            .withNewPort().withNumber(80).endPort()
                                        .endService()
                                    .endBackend()
                                .endPath()
                            .endHttp()
                        .endRule()
                    .endSpec()
                    .build();

            client.network().ingresses().inNamespace("default").createOrReplace(ingress);
            System.out.println("Ingress " + ingressName + " created successfully!");

        } catch (Exception e) {
            System.err.println("Error creating Ingress: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

Network Policies

Control traffic flow giữa pods.

DNS

Kubernetes DNS automatic service discovery.

CNI Plugins

  • Calico
  • Flannel
  • Weave
  • Cilium

Best Practices

  • Use Services cho pod communication
  • Configure Ingress cho external access
  • Implement Network Policies cho security
  • Monitor network performance

Networking Deep Dive và Troubleshooting

Pod-to-Pod Communication

Pods trong cùng một Node giao tiếp trực tiếp. Giữa các Node, giao tiếp được thực hiện thông qua CNI plugin.

Troubleshooting: - kubectl exec -it <pod-name> -- ping <target-pod-ip>: Kiểm tra kết nối IP. - kubectl exec -it <pod-name> -- nslookup <service-name>: Kiểm tra phân giải DNS. - Kiểm tra logs của CNI plugin pods trong kube-system namespace.

Service Discovery

Kubernetes DNS tạo các bản ghi DNS cho Services và Pods.

Troubleshooting: - kubectl get svc: Kiểm tra ClusterIP của Service. - kubectl describe svc <service-name>: Kiểm tra Endpoints của Service. - kubectl logs -n kube-system -l k8s-app=kube-dns: Kiểm tra logs của CoreDNS.

External Access (Ingress/LoadBalancer)

Troubleshooting: - Kiểm tra trạng thái của Ingress Controller (ví dụ: Nginx Ingress Controller, AWS ALB Ingress Controller). - Kiểm tra Security Groups và Network ACLs trên Cloud Provider. - Kiểm tra logs của Ingress Controller pod.

Network Policy Troubleshooting

Network Policies có thể chặn lưu lượng truy cập một cách không mong muốn.

Troubleshooting: - kubectl get networkpolicy: Liệt kê các Network Policies. - kubectl describe networkpolicy <policy-name>: Xem chi tiết policy. - Sử dụng các công cụ như netshoot hoặc debug container để kiểm tra kết nối từ bên trong Pod.

Next Steps

  1. 📚 Học về ConfigMaps & Secrets
  2. 🎯 Practice Ingress configuration
  3. 🏗️ Explore Network Policies
  4. 💻 Setup DNS testing

Nội dung đã được mở rộng với networking deep dive và troubleshooting guides, cùng các ví dụ Java.