分布式版本控制系统(一)

分布式版本控制系统(一)

目录

1、Git、Github、Gitlab 的区别

  • Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。git是一套软件,可以做本地私有仓库。
  • Github是在线的基于Git的代码托管服务。 GitHub是2008年由Ruby on Rails编写而成。GitHub同时提供付费账户和免费账户。公有和私有仓库(收费),不能做本地私有仓库。
  • Gitlab本身也是一个代码托管的网站,功能上和github没有区别,公有和私有仓库(免费),可以部署本地私有仓库。

2、Git 与 SVN 区别

GIT不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等。

如果你是一个具有使用SVN背景的人,你需要做一定的思想转换,来适应GIT提供的一些概念和特征。

Git 与 SVN 区别:

  • Git是分布式的,svn不是:这是GIT和其它非分布式的版本控制系统,例如SVN,CVS等,最核心的区别。
  • GIT把内容按元数据方式存储,而SVN是按文件:所有的资源控制系统都是把文件的元信息隐藏在一个类似.svn,.cvs等的文件夹里。
  • GIT分支和SVN的分支不同:分支在SVN中一点不特别,就是版本库中的另外的一个目录。
  • GIT没有一个全局的版本号,而SVN有:目前为止这是跟SVN相比GIT缺少的最大的一个特征。
  • GIT的内容完整性要优于SVN:GIT的内容存储使用的是SHA-1哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。
  • GIT是分布式的版本控制器,没有客户端和服务器端的概念。SVN它是C/S结构的版本控制器,有客户端和服务器端 服务器如果宕机而且代码没有备份的情况下完整代码就会丢失。

3、Git工作流程

一般工作流程如下:

  • 克隆 Git 资源作为工作目录。
  • 在克隆的资源上添加或修改文件。
  • 如果其他人修改了,你可以更新资源。
  • 在提交前查看修改。
  • 提交修改。
  • 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交。

Git 的工作流程示意图:

图片.png-52.1kB

4、Git基本概念

  • 工作区:就是你在电脑里能看到的目录。
  • 暂存区:英文叫stage, 或index。一般存放在"git目录"下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
  • 版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。

工作区、版本库中的暂存区和版本库之间的关系的示意图:

图片.png-153.3kB

  • 图中左侧为工作区,右侧为版本库。在版本库中标记为 index 的区域是暂存区(stage, index),标记为 master 的是 master 分支所代表的目录树。
  • 图中我们可以看出此时HEAD实际是指向 master 分支的一个游标。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。
  • 图中的objects标识的区域为 Git 的对象库,实际位于.git/objects目录下,里面包含了创建的各种对象及内容。
  • 当对工作区修改(或新增)的文件执行git add 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。
  • 当执行提交操作git commit时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。
  • 当执行git reset HEAD命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。
  • 当执行git rm --cached <file>命令时,会直接从暂存区删除文件,工作区则不做出改变。
  • 当执行git checkout .或者git checkout -- <file> 命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区的改动。
  • 当执行git checkout HEAD .或者git checkout HEAD <file>命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。

5、Git 客户端安装使用

5.1 git-server安装配置

名称 物理IP
git-server 192.168.200.19
git-client 192.168.200.20
# 安装git
[root@git-server ~]# yum -y install curl-devel expat-devel gettext-devel openssl-devel zlib-devel
[root@git-server ~]# yum -y install git git-all git-core gitweb
# 创建git用户
[root@git-server ~]# useradd git
[root@git-server ~]# echo "123.123" | passwd --stdin git

# 创建git仓库目录
[root@git-server ~]# mkdir /git-root
[root@git-server ~]# cd /git-root/

# 创建一个裸仓库
[root@git-server git-root]# git init --bare shell.git
初始化空的 Git 版本库于 /git-root/shell.git/

git init 和 git init --bare 的区别:

  • 使用--bare选项时,不再生成.git目录,而是只生成.git目录下面的版本历史记录文件,这些版本历史记录文件也不再存放在.git目录下面,而是直接存放在版本库的根目录下面.
  • git init初始化的版本库用户也可以在该目录下执行所有git方面的操作,但别的用户在将更新push上来的时候容易出现冲突。
  • 使用git init --bare方法创建一个所谓的裸仓库,之所以叫裸仓库是因为这个仓库只保存git历史提交的版本信息,而不允许用户在上面进行各种git操作,如果你硬要操作的话,只会得到下面的错误(This operation must be run in a work tree)这个就是最好把远端仓库初始化成bare仓库的原因
# 仓库目录授权
[root@git-server git-root]# chown -R git:git shell.git

5.2 git-client配置免密登录git服务器

# 创建密匙
[root@git-client ~]# ssh-keygen

# 分发密匙到git-server机器
[root@git-client ~]# ssh-copy-id git@192.168.200.19

Git 提供了一个叫做 git config 的工具,专门用来配置或读取相应的工作环境变量。这些环境变量,决定了 Git 在各个环节的具体工作方式和行为。这些变量可以存放在以下三个不同的地方:

  • /etc/gitconfig 文件:系统中对所有用户都普遍适用的配置。若使用 git config 时用 --system 选项,读写的就是这个文件。
  • ~/.gitconfig 文件:用户目录下的配置文件只适用于该用户。若使用 git config 时用 --global 选项,读写的就是这个文件。
  • 当前项目的 Git 目录中的配置文件(也就是工作目录中的 .git/config 文件):这里的配置仅仅针对当前项目有效。每一个级别的配置都会覆盖上层的相同配置,所以 .git/config 里的配置会覆盖 /etc/gitconfig 中的同名变量。
# 配置git使用邮箱
[root@git-client ~]# git config --global user.email "git@163.com"
# 配置git使用用户
[root@git-client ~]# git config --global user.name "git"

如果用了 --global 选项,那么更改的配置文件就是位于你用户主目录下的那个,以后你所有的项目都会默认使用这里配置的用户信息。

