一、实验背景
前面我们已经完成了 Harbor(私有镜像仓库)的部署,并验证了 Docker(容器工具)可以正常 push(推送)和 pull(拉取)镜像。
随后,我们又完成了 Kubernetes(K8s)从 Harbor 拉取镜像并运行 Pod(容器组)的测试。
本篇文章继续完成最后一段:
把 Kubernetes YAML(资源配置文件)保存到 GitHub,然后通过 ArgoCD(GitOps 自动发布工具)自动同步到 Kubernetes 集群。
最终实现:
GitHub 保存配置
↓
ArgoCD 自动同步
↓
Kubernetes 自动创建 Deployment(部署)和 Service(服务)
↓
Pod(容器组)从 Harbor 拉取镜像
↓
浏览器访问成功
二、实验目标
本次目标:
1. 创建 GitHub 仓库保存 Kubernetes YAML(资源配置文件)
2. 将应用配置 push(推送)到 GitHub
3. 安装并访问 ArgoCD(GitOps 自动发布工具)
4. 创建 ArgoCD Application(应用)
5. 让 ArgoCD 自动同步 GitHub 配置
6. Kubernetes 自动运行 Harbor 镜像
7. 通过 NodePort(节点端口)访问应用页面
三、实验环境
项目 信息
Harbor 地址 172.16.11.142
Harbor 项目 library
镜像地址 172.16.11.142/library/kgale-web:v1
Kubernetes 节点 k8s-master
GitHub 仓库 YANYUE0721/kgale-web-gitops
ArgoCD 命名空间 argocd
应用命名空间 default
Web 访问端口 30084
最终访问地址:
http://172.16.11.142:30084
四、创建 GitOps 项目目录
在 k8s-master 上创建项目目录:
mkdir -p ~/kgale-web-gitops
cd ~/kgale-web-gitops
五、创建 Kubernetes YAML 配置文件
创建 kgale-web-gitops.yaml:
cat > kgale-web-gitops.yaml <<'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
name: kgale-web-gitops
spec:
replicas: 1
selector:
matchLabels:
app: kgale-web-gitops
template:
metadata:
labels:
app: kgale-web-gitops
spec:
nodeName: k8s-master # 指定运行到 k8s-master 节点
tolerations:
- operator: "Exists" # 容忍 Taint(污点),实验环境使用
containers:
- name: kgale-web # Container(容器)名称
image: 172.16.11.142/library/kgale-web:v1 # Harbor(私有镜像仓库)镜像
ports:
- containerPort: 80 # 容器内部端口
---
apiVersion: v1
kind: Service
metadata:
name: kgale-web-gitops-svc
spec:
type: NodePort # 使用 NodePort(节点端口)暴露服务
selector:
app: kgale-web-gitops
ports:
- port: 80 # Service(服务)端口
targetPort: 80 # Pod(容器组)端口
nodePort: 30084 # 外部访问端口
EOF
这份 YAML(资源配置文件)包含两个资源:
Deployment(部署):负责创建并管理 Pod(容器组)
Service(服务):负责通过 NodePort(节点端口)暴露访问
六、初始化 Git 仓库
设置 Git 用户信息:
git config --global user.name "kgale"
git config --global user.email "216852193+YANYUE0721@users.noreply.github.com"
初始化 Git 仓库:
git init
git add .
git commit -m "add kgale web gitops yaml"
git branch -M main
添加 GitHub 远程仓库:
git remote add origin https://github.com/YANYUE0721/kgale-web-gitops.git
推送到 GitHub:
git push -u origin main
如果 GitHub 要求输入账号密码:
Username: GitHub 用户名
Password: GitHub Token(访问令牌)
注意:这里的 Password 不是 GitHub 登录密码,而是 GitHub Token(访问令牌)。
七、GitHub 邮箱隐私问题处理
如果推送时报错:
GH007: Your push would publish a private email address.
说明 GitHub 开启了邮箱隐私保护。
解决方法是使用 GitHub 提供的 noreply 邮箱:
git config --global user.email "216852193+YANYUE0721@users.noreply.github.com"
git commit --amend --reset-author --no-edit
git push -u origin main
推送成功后会看到:
[new branch] main -> main
branch ‘main’ set up to track ‘origin/main’
这说明 YAML(资源配置文件)已经成功保存到 GitHub 的 main 分支。
八、安装 ArgoCD
创建 ArgoCD 工作目录:
mkdir -p ~/argocd-demo
cd ~/argocd-demo
创建 Namespace(命名空间):
kubectl create namespace argocd –dry-run=client -o yaml | kubectl apply -f –
下载 ArgoCD 安装文件:
curl -L -o argocd-install.yaml https://raw.githubusercontent.com/argoproj/argo-cd/v2.13.3/manifests/install.yaml
安装 ArgoCD:
kubectl apply -n argocd -f argocd-install.yaml
九、让 ArgoCD 跑到 k8s-master 节点
因为当前 worker1 / worker2 是 NotReady(节点不可用),所以需要让 ArgoCD 的 Pod(容器组)运行在 k8s-master 上。
给所有 Deployment(部署)添加 nodeSelector(节点选择)和 tolerations(容忍污点):
for d in argocd-applicationset-controller argocd-dex-server argocd-notifications-controller argocd-redis argocd-repo-server argocd-server; do
kubectl patch deployment $d -n argocd –type=’merge’ -p ‘{“spec”:{“template”:{“spec”:{“nodeSelector”:{“kubernetes.io/hostname”:”k8s-master”},”tolerations”:[{“operator”:”Exists”}]}}}}’
done
给 StatefulSet(有状态部署)添加同样配置:
for s in $(kubectl get statefulset -n argocd -o name); do
kubectl patch -n argocd $s –type=’merge’ -p ‘{“spec”:{“template”:{“spec”:{“nodeSelector”:{“kubernetes.io/hostname”:”k8s-master”},”tolerations”:[{“operator”:”Exists”}]}}}}’
done
删除旧 Pod(容器组),让它们按新配置重建:
kubectl delete pod -n argocd –all –grace-period=0 –force
查看 ArgoCD Pod(容器组)状态:
kubectl get pods -n argocd -o wide
最终所有 Pod(容器组)都变成 Running(运行中):
argocd-application-controller-0 1/1 Running
argocd-applicationset-controller 1/1 Running
argocd-dex-server 1/1 Running
argocd-notifications-controller 1/1 Running
argocd-redis 1/1 Running
argocd-repo-server 1/1 Running
argocd-server 1/1 Running
这说明 ArgoCD(GitOps 自动发布工具)安装成功。
十、暴露 ArgoCD Web 页面
将 argocd-server 的 Service(服务)改成 NodePort(节点端口):
kubectl -n argocd patch svc argocd-server –type=’merge’ -p \
‘{“spec”:{“type”:”NodePort”,”ports”:[{“name”:”http”,”port”:80,”protocol”:”TCP”,”targetPort”:8080,”nodePort”:30082},{“name”:”https”,”port”:443,”protocol”:”TCP”,”targetPort”:8080,”nodePort”:30083}]}}’
查看 Service(服务):
kubectl get svc -n argocd argocd-server
输出示例:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)
argocd-server NodePort 10.111.170.77
浏览器访问:
https://172.16.11.142:30083
如果提示证书不安全,选择继续访问即可。
十一、获取 ArgoCD 登录密码
默认用户名:
admin
获取初始密码:
kubectl -n argocd get secret argocd-initial-admin-secret \
-o jsonpath=”{.data.password}” | base64 -d; echo
登录 ArgoCD 后,就可以看到 Web 管理页面。
十二、创建 ArgoCD Application
ArgoCD Application(应用)负责告诉 ArgoCD:
从哪个 Git 仓库读取配置
同步到哪个 Kubernetes 集群
发布到哪个 Namespace(命名空间)
是否自动同步
创建 Application(应用)配置文件:
cd ~/argocd-demo
cat > kgale-web-argocd-app.yaml <<'EOF'
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: kgale-web-gitops
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/YANYUE0721/kgale-web-gitops.git # GitHub 仓库地址
targetRevision: main # Git 分支
path: . # YAML 所在目录
destination:
server: https://kubernetes.default.svc # 当前 Kubernetes 集群
namespace: default # 发布到 default 命名空间
syncPolicy:
automated:
prune: true # Git 删除资源后,K8s 也删除
selfHeal: true # K8s 被手动修改后自动恢复
syncOptions:
- CreateNamespace=true
EOF
应用配置:
kubectl apply -f kgale-web-argocd-app.yaml
如果输出:
application.argoproj.io/kgale-web-gitops created
说明 ArgoCD Application(应用)创建成功。
十三、查看 ArgoCD 同步状态
查看 Application(应用)状态:
kubectl get application -n argocd
成功状态:
NAME SYNC STATUS HEALTH STATUS
kgale-web-gitops Synced Healthy
其中:
Synced:GitHub 配置已经同步到 Kubernetes
Healthy:应用状态健康
查看 Pod(容器组):
kubectl get pods -o wide | grep kgale-web-gitops
成功状态:
kgale-web-gitops-7c69f6b9db-zdlxb 1/1 Running k8s-master
查看 Service(服务):
kubectl get svc kgale-web-gitops-svc
成功状态:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)
kgale-web-gitops-svc NodePort 10.105.226.217
十四、浏览器访问验证
浏览器访问:
http://172.16.11.142:30084
成功页面显示:
Harbor + Kubernetes 部署成功!
页面内容来自 Harbor(私有镜像仓库)中的镜像:
172.16.11.142/library/kgale-web:v1
这说明:
GitHub 配置同步成功
ArgoCD 自动发布成功
Kubernetes Pod(容器组)运行成功
Harbor 镜像拉取成功
NodePort(节点端口)访问成功
十五、最终完整链路
本次实验完整链路如下:
本地编写 Kubernetes YAML(资源配置文件)
↓
Git commit(提交)
↓
Git push(推送)到 GitHub
↓
ArgoCD(GitOps 自动发布工具)监听 GitHub 仓库
↓
ArgoCD 自动同步 Application(应用)
↓
Kubernetes 创建 Deployment(部署)
↓
Kubernetes 创建 Service(服务)
↓
Pod(容器组)从 Harbor 拉取镜像
↓
Pod(容器组)Running(运行中)
↓
NodePort(节点端口)暴露服务
↓
浏览器访问成功
十六、实验结果
本次最终完成:
1. Harbor(私有镜像仓库)部署成功
2. 自定义 Web 镜像推送到 Harbor 成功
3. Kubernetes 成功从 Harbor 拉取镜像
4. ArgoCD(GitOps 自动发布工具)安装成功
5. GitHub 仓库保存 Kubernetes YAML 配置
6. ArgoCD 成功同步 GitHub 仓库
7. Application(应用)状态为 Synced / Healthy
8. Pod(容器组)状态为 Running
9. Service(服务)通过 NodePort 暴露
10. 浏览器访问成功
最终访问地址:
http://172.16.11.142:30084
最终 GitHub 仓库:
https://github.com/YANYUE0721/kgale-web-gitops
最终 Harbor 镜像:
172.16.11.142/library/kgale-web:v1
十七、总结
这次实验完成了一套完整的 DevOps / GitOps 发布流程。
从最开始的 Harbor(私有镜像仓库),到 Kubernetes(K8s)运行镜像,再到 GitHub 保存配置,最后由 ArgoCD 自动同步发布,整个流程已经形成闭环。
最终效果是:
以后只要修改 GitHub 仓库里的 YAML 配置
ArgoCD 就可以自动同步到 Kubernetes
Kubernetes 会根据配置自动创建或更新应用
这就是 GitOps 的核心思想:
Git 是唯一配置源
ArgoCD 负责自动同步
Kubernetes 负责运行应用
Harbor 负责保存镜像
至此,Harbor + Kubernetes + GitHub + ArgoCD 自动发布实验完成。