Harbor + Kubernetes + GitHub + ArgoCD 自动发布完整实战

一、实验背景

前面我们已经完成了 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 80:30082/TCP,443:30083/TCP

浏览器访问:

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 80:30084/TCP
十四、浏览器访问验证

浏览器访问:

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 自动发布实验完成。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