如果要在某个特定的项目中使用其他名字或者电邮,只要去掉 --global 选项重新配置即可,新的设定保存在当前项目的 .git/config 文件里。

5.3 文本编辑器

设置Git默认使用的文本编辑器, 一般可能会是 Vi 或者 Vim。如果你有其他偏好,比如 Emacs 的话,可以重新设置

[root@git-client ~]# git config --global core.editor emacs

5.4 差异分析工具

还有一个比较常用的是,在解决合并冲突时使用哪种差异分析工具。比如要改用 vimdiff 的话:

[root@git-client ~]# git config --global merge.tool vimdiff

Git 可以理解 kdiff3,tkdiff,meld,xxdiff,emerge,vimdiff,gvimdiff,ecmerge,和 opendiff 等合并工具的输出信息。

5.5 查看配置信息

要检查已有的配置信息,可以使用 git config --list 命令:

[root@git-client ~]# git config --list
user.email=git@163.com
user.name=git
core.editor=emacs
merge.tool=vimdiff

有时候会看到重复的变量名,那就说明它们来自不同的配置文件(比如/etc/gitconfig~/.gitconfig),不过最终 Git 实际采用的是最后一个。

这些配置我们也可以在 ~/.gitconfig/etc/gitconfig 看到,如下所示:

[root@git-client ~]# cat ~/.gitconfig 
[user]
	email = git@163.com
	name = git
[core]
	editor = emacs
[merge]
	tool = vimdiff

也可以直接查阅某个环境变量的设定,只要把特定的名字跟在后面即可,像这样:

[root@git-client ~]# git config user.name
git

5.6 常用的 git 命令

图片.png-2444.7kB

git init                      # 初始化 
git add main.cpp              # 将某一个文件添加到暂存区 
git add .                     # 将文件夹下的所有的文件添加到暂存区 
git commit -m ‘note‘          # 将暂存区中的文件保存成为某一个版本 
git log                       # 查看所有的版本日志 
git status                    # 查看现在暂存区的状况 
git diff                      # 查看现在文件与上一个提交-commit版本的区别 
git reset --hard HEAD^        # 回到上一个版本 
git reset --hard XXXXX        # XXX为版本编号,回到某一个版本 
git pull origin master        # 从主分支pull到本地 
git push -u origin master     # 从本地push到主分支 
git pull                      # pull默认主分支 
git push                      # push默认主分支 ...

5.7 本地项目与远程服务器项目之间的交互

5.7.1 如果你没有最新的代码,希望从头开始

# 这里是项目的地址(可从项目主页复制),将远程服务器的内容完全复制过来 
[root@git-client ~]# git clone git@192.168.200.19:/git-root/shell.git

# clone 之后进入该项目的文件夹
[root@git-client ~]# cd shell/
# 新建一个文件 
[root@git-client shell]# echo "ceshi" > 1.txt

# 将新的文件添加到git的暂存区        
[root@git-client shell]# git add 1.txt
# 将暂存区的文件提交到某一个版本保存下来,并加上注释
[root@git-client shell]# git commit -m '首次测试提交文件'
# 将本地的更改提交到远程服务器
[root@git-client shell]# git push -u origin master

5.7.2 如果你已经有一个新版代码,希望直接把本地的代码替换到远程服务器

# 新的代码
[root@git-client shell]# echo "git" > 1.txt
[root@git-client shell]# cat 1.txt 
git

# 进入代码存在的文件夹,或者直接在该文件夹打开
# 重新初始化 
[root@git-client shell]# git init

# 添加该文件夹中所有的文件到git的暂存区 
[root@git-client shell02]# git add .
# 提交所有代码到本机的版本库 
[root@git-client shell]# git commit -m '第二次测试提交文件'
# 将本地的更改提交到远程服务器
[root@git-client shell]# git push -u origin master
  • git 中 clone 过来的时候,git 不会对比本地和服务器的文件,也就不会有冲突,
  • 建议确定完全覆盖本地的时候用 clone,不确定会不会有冲突的时候用 git pull,将远程服务器的代码download下来
  • git pull=git fetch+git merge

5.8 分支管理

5.8.1 创建分支

# 创建 test 分支
[root@git-client shell]# git branch test
# 命令会列出所有分支,当前分支前面会标一个*号
[root@git-client shell]# git branch
* master
  test

5.8.2 分支切换

[root@git-client shell]# git checkout test
切换到分支 'test'
[root@git-client shell]# git branch
  master
* test

# 创建dev分支并切换到dev分支
[root@git-client shell]# git checkout -b dev
切换到一个新分支 'dev'
[root@git-client shell]# git branch
* dev
  master
  test

5.8.3 分支删除

# 删除 test 分支
[root@git-client shell]# git branch -d test
已删除分支 test(曾为 fc18276)。
[root@git-client shell]# git branch
* dev
  master

5.8.4 分支提交

# 修改代码
[root@git-client shell]# echo "123" >> 1.txt 
[root@git-client shell]# cat 1.txt 
git
123

# 添加该文件夹中所有的文件到git的暂存区 
[root@git-client shell02]# git add .
# 在dev分支上正常提交
[root@git-client shell]# git commit -m '第三次测试提交文件'
# 将本地的更改提交到远程服务器
[root@git-client shell]# git push -u origin dev

# 查看文件,刚才添加的内容不见了,因为那个提交是在dev分支上,而master分支此刻的提交点并没有变  
[root@git-client shell]# git checkout master
切换到分支 'master'
[root@git-client shell]# cat 1.txt 
git

5.8.5 合并分支

# 把dev分支的工作成果合并到master分支上
[root@git-client shell]# git merge dev
更新 fc18276..7298181
Fast-forward
 1.txt | 1 +
 1 file changed, 1 insertion(+)
 
