本项目使用Helm Chart管理Kubernetes部署配置,并通过ArgoCD实现GitOps自动化部署。
如果你是刚开始设置Kubernetes集群并集成ArgoCD,请先参考:
- K8s集群前期准备与ArgoCD集成指南 - 详细介绍如何准备K8s集群、安装ArgoCD、配置权限和添加集群等前期工作
OPS/
├── charts/ # Helm Charts目录
│ └── example-app/ # 示例应用的Helm Chart
│ ├── Chart.yaml # Chart元数据
│ ├── values.yaml # 默认配置值
│ ├── charts/ # 子Chart目录
│ └── templates/ # Kubernetes清单模板
│ ├── _helpers.tpl
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── ingress.yaml
│ ├── serviceaccount.yaml
│ └── autoscaling.yaml
├── argocd/ # ArgoCD配置
│ └── example-app-application.yaml # ArgoCD Application定义
└── README.md # 项目说明文档
根据你的应用需求,修改 charts/example-app/values.yaml 文件:
- 镜像配置:修改
image.repository为你的阿里云ACR镜像地址 - 副本数:调整
replicaCount以满足你的服务需求 - 资源限制:根据应用资源需求调整
resources部分 - 服务配置:默认已配置为
ClusterIP类型,适合本地K8S环境使用port-forward访问
确保在Kubernetes集群中创建了访问阿里云ACR的镜像拉取密钥:
kubectl create secret docker-registry aliyun-acr-credentials \
--docker-server=registry.cn-hangzhou.aliyuncs.com \
--docker-username=你的用户名 \
--docker-password=你的密码 \
--docker-email=your-email@example.com \
-n default对于本地自建的Kubernetes环境,使用以下步骤通过port-forward访问应用:
-
部署应用:
helm install cloudflare-app ./charts/example-app -n default
-
使用port-forward访问:
# 将本地8080端口转发到服务的80端口 kubectl port-forward svc/cloudflare-app -n default 8080:80 -
访问应用: 打开浏览器,访问
http://localhost:8080
# 查看Pod状态
kubectl get pods -n default
# 查看服务状态
kubectl get svc -n default
# 查看Pod日志
kubectl logs -f deployment/cloudflare-app -n default当你修改了values.yaml或其他Helm Chart配置文件后,可以通过以下方式重新发布应用:
当前ArgoCD应用配置已启用自动同步功能,步骤如下:
-
提交更改到Git仓库:
git add charts/example-app/values.yaml git commit -m "更新应用配置" git push origin HEAD:master -
等待自动同步:
- ArgoCD会定期检测Git仓库变更(默认3分钟一次)
- 检测到变更后会自动同步到集群
- 配置了
selfHeal: true,确保集群状态与Git保持一致
如果需要立即应用更改,可以手动触发同步:
# 使用ArgoCD CLI手动同步
argocd app sync cloudflare-app
# 或者使用kubectl强制同步(不推荐,除非CLI不可用)
kubectl patch app cloudflare-app -n argocd -p '{"spec":{"syncPolicy":{"syncOptions":["Force=true"]}}}' --type merge# 查看ArgoCD应用同步状态
argocd app get cloudflare-app
# 查看部署状态
kubectl get deployment cloudflare-app -n default
# 查看Pod状态
kubectl get pods -n default
# 查看Pod日志
kubectl logs -f deployment/cloudflare-app -n default编辑 argocd/example-app-application.yaml 文件:
- 仓库地址:修改
repoURL为https://github.com/brucedjh/OPS.git - 集群地址:修改
destination.server为https://192.168.2.41:6443 - 命名空间:确保
destination.namespace设置为default - 应用名称:确保元数据中的
name为cloudflare-app - 健康检查:确保
healthChecks中配置了正确的应用名称和命名空间
将Application配置应用到ArgoCD:
kubectl apply -f argocd/example-app-application.yaml安全注意:为了避免在命令历史中暴露令牌,请使用环境变量或从安全文件读取:
# 方法1:使用环境变量(推荐)
export GITHUB_TOKEN="your-github-token-here"
argocd repo add https://github.com/brucedjh/OPS.git --username your-username --password $GITHUB_TOKEN
# 方法2:交互式输入(更安全,但无法自动化)
argocd repo add https://github.com/brucedjh/OPS.git
# 提示输入时再输入凭据argocd app create cloudflare-app \
--repo https://github.com/brucedjh/OPS.git \
--path charts/example-app \
--dest-server https://192.168.2.41:6443 \
--dest-namespace default \
--sync-policy automated# 使用ArgoCD CLI查看应用状态
argocd app get cloudflare-app
# 查看Pod状态
kubectl get pods -n default
# 查看服务状态
kubectl get svc -n default
# 查看Pod日志
kubectl logs -f deployment/cloudflare-app -n default如果需要通过Port-Forward访问应用:
# 将本地8080端口转发到服务的80端口
kubectl port-forward svc/cloudflare-app -n default 8080:80然后在浏览器中访问 http://localhost:8080
在你的应用代码仓库中,创建GitHub Actions工作流文件,用于构建镜像并更新部署配置:
# .github/workflows/deploy.yaml
name: Build and Deploy
on:
push:
branches: [ main ]
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Login to Aliyun Container Registry
uses: docker/login-action@v2
with:
registry: registry.cn-hangzhou.aliyuncs.com
username: ${{ secrets.ALIYUN_ACR_USERNAME }}
password: ${{ secrets.ALIYUN_ACR_PASSWORD }}
- name: Build and push
uses: docker/build-push-action@v4
with:
push: true
tags: registry.cn-hangzhou.aliyuncs.com/your-namespace/your-app:${{ github.sha }}
- name: Checkout OPS repository
uses: actions/checkout@v3
with:
repository: your-org/your-ops-repo
path: ops-repo
token: ${{ secrets.GITHUB_TOKEN }}
- name: Update image tag
run: |
cd ops-repo
sed -i "s|image: \"registry.cn-hangzhou.aliyuncs.com/your-namespace/your-app:.*\"|image: \"registry.cn-hangzhou.aliyuncs.com/your-namespace/your-app:${{ github.sha }}\"|g" charts/example-app/values.yaml
git config --global user.name 'GitHub Actions'
git config --global user.email 'actions@github.com'
git add charts/example-app/values.yaml
git commit -m "Update image tag to ${{ github.sha }}"
git push-
环境隔离:为不同环境(开发、测试、生产)创建不同的values文件
values-dev.yaml values-test.yaml values-prod.yaml
-
密钥管理:使用Kubernetes Secrets或外部密钥管理系统(如Vault)存储敏感信息
-
资源监控:配置资源限制和自动伸缩,确保应用性能和成本优化
-
健康检查:配置适当的存活和就绪探针,确保服务可用性
-
GitOps工作流:所有配置变更通过Git提交管理,利用ArgoCD自动同步到集群
- 检查镜像地址、标签和拉取密钥是否正确
- 确认镜像是否存在
- 查看Kubernetes节点是否能访问镜像仓库网络
- 原因分析:Pod事件日志显示健康检查连接被拒绝("connection refused")
- 当前配置:已将健康检查修改为直接检查3000端口(TCP socket检查),这是一种更直接的端口可用性验证方式
- 调整说明:
- 使用TCP socket检查替代HTTP GET检查,减少应用层依赖
- 增加了初始延迟时间,给应用更多启动时间
- 降低了探测频率,减轻对应用的压力
- 操作步骤:修改values.yaml中的健康检查配置后,重新应用部署
- 查看Pod事件和日志,确认资源是否足够、配置是否正确
- 检查Pod状态和日志:
kubectl logs -f <pod-name> - 查看详细的事件信息:
kubectl describe pod <pod-name>
- 检查Git仓库权限、网络连接和配置格式
- 查看ArgoCD UI中的错误详情
- 确认目标集群访问配置是否正常
- 定期更新Helm Chart和依赖版本
- 审查和优化资源配置
- 监控部署状态和应用性能