# Kubernetes 部署完整指南 Kubernetes 作为容器编排的事实标准,已经成为现代云原生应用部署的核心技术。本指南将从零开始,详细介绍 Kubernetes 集群的搭建、应用部署和服务管理的完整流程。 ## 概述 Kubernetes 是一个开源的容器编排平台,它能够自动化部署、扩展和管理容器化应用程序。通过 Kubernetes,您可以轻松管理大规模的容器集群,实现高可用性、自动扩展和滚动更新等企业级特性。 ## 前置要求 ### 1. 系统要求 - **操作系统**: Ubuntu 20.04+ / CentOS 7+ / RHEL 7+ - **CPU**: 至少 2 核 - **内存**: 至少 4GB RAM - **存储**: 至少 20GB 可用空间 - **网络**: 稳定的网络连接 ### 2. 软件依赖 - Docker 20.10+ 或 containerd 1.4+ - 支持的内核版本 (3.10+) - 禁用 swap 分区 - 配置防火墙规则 ## 集群搭建 ### 1. 安装 Docker ```bash # Ubuntu/Debian sudo apt-get update sudo apt-get install -y docker.io sudo systemctl enable docker sudo systemctl start docker # CentOS/RHEL sudo yum install -y docker sudo systemctl enable docker sudo systemctl start docker ``` ### 2. 安装 Kubernetes 组件 ```bash # 添加 Kubernetes 源 curl -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.list # 安装 kubeadm, kubelet 和 kubectl sudo apt-get update sudo apt-get install -y kubelet kubeadm kubectl sudo apt-mark hold kubelet kubeadm kubectl ``` ### 3. 初始化主节点 ```bash # 初始化集群 sudo kubeadm init --pod-network-cidr=10.244.0.0/16 # 配置 kubectl mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config # 安装网络插件 (Flannel) kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml ``` ### 4. 添加工作节点 ```bash # 在主节点上生成加入命令 kubeadm token create --print-join-command # 在工作节点上执行加入命令 sudo kubeadm join :6443 --token --discovery-token-ca-cert-hash ``` ## 应用部署 ### 1. 创建命名空间 ```yaml # namespace.yaml apiVersion: v1 kind: Namespace metadata: name: myapp labels: name: myapp ``` ```bash kubectl apply -f namespace.yaml ``` ### 2. 部署应用 #### 2.1 使用 Deployment ```yaml # deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment namespace: myapp spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.21 ports: - containerPort: 80 resources: requests: memory: "64Mi" cpu: "250m" limits: memory: "128Mi" cpu: "500m" ``` #### 2.2 使用 Service 暴露服务 ```yaml # service.yaml apiVersion: v1 kind: Service metadata: name: nginx-service namespace: myapp spec: selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 type: ClusterIP ``` #### 2.3 使用 Ingress 配置外部访问 ```yaml # ingress.yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: nginx-ingress namespace: myapp annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: rules: - host: myapp.example.com http: paths: - path: / pathType: Prefix backend: service: name: nginx-service port: number: 80 ``` ### 3. 应用配置管理 #### 3.1 使用 ConfigMap ```yaml # configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: app-config namespace: myapp data: app.properties: | database.url=jdbc:mysql://mysql:3306/myapp cache.enabled=true log.level=INFO ``` #### 3.2 使用 Secret ```yaml # secret.yaml apiVersion: v1 kind: Secret metadata: name: app-secret namespace: myapp type: Opaque data: username: YWRtaW4= # admin password: cGFzc3dvcmQ= # password ``` ## 服务管理 ### 1. 扩缩容 ```bash # 手动扩缩容 kubectl scale deployment nginx-deployment --replicas=5 # 自动扩缩容 (HPA) kubectl autoscale deployment nginx-deployment --cpu-percent=50 --min=1 --max=10 ``` ### 2. 滚动更新 ```bash # 更新镜像 kubectl set image deployment/nginx-deployment nginx=nginx:1.22 # 查看更新状态 kubectl rollout status deployment/nginx-deployment # 回滚到上一个版本 kubectl rollout undo deployment/nginx-deployment ``` ### 3. 健康检查 ```yaml # 在 Deployment 中添加健康检查 spec: template: spec: containers: - name: nginx image: nginx:1.21 livenessProbe: httpGet: path: / port: 80 initialDelaySeconds: 30 periodSeconds: 10 readinessProbe: httpGet: path: / port: 80 initialDelaySeconds: 5 periodSeconds: 5 ``` ## 监控与日志 ### 1. 资源监控 ```bash # 查看节点资源使用情况 kubectl top nodes # 查看 Pod 资源使用情况 kubectl top pods # 查看命名空间资源使用情况 kubectl top pods --namespace=myapp ``` ### 2. 日志管理 ```bash # 查看 Pod 日志 kubectl logs -n myapp # 实时跟踪日志 kubectl logs -f -n myapp # 查看多个容器的日志 kubectl logs -c -n myapp ``` ### 3. 事件监控 ```bash # 查看集群事件 kubectl get events --sort-by='.lastTimestamp' # 查看特定命名空间的事件 kubectl get events -n myapp --sort-by='.lastTimestamp' ``` ## 故障排除 ### 1. 常见问题诊断 #### Pod 无法启动 ```bash # 查看 Pod 状态 kubectl describe pod -n myapp # 查看 Pod 日志 kubectl logs -n myapp # 检查节点资源 kubectl describe node ``` #### 服务无法访问 ```bash # 检查 Service 配置 kubectl get svc -n myapp # 检查 Endpoints kubectl get endpoints -n myapp # 测试网络连通性 kubectl run test-connection --image=busybox --rm -it --restart=Never -- nslookup nginx-service ``` ### 2. 性能优化 #### 资源限制 ```yaml resources: requests: memory: "64Mi" cpu: "250m" limits: memory: "128Mi" cpu: "500m" ``` #### 节点亲和性 ```yaml affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/os operator: In values: - linux ``` ## 最佳实践 ### 1. 安全性 - 使用 RBAC 控制访问权限 - 定期更新 Kubernetes 版本 - 启用 Pod 安全策略 - 使用网络策略限制 Pod 间通信 ### 2. 可靠性 - 配置多个副本确保高可用 - 使用反亲和性分散 Pod 分布 - 实施健康检查和自动恢复 - 配置资源限制防止资源耗尽 ### 3. 可维护性 - 使用标签和注解组织资源 - 实施基础设施即代码 (IaC) - 建立监控和告警体系 - 定期备份集群配置 ## 总结 Kubernetes 提供了强大的容器编排能力,但同时也带来了复杂性和学习成本。通过本指南的学习,您应该能够: 1. 搭建一个基本的 Kubernetes 集群 2. 部署和管理容器化应用 3. 配置网络和服务发现 4. 实施监控和故障排除 5. 遵循最佳实践确保生产环境的稳定性 记住,Kubernetes 是一个不断发展的平台,建议您: - 保持对最新版本的关注 - 参与社区讨论和贡献 - 在实际项目中积累经验 - 持续学习和改进 --- *本文由 CloudPro 技术团队编写,如有疑问请联系我们。*