Kubernetes概述与部署 Kubernetes概述与部署什么是Kubernetes想象一下你开了一家餐馆每天有成千上万的顾客点餐。如果只靠一个厨师做菜很快就会忙不过来而且一旦厨师生病整个餐馆就得停业。Kubernetes简称K8s就像是你的餐馆里那个智能的厨房管理系统它能自动调配多个厨师容器、处理顾客高峰期的加菜请求弹性扩展、在某个厨师请假时自动找人代替故障恢复并且保证每道菜都按照标准配方制作环境一致性。实际上Kubernetes是一个开源的容器编排平台由Google在2014年开源。它能够自动化地部署、扩展和管理容器化应用。所谓“容器化”就是像把应用程序及其依赖打包成一个轻量级、可移植的“盒子”这个盒子可以在任何地方运行——无论是你的笔记本电脑、数据中心的服务器还是云服务商的虚拟机。## Kubernetes的核心概念### Pod最小的部署单元Pod是Kubernetes中最基本的工作单元它包含一个或多个容器。这些容器共享网络和存储资源通常用于运行紧密耦合的进程。比如一个Web应用Pod可能同时包含Nginx和PHP-FPM两个容器。### Service稳定的网络入口由于Pod的IP地址会随生命周期变化Service提供了一种稳定的访问方式。它像一个负载均衡器将请求分发到一组功能相同的Pod上。### Deployment声明式的应用管理Deployment定义了应用的期望状态比如“我想要3个Nginx Pod正在运行”Kubernetes会自动确保实际状态与期望状态一致。如果你更新了镜像版本Deployment会逐步替换旧的Pod实现零停机部署。## Kubernetes的架构Kubernetes采用主从架构Master-Worker-Master节点控制平面负责集群管理。包含API Server集群入口、Scheduler调度Pod到节点、Controller Manager监控状态和etcd存储配置数据。-Worker节点实际运行Pod的机器。每个节点上有kubelet与Master通信、kube-proxy网络代理和容器运行时如Docker。## 部署Kubernetes集群下面我们通过两种方式来部署Kubernetes使用Minikube在本地快速搭建单节点集群适合学习和测试以及使用kubeadm在生产环境中部署多节点集群。### 方法一使用Minikube本地部署Minikube是Kubernetes官方提供的工具可以在本地虚拟机中运行一个单节点集群。以下是安装和启动步骤bash# 1. 安装Minikube以Linux为例curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64sudo install minikube-linux-amd64 /usr/local/bin/minikube# 2. 启动集群默认使用Docker驱动minikube start --driverdocker# 3. 验证集群状态kubectl cluster-info如果一切正常你会看到类似输出Kubernetes master is running at https://192.168.49.2:8443KubeDNS is running at https://192.168.49.2:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy### 方法二使用kubeadm部署多节点集群kubeadm是生产环境中最常用的部署工具。假设你有三台Ubuntu 20.04服务器1台Master2台Worker以下是部署步骤#### 1. 在所有节点上安装容器运行时和kubeadmbash# 安装Dockersudo apt-get updatesudo apt-get install -y docker.io# 安装kubeadm、kubelet和kubectlsudo apt-get update sudo apt-get install -y apt-transport-https curlcurl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -echo deb https://apt.kubernetes.io/ kubernetes-xenial main | sudo tee /etc/apt/sources.list.d/kubernetes.listsudo apt-get updatesudo apt-get install -y kubelet kubeadm kubectlsudo apt-mark hold kubelet kubeadm kubectl#### 2. 初始化Master节点在Master节点上执行bashsudo kubeadm init --pod-network-cidr10.244.0.0/16初始化完成后会输出类似信息Your Kubernetes control-plane has been initialized successfully!To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/configYou can now join any number of worker nodes by running the following on each as root:kubeadm join 192.168.1.100:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:...#### 3. 配置kubectl并安装网络插件bash# 配置kubectlmkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/config# 安装Calico网络插件使Pod之间可以通信kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.25/manifests/calico.yaml#### 4. 加入Worker节点在每个Worker节点上执行Master初始化时输出的join命令bashsudo kubeadm join 192.168.1.100:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:...#### 5. 验证集群状态在Master节点上运行bashkubectl get nodes你应该看到所有节点都是Ready状态NAME STATUS ROLES AGE VERSIONmaster-1 Ready control-plane,master 5m v1.28.2worker-1 Ready none 3m v1.28.2worker-2 Ready none 2m v1.28.2## 部署第一个应用现在让我们部署一个简单的Nginx Web服务器来验证集群是否正常工作。### 创建Deploymentyaml# nginx-deployment.yamlapiVersion: apps/v1kind: Deploymentmetadata: name: nginx-deployment # Deployment的名称spec: replicas: 3 # 期望运行3个Pod副本 selector: matchLabels: app: nginx # 选择器标签 template: metadata: labels: app: nginx # Pod的标签 spec: containers: - name: nginx # 容器名称 image: nginx:1.25 # 镜像版本 ports: - containerPort: 80 # 容器内的端口### 创建Serviceyaml# nginx-service.yamlapiVersion: v1kind: Servicemetadata: name: nginx-service # Service名称spec: type: NodePort # 通过节点IP端口访问 selector: app: nginx # 选择标签为appnginx的Pod ports: - port: 80 # Service的端口 targetPort: 80 # 转发到容器的端口 nodePort: 30080 # 节点上的端口范围30000-32767### 部署应用bash# 应用Deployment配置kubectl apply -f nginx-deployment.yaml# 应用Service配置kubectl apply -f nginx-service.yaml# 查看Pod状态kubectl get pods# 查看Service信息kubectl get svc# 测试访问使用任一Worker节点的IPcurl http://192.168.1.101:30080如果一切正常你会看到Nginx的默认欢迎页面。现在即使你删除一个PodKubernetes也会自动创建新的Pod来维持3个副本bashkubectl delete pod nginx-deployment-xxxxxkubectl get pods # 你会看到一个新的Pod正在启动## 总结Kubernetes是现代云原生应用的核心基础设施它解决了容器化应用部署和管理的核心难题自动化扩展、故障恢复、服务发现和滚动更新。通过本文我们学习了1.核心概念Pod、Service、Deployment的工作原理2.集群架构Master-Worker节点的协作机制3.部署方式从Minikube的快速测试到kubeadm的生产级部署4.实践操作成功部署了一个高可用的Nginx应用Kubernetes的学习曲线虽然陡峭但一旦掌握你将获得前所未有的应用管理能力。建议从Minikube开始逐步深入到生产级部署和高级功能如Ingress、Helm、Operator等。记住实践是最好的老师