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圣经

全部评论

相关推荐

最终还是婉拒了小红书的offer,厚着脸皮回了字节。其实这次字节不管是组内的氛围、HR的沟通体验,都比之前好太多,开的薪资也还算过得去,这些都是让我下定决心的原因之一。但最核心的,还是抵不住对Agent的兴趣,选择了Ai Coding这么一个方向。因为很多大佬讲过,在未来比较火的还是属于那些更加垂类的Agent,而Ai Coding恰好是Coding Agent这么一个领域,本质上还是程序员群体和泛程序员群体这个圈子的。目前也已经在提前实习,也是全栈这么一个岗位。就像最近阿里P10针对前端后端等等不再那么区分,确实在Agent方向不太区分这个。尤其是我们自己做AI Coding的内容,基本上90%左右的内容都是AI生成的,AI代码仓库贡献率也是我们的指标之一。有人说他不好用,那肯定是用的姿态不太对。基本上用对Skill、Rules 加上比较好的大模型基本都能Cover你的大部分需求,更别说Claude、Cursor这种目前看来Top水准的Coding工具了(叠甲:起码在我看来是这样)。所以不太区分的主要原因,还是针对一些例如Claude Code、Cursor、Trae、Codex、CC等一大堆,他们有很多新的概念和架构提出,我们往往需要快速验证(MVP版本)来看效果。而全栈就是这么快速验证的一个手段,加上Ai Coding的辅助,目前看起来问题不大(仅仅针对Agent而言)。而且Coding的产品形态往往是一个Plugin、Cli之类的,本质还是属于大前端领域。不过针对业务后端来看,区分还是有必要的。大家很多人也说Agent不就是Prompt提示词工程么?是的没错,本质上还是提示词。不过现在也衍生出一个新的Context Eneering,抽象成一种架构思想(类比框架、或者你们业务架构,参考商品有商品发布架构来提效)。本质还是提示词,但是就是能否最大化利用整个上下文窗口来提升效果,这个还是有很多探索空间和玩法的,例如Cursor的思想:上下文万物皆文件, CoWork之类的。后续也有一些Ralph Loop啥的,还有Coding里面的Coding Act姿态。这种才是比较核心的点,而不是你让AI生成的那提示词,然后调用了一下大模型那么简单;也不是dify、LangGraph搭建了一套workflow,从一个node走到另外一个node那么简单。Agent和WorkFLow还是两回事,大部分人也没能很好的区分这一点。不过很多人说AI泡沫啥啥啥的,我们ld也常把这句话挂在嘴边:“说AI泡沫还是太大了”诸如此类。我觉得在AI的时代,懂一点还是会好一点,所以润去字节了。目前的实习生活呢,除了修一些Tools的问题,还包括对比Claude、Cursor、Trae在某些源码实现思想上的点,看看能不能迁移过来,感觉还是比较有意思。不过目前组内还是主要Follow比较多,希望下一个阶段就做一些更有创新的事情哈哈。这就是一个牛马大学生的最终牧场,希望能好好的吧。说不定下次发的时候,正式AI泡沫结束,然后我又回归传统后端这么一个结局了。欢迎交流👏,有不对的🙅不要骂博主(浅薄的认知),可以私聊交流
码农索隆:和优秀的人,做有挑战的事
点赞 评论 收藏
分享
2025-12-11 14:24
门头沟学院 Java
牛客35720396...:不要用boss,全是骗
点赞 评论 收藏
分享
评论
3
4
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务