找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

892

积分

0

好友

118

主题
发表于 3 天前 | 查看: 14| 回复: 0

通过结合Argo CD与GitOps,可以实现Kubernetes应用程序的自动化部署和自我修复。其核心思想是将集群状态与Git仓库同步,确保应用始终符合预期配置,并在发生漂移时自动修复。

什么是 GitOps 和自我修复?

GitOps 意味着Git仓库是系统配置的唯一真实来源。当实际运行状态与Git定义不符时,系统会自动修复以匹配定义。

应用程序配置存储在Git中,任何对应用代码或配置的更改都会触发自动修复流程。这是GitOps加速传统部署过程的绝佳机会。

传统部署的痛点

在传统部署流程中,常会遇到以下问题:

  • 手动更改生产设置可能导致生产环境停滞。
  • 服务器技术故障可能暂停生产,需手动干预重启。
  • 应用程序配置变更时,需手动追踪所有更改。

GitOps 能高效且简洁地处理所有这些情况。

GitOps 自我修复方案

通过GitOps,你可以将应用的期望状态维护在Git仓库中。使用Argo CD等GitOps工具,确保Git中定义的状态与实际部署保持一致。

如果服务器出现技术问题,GitOps会自动修复并将应用恢复到定义状态,这就是自我修复。此外,Git还提供了所有变更的审计追踪。

第 0 步:先决条件

  • 系统已安装 Docker。
  • 推荐使用WSL2 Ubuntu,或你自己的Linux环境。
  • GitHub 账户。
  • Docker Hub 账户。
  • 示例使用React项目(可替换为任何项目)。
  • 基础的Kubernetes知识(可选)。

第 1 步:安装并启动 Minikube

首先,设置一个Kubernetes集群。本教程使用轻量级的Minikube,适合学习和测试。

(如果已有本地集群,可跳过此步。)

安装 Minikube

运行以下命令:

# 下载并安装 Minikube
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube

# 安装 kubectl(如未安装)
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl

# 某些Linux发行版需要安装 conntrack
sudo apt install conntrack

启动 Minikube 集群

确保Docker正在运行,然后执行:

# 使用 Docker 驱动启动 Minikube
minikube start --driver=docker

# 验证安装
kubectl version --client
kubectl get nodes
# 输出应类似:
# NAME       STATUS   ROLES           AGE
# minikube   Ready    control-plane   1m

# 启用 Ingress 插件(后续可能用到)
minikube addons enable ingress

第 2 步:创建 React 应用

# 创建应用
cd ~/projects
npx create-react-app my-selfhealing-app
cd my-selfhealing-app

更新应用代码

替换 src/App.js 内容:

import './App.css';
import { useState, useEffect } from 'react';

function App() {
  const [count, setCount] = useState(0);
  const [timestamp, setTimestamp] = useState('');

  useEffect(() => {
    setTimestamp(new Date().toLocaleString());
  }, []);

  return (
    <div className="App">
      <header className="App-header">
        <h1>🛡️ Self-Healing React App</h1>
        <p>This app automatically fixes itself using GitOps!</p>

        <div style={{
          background: 'rgba(255,255,255,0.1)',
          padding: '20px',
          borderRadius: '10px',
          margin: '20px 0'
        }}>
          <button
            onClick={() => setCount(count + 1)}
            style={{
              padding: '10px 20px',
              fontSize: '16px',
              backgroundColor: '#61dafb',
              border: 'none',
              borderRadius: '5px',
              cursor: 'pointer'
            }}
          >
            Clicked {count} times
          </button>
        </div>
        <div style={{ fontSize: '14px', opacity: 0.8 }}>
          <p>🔄 Auto-sync enabled</p>
          <p>🛠️ Self-healing active</p>
          <p>📅 Deployed: {timestamp}</p>
          <p>🏷️ Version: 1.0.0</p>
        </div>
      </header>
    </div>
  );
}

export default App;

注意:Create React App 已弃用,也可使用 Vite 等替代方案。

创建 Dockerfile

在项目根目录创建 Dockerfile

FROM node:18-alpine as builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

推送到 GitHub

git init
git add .
git commit -m "Initial self-healing app"
git branch -M main
git remote add origin https://github.com/YOUR_USERNAME/my-selfhealing-app.git
git push -u origin main

第 3 步:构建并推送 Docker 镜像

确保本地Docker运行,然后构建并推送镜像到Docker Hub。

# 构建镜像
docker build -t YOUR_DOCKERHUB_USERNAME/selfhealing-app:v1.0.0 .

# 登录并推送
docker login
docker push YOUR_DOCKERHUB_USERNAME/selfhealing-app:v1.0.0

第 4 步:创建 GitOps 配置仓库

为GitOps创建一个独立的Git仓库,用于存储Kubernetes配置。

# 新建仓库(在GitHub创建后克隆)
git clone https://github.com/YOUR_USERNAME/my-GitOps-config.git
cd my-GitOps-config

创建 Kubernetes 清单

在仓库内创建 app 文件夹,并添加部署文件。

app/deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: selfhealing-app
  namespace: default
