# NGINX Kubernetes 部署 Makefile # 简化部署操作和管理 # 默认配置 HARBOR_REGISTRY ?= harbor.example.com HARBOR_USERNAME ?= your-username HARBOR_PASSWORD ?= your-password NGINX_IMAGE_TAG ?= latest NAMESPACE ?= default DEPLOYMENT_FILE ?= ./nginx-deployment.yaml # 颜色输出 RED := \033[0;31m GREEN := \033[0;32m YELLOW := \033[1;33m BLUE := \033[0;34m NC := \033[0m # No Color .PHONY: help deploy clean status logs port-forward scale update rollback check-env install-deps # 默认目标 help: ## 显示帮助信息 @echo "$(BLUE)NGINX Kubernetes 部署工具$(NC)" @echo "" @echo "$(YELLOW)可用命令:$(NC)" @awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf " $(GREEN)%-15s$(NC) %s\n", $$1, $$2}' $(MAKEFILE_LIST) @echo "" @echo "$(YELLOW)环境变量:$(NC)" @echo " HARBOR_REGISTRY Harbor 仓库地址 (当前: $(HARBOR_REGISTRY))" @echo " HARBOR_USERNAME Harbor 用户名 (当前: $(HARBOR_USERNAME))" @echo " HARBOR_PASSWORD Harbor 密码 (已设置: $(if $(HARBOR_PASSWORD),是,否))" @echo " NGINX_IMAGE_TAG 镜像标签 (当前: $(NGINX_IMAGE_TAG))" @echo " NAMESPACE 命名空间 (当前: $(NAMESPACE))" check-env: ## 检查环境变量 @echo "$(BLUE)[INFO]$(NC) 检查必要的环境变量..." @if [ -z "$(HARBOR_REGISTRY)" ]; then echo "$(RED)[ERROR]$(NC) HARBOR_REGISTRY 未设置"; exit 1; fi @if [ -z "$(HARBOR_USERNAME)" ]; then echo "$(RED)[ERROR]$(NC) HARBOR_USERNAME 未设置"; exit 1; fi @if [ -z "$(HARBOR_PASSWORD)" ]; then echo "$(RED)[ERROR]$(NC) HARBOR_PASSWORD 未设置"; exit 1; fi @if [ -z "$(NGINX_IMAGE_TAG)" ]; then echo "$(RED)[ERROR]$(NC) NGINX_IMAGE_TAG 未设置"; exit 1; fi @echo "$(GREEN)[SUCCESS]$(NC) 环境变量检查通过" install-deps: ## 安装必要的依赖工具 @echo "$(BLUE)[INFO]$(NC) 检查并安装必要的工具..." @which kubectl > /dev/null || (echo "$(RED)[ERROR]$(NC) kubectl 未安装" && exit 1) @echo "$(GREEN)[SUCCESS]$(NC) 所有必要工具已安装" deploy: check-env install-deps ## 部署 NGINX 到 Kubernetes @echo "$(BLUE)[INFO]$(NC) 开始部署 NGINX 到 Kubernetes..." @cd k8s && chmod +x deploy.sh && \ HARBOR_REGISTRY=$(HARBOR_REGISTRY) \ HARBOR_USERNAME=$(HARBOR_USERNAME) \ HARBOR_PASSWORD=$(HARBOR_PASSWORD) \ NGINX_IMAGE_TAG=$(NGINX_IMAGE_TAG) \ NAMESPACE=$(NAMESPACE) \ ./deploy.sh status: ## 查看部署状态 @echo "$(BLUE)[INFO]$(NC) 查看 NGINX 部署状态..." @echo "" @echo "$(YELLOW)=== Pods ===$(NC)" @kubectl get pods -l app=nginx -n $(NAMESPACE) -o wide || true @echo "" @echo "$(YELLOW)=== Services ===$(NC)" @kubectl get services -l app=nginx -n $(NAMESPACE) || true @echo "" @echo "$(YELLOW)=== Deployments ===$(NC)" @kubectl get deployments -l app=nginx -n $(NAMESPACE) || true @echo "" @echo "$(YELLOW)=== HPA ===$(NC)" @kubectl get hpa -l app=nginx -n $(NAMESPACE) 2>/dev/null || echo "HPA 未启用" logs: ## 查看 NGINX Pod 日志 @echo "$(BLUE)[INFO]$(NC) 查看 NGINX Pod 日志..." @kubectl logs -l app=nginx -n $(NAMESPACE) -f --all-containers=true port-forward: ## 设置端口转发以便本地访问 @echo "$(BLUE)[INFO]$(NC) 设置端口转发 localhost:8080 -> nginx-service:80" @echo "$(YELLOW)访问 http://localhost:8080 来测试 NGINX$(NC)" @kubectl port-forward service/nginx-service 8080:80 -n $(NAMESPACE) scale: ## 扩缩容 NGINX 部署 (用法: make scale REPLICAS=5) @if [ -z "$(REPLICAS)" ]; then echo "$(RED)[ERROR]$(NC) 请指定副本数: make scale REPLICAS=5"; exit 1; fi @echo "$(BLUE)[INFO]$(NC) 扩缩容 NGINX 到 $(REPLICAS) 个副本..." @kubectl scale deployment nginx-deployment --replicas=$(REPLICAS) -n $(NAMESPACE) @kubectl rollout status deployment/nginx-deployment -n $(NAMESPACE) update: check-env ## 更新 NGINX 镜像版本 @echo "$(BLUE)[INFO]$(NC) 更新 NGINX 镜像到 $(NGINX_IMAGE_TAG)..." @kubectl set image deployment/nginx-deployment nginx=$(HARBOR_REGISTRY)/test/nginx:$(NGINX_IMAGE_TAG) -n $(NAMESPACE) @kubectl rollout status deployment/nginx-deployment -n $(NAMESPACE) @echo "$(GREEN)[SUCCESS]$(NC) 镜像更新完成" rollback: ## 回滚到上一个版本 @echo "$(BLUE)[INFO]$(NC) 回滚 NGINX 部署到上一个版本..." @kubectl rollout undo deployment/nginx-deployment -n $(NAMESPACE) @kubectl rollout status deployment/nginx-deployment -n $(NAMESPACE) @echo "$(GREEN)[SUCCESS]$(NC) 回滚完成" restart: ## 重启 NGINX 部署 @echo "$(BLUE)[INFO]$(NC) 重启 NGINX 部署..." @kubectl rollout restart deployment/nginx-deployment -n $(NAMESPACE) @kubectl rollout status deployment/nginx-deployment -n $(NAMESPACE) @echo "$(GREEN)[SUCCESS]$(NC) 重启完成" clean: ## 清理 NGINX 部署 @echo "$(BLUE)[INFO]$(NC) 清理 NGINX 部署..." @kubectl delete -f k8s/nginx-deployment.yaml -n $(NAMESPACE) --ignore-not-found=true @kubectl delete secret harbor-registry-secret -n $(NAMESPACE) --ignore-not-found=true @echo "$(GREEN)[SUCCESS]$(NC) 清理完成" config: ## 显示当前配置 @echo "$(BLUE)[INFO]$(NC) 当前配置:" @echo " Harbor 仓库: $(HARBOR_REGISTRY)" @echo " Harbor 用户: $(HARBOR_USERNAME)" @echo " 镜像标签: $(NGINX_IMAGE_TAG)" @echo " 命名空间: $(NAMESPACE)" @echo " 部署文件: $(DEPLOYMENT_FILE)" test: ## 测试 NGINX 服务连接 @echo "$(BLUE)[INFO]$(NC) 测试 NGINX 服务连接..." @POD_NAME=$$(kubectl get pods -l app=nginx -n $(NAMESPACE) -o jsonpath='{.items[0].metadata.name}'); \ if [ -n "$$POD_NAME" ]; then \ echo "测试 Pod: $$POD_NAME"; \ kubectl exec $$POD_NAME -n $(NAMESPACE) -- curl -s -o /dev/null -w "HTTP状态码: %{http_code}\n" http://localhost/; \ else \ echo "$(RED)[ERROR]$(NC) 未找到运行中的 NGINX Pod"; \ fi debug: ## 调试部署问题 @echo "$(BLUE)[INFO]$(NC) 调试 NGINX 部署..." @echo "" @echo "$(YELLOW)=== 检查 Secrets ===$(NC)" @kubectl get secret harbor-registry-secret -n $(NAMESPACE) -o yaml 2>/dev/null || echo "Secret 不存在" @echo "" @echo "$(YELLOW)=== 检查事件 ===$(NC)" @kubectl get events --sort-by=.metadata.creationTimestamp -n $(NAMESPACE) | grep nginx | tail -10 @echo "" @echo "$(YELLOW)=== Pod 详细信息 ===$(NC)" @POD_NAME=$$(kubectl get pods -l app=nginx -n $(NAMESPACE) -o jsonpath='{.items[0].metadata.name}' 2>/dev/null); \ if [ -n "$$POD_NAME" ]; then \ kubectl describe pod $$POD_NAME -n $(NAMESPACE); \ else \ echo "未找到 NGINX Pod"; \ fi # 为方便使用,创建一些简短的别名 s: status ## 别名: status l: logs ## 别名: logs d: deploy ## 别名: deploy c: clean ## 别名: clean u: update ## 别名: update