📦 一、项目目录结构(标准企业布局)


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

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