153 lines
6.4 KiB
Makefile
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
|