# 合并后,再查看文件内容,就可以看到和dev分支的最新提交是完全一样的
[root@git-client shell]# cat 1.txt 
git
123

注意到上面的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。当然,也不是每次合并都能Fast-forward,我们后面会讲其他方式的合并。

5.8.6 解决冲突

# 创建新的feature1分支
[root@git-client shell]# git checkout -b feature
切换到一个新分支 'feature'
[root@git-client shell]# git branch
  dev
* feature
  master

# 修改文件内容
[root@git-client shell]# echo "feature" >> 1.txt 
[root@git-client shell]# cat 1.txt 
git
123
feature

# 添加该文件夹中所有的文件到git的暂存区 
[root@git-client shell02]# git add .
# 在feature分支上提交
[root@git-client shell]# git commit -m '第四次测试提交文件'
#切换到master分支
[root@git-client shell]# git checkout master
切换到分支 'master'
您的分支领先 'origin/master' 共 1 个提交。
  (使用 "git push" 来发布您的本地提交)

# Git还会自动提示我们当前master分支比远程的master分支要超前1个提交。

# 在master分支上把文件改为:
[root@git-client shell]# echo "feature" >> 1.txt 
[root@git-client shell]# cat 1.txt 
git
123
feature

# 添加该文件夹中所有的文件到git的暂存区 
[root@git-client shell02]# git add .
# 在master分支上提交
[root@git-client shell]# git commit -m '第五次测试提交文件'
# 现在,master分支和feature分支各自都分别有新的提交。这种情况下,Git无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突,我们试试看:
[root@git-client shell]# git merge feature
fatal: 您尚未结束您的合并(存在 MERGE_HEAD)。
请在合并前先提交您的修改。

# 文件存在冲突,必须手动解决冲突后再提交。
# git status 可以显示冲突的文件;
[root@git-client shell]# git status
# 位于分支 master
# 您的分支领先 'origin/master' 共 2 个提交。
#   (使用 "git push" 来发布您的本地提交)
#
# 所有冲突已解决但您仍处于合并中。
#   (使用 "git commit" 结束合并)
#
无文件要提交,干净的工作区

# 添加该文件夹中所有的文件到git的暂存区 
[root@git-client shell02]# git add .
# 在master分支上提交
[root@git-client shell]# git commit -m '第六次测试提交文件'
# 将本地的更改提交到远程服务器
[root@git-client shell]# git push -u origin master

5.8.7 fetch拷贝分支内容

实验如下:

# 远程Git服务器代码内容如下:
[root@git-client shell]# cat 1.txt 
ceshi

# 本地代码内容如下:
[root@git-client shell]# echo "hello" >> 1.txt
[root@git-client shell]# cat 1.txt 
ceshi
hello
# 本地机器做fetch操作:
[root@git-client shell]# git fetch origin master:test
来自 192.168.200.19:/git-root/shell
 * [新分支]          master     -> test

# 新分支
[root@git-client shell]# git branch
  dev
  feature
* master
  test

fetch是把远程代码作为本地的一个其他分支下载到本地,并不更新本地分支,这里的命令是把远程的master分支下载到本地作为一个新的分支test存在

# 查看本地文件并没有发生变化
[root@git-client shell]# ls
1.txt
[root@git-client shell]# cat 1.txt 
ceshi
hello

# 添加该文件夹中所有的文件到git的暂存区 
[root@git-client shell02]# git add .
# 提交所有代码到本机的版本库 
[root@git-client shell]# git commit -m '第七次测试提交文件'
# 用diff查看本地master分支和fetch下来的test分支有什么区别:
[root@git-client shell]# git diff master test
diff --git a/1.txt b/1.txt
index 6b96083..9c0df78 100644
--- a/1.txt
+++ b/1.txt
@@ -1,2 +1,3 @@
-ceshi
-hello
+git
+123
+feature

5.9 版本回退

# 用 git log 命令查看
[root@git-client shell]# git log
......
commit 64df6707db0ed6fd675fd00cadd975601e505502
Merge: 24a7faa b137dad
Author: git <git@163.com>
Date:   Fri Jun 9 15:01:47 2023 +0800

    第六次测试提交文件

commit 24a7faa8528aa3ec22f4db7e0ecabc7a6ad0d102
Author: git <git@163.com>
Date:   Fri Jun 9 14:57:53 2023 +0800

    第五次测试提交文件

commit b137dadbc8bb922e3ec39871b4490177ee9df3b3
Author: git <git@163.com>
Date:   Fri Jun 9 14:55:00 2023 +0800
......
# 查看当前文件内容
[root@git-client shell]# cat 1.txt 
git
123
feature

# 使用 git reset 命令退到上一个版本
[root@git-client shell]# git reset --hard HEAD^
HEAD 现在位于 eeacd84 第三次测试提交文件

# 查看现在文件内容
[root@git-client shell]# cat 1.txt 
git
123
# 查看命令历史,以便确定要回到哪个版本
[root@git-client shell]# git reflog
7298181 HEAD@{0}: reset: moving to HEAD^
.....
fc18276 HEAD@{17}: commit: 第二次测试提交文件
2439382 HEAD@{18}: commit (initial): 首次测试提交文件

# 回滚哪个版本
[root@git-client shell]# git reset --hard 2439382
HEAD 现在位于 2439382 首次测试提交文件

# 查看现在文件内容
[root@git-client shell]# cat 1.txt 
ceshi

6、Github 远程仓库

6.1 登录github官方网站注册账户

图片.png-103.9kB

6.2 github 上创建仓库

图片.png-121.3kB

图片.png-105.3kB

6.3 本地服务器生成 ssh 公钥

# 邮箱要与github上注册的相同
[root@git-client ~]# ssh-keygen -t rsa -C 'git@163.com'