spec:
  replicas: 2
  selector:
    matchLabels:
      app: selfhealing-app
  template:
    metadata:
      labels:
        app: selfhealing-app
    spec:
      containers:
      - name: react-app
        image: YOUR_DOCKERHUB_USERNAME/selfhealing-app:v1.0.0  # 更新为你的镜像
        ports:
        - containerPort: 80
        resources:
          requests:
            memory: "64Mi"
            cpu: "50m"
          limits:
            memory: "128Mi"
            cpu: "100m"

app/service.yaml

apiVersion: v1
kind: Service
metadata:
  name: selfhealing-app-service
  namespace: default
spec:
  selector:
    app: selfhealing-app
  ports:
  - port: 80
    targetPort: 80
  type: LoadBalancer

提交配置

git add .
git commit -m "Add GitOps configuration for self-healing app"
git push origin main

第 5 步:安装 Argo CD

在Kubernetes集群中安装Argo CD。

# 创建命名空间
kubectl create namespace argocd

# 安装 Argo CD
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

# 等待就绪(约2-3分钟)
echo "Installing Argo CD... this takes a few minutes"
kubectl wait --for=condition=available --timeout=300s deployment/argocd-server -n argocd

访问 Argo CD UI

# 获取管理员密码
echo "Argo CD Password:"
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d && echo
# 输出类似:Gvy5q5gb3kADdS3w,用户名为 admin

# 端口转发
kubectl port-forward svc/argocd-server -n argocd 8080:443 > /dev/null 2>&1 &
echo "Argo CD UI: https://localhost:8080"

浏览器打开 https://localhost:8080,使用用户名 admin 和获取的密码登录。

Argo CD 登录界面

第 6 步:创建自我修复应用

定义Argo CD应用以启用自我修复。

创建 selfhealing-application.yaml

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: selfhealing-app
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/YOUR_USERNAME/my-GitOps-config  # 更新为你的仓库
    targetRevision: HEAD
    path: app
  destination:
    server: https://kubernetes.default.svc
    namespace: default
  syncPolicy:
    automated:
      prune: true      # 清理多余资源
      selfHeal: true   # 关键:启用漂移自动修复

应用配置:

kubectl apply -f selfhealing-application.yaml

在Argo CD UI中应看到应用同步状态。

Argo CD UI 显示本地运行

第 7 步:访问应用

# 检查 Pod 状态
kubectl get pods -l app=selfhealing-app

# 端口转发访问应用
kubectl port-forward svc/selfhealing-app-service 3000:80 > /dev/null 2>&1 &

访问 http://localhost:3000 查看运行中的应用。

初始应用版本 1.0.0

第 8 步:测试自我修复

删除 Pod

# 查看 Pod
kubectl get pods -l app=selfhealing-app
# 输出两个 Pod

# 删除一个 Pod
kubectl delete pod -l app=selfhealing-app

# 观察自动重建
kubectl get pods -l app=selfhealing-app
# 仍应看到两个 Pod

删除整个部署

# 删除所有资源
kubectl delete deployment selfhealing-app
kubectl delete service selfhealing-app-service

# 观察 Argo CD 自动重建
kubectl get all -l app=selfhealing-app -w

Argo CD UI 将显示同步时间为“几秒前”,表示已自动修复。

Argo CD 应用状态显示同步时间

第 9 步:实际更新(GitOps 方式)

更新应用代码

编辑 src/App.js,修改版本号:

<p>🏷️ Version: 2.0.0 - Updated via GitOps!</p>

构建并推送新镜像

cd ~/projects/my-selfhealing-app

# 构建新版本
docker build -t YOUR_DOCKERHUB_USERNAME/selfhealing-app:v2.0.0 .
docker push YOUR_DOCKERHUB_USERNAME/selfhealing-app:v2.0.0

# 提交代码变更
git add .
git commit -m "Update to version 2.0.0"
git push origin main

更新 GitOps 配置

在GitOps仓库中,更新 app/deployment.yaml 的镜像标签:

image: YOUR_DOCKERHUB_USERNAME/selfhealing-app:v2.0.0

提交并推送:

git add .
git commit -m "Deploy version 2.0.0"
git push origin main

观察自动部署

Argo CD 会检测Git变更,自动拉取新配置并更新应用。默认每3分钟同步一次,可在UI中调整。

确保端口转发运行后访问 http://localhost:3000 查看更新。

更新后应用显示版本 2.0.0

理解自我修复机制

自我修复的工作流程如下:

  1. Argo CD 持续监控Git仓库和Kubernetes集群状态。
  2. 比较Git中定义的期望状态与实际集群状态。
  3. 发现差异时,自动触发同步以修复漂移。

这就是GitOps实现自我修复的核心原理。

GitOps 工作流程

结语:GitOps 的价值

每次推送到Git都会自动触发应用更新,生产问题也能自我修复。这不仅是部署自动化,更是构建自愈基础设施的关键。GitOps 解放了运维负担,让团队专注于更高价值的任务。




上一篇:Kubernetes部署的未来:开放平台如何克服专有、DIY与公有云的挑战
下一篇:Kubernetes长期支持迎来巨变:Canonical推出15年LTS保障企业级稳定性
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2025-12-17 19:06 , Processed in 0.154661 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表