11.2 Kubernetes基础
面试重要程度:⭐⭐⭐⭐⭐
常见提问方式:Kubernetes的核心组件有哪些?Pod和Container的区别?
预计阅读时间:35分钟
📋 知识点概览
Kubernetes(K8s)是容器编排领域的事实标准,掌握其核心概念和实践对于现代Java开发者至关重要。本节将深入讲解K8s架构、核心资源对象以及服务发现机制。
🏗️ Kubernetes架构详解
集群架构组件
/** * Kubernetes集群架构 */ public class KubernetesArchitecture { /** * Master节点组件 */ public enum MasterComponent { API_SERVER("kube-apiserver", "集群的统一入口,提供RESTful API"), ETCD("etcd", "分布式键值存储,保存集群状态"), SCHEDULER("kube-scheduler", "负责Pod调度到合适的Node"), CONTROLLER_MANAGER("kube-controller-manager", "运行控制器进程"), CLOUD_CONTROLLER_MANAGER("cloud-controller-manager", "云平台相关控制器"); private final String name; private final String description; MasterComponent(String name, String description) { this.name = name; this.description = description; } } /** * Node节点组件 */ public enum NodeComponent { KUBELET("kubelet", "节点代理,管理Pod生命周期"), KUBE_PROXY("kube-proxy", "网络代理,实现Service负载均衡"), CONTAINER_RUNTIME("container-runtime", "容器运行时(Docker/containerd)"); private final String name; private final String description; NodeComponent(String name, String description) { this.name = name; this.description = description; } } /** * 集群网络组件 */ public static class NetworkComponents { public static final String[] CNI_PLUGINS = { "Flannel", // 简单的overlay网络 "Calico", // 支持网络策略的CNI "Weave Net", // 易于安装的网络方案 "Cilium", // 基于eBPF的高性能网络 "Antrea" // VMware开源的CNI插件 }; /** * 网络模型说明 */ public static void explainNetworkModel() { System.out.println("Kubernetes网络模型要求:"); System.out.println("1. 每个Pod都有独立的IP地址"); System.out.println("2. 同一Node上的Pod可以直接通信"); System.out.println("3. 不同Node上的Pod可以直接通信(无需NAT)"); System.out.println("4. Pod内的容器共享网络命名空间"); } } }
🚀 核心资源对象详解
Pod资源管理
# Pod配置示例 apiVersion: v1 kind: Pod metadata: name: spring-boot-app labels: app: spring-boot version: v1.0 annotations: description: "Spring Boot应用Pod" spec: # 重启策略 restartPolicy: Always # 节点选择器 nodeSelector: disktype: ssd # 容器配置 containers: - name: app image: myregistry/spring-boot-app:v1.0 ports: - containerPort: 8080 name: http # 资源限制 resources: requests: memory: "512Mi" cpu: "250m" limits: memory: "1Gi" cpu: "500m" # 环境变量 env: - name: SPRING_PROFILES_ACTIVE value: "prod" - name: DB_PASSWORD valueFrom: secretKeyRef: name: db-secret key: password # 健康检查 livenessProbe: httpGet: path: /actuator/health port: 8080 initialDelaySeconds: 30 periodSeconds: 10 timeoutSeconds: 5 failureThreshold: 3 readinessProbe: httpGet: path: /actuator/health/readiness port: 8080 initialDelaySeconds: 5 periodSeconds: 5 timeoutSeconds: 3 failureThreshold: 3 # 数据卷挂载 volumeMounts: - name: config-volume mountPath: /app/config - name: log-volume mountPath: /app/logs # 数据卷定义 volumes: - name: config-volume configMap: name: app-config - name: log-volume emptyDir: {} # Init容器 initContainers: - name: init-db image: busybox:1.35 command: ['sh', '-c', 'until nslookup db-service; do echo waiting for db; sleep 2; done;']
Deployment控制器
/** * Deployment资源管理 */ public class DeploymentManagement { /** * Deployment配置示例 */ public static String getDeploymentYaml() { return """ apiVersion: apps/v1 kind: Deployment metadata: name: spring-boot-deployment labels: app: spring-boot spec: # 副本数量 replicas: 3 # 选择器 selector: matchLabels: app: spring-boot # 更新策略 strategy: type: RollingUpdate rollingUpdate: maxUnavailable: 1 maxSurge: 1 # Pod模板 template: metadata: labels: app: spring-boot spec: containers: - name: app image: myregistry/spring-boot-app:v1.0 ports: - containerPort: 8080 resources: requests: memory: "512Mi" cpu: "250m" limits: memory: "1Gi" cpu: "500m" livenessProbe: httpGet: path: /actuator/health port: 8080 initialDelaySeconds: 30 periodSeconds: 10 readinessProbe: httpGet: path: /actuator/health/readiness port: 8080 initialDelaySeconds: 5 periodSeconds: 5 """; } /** * 滚动更新策略 */ public static class RollingUpdateStrategy { public static void performRollingUpdate() { String[] commands = { "# 更新镜像版本", "kubectl set image deployment/spring-boot-deployment app=myregistry/spring-boot-app:v2.0", "", "# 查看更新状态", "kubectl rollout status deployment/spring-boot-deployment", "", "# 查看更新历史", "kubectl rollout history deployment/spring-boot-deployment", "", "# 回滚到上一版本", "kubectl rollout undo deployment/spring-boot-deployment", "", "# 回滚到指定版本", "kubectl rollout undo deployment/spring-boot-deployment --to-revision=2", "", "# 暂停更新", "kubectl rollout pause deployment/spring-boot-deployment", "", "# 恢复更新", "kubectl rollout resume deployment/spring-boot-deployment" }; for (String command : commands) { System.out.println(command); } } } }
Service服务发现
# Service配置示例 apiVersion: v1 kind: Service metadata: name: spring-boot-service labels: app: spring-boot spec: # 服务类型 type: ClusterIP # ClusterIP/NodePort/LoadBalancer/ExternalName # 选择器 selector: app: spring-boot # 端口配置 ports: - name: http port: 80 targetPort: 8080 protocol: TCP # 会话亲和性 sessionAffinity: ClientIP sessionAffinityConfig: clientIP: timeoutSeconds: 10800 --- # NodePort Service示例 apiVersion: v1 kind: Service metadata: name: spring-boot-nodeport spec: type: NodePort selector: app: spring-boot ports: - port: 80 targetPort: 8080 nodePort: 30080 --- # LoadBalancer Service示例 apiVersion: v1 kind: Service metadata: name: spring-boot-lb spec: type: LoadBalancer selector: app: spring-boot ports: - port: 80 targetPort: 8080 loadBalancerSourceRanges: - 10.0.0.0/8
🔧 ConfigMap和Secret管理
配置管理最佳实践
/** * Kubernetes配置管理 */ public class ConfigurationManagement { /** * ConfigMap使用示例 */ public static class ConfigMapExample {
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
Java面试圣经 文章被收录于专栏
Java面试圣经,带你练透java圣经