[root@git-client ~]# cat .ssh/id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCrKk6mx30blyeRetvc2PwnKv5bRY3ifXkZLD5Z5GUBfy5GiRX7T6suNiFzmi5Oscn/vofkAVbf1rfrGa+C76O+1ohYlKc9mlgOYKvO0WrW0lJL47P7MSy9zeuMfDxTM0KlKdpQ9AXGzpNFloEwRRFEZf36cquAdv6mkyzpkIalRJjtoZZt4Ps43bSvhJCMSfiIo0n7HowwDBQWpqON6VrU/R75RC5AbK9plyR5MUZ2Scf33skfmkPfn/5C7wmbL/E24Ngtg8KtWcLV05uvSh3amDIHC5zCimXdT0heDIEbZV2JrbHtD3tUk+xmjKzdM3EqVsMt1cGJKfOJh17YqJ2f git@163.com

6.4 github 添加 ssh 公钥

图片.png-53.1kB

图片.png-108.2kB

图片.png-92kB

6.5 测试连接

The authenticity of host 'github.com (20.205.243.166)' can't be established.
ECDSA key fingerprint is SHA256:p2QAMXNIC1TJYWeIOttrVc98/R1BUFWu3/LiyKgUfQM.
ECDSA key fingerprint is MD5:7b:99:81:1e:4c:91:a5:0d:5a:2e:2e:80:13:3f:24:ca.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,20.205.243.166' (ECDSA) to the list of known hosts.
Hi ywb971108! You've successfully authenticated, but GitHub does not provide shell access.

6.6 连接远程仓库(创建一个测试存储库)

# 在 github 网站新建一个仓库,命名为fib
[root@git-client ~]# mkdir fib
[root@git-client ~]# cd fib/

# git 初始化,然后做第一个基本的git操作(需要在github上创建存储库)
[root@git-client fib]# git init
[root@git-client fib]# echo "ceshi" > README.md
[root@git-client fib]# cat README.md 
ceshi

[root@git-client fib]# git add README.md 
[root@git-client fib]# git commit -m "首次提交"
[root@git-client fib]# git remote add origin git@github.com:ywb971108/fib.git

# 执行push到远端
[root@git-client fib]# git push -u origin master

# 注意设置存储库链接
[root@git-client linux]# git remote set-url origin git@github.com:ywb971108/fib.git

图片.png-92.6kB

7、Gitlab Server 部署

7.1 环境配置

7.1.1 关闭防火墙

[root@git-server ~]# systemctl stop firewalld
[root@git-server ~]# systemctl disable firewalld

7.1.2 关闭 SELinux

[root@git-server ~]# setenforce 0
[root@git-server ~]# sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

7.1.3 开启邮件服务

[root@git-server ~]# systemctl start postfix
[root@git-server ~]# systemctl enable postfix

7.2 部署 Gitlab

7.2.1 安装 gitlab 依赖包

# gitlab-ce 10.x.x以后的版本需要依赖policycoreutils-python
[root@git-server ~]# yum install -y curl openssh-server openssh-clients postfix cronie policycoreutils-python

7.2.2 添加官方源

[root@git-server ~]# curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | bash

7.2.3 安装 Gitlab

# 安装指定版本Gitlab
[root@git-server ~]# yum -y install gitlab-ce-12.3.5

7.2.4 配置 Gitlab

7.2.4.1 查看Gitlab版本
[root@git-server ~]# head -1 /opt/gitlab/version-manifest.txt 
gitlab-ce 12.3.5
7.2.4.2 修改 Gitlab 配置
[root@git-server ~]# vim /etc/gitlab/gitlab.rb
[root@git-server ~]# egrep -v "^#|^$" /etc/gitlab/gitlab.rb
# 绑定监听的域名或IP。没有域名,可以设置为本机IP地址
# GitLab默认的监听端口为80,但是在企业中这个端口经常被别的服务占用,所以我们还需要更换端口号
external_url 'http://192.168.200.19:8088'
gitlab_rails['gitlab_email_enabled'] = true
gitlab_rails['gitlab_email_from'] = '2659911387@qq.com'
gitlab_rails['gitlab_email_display_name'] = 'gitlab'
gitlab_rails['gitlab_email_reply_to'] = '2659911387@qq.com'
gitlab_rails['gitlab_email_subject_suffix'] = '[gitlab]'
gitlab_rails['gitlab_email_smime_enabled'] = true
# ssl证书
gitlab_rails['gitlab_email_smime_key_file'] = '/etc/gitlab/ssl/git-server.key'
gitlab_rails['gitlab_email_smime_cert_file'] = '/etc/gitlab/ssl/git-server.crt'
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.qq.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "2659911387@qq.com"
# 这是我的qq邮箱授权码
gitlab_rails['smtp_password'] = "gpmkavaafgtwdice"
gitlab_rails['smtp_domain'] = "smtp.qq.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = false
7.2.4.3 手动配置ssl证书

1、创建私有密钥

[root@git-server ~]# mkdir -p /etc/gitlab/ssl
[root@git-server ~]# openssl genrsa -out "/etc/gitlab/ssl/git-server.key" 2048

2、创建私有证书

