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
- 📚 Học về ConfigMaps & Secrets
- 🎯 Practice Ingress configuration
- 🏗️ Explore Network Policies
- 💻 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.