nginx/k8s/Makefile
huangzhiqiang 5c7293be88
Some checks failed
Build NGINX on Ubuntu / build-nginx (push) Has been cancelled
add action for k8s deploy
2025-06-07 17:40:01 +08:00

153 lines
6.4 KiB
Makefile

# 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