[root@git-server ~]# openssl req -new -key "/etc/gitlab/ssl/git-server.key" -out "/etc/gitlab/ssl/git-server.csr"
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN                # 国家
State or Province Name (full name) []:BeiJing       # 省份
Locality Name (eg, city) [Default City]:BeiJing     # 城市
Organization Name (eg, company) [Default Company Ltd]:     # 空格
Organizational Unit Name (eg, section) []:                 # 空格
Common Name (eg, your name or your server's hostname) []:git-server   # 名字
Email Address []:2659911387@qq.com    # 邮箱地址

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:123456      # 密码
An optional company name []:        # 空格

3、利用ssl密钥和证书创建签署证书

[root@git-server ~]# openssl x509 -req -days 365 -in "/etc/gitlab/ssl/git-server.csr" -signkey "/etc/gitlab/ssl/git-server.key" -out "/etc/gitlab/ssl/git-server.crt"
Signature ok
subject=/C=CN/ST=BeiJing/L=BeiJing/O=Default Company Ltd/CN=git-server/emailAddress=2659911387@qq.com
Getting Private key
[root@git-server ~]# ll /etc/gitlab/ssl/
总用量 12
-rw-r--r-- 1 root root 1289 6月  14 11:54 git-server.crt
-rw-r--r-- 1 root root 1078 6月  14 11:51 git-server.csr
-rw-r--r-- 1 root root 1679 6月  14 11:50 git-server.key
7.2.4.4 GitLab中文社区版补丁包安装

GitLab中文社区:https://gitlab.com/xhang/gitlab/tree/12-3-stable-zh

# 下载GitLab中文版补丁包
[root@git-server ~]# wget https://gitlab.com/xhang/gitlab/-/archive/12-3-stable-zh/gitlab-12-3-stable-zh.tar.gz

#解压GitLab中文版补丁包
[root@git-server ~]# tar xf gitlab-12-3-stable-zh.tar.gz

#备份英文版GitLab
[root@git-server ~]# cp -r /opt/gitlab/embedded/service/gitlab-rails{,.bak}

#将中文补丁包的内容覆盖英文版
[root@git-server ~]# rm -rf gitlab-12-3-stable-zh/{tmp,log}
[root@git-server ~]# /bin/cp -rf gitlab-12-3-stable-zh/* /opt/gitlab/embedded/service/gitlab-rails/
7.2.4.5 初始化 Gitlab
# 初始化GitLab,配置时间较长
[root@git-server ~]# gitlab-ctl reconfigure
......
7.2.4.6 启动 Gitlab 服务
[root@git-server ~]# gitlab-ctl start
ok: run: alertmanager: (pid 11147) 304s
ok: run: gitaly: (pid 10157) 473s
ok: run: gitlab-exporter: (pid 11110) 306s
ok: run: gitlab-workhorse: (pid 11089) 307s
ok: run: grafana: (pid 11176) 298s
ok: run: logrotate: (pid 10786) 348s
ok: run: nginx: (pid 10754) 354s
ok: run: node-exporter: (pid 11100) 306s
ok: run: postgres-exporter: (pid 11162) 304s
ok: run: postgresql: (pid 10006) 494s
ok: run: prometheus: (pid 11126) 305s
ok: run: redis: (pid 9845) 502s
ok: run: redis-exporter: (pid 11117) 305s
ok: run: sidekiq: (pid 10714) 361s
ok: run: unicorn: (pid 10687) 362s

[root@git-server ~]# lsof -i:8088
COMMAND   PID       USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nginx   10754       root    7u  IPv4  37593      0t0  TCP *:radan-http (LISTEN)
nginx   10760 gitlab-www    7u  IPv4  37593      0t0  TCP *:radan-http (LISTEN)
nginx   10761 gitlab-www    7u  IPv4  37593      0t0  TCP *:radan-http (LISTEN)
nginx   10762 gitlab-www    7u  IPv4  37593      0t0  TCP *:radan-http (LISTEN)
nginx   10763 gitlab-www    7u  IPv4  37593      0t0  TCP *:radan-http (LISTEN)
7.2.4.7 Gitlab 发送邮件测试
[root@git-server ~]# gitlab-rails console 
--------------------------------------------------------------------------------
 GitLab:       12.3.5 (2417d5becc7)
 GitLab Shell: 10.0.0
 PostgreSQL:   10.9
--------------------------------------------------------------------------------
Loading production environment (Rails 5.2.3)
irb(main):001:0> Notify.test_email('2659911387@qq.com', 'Message Subject', 'hi 杨哥!').deliver_now   # 输入测试命令,回车

......

=> #<Mail::Message:70088952551520, Multipart: true, Headers: <Date: Wed, 14 Jun 2023 12:07:34 +0800>, <From: gitlab <2659911387@qq.com>>, <Reply-To: gitlab <2659911387@qq.com>>, <To: 2659911387@qq.com>, <Message-ID: <64893d0631374_2f053fbef17cf9a823477@git-server.mail>>, <Subject: Message Subject>, <Mime-Version: 1.0>, <Content-Type: multipart/signed; boundary=----4C560D25FC43B1D07A1CF6F8B4FC1BF9; micalg=sha-256; protocol="application/x-pkcs7-signature">, <Content-Transfer-Encoding: 7bit>, <Content-Disposition: >, <Auto-Submitted: auto-generated>, <X-Auto-Response-Suppress: All>>

去qq邮箱web界面查看是否收到邮件

图片.png-48.8kB

7.2.4.8 Gitlab服务管理
gitlab-ctl start                        # 启动所有 gitlab 组件;
gitlab-ctl stop                         # 停止所有 gitlab 组件;
gitlab-ctl restart                      # 重启所有 gitlab 组件;
gitlab-ctl status                       # 查看服务状态;
gitlab-ctl reconfigure                  # 初始化服务;
vim /etc/gitlab/gitlab.rb               # 修改默认的配置文件;
gitlab-ctl tail                         # 查看日志;

7.3 Gitlab 的使用

7.3.1 浏览器登录Gitlab

图片.png-72.8kB

图片.png-60.7kB

7.3.2 创建项目组 group

图片.png-109.4kB

图片.png-76.2kB

图片.png-63.3kB

7.3.3 去掉用户的自动注册功能(安全)

图片.png-180.2kB

8、Gitlab 开发代码提交处理流程

8.1 公司代码提交合并流程

  • PM(项目主管/项目经理)在gitlab创建任务,分配给开发人员
  • 开发人员领取任务后,在本地使用git clone拉取代码库
  • 开发人员创建开发分支(git checkout -b dev),并进行开发
  • 开发人员完成之后,提交到本地仓库(git commit )
  • 开发人员在gitlab界面上申请分支合并请求(Merge request)
  • PM在gitlab上查看提交和代码修改情况,确认无误后,确认将开发人员的分支合并到主分支(master)
  • 开发人员在gitlab上Mark done确认开发完成,并关闭issue。这一步在提交合并请求时可以通过描述中填写"close #1"等字样,可以直接关闭issue

8.2 创建项目管理用户 laoli

图片.png-107kB

图片.png-140.2kB

图片.png-108kB
同样的方法,再创建 xiaozhaoxiaosun用户。用户添加完毕后,gitlab 会给用户发一封修改密码的邮件,各用户需要登录自己的邮箱,并点击相关的链接,设置新密码。
图片.png-41.9kB

8.3 将 laoli 用户添加到组中,指定T为本组的 owner

图片.png-73kB

图片.png-61.9kB

图片.png-60.9kB

8.4 同样的方法将用户xiaozhao、xiaosun 添加到组中,并指定为 Developer

图片.png-74kB

8.5 使用 laoli 用户的身份与密码登录到 gitlab 界面中,并创建项目 Project

图片.png-57.5kB

8.6 指定项目的存储路径和项目名称

图片.png-80.6kB

把客户端的公钥添加到这里之后才会出现下图的内容

图片.png-89.9kB

8.7 在 client 上添加 laoli 的用户

[root@git-client ~]# useradd laoli
[root@git-client ~]# useradd xiaozhao
[root@git-client ~]# useradd xiaosun

[root@git-client ~]# su - laoli
[laoli@git-client ~]$ ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (/home/laoli/.ssh/id_rsa): 
Created directory '/home/laoli/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/laoli/.ssh/id_rsa.
Your public key has been saved in /home/laoli/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:E5n9PvKd1ZLTmISeyxodzvlU4snmvIc99G245jjmKE0 laoli@git-client
The key's randomart image is:
+---[RSA 2048]----+
|                 |
|         +       |
|        + .      |
|         . . .   |
|        S   + o .|
|         .E* B X.|
|         oo X &+*|
|        . .*o@+**|
|         .o+*+X=.|
+----[SHA256]-----+


[laoli@git-client ~]$ cat .ssh/id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDVRpUTP6OdsODg2qmICQsYGHhI3ThGnYD3Xw104VudQShpdPEzgQE5Fr47xdTSojCsyExiA2HovJKKZDjjHavzDepIhRH4jC4aDGWSpPOJDDRJRD64O0CmNfzvedzE+HUq8j3UxPLCS6N0Kf8CQBlGB+jqj/yFeUL39rOCORxOYk1nqgo8hU4BQ20RtmwpRMBzOBqlkz/Z5ksDeRSFqppq1K7h7MZnrkfS2JVVZywFs3LqoWes+wm7zpROSWU/m9+Ftlm7wZMKYDlqu3bZeh6RFGZ8IwTYR+Dnhyy2jRAc5kSCqfYaADiMUCVRpqbuf8Q92pe//ZTkkOBpc/YVifKF laoli@git-client

8.8 将 laoli 的公钥复制到 gitlab 中

使用 laoli 用户的身份与密码登录到 gitlab界面中,然后在 ssh-key 中添加相关的key

图片.png-139.8kB

8.9 为 laoli 用户配置 git

[laoli@git-client ~]$ git config --global user.email "2@qq.com"
[laoli@git-client ~]$ git config --global user.name "laoli"

[laoli@git-client ~]$ git clone git@192.168.200.19:ceshi/project.git

8.10 创建新文件,添加内容,并提交到 master 分支

[laoli@git-client ~]$ cd project/
[laoli@git-client project]$ echo "gitlab test" > test.txt
[laoli@git-client project]$ cat test.txt 
gitlab test

[laoli@git-client project]$ git add .
[laoli@git-client project]$ git commit -m "首次提交"
[laoli@git-client project]$ git push -u origin master 

8.11 使用 xiaozhao 用户登录,并 clone 项目

[root@git-client ~]# su - xiaozhao
[xiaozhao@git-client ~]$ ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (/home/xiaozhao/.ssh/id_rsa): 
Created directory '/home/xiaozhao/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/xiaozhao/.ssh/id_rsa.
Your public key has been saved in /home/xiaozhao/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:Wf0g3H5vqScOD9VeE3X1g3X5/Z6D0hRa/7/Px6lk89o xiaozhao@git-client
The key's randomart image is:
+---[RSA 2048]----+
|               .B|
|         . o  o.=|
|          + +. o+|
|         o o =. =|
|        S   +.=oo|
|           ..o.o=|
|           oo+.=*|
|           .*+=B=|
|            o*=EX|
+----[SHA256]-----+


[xiaozhao@git-client ~]$ cat .ssh/id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDTzKqeDVDiD/FzelTDuWV21k9r162lTLRGwK3v+kIikzY0QoncI4ebmxR2CicnzjvGjs9ooKAHTAzXxqDct/mJ0/y4D05eOu8zbvEqCDYpSDLx+UQxs9GLfLhFqnJm5Pd6fJU/gSVwU88P1WVNrUkzjH77rqxAmmnol9zwx7TblqKwtC8hrko//hovXdAmxXhI+CwDMbEUtrxDbRuAyeH/eNaFiumPhXOdeN+O2MsiLYMEAujbS+baEuuPwfm9ZJMRuTHCXT9zERcz+pMnmJg+Tngm8dPPJF/ZinZuV0g2fifxlTBu72prlpKA23ZVRmAqCcpP6MoKnN/Culo/qbdJ xiaozhao@git-client

8.12 同样需要使用Eric用户登录gitlab web 界面,并添加相应的ssh-key。然后设置git ,并clone项目

[xiaozhao@git-client ~]$ git config --global user.email "3@qq.com"
[xiaozhao@git-client ~]$ git config --global user.name "xiaozhao"
[xiaozhao@git-client ~]$ git clone git@192.168.200.19:ceshi/project.git

8.13 创建并切换到dev分支,修改文件内容,并将新 code 提交到 dev分支 (Developer角色默认并没有提交master的权限)

[xiaozhao@git-client ~]$ cd project/
[xiaozhao@git-client project]$ git checkout -b dev
切换到一个新分支 'dev'
[xiaozhao@git-client project]$ git branch
* dev
  master
  
[xiaozhao@git-client project]$ echo "xiaozhao test" > xiaozhao.txt
[xiaozhao@git-client project]$ ls
test.txt  xiaozhao.txt
[xiaozhao@git-client project]$ cat xiaozhao.txt 
xiaozhao test

[xiaozhao@git-client project]$ git add .
[xiaozhao@git-client project]$ git commit -m '第二次提交'
[xiaozhao@git-client project]$ git push -u origin dev 

8.14 使用 xiaozhao 用户登录gitlab web,在界面中 创建一个合并请求

图片.png-47.5kB

提交合并请求:

图片.png-88.5kB

图片.png-62.4kB

8.15 使用 laoli 用户登录 gitlab web ,找到“合并请求” ,然后将dev分支合并到master分支

图片.png-58.6kB

图片.png-74.6kB

9、Gitlab 备份与恢复

9.1 查看系统版本和软件版本

[root@git-server ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

[root@git-server ~]# cat /opt/gitlab/embedded/service/gitlab-rails/VERSION 
12.3.5

9.2 数据备份

9.2.1 创建备份目录

[root@git-server ~]# mkdir -p /data/gitlab/backups

9.2.2 查看备份相关的配置项

[root@git-server ~]# vim /etc/gitlab/gitlab.rb
[root@git-server ~]# sed -n "368,369p" /etc/gitlab/gitlab.rb
gitlab_rails['manage_backup_path'] = true
gitlab_rails['backup_path'] = "/data/gitlab/backups"

该项定义了默认备份出文件的路径,可以通过修改该配置,并执行 gitlab-ctl reconfigure 或者 gitlab-ctl restart 重启服务生效。

# 重启服务
[root@git-server ~]# gitlab-ctl restart

9.2.3 执行备份命令进行备份

[root@git-server ~]# /opt/gitlab/bin/gitlab-rake gitlab:backup:create 

9.2.4 添加到 crontab 中定时执行

[root@git-server ~]# crontab -l
0 2 * * * bash /opt/gitlab/bin/gitlab-rake gitlab:backup:create

可以到/data/gitlab/backups找到备份包,解压查看,会发现备份的还是比较全面的,数据库、repositories、build、upload等分类还是比较清晰的。

9.2.5 设置备份保留时长

防止每天执行备份,有目录被爆满的风险,打开/etc/gitlab/gitlab.rb配置文件,找到如下配置:

[root@git-server ~]# vim /etc/gitlab/gitlab.rb
[root@git-server ~]# sed -n "377p" /etc/gitlab/gitlab.rb
gitlab_rails['backup_keep_time'] = 604800

# 重启服务
[root@git-server ~]# gitlab-ctl restart

设置备份保留7天(7360024=604800),秒为单位,如果想增大或减小,可以直接在该处配置,并通过gitlab-ctl restart 重启服务生效。

备份完成,会在备份目录中生成一个当天日期的tar包。

[root@git-server ~]# ll /data/gitlab/backups/
总用量 140
-rw------- 1 git git 143360 8月  11 23:19 1691767153_2023_08_11_12.3.5_gitlab_backup.tar

9.3 数据恢复

9.3.1 安装部署 gitlab server

具体步骤参见上面:7.2 gitlab server 搭建过程

9.3.2 恢复 gitlab

9.3.2.1 查看备份相关的配置项
# 创建备份目录
[root@git-client ~]# mkdir -p /data/gitlab/backups

[root@git-client ~]# vim /etc/gitlab/gitlab.rb
[root@git-client ~]# sed -n "369p" /etc/gitlab/gitlab.rb
gitlab_rails['backup_path'] = "/data/gitlab/backups"

修改该配置,定义了默认备份出文件的路径,并执行 gitlab-ctl reconfigure 或者 gitlab-ctl restart 重启服务生效。

9.3.2.2 恢复前需要先停掉数据连接服务
[root@git-client ~]# gitlab-ctl stop unicorn
[root@git-client ~]# gitlab-ctl stop sidekiq
  • 如果是台新搭建的主机,不需要操作,理论上不停这两个服务也可以。停这两个服务是为了保证数据一致性。
9.3.2.3 同步备份文件到新服务器

将老服务器/data/gitlab/backups目录下的备份文件拷贝到新服务器上的/data/gitlab/backups

[root@git-server ~]# rsync -avz /data/gitlab/backups/1691767153_2023_08_11_12.3.5_gitlab_backup.tar root@192.168.200.20:/data/gitlab/backups/
  • 注意权限:600权限是无权恢复的。 实验环境可改成了777,生产环境建议修改属主属组
[root@git-client ~]# cd /data/gitlab/backups

[root@git-client backups]# chown -R git:git 1691767153_2023_08_11_12.3.5_gitlab_backup.tar 
[root@git-client backups]# chmod -R 777 1691767153_2023_08_11_12.3.5_gitlab_backup.tar 

[root@git-client backups]# ll
总用量 140
-rwxrwxrwx 1 git git 143360 8月  11 23:19 1691767153_2023_08_11_12.3.5_gitlab_backup.tar

9.3.2.4 执行命令进行恢复
# 注意:backups 目录下保留一个备份文件可直接执行
[root@git-client backups]# /opt/gitlab/bin/gitlab-rake gitlab:backup:restore BACKUP=1691767153_2023_08_11_12.3.5

# 后面再输入两次 yes 就完成恢复了
9.3.2.5 恢复完成启动服务

恢复完成后,启动刚刚的两个服务,或者重启所有服务,再打开浏览器进行访问,发现数据和之前的一致:

[root@git-client backups]# gitlab-ctl start unicorn
[root@git-client backups]# gitlab-ctl start sidekiq

或

gitlab-ctl restart

注意:通过备份文件恢复gitlab必须保证两台主机的gitlab版本一致,否则会提示版本不匹配

图片.png-134.9kB

10、利用Gitlab管理k8s集群

10.1 获取k8s集群API地址

[root@k8s-master ~]# kubectl cluster-info | grep 'Kubernetes' | awk '/http/ {print $NF}'
https://192.168.200.21:6443

10.2 权限设置

图片.png-172.5kB

10.3 获取k8s集群默认CA证书

[root@k8s-master ~]# kubectl get secrets
NAME                  TYPE                                  DATA   AGE
default-token-74zwn   kubernetes.io/service-account-token   3      20m

default-token-74zwn为上面获取到的secrets的名称,用以下命令查看证书

[root@k8s-master ~]# kubectl get secret default-token-74zwn -o jsonpath="{['data']['ca\.crt']}" | base64 --decode
-----BEGIN CERTIFICATE-----
MIIC5zCCAc+gAwIBAgIBADANBgkqhkiG9w0BAQsFADAVMRMwEQYDVQQDEwprdWJl
cm5ldGVzMB4XDTIzMDgxNDE0MTk1MFoXDTMzMDgxMTE0MTk1MFowFTETMBEGA1UE
AxMKa3ViZXJuZXRlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPdL
VEhCPY0nhSqZinVG4rc7dFLil+GdYgNZMzZMr4hIueszKqyMemWnS1RK/H7CBGfY
Us6t9/jVfDUymz6UmTjj2QBVYgUfxH11xyfOBeHZHAmyRZjmE+7tlq+85sbIDrXU
uiLqcNdAIWGS5w8AYLoUhEMPrir3L+dE4Hug2c+543UTw+GP94Fxfh+VYbZx5Yke
U9Ji/Hea8+cq4/o6nARlFxVpI5pirl6KH7BhkkhvKVdb/8LwKAFTdp0SQ6INVbC3
lxUFcBsxc1C9KydwnZkQVZHAIQZJVv53ImfTeY6sWrOMeihjQtEypjGQuFIfiE6X
TnBGgpx1v4WmgQeR4OMCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgKkMA8GA1UdEwEB
/wQFMAMBAf8wHQYDVR0OBBYEFBv7Foo8bPpEYzi5XUPONTZHpF6JMA0GCSqGSIb3
DQEBCwUAA4IBAQDkjegr5TOvdPaMndFbE03wy73eheK+nNZt8c0v6CvC5heM+Hul
IrVt1uR7g60zjEx8qVQ3Vn1zNlY+U6GpCMpH2RiY9S9c5Yj6LJUbRYZ9pmSptz+j
UCaayR6hswLOZ08R+OsN8skfFS53QXEC0b4bmP1DymXKcpMD/NNnt4PFOF6oATwy
JSkjKoTd1Iq5pp/nT+apBFwjokGBitrg6yrPqel2bgnaq3MFsLCCjUKfDKXxbMC5
qG+XbrNg5M98KWdxLh9RCIvXFy3YuIoXfReF2ZmVvRA4oiRaTH2crSx6R4v0IEcZ
ADHsavHxImP46bfranoOCSOVrizJz8ibO+2C
-----END CERTIFICATE-----

10.4 设置rbac

[root@k8s-master ~]# cat > gitlab-admin-service-account.yaml << EOF
apiVersion: v1
kind: ServiceAccount
metadata:
  name: gitlab-admin
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: gitlab-admin
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: gitlab-admin
  namespace: kube-system
EOF

[root@k8s-master ~]# kubectl apply -f gitlab-admin-service-account.yaml

10.5 获取gitlab-admin的token

[root@k8s-master ~]# kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep gitlab-admin | awk '{print $1}')
Name:         gitlab-admin-token-lp9fm
Namespace:    kube-system
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: gitlab-admin
              kubernetes.io/service-account.uid: 50623e31-0189-4f75-9267-acf1691eb1fa

Type:  kubernetes.io/service-account-token

Data
====
ca.crt:     1066 bytes
namespace:  11 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IlZacFNqNWctTENwa0UwVS15VHJHMmFscF9aR0wzYloxQ09kV096bjFxUm8ifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJnaXRsYWItYWRtaW4tdG9rZW4tbHA5Zm0iLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZ2l0bGFiLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiNTA2MjNlMzEtMDE4OS00Zjc1LTkyNjctYWNmMTY5MWViMWZhIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmdpdGxhYi1hZG1pbiJ9.GBkb434h84KLtDoQDEbLZFX_BDjMnX7imuS-6GspXA0FKTm2h9kK-SbJHs0kw5WdM2wBkiW1oFoyWnvuaTtaYj5fqN6-8YBdyo-gXI9C5x11XTWp2Lb0k_v5zJX8xypfDwmVgy0arLR8LX5owWYJDgWjnFYwVzaLkEJR7IaN5fHo57xuIicylCJlkqmZOD3FoNw7L1Qo3EvQIoNsvdNnm8QjLZZKh9xkX4TMX_qsnqVDOoBU_B9NPpsyhADnbZpGBOmxaS6q8oUr_MIg0d-flWUTr2X5z8LNIezMRwlHEPsYO9v_XAAmQXnfTYgA0TT_sPJazz3TRDc55_I_3QHb6g

10.6 添加k8s集群

图片.png-103.2kB

图片.png-155.4kB

图片.png-92.3kB