📦 一、项目目录结构(标准企业布局)
devops-demo/
├── app/ # 应用代码(示例)
│ ├── Dockerfile
│ └── index.html
│
├── jenkins/
│ └── Jenkinsfile
│
├── k8s/
│ ├── base/
│ │ ├── deployment.yaml
│ │ ├── service.yaml
│ │ └── ingress.yaml
│ │
│ └── rollout/
│ └── rollout.yaml # 金丝雀发布
│
├── argocd/
│ └── application.yaml
│
└── README.md
🐳 二、应用 + Dockerfile
app/index.html
<h1>Hello DevOps 🚀</h1>
app/Dockerfile
FROM nginx:1.25-alpine
COPY index.html /usr/share/nginx/html/index.html
EXPOSE 80
🔧 三、Jenkinsfile(CI核心)
📍作用:构建 + 推送镜像 + 更新 Git(触发 CD)
pipeline {
agent any
environment {
REGISTRY = "192.168.100.30:5000/devops-demo"
IMAGE = "web"
TAG = "${BUILD_NUMBER}"
GIT_CREDENTIALS = "gitlab-creds"
}
stages {
stage('Checkout') {
steps {
git branch: 'master',
credentialsId: "${GIT_CREDENTIALS}",
url: 'http://192.168.100.100/devops/devops-demo.git'
}
}
stage('Build Image') {
steps {
sh """
docker build -t $REGISTRY/$IMAGE:$TAG ./app
"""
}
}
stage('Push Image') {
steps {
sh """
docker push $REGISTRY/$IMAGE:$TAG
"""
}
}
stage('Update K8s YAML') {
steps {
sh """
sed -i 's#image:.*#image: $REGISTRY/$IMAGE:$TAG#g' k8s/rollout/rollout.yaml
git config user.name "jenkins"
git config user.email "jenkins@local"
git commit -am "update image to $TAG"
git push origin master
"""
}
}
}
}
☸️ 四、Kubernetes 部署 YAML
1️⃣ Service
apiVersion: v1
kind:Service
metadata:
name:devops-demo
spec:
selector:
app:devops-demo
ports:
-port:80
targetPort:80
type:ClusterIP
2️⃣ Ingress(外部访问)
apiVersion: networking.k8s.io/v1
kind:Ingress
metadata:
name:devops-demo
spec:
rules:
-host:devops.local
http:
paths:
-path:/
pathType:Prefix
backend:
service:
name:devops-demo
port:
number:80
👉 记得本地 /etc/hosts:
192.168.100.xxx devops.local
🚀 五、金丝雀发布(重点🔥)
k8s/rollout/rollout.yaml
apiVersion: argoproj.io/v1alpha1
kind:Rollout
metadata:
name:devops-demo
spec:
replicas:3
selector:
matchLabels:
app:devops-demo
template:
metadata:
labels:
app:devops-demo
spec:
containers:
-name:app
image:192.168.100.30:5000/devops-demo/web:1
ports:
-containerPort:80
strategy:
canary:
steps:
-setWeight:20
-pause: {duration:30}
-setWeight:50
-pause: {duration:60}
-setWeight:100
🔁 六、ArgoCD(CD核心)
argocd/application.yaml
apiVersion: argoproj.io/v1alpha1
kind:Application
metadata:
name:devops-demo
namespace:argocd
spec:
project:default
source:
repoURL:http://192.168.100.100/devops/devops-demo.git
targetRevision:master
path:k8s
destination:
server:https://kubernetes.default.svc
namespace:default
syncPolicy:
automated:
prune:true
selfHeal:true
🔄 七、完整执行流程
1. 开发 push 代码 → GitLab
2. Jenkins 自动执行:
`
- 构建 Docker 镜像
- push Harbor
- 修改 rollout.yaml
- push Git`
3. ArgoCD 检测 Git 变更:
`
- 自动同步 K8s`
4. Argo Rollouts:
`
- 20% → 50% → 100% 灰度发布`
5. 用户访问:
devops.local
🧪 八、部署步骤(实战)
1️⃣ 准备环境
-
Kubernetes
-
Jenkins(已装)
-
Harbor(已装)
-
ArgoCD(建议 Helm 安装)
2️⃣ 安装 ArgoCD
kubectl create namespace argocd
kubectl apply -n argocd -f \
https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
3️⃣ 安装 Argo Rollouts
kubectl create namespace argo-rollouts
kubectl apply -n argo-rollouts -f \
https://github.com/argoproj/argo-rollouts/releases/latest/download/install.yaml
4️⃣ 创建应用
kubectl apply -f argocd/application.yaml
5️⃣ 访问
kubectl get svc -n argocd
