首页
关于
统计
留言
更多
友链
直播
壁纸
Search
1
单机部署milvus(向量数据库)
12 阅读
2
Nginx部署
11 阅读
3
MySQL部署
9 阅读
4
源码编译安装ansible
9 阅读
5
typecho 部署
8 阅读
Linux
Typecho
小程序
生活
其他
k8s
登录
Search
clouds
累计撰写
18
篇文章
累计收到
15
条评论
首页
栏目
Linux
Typecho
小程序
生活
其他
k8s
页面
关于
统计
留言
友链
直播
壁纸
搜索到
18
篇与
的结果
2026-05-26
Jenkins部署
docker + docker-compose 安装略1.设置仓库 (安装所需的软件包) yum install -y yum-utils device-mapper-persistent-data lvm2 2.添加仓库 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 3.列出并排序您存储库中可用的版本。此示例按版本号(从高到低)对结果进行排序 yum list docker-ce --showduplicates | sort -r 4.安装Docker yum install docker-ce-26.1.4-1.el7 docker-ce-cli-26.1.4-1.el7 containerd.io 5.设置开机自启动 systemctl enable docker 6.启动Docker systemctl start docker 7.配置Docker镜像加速器 国内镜像加速器地址 网易:https://hub-mirror.c.163.com/ 阿里云:https://<你的ID>.mirror.aliyuncs.com 七牛云加速器:https://reg-mirror.qiniu.com [root@prometheus docker-compose]# cat /etc/docker/daemon.json { "registry-mirrors": [ "https://docker.1ms.run", "https://docker.xuanyuan.me" ], "data-root": "/data/docker" } systemctl daemon-reload systemctl restart docker 8.测试Docker [root@prometheus docker-compose]# docker run hello-world Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world [root@prometheus docker-compose]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest 74cc54e27dc4 8 weeks ago 10.1kB 9.安装docker-compose 三种安装docker-compose方式: (1)使用epel源直接安装(缺点就是版本较低) # yum -y install epel-release # yum -y install docker-compose (2)给docker打补丁安装(先安装docker,再docker compose补丁) # curl -o /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo # yum -y install docker-compose-plugin # vim /root/.bashrc ... alias docker-compose='docker compose' # source /root/.bashrc (3)基于二进制安装(需要从GitHub下载软件包,不推荐!速度慢!) # curl -SL https://github.com/docker/compose/releases/download/v2.16.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose 参考链接: https://docs.docker.com/compose/install/linux/ https://docs.docker.com/compose/install/other/安装Jenkins1.准备工作目录 mkdir /data/jenkins/{data,app} 2.docker-compose部署Jenkins [root@jenkins jenkins]# cat docker-compose.yaml version: '3' services: jenkins: image: jenkins/jenkins:lts-jdk21 container_name: jenkins restart: unless-stopped user: root ports: - '8080:8080' # 建议改为 8080,避免占用 80 端口 - '50000:50000' environment: TZ: Asia/Shanghai JAVA_OPTS: "-Xms512m -Xmx2048m -XX:MaxMetaspaceSize=512m -Dhudson.model.DirectoryBrowserSupport.CSP=" volumes: - '/data/jenkins/data:/var/jenkins_home' - '/data/jenkins/app:/var/jenkins/app' - '/var/run/docker.sock:/var/run/docker.sock' - '/etc/localtime:/etc/localtime:ro' networks: - jenkins-network logging: driver: "json-file" options: max-size: "50m" max-file: "5" networks: jenkins-network: driver: bridge 3.启动Jenkins docker-compose up -d 4.验证Jenkins docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES fbc202812815 jenkins/jenkins:lts-jdk21 "/usr/bin/tini -- /u…" 30 minutes ago Up 30 minutes 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp, 0.0.0.0:50000->50000/tcp, :::50000->50000/tcp jenkins 5.访问Jenkins http://localhost:8080 6.首次进入需要输入密码 cat /data/jenkins/jenkins_home/secrets/initialAdminPasswordJenkins离线安装1.准备Jenkins WAR 包和JDK 17 安装包 Jenkins官方下载地址:https://get.jenkins.io/war-stable/ jdk官方下载地址:https://www.oracle.com/java/technologies/downloads/ 国内清华大学 TUNA 镜像地址:https://mirrors.tuna.tsinghua.edu.cn/jenkins/ 国内清华大学 TUNA 镜像地址:https://mirrors.tuna.tsinghua.edu.cn/Adoptium/17/jdk/ 2.准备工作目录: mkdir /data/jenkins #下载到本地的包上传到离线服务器这个路劲下 3.安装jdk 1)解压jdk: tar -xvf OpenJDK17U-jdk_x64_linux_hotspot_17.0.19_10.tar.gz -C /data/jenkins 2)配置环境变量 : vim /etc/profile #添加以下内容: export JAVA_HOME=/data/jenkins/jdk-17.0.19+10 export PATH=$PATH:$JAVA_HOME/bin 3)使配置生效 source /etc/profile 4)验证安装 java -version openjdk version "17.0.19" 2026-04-21 OpenJDK Runtime Environment Temurin-17.0.19+10 (build 17.0.19+10) OpenJDK 64-Bit Server VM Temurin-17.0.19+10 (build 17.0.19+10, mixed mode, sharing) 4.启动 Jenkins nohup java -jar /data/jenkins/jenkins.war --httpPort=8082 > jenkins.log 2>&1 & 查看日志出现Jenkins 在初始化时需要使用 AWT 字体渲染功能(用于生成趋势图等),但你的服务器缺少图形化界面相关的字体配置。 解决方案: yum install -y fontconfig liberation-fonts 安装完成后,重启 Jenkins 即可: # 先找到并杀掉 Jenkins 进程 ps -ef | grep jenkins | grep -v grep | awk '{print $2}' | xargs kill -9 # 重新启动 Jenkins nohup java -jar /data/jenkins/jenkins.war --httpPort=8082 > jenkins.log 2>&1 & 5.验证Jenkins启动成功 ps -ef|grep jenkins root 4403 3309 28 23:42 pts/1 00:00:33 java -jar /data/jenkins/jenkins.war --httpPort=8082 netstat -tnulp|grep 8082 tcp6 0 0 :::8082 :::* LISTEN 4403/java 6.浏览器访问Jenkins http://10.0.0.201:8082/ 初始密码在 /root/.jenkins/secrets/initialAdminPassword #启动日志可以看见路劲
2026年05月26日
4 阅读
0 评论
0 点赞
2026-05-26
Git和Gitlab安装和使用
1. 系统环境准备cat /etc/redhat-release #查看系统版本 CentOS Linux release 7.9.2009 (Core) uname -r #查看内核版本 3.10.0-229.el7.x86_64 getenforce #确认Selinux关闭状态 Disabled systemctl stop firewalld #关闭防火墙2. Git安装部署yum install git git config --global 使用全局配置文件 --system 使用系统级配置文件 --local 使用版本库级配置文件 git config –-global user.name “your_username” # 配置git使用用户 git config –-global user.email “gitlab@mail.com” # 配置git使用邮箱 git config –-global color.ui true # 语法高亮 git config –-list user.name=your_username user.email=gitlab@mail.com color.ui=true cat .gitconfig [user] name = your_username email = gitlab@mail.com [color] ui = true3.git初始化 初始化工作目录、对已存在的目录或者对已存在的目录都可进行初始化 mkdir git_data cd git_data/ # 初始化 git init # 查看工作区状态 git status 隐藏文件介绍: branches # 分支目录 config # 定义项目特有的配置选项 description # 仅供git web程序使用 HEAD # 指示当前的分支 hooks # 包含git钩子文件 info # 包含一个全局排除文件(exclude文件) objects # 存放所有数据内容,有info和pack两个子文件夹 refs # 存放指向数据(分支)的提交对象的指针 index # 保存暂存区信息,在执行git init的时候,这个文件还没有4.git基础命令[root@git git_data]# git status # 位于分支 master # 初始提交 无文件要提交(创建/拷贝文件并使用 "git add" 建立跟踪) [root@git git_data]# touch a b c [root@git git_data]# git status # 位于分支 master # # 初始提交 # # 未跟踪的文件: # (使用 "git add <file>..." 以包含要提交的内容) # # a # b # c 提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪) [root@git git_data]# git add a [root@git git_data]# git status # 位于分支 master # # 初始提交 # # 要提交的变更: # (使用 "git rm --cached <file>..." 撤出暂存区) # # 新文件: a # # 未跟踪的文件: # (使用 "git add <file>..." 以包含要提交的内容) # # b # c [root@git git_data]# ll .git/ 总用量 20 drwxr-xr-x 2 root root 6 8月 23 05:44 branches -rw-r--r-- 1 root root 92 8月 23 05:44 config -rw-r--r-- 1 root root 73 8月 23 05:44 description -rw-r--r-- 1 root root 23 8月 23 05:44 HEAD drwxr-xr-x 2 root root 4096 8月 23 05:44 hooks -rw-r--r-- 1 root root 96 8月 23 07:06 index # git add a 把文件提交到了暂存区 drwxr-xr-x 2 root root 20 8月 23 05:44 info drwxr-xr-x 5 root root 37 8月 23 07:06 objects drwxr-xr-x 4 root root 29 8月 23 05:44 refs [root@git git_data]# git add . # 使用git add . 或者* 添加目录中所有改动过的文件 [root@git git_data]# git status # 位于分支 master # # 初始提交 # # 要提交的变更: # (使用 "git rm --cached <file>..." 撤出暂存区) # # 新文件: a # 新文件: b # 新文件: c [root@git git_data]# git rm --cached c rm 'c' [root@git git_data]# ll 总用量 0 -rw-r--r-- 1 root root 0 8月 23 07:05 a -rw-r--r-- 1 root root 0 8月 23 07:05 b -rw-r--r-- 1 root root 0 8月 23 07:05 c [root@git git_data]# git status # 位于分支 master # # 初始提交 # # 要提交的变更: # (使用 "git rm --cached <file>..." 撤出暂存区) # # 新文件: a # 新文件: b # # 未跟踪的文件: # (使用 "git add <file>..." 以包含要提交的内容) # # c 删除文件 1.先从暂存区撤回到工作区、然后直接删除文件 git rm --cached c rm -f c 2.直接从暂存区域同工作区域一同删除文件命令 git rm -f b [root@git git_data]# git commit -m "commit a" # 提交到本地仓库 [master(根提交) b4017a8] commit a 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 a [root@git git_data]# git status # 位于分支 master 无文件要提交,干净的工作区 修改文件名称两种方法 1. [root@git git_data]# mv a a.txt [root@git git_data]# git status # 位于分支 master # 尚未暂存以备提交的变更: # (使用 "git add/rm <file>..." 更新要提交的内容) # (使用 "git checkout -- <file>..." 丢弃工作区的改动) # # 删除: a # # 未跟踪的文件: # (使用 "git add <file>..." 以包含要提交的内容) # # a.txt 修改尚未加入提交(使用 "git add" 和/或 "git commit -a") [root@git git_data]# git rm --cached a # 从暂存区删除a文件 rm 'a' [root@git git_data]# git status # 位于分支 master # 要提交的变更: # (使用 "git reset HEAD <file>..." 撤出暂存区) # # 删除: a # # 未跟踪的文件: # (使用 "git add <file>..." 以包含要提交的内容) # # a.txt [root@git git_data]# git add a.txt [root@git git_data]# git status # 位于分支 master # 要提交的变更: # (使用 "git reset HEAD <file>..." 撤出暂存区) # # 重命名: a -> a.txt # 识别到a和a.txt相同为重命名 [root@git git_data]# git commit -m "commit a.txt" 2.直接用git命令重命名 [root@git git_data]# git mv a.txt a 把工作区域和暂存区域的文件同时修改文件名称 [root@git git_data]# git status # 位于分支 master # 要提交的变更: # (使用 "git reset HEAD <file>..." 撤出暂存区) # # 重命名: a.txt -> a git commit -m "rename a.txt a" git status 只能查看区域状态的不同,不能查看文件内容的变化。 git diff 查看内容的不同 [root@git git_data]# echo aaa > a [root@git git_data]# git diff a # 比对本地工作目录和暂存区文件的不同 diff --git a/a b/a index e69de29..72943a1 100644# --- a/a +++ b/a @@ -0,0 +1 @@ +aaa [root@git git_data]# git add a # 提交a文件到暂存区域、在用git diff是相同的 [root@git git_data]# git diff --cached a # 比对的是暂存区和本地仓库文件的不同处 diff --git a/a b/a index e69de29..72943a1 100644 --- a/a +++ b/a @@ -0,0 +1 @@ +aaa [root@git git_data]# git commit -m "modified a" # 提交后在比对则暂存区和本地仓库内容相同 [master 4c57a60] modified a 1 file changed, 1 insertion(+) [root@git git_data]# git diff --cached a [root@git git_data]# git commit # 相当于虚拟机的镜像、任何操作都被做了一次快照,可恢复到任意一个位置 [root@git git_data]# git log 查看历史的git commit快照操作 commit 4c57a605997f511149bfec53d9018b503e77f961 # 哈希唯一标识的字符串 Author: lizhenya <lizhenya@qq.com> # 作者个人信息 Date: Thu Aug 23 07:54:23 2018 +0800 # 时间 modified a # -m 个人写的提交描述信息 commit 56925321114eb9adf09b42a733a6f9f3edd9ad65 Author: lizhenya <lizhenya@qq.com> Date: Thu Aug 23 07:39:41 2018 +0800 rename a.txt a commit 7adfca06559ef7739dffdc11ecb7fb8800a9931a Author: lizhenya <lizhenya@qq.com> Date: Thu Aug 23 07:36:47 2018 +0800 commit a.txt commit b4017a876cfed78425fe58e7ecbcd49199ed5a11 Author: lizhenya <lizhenya@qq.com> Date: Thu Aug 23 07:22:29 2018 +0800 [root@git git_data]# git log --oneline # 一行简单的显示commit信息 4c57a60 modified a 5692532 rename a.txt a 7adfca0 commit a.txt b4017a8 commit a [root@git git_data]# git log --oneline --decorate # 显示当前的指针指向哪里 4c57a60 (HEAD, master) modified a 5692532 rename a.txt a 7adfca0 commit a.txt b4017a8 commit a [root@git git_data]# git log -p # 显示具体内容的变化 [root@git git_data]# git log -1 # 只显示1条内容 恢复历史数据 1.只更改了当前目录 [root@git git_data]# echo "333" >> a [root@git git_data]# git status # 位于分支 master # 尚未暂存以备提交的变更: # (使用 "git add <file>..." 更新要提交的内容) # (使用 "git checkout -- <file>..." 丢弃工作区的改动) # 看提示使用此命令覆盖工作区的改动 # # 修改: a # 修改尚未加入提交(使用 "git add" 和/或 "git commit -a") [root@git git_data]# git checkout -- a # 从暂存区覆盖本地工作目录 [root@git git_data]# git status # 位于分支 master 无文件要提交,干净的工作区 [root@git git_data]# cat a aaa 2.修改了本地目录且同时提交到了暂存区 [root@git git_data]# echo ccc >> a # 添加新内容 [root@git git_data]# git add . # 提交到暂存区 [root@git git_data]# git diff --cached #比对暂存区和本地仓库的内容 diff --git a/a b/a index 72943a1..959479a 100644 --- a/a +++ b/a @@ -1 +1,2 @@ aaa +ccc [root@git git_data]# git status # 位于分支 master # 要提交的变更: # (使用 "git reset HEAD <file>..." 撤出暂存区) # # 修改: a [root@git git_data]# git reset HEAD a # 本地仓库覆盖暂存区域 重置后撤出暂存区的变更: M a [root@git git_data]# git diff a diff --git a/a b/a index 72943a1..959479a 100644 --- a/a +++ b/a @@ -1 +1,2 @@ aaa +ccc [root@git git_data]# git diff --cached a [root@git git_data]# 3.修改了工作目录后提交到了暂存区和本地仓库后进行数据恢复 echo bbb >>a # 提交新的bbb文件到a git commit -m "add bbb" echo ccc >> a git commit -am "add ccc" # 这时候发现改错代码了,想还原某一次提交的文件快照 [root@git git_data]# git log --oneline 59ba2a9 add ccc dbead4c add bbb 4c57a60 modified a 5692532 rename a.txt a 7adfca0 commit a.txt b4017a8 commit a `Git服务程序中有一个叫做HEAD的版本指针,当用户申请还原数据时,其实就是将HEAD指针指向到某个特定的提交版本,但是因为Git是分布式 版本控制系统,为了避免历史记录冲突,故使用了SHA-1计算出十六进制的哈希字串来区分每个提交版本,另外默认的HEAD版本指针会指向到最近的一次提交版本记录` [root@git git_data]# git reset --hard 4c57a60 HEAD 现在位于 4c57a60 modified a `刚刚的操作实际上就是改变了一下HEAD版本指针的位置,就是你将HEAD指针放在那里,那么你的当前工作版本就会定位在那里,要想把内容再还原到最新提交的版本,先看查看下提交版本号` [root@git git_data]# cat a # 打开发现回退错了,应该回退到bbb版本 aaa [root@git git_data]# git log --oneline # 这时候查看log没有commit bbb的历史了 4c57a60 modified a 5692532 rename a.txt a 7adfca0 commit a.txt b4017a8 commit a `怎么搞得?竟然没有了add bbb这个提交版本记录? 原因很简单,因为我们当前的工作版本是历史的一个提交点,这个历史提交点还没有发生过add bbb 更新记录,所以当然就看不到了,要是想”还原到未来”的历史更新点,可以用git reflog命令来查看所有的历史记录:` [root@git git_data]# git reflog # 使用git reflog 可查看总历史内容 4c57a60 HEAD@{0}: reset: moving to 4c57a60 59ba2a9 HEAD@{1}: commit: add ccc dbead4c HEAD@{2}: commit: add bbb 4c57a60 HEAD@{3}: commit: modified a 5692532 HEAD@{4}: commit: rename a.txt a 7adfca0 HEAD@{5}: commit: commit a.txt b4017a8 HEAD@{6}: commit (initial): commit a [root@git git_data]# git reset --hard dbead4c # 然后使用reset回到bbb的版本内容下 HEAD 现在位于 dbead4c add bbb [root@git git_data]# cat a aaa bbb5.git分支 `分支即是平行空间,假设你在为某个手机系统研发拍照功能,代码已经完成了80%,但如果将这不完整的代码直接提交到git仓库中,又有可能影响到其他人的工作,此时我们便可以在该软件的项目之上创建一个名叫”拍照功 能”的分支,这种分支只会属于你自己,而其他人看不到,等代码编写完成后再与原来的项目主分支合并下即可,这样即能保证代码不丢失,又不影响其他人的工作。` `一般在实际的项目开发中,我们要尽量保证master分支是非常稳定的,仅用于发布新版本,平时不要随便直接修改里面的数据文件,而工作的时候则可以新建不同的工作分支,等到工作完成后在合并到master分支上面,所以团队的合作分支看起来会像上面图那样。` [root@git git_data]# git log --oneline --decorate dbead4c (HEAD, master) add bbb # 默认分支指向你最后一次的提交 HEAD头、指针 4c57a60 modified a 5692532 rename a.txt a 7adfca0 commit a.txt b4017a8 commit a `HEAD 指针指向哪个分支、说明你当前在哪个分支下工作` [root@git git_data]# git branch testing # 新建testing分支 [root@git git_data]# git branch * master # *号在哪里就说明当前在哪个分支上入下图所示 testing [root@git git_data]# git log --oneline --decorate # 通过命令查看分支指向 dbead4c (HEAD, testing, master) add bbb 4c57a60 modified a 5692532 rename a.txt a 7adfca0 commit a.txt b4017a8 commit a [root@git git_data]# git checkout testing # 切换到testing分支、对应的HEAD指针也指向了testing 切换到分支 'testing' [root@git git_data]# git branch master * testing [root@git git_data]# touch test [root@git git_data]# git add . [root@git git_data]# git commit -m "commit test" [root@git git_data]# git checkout master # 切换到master分支后指针指向到了master 切换到分支 'master' [root@git git_data]# git branch * master testing [root@git git_data]# ll # 正常情况下是没有test文件的、保证master分支是线上环境的 总用量 4 -rw-r--r-- 1 root root 8 8月 23 08:42 a [root@git git_data]# touch master [root@git git_data]# git add . [root@git git_data]# git commit -m "commit master" 合并分支 [root@git git_data]# git merge testing # 提示输入描述信息 相当于git的-m参数 [root@git git_data]# git log --oneline --decorate 3258705 (HEAD, master) Merge branch 'testing' f5ae1d8 commit master ad4f25a (testing) commit test dbead4c add bbb 4c57a60 modified a 5692532 rename a.txt a 7adfca0 commit a.txt b4017a8 commit a 冲突合并 [root@git git_data]# echo "master" >> a [root@git git_data]# git commit -am "modified a master" [root@git git_data]# git checkout testing 切换到分支 'testing' [root@git git_data]# git branch master * testing [root@git git_data]# cat a aaa bbb [root@git git_data]# echo "testing" >>a [root@git git_data]# git commit -am "modified a on testing branch" [root@git git_data]# git checkout master [root@git git_data]# git merge testing 自动合并 a 冲突(内容):合并冲突于 a 自动合并失败,修正冲突然后提交修正的结果。 [root@git git_data]# cat a # 冲突的文件自动标识到文件里,手动更改冲突要保留的代码 [root@git git_data]# git commit -am "merge testing to master" # 进行提交即可 [root@git git_data]# git log --oneline --decorate bba413d (HEAD, master) merge testing to master 34d7a55 (testing) modified a on testing branch ec1a424 modified a master 3258705 Merge branch 'testing' f5ae1d8 commit master ad4f25a commit test 删除分支-d参数 [root@git git_data]# git branch -d testing 已删除分支 testing(曾为 34d7a55)。 [root@git git_data]# git branch * master6.git标签使用标签也是指向了一次commit提交,是一个里程碑式的标签,回滚打标签直接加标签号,不需要加唯一字符串不好记 [root@git git_data]# git tag -a v1.0 -m "aaa bbb master tesing version v1.0" # -a指定标签名字 -m 指定说明文字 [root@git git_data]# git tag v1.0 [root@git git_data]# git tag -a v2.0 dbead4c -m "add bbb version v2.0" # 指定某一次的提交为标签 [root@git git_data]# git show v1.0 # 查看v1.0的信息 git show 加标签查看 [root@git git_data]# git reset --hard v2.0 # 直接还原数据到v2.0 HEAD 现在位于 dbead4c add bbb [root@git git_data]# ll 总用量 4 -rw-r--r-- 1 root root 8 8月 23 11:26 a -rw-r--r-- 1 root root 0 8月 23 11:25 b [root@git git_data]# git tag -d v2.0 # 删除标签 -d参数GitLab使用1.GitLab简介GitLab 是一个用于仓库管理系统的开源项目。使用Git作为代码管理工具,并在此基础上搭建起来的web服务。可通过Web界面进行访问公开的或者私人项目。它拥有与Github类似的功能,能够浏览源代码,管理缺陷和注释。可以管理团队对仓库的访问,它非常易于浏览提交过的版本并提供一个文件历史库。团队成员可以利用内置的简单聊天程序(Wall)进行交流。它还提供一个代码片段收集功能可以轻松实现代码复用。 常用的网站: 官网:https://about.gitlab.com/ 国内镜像:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/2.环境准备安装环境: 1、 CentOS 6或者7 2、 2G内存(实验)生产(至少4G) 3、 安装包:gitlab-ce-15.11.13-ce 4、 禁用防火墙,关闭selinux https://about.gitlab.com/installation/#centos-7 # git官网 yum install -y curl policycoreutils-python openssh-server # 安装依赖 cd /home/www/tools rz -bye gitlab-ce-15.11.13-ce.0.el7.x86_64.rpm # 上传gitlab安装包 下载方式可通过国内清华源gitlab-ce社区版本下载 vim /etc/gitlab/gitlab.rb # gitlab 配置文件 更改url地址为本机IP地址 external_url 'http://10.0.0.203' gitlab-ctl reconfigure # 这个步骤会初始化所有组件,需要 5-10 分钟 /opt/gitlab/ # gitlab的程序安装目录 /var/opt/gitlab # gitlab目录数据目录 /var/opt/gitlab/git-dfata # 存放仓库数据 gitlab-ctl status # 查看目前gitlab所有服务运维状态 都必须为run [root@gitlab data]# gitlab-ctl status run: alertmanager: (pid 1504) 389s; run: log: (pid 1503) 389s run: gitaly: (pid 1475) 389s; run: log: (pid 1474) 389s run: gitlab-exporter: (pid 1485) 390s; run: log: (pid 1483) 390s run: gitlab-kas: (pid 1482) 390s; run: log: (pid 1477) 390s run: gitlab-workhorse: (pid 1501) 390s; run: log: (pid 1493) 390s run: logrotate: (pid 1469) 390s; run: log: (pid 1466) 390s run: nginx: (pid 1484) 390s; run: log: (pid 1478) 390s run: node-exporter: (pid 1500) 390s; run: log: (pid 1491) 390s run: postgres-exporter: (pid 2300) 32s; run: log: (pid 1488) 390s run: postgresql: (pid 2345) 10s; run: log: (pid 1476) 390s run: prometheus: (pid 1497) 390s; run: log: (pid 1496) 390s run: puma: (pid 2282) 42s; run: log: (pid 1487) 390s run: redis: (pid 1490) 390s; run: log: (pid 1489) 390s run: redis-exporter: (pid 1495) 390s; run: log: (pid 1494) 390s run: sidekiq: (pid 2237) 61s; run: log: (pid 1481) 390s gitlab-ctl stop # 停止gitlab服务 gitlab-ctl stop nginx # 单独停止某个服务 gitlab-ctl tail # 查看所有服务的日志 通过浏览器输入IP地址进行访问gitlab 10.0.0.203 获取初始 root 密码 sudo cat /etc/gitlab/initial_root_password Gitlab的服务构成: nginx: 静态web服务器 gitlab-workhorse: 轻量级的反向代理服务器 logrotate:日志文件管理工具 postgresql:数据库 redis:缓存数据库 sidekiq:用于在后台执行队列任务(异步执行)。(Ruby) unicorn:An HTTP server for Rack applications,GitLab Rails应用是托管在这个服务器上面的。(Ruby Web Server,主要使用Ruby编写)3.gitlab汉化1、下载汉化补丁 git clone https://gitlab.com/xhang/gitlab.git 2、查看全部分支版本 git branch -a 3、对比版本、生成补丁包 git diff remotes/origin/10-2-stable remotes/origin/10-2-stable-zh > ../10.2.2-zh.diff 4、停止服务器 gitlab-ctl stop 5、打补丁 patch -d /opt/gitlab/embedded/service/gitlab-rails -p1 < /tmp/10.2.2-zh.diff 6、启动和重新配置 gitlab-ctl start gitlab-ctl reconfigure4. gitlab配置使用1、配置外观 管理区域-外观 2、关闭自动注册-可根据实际需求操作 管理区域-设置-关闭自动注册 3、创建组-用户-项目 创建组5.设置组名称、描述等创建群组6.创建用户7.设置密码8.验证9.把用户添加到组里面管理区域-选择创建的oldboy组进行添加用户、权限给开发人员-增加用户到群组10.创建新空白项目6、登陆dev用户测试是否能看到空的git-test仓库 7、添加ssh-keys到gitlab 注:一个服务器的key只能添加到一个gitlab服务器上,一个用户可以添加多个key ssh-keygen -t rsa 8、添加远程仓库、推送本地代码到远程仓库 git remote add origin git@10.0.0.200:zy/git_test.git # 添加远程仓库 git remote rename origin old-origin # 远程 origin 如果已经存在则重新命名或者新添加仓库名称不同 git push -u origin --all # 推送代码到远程仓库 8、克隆代码到另外一台主机 如果不做认证会让输入gitlab的密码、我们使用key进行认证 ssh-keygen -t rsa 把公钥复制到dev用户下进行测试 然后在克隆代码 git clone git@10.0.0.200:zy/git_test.git 测试推送代码到dev下 git branch dev git checkout dev touch dev git add . git commit -m "add dev" git push -u origin dev # 推送dev分支到远程仓库 提交合并请求进行分支合并到master主分支 合并后在gitlab服务端master上没有dev、要先进行pull cd /root/git_data git pull 9、设置保护主分支使用过程中遇到问题及解决1.git checkout -b dev origin/dev fatal: Cannot update paths and switch to branch 'dev' at the same time. Did you intend to checkout 'origin/dev' which can not be resolved as commit? #这个错误可能是因为 origin/dev 引用没有正确设置。我们换一种方式来恢复 dev 分支。 解决: # 基于刚才 fetch 下来的 dev 分支创建本地分支 git checkout -b dev FETCH_HEAD 验证: [root@gitlab git_test]# git branch * dev main [root@gitlab git_test]# ls -la total 0 drwxr-xr-x 4 root root 47 May 26 18:57 . drwxr-xr-x 5 root root 61 May 26 18:53 .. -rw-r--r-- 1 root root 0 May 26 18:57 a.txt drwxr-xr-x 8 root root 181 May 26 18:57 .git drwxr-xr-x 2 root root 17 May 26 18:57 git_test #仓库里出现了一个 git_test 子目录,这看起来不太对劲。这通常表示你在一个 Git 仓库内部又克隆或创建了另一个 Git 仓库,这可能会导致混乱。 #你的当前工作目录是 /data/git_test/git_test,这是一个嵌套的目录。你之前克隆仓库时,在 /data/git_test 目录下又执行了 git clone,导致创建了嵌套的仓库结构。 解决方式: # 1. 回到上一层目录(真正的 Git 仓库根目录) cd /data/git_test # 2. 确认你在正确的位置 pwd # 应该显示:/data/git_test # 4. 查看当前分支 git branch # 5. 将内层的 dev 文件移动到当前目录 mv git_test/dev . # 6. 删除空的嵌套目录 rmdir git_test # 7. 查看当前状态 [root@gitlab git_test]# git status # On branch dev # Changes not staged for commit: # (use "git add/rm <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # deleted: git_test/dev # # Untracked files: # (use "git add <file>..." to include in what will be committed) # # dev no changes added to commit (use "git add" and/or "git commit -a") #现在你在正确的仓库根目录了(/data/git_test)。Git 检测到: #删除了 git_test/dev(原来的嵌套文件) #新增了 dev(你移出来的新文件) #这其实只是重命名/移动文件,我们来清理这个状态。 解决方式: # 1. 添加所有更改(Git 会自动检测到文件移动) git add -A # 2. 查看状态,确认 Git 识别为重命名 git status # 应该显示:renamed: git_test/dev -> dev # 3. 提交更改 git commit -m "Move dev file from nested directory to root" # 4. 推送到远程 git push origin dev 方法2:手动添加和删除 # 1. 添加新文件 git add dev # 2. 删除旧文件 git rm git_test/dev # 3. 提交 git commit -m "Move dev file to root directory" # 4. 推送 git push origin dev 最终验证成果: # 1. 确认目录结构 pwd # 应该是 /data/git_test ls -la # 应该看到: # drwxr-xr-x .git # -rw-r--r-- dev # 不应该再有 git_test 子目录 # 2. 查看 Git 状态 git status # 应该显示:nothing to commit, working directory clean # 3. 查看分支 git branch # 应该显示 * dev # 4. 查看远程状态 [root@gitlab git_test]# git remote -v origin git@10.0.0.200:zy/git_test.git (fetch) origin git@10.0.0.200:zy/git_test.git (push)Gitlab备份对gitlab进行备份将会创建一个包含所有库和附件的归档文件。对备份的恢复只能恢复到与备份时的gitlab相同的版本。将gitlab迁移到另一台服务器上的最佳方法就是通过备份和还原。 gitlab提供了一个简单的命令行来备份整个gitlab,并且能灵活的满足需求。 备份文件将保存在配置文件中定义的backup_path中,文件名为TIMESTAMP_gitlab_backup.tar,TIMESTAMP为备份时的时间戳。TIMESTAMP的格式为:EPOCH_YYYY_MM_DD_Gitlab-version。 如果自定义备份目录需要赋予git权限 配置文件中加入 gitlab_rails['backup_path'] = '/data/backup/gitlab' gitlab_rails['backup_keep_time'] = 604800 备份保留的时间(以秒为单位,这个是七天默认值), mkdir /data/backup/gitlab chown -R git.git /data/backup/gitlab 完成后执行gitlab-ctl reconfigure
2026年05月26日
1 阅读
0 评论
1 点赞
2026-03-18
k8s-kubeadm集群部署
一、环境准备:(1)虚拟机操作系统环境准备 参考链接: https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/ (2)关闭swap分区 1)临时关闭 swapoff -a && sysctl -w vm.swappiness=0 2)基于配置文件关闭 sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab (3)确保各个节点MAC地址或product_uuid唯一 ifconfig eth0 | grep ether | awk '{print $2}' cat /sys/class/dmi/id/product_uuid 温馨提示: 一般来讲,硬件设备会拥有唯一的地址,但是有些虚拟机的地址可能会重复。 Kubernetes使用这些值来唯一确定集群中的节点。 如果这些值在每个节点上不唯一,可能会导致安装失败。 (4)检查网络节点是否互通 简而言之,就是检查你的k8s集群各节点是否互通,可以使用ping命令来测试。 (5)允许iptable检查桥接流量 cat <<EOF | tee /etc/modules-load.d/k8s.conf br_netfilter EOF cat <<EOF | tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 EOF sysctl --system (6)检查端口是否被占用 参考链接: https://kubernetes.io/zh-cn/docs/reference/networking/ports-and-protocols/ (7)检查docker的环境 参考链接: https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.15.md#unchanged 1)配置docker源 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo curl -o /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo sed -i 's+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo yum list docker-ce --showduplicates 2)安装指定的docker版本 yum -y install docker-ce-18.09.9 docker-ce-cli-18.09.9 yum -y install bash-completion source /usr/share/bash-completion/bash_completion 3)打包软件包分发到其他节点部署docker(此步骤可跳过) mkdir docker-rpm-18-09 && find /var/cache/yum -name "*.rpm" | xargs mv -t docker-rpm-18-09/ 4)配置docker优化 mkdir -pv /etc/docker && cat <<EOF | sudo tee /etc/docker/daemon.json { "registry-mirrors": [ "https://docker.1ms.run", "https://docker.xuanyuan.me" ], "data-root": "/data/docker" } EOF 5)配置docker开机自启动 systemctl daemon-reload systemctl enable --now docker systemctl status docker (8)禁用防火墙 systemctl disable --now firewalld (9)禁用selinux sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config grep ^SELINUX= /etc/selinux/config (10)配置host解析 cat >> /etc/hosts <<'EOF' 10.0.0.121 master02 10.0.0.122 node01 10.0.0.123 node02 EOF cat /etc/hosts二、软件包说明:你需要在每台机器上安装以下的软件包: kubeadm: 用来初始化集群的指令。 kubelet: 在集群中的每个节点上用来启动Pod和容器等。 kubectl: 用来与集群通信的命令行工具。 kubeadm不能帮你安装或者管理kubelet或kubectl,所以你需要确保它们与通过kubeadm安装的控制平面(master)的版本相匹配。 如果不这样做,则存在发生版本偏差的风险,可能会导致一些预料之外的错误和问题。 然而,控制平面与kubelet间的相差一个次要版本不一致是支持的,但kubelet的版本不可以超过"API SERVER"的版本。 例如,1.7.0版本的kubelet可以完全兼容1.8.0版本的"API SERVER",反之则不可以。三、所有节点安装kubeadm,kubelet,kubectl(1)配置软件源 cat > /etc/yum.repos.d/kubernetes.repo <<EOF [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled=1 gpgcheck=0 repo_gpgcheck=0 EOF (2)查看kubeadm的版本(将来你要安装的K8S时请所有组件版本均保持一致!) yum -y list kubeadm --showduplicates | sort -r (3)安装kubeadm,kubelet,kubectl软件包 yum -y install kubeadm-1.15.12-0 kubelet-1.15.12-0 kubectl-1.15.12-0 (4)启动kubelet服务(若服务启动失败时正常现象,其会自动重启,因为缺失配置文件,初始化集群后恢复!此步骤可跳过!) systemctl enable --now kubelet systemctl status kubelet (5)温馨提示:(可以将k8s软件打包到其他节点安装哟,前提是得开启rpm包缓存。) mkdir k8s-rpm && find /var/cache/yum -name "*.rpm" | xargs mv -t k8s-rpm 参考链接: https://kubernetes.io/zh/docs/tasks/tools/install-kubectl-linux/四、初始化master节点(1)使用kubeadm初始化master节点 kubeadm init --kubernetes-version=v1.15.12 --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16 --service-cidr=10.254.0.0/16 --service-dns-domain=example.com 相关参数说明: --kubernetes-version: 指定K8S master组件的版本号。 --image-repository: 指定下载k8s master组件的镜像仓库地址。 --pod-network-cidr: 指定Pod的网段地址。 --service-cidr: 指定SVC的网段 --service-dns-domain: 指定service的域名。若不指定,默认为"cluster.local"。 使用kubeadm初始化集群时,可能会出现如下的输出信息: [init] 使用初始化的K8S版本。 [preflight] 主要是做安装K8S集群的前置工作,比如下载镜像,这个时间取决于你的网速。 [certs] 生成证书文件,默认存储在"/etc/kubernetes/pki"目录哟。 [kubeconfig] 生成K8S集群的默认配置文件,默认存储在"/etc/kubernetes"目录哟。 [kubelet-start] 启动kubelet, 环境变量默认写入:"/var/lib/kubelet/kubeadm-flags.env" 配置文件默认写入:"/var/lib/kubelet/config.yaml" [control-plane] 使用静态的目录,默认的资源清单存放在:"/etc/kubernetes/manifests"。 此过程会创建静态Pod,包括"kube-apiserver","kube-controller-manager"和"kube-scheduler" [etcd] 创建etcd的静态Pod,默认的资源清单存放在:""/etc/kubernetes/manifests" [wait-control-plane] 等待kubelet从资源清单目录"/etc/kubernetes/manifests"启动静态Pod。 [apiclient] 等待所有的master组件正常运行。 [upload-config] 创建名为"kubeadm-config"的ConfigMap在"kube-system"名称空间中。 [kubelet] 创建名为"kubelet-config-1.22"的ConfigMap在"kube-system"名称空间中,其中包含集群中kubelet的配置 [upload-certs] 跳过此节点,详情请参考”--upload-certs" [mark-control-plane] 标记控制面板,包括打标签和污点,目的是为了标记master节点。 [bootstrap-token] 创建token口令,例如:"kbkgsa.fc97518diw8bdqid"。 如下图所示,这个口令将来在加入集群节点时很有用,而且对于RBAC控制也很有用处哟。 [kubelet-finalize] 更新kubelet的证书文件信息 [addons] 添加附加组件,例如:"CoreDNS"和"kube-proxy” (2)拷贝授权文件,用于管理K8S集群 mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config (3)查看集群节点 kubectl get cs NAME STATUS MESSAGE ERROR controller-manager Healthy ok scheduler Healthy ok etcd-0 Healthy {"health":"true"} 五、配置所有worker节点加入k8s集群(1)worker节点加入集群(如上图所示,下面的token及hash值需要根据您的集群环境而发生改变哟~) kubeadm join 10.0.0.121:6443 --token u6aq9n.4niu8w0byrppiafj \ --discovery-token-ca-cert-hash sha256:470779a9ab746a0cd2facf24e37956af9f844593734d55238c6ec0ad994cbd2c (2)查看集群现有的worker节点 kubectl get no NAME STATUS ROLES AGE VERSION master02 NotReady master 53m v1.15.12 node01 NotReady <none> 57s v1.15.12 node02 NotReady <none> 53s v1.15.12六、初始化网络组件cat > kube-flannel.yml << EOF --- apiVersion: policy/v1beta1 kind: PodSecurityPolicy metadata: name: psp.flannel.unprivileged annotations: seccomp.security.alpha.kubernetes.io/allowedProfileNames: docker/default seccomp.security.alpha.kubernetes.io/defaultProfileName: docker/default apparmor.security.beta.kubernetes.io/allowedProfileNames: runtime/default apparmor.security.beta.kubernetes.io/defaultProfileName: runtime/default spec: privileged: false volumes: - configMap - secret - emptyDir - hostPath allowedHostPaths: - pathPrefix: "/etc/cni/net.d" - pathPrefix: "/etc/kube-flannel" - pathPrefix: "/run/flannel" readOnlyRootFilesystem: false # Users and groups runAsUser: rule: RunAsAny supplementalGroups: rule: RunAsAny fsGroup: rule: RunAsAny # Privilege Escalation allowPrivilegeEscalation: false defaultAllowPrivilegeEscalation: false # Capabilities allowedCapabilities: ['NET_ADMIN', 'NET_RAW'] defaultAddCapabilities: [] requiredDropCapabilities: [] # Host namespaces hostPID: false hostIPC: false hostNetwork: true hostPorts: - min: 0 max: 65535 # SELinux seLinux: rule: RunAsAny --- kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: flannel rules: - apiGroups: ['extensions'] resources: ['podsecuritypolicies'] verbs: ['use'] resourceNames: ['psp.flannel.unprivileged'] - apiGroups: - "" resources: - pods verbs: - get - apiGroups: - "" resources: - nodes verbs: - list - watch - apiGroups: - "" resources: - nodes/status verbs: - patch --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: flannel roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: flannel subjects: - kind: ServiceAccount name: flannel namespace: kube-system --- apiVersion: v1 kind: ServiceAccount metadata: name: flannel namespace: kube-system --- kind: ConfigMap apiVersion: v1 metadata: name: kube-flannel-cfg namespace: kube-system labels: tier: node app: flannel data: cni-conf.json: | { "name": "cbr0", "cniVersion": "0.3.1", "plugins": [ { "type": "flannel", "delegate": { "hairpinMode": true, "isDefaultGateway": true } }, { "type": "portmap", "capabilities": { "portMappings": true } } ] } net-conf.json: | { "Network": "10.244.0.0/16", "Backend": { "Type": "vxlan" } } --- apiVersion: apps/v1 kind: DaemonSet metadata: name: kube-flannel-ds-amd64 namespace: kube-system labels: tier: node app: flannel spec: selector: matchLabels: app: flannel template: metadata: labels: tier: node app: flannel spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: beta.kubernetes.io/arch operator: In values: - amd64 hostNetwork: true priorityClassName: system-node-critical tolerations: - operator: Exists effect: NoSchedule serviceAccountName: flannel initContainers: - name: install-cni image: quay.io/coreos/flannel:v0.11.0-amd64 command: - cp args: - -f - /etc/kube-flannel/cni-conf.json - /etc/cni/net.d/10-flannel.conflist volumeMounts: - name: cni mountPath: /etc/cni/net.d - name: flannel-cfg mountPath: /etc/kube-flannel/ containers: - name: kube-flannel image: quay.io/coreos/flannel:v0.11.0-amd64 command: - /opt/bin/flanneld args: - --ip-masq - --kube-subnet-mgr resources: requests: cpu: "100m" memory: "50Mi" limits: cpu: "100m" memory: "50Mi" securityContext: privileged: false capabilities: add: ["NET_ADMIN", "NET_RAW"] env: - name: POD_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: POD_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace volumeMounts: - name: run mountPath: /run/flannel - name: flannel-cfg mountPath: /etc/kube-flannel/ volumes: - name: run hostPath: path: /run/flannel - name: cni hostPath: path: /etc/cni/net.d - name: flannel-cfg configMap: name: kube-flannel-cfg --- apiVersion: apps/v1 kind: DaemonSet metadata: name: kube-flannel-ds-arm64 namespace: kube-system labels: tier: node app: flannel spec: selector: matchLabels: app: flannel template: metadata: labels: tier: node app: flannel spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: beta.kubernetes.io/arch operator: In values: - arm64 hostNetwork: true priorityClassName: system-node-critical tolerations: - operator: Exists effect: NoSchedule serviceAccountName: flannel initContainers: - name: install-cni image: quay.io/coreos/flannel:v0.11.0-arm64 command: - cp args: - -f - /etc/kube-flannel/cni-conf.json - /etc/cni/net.d/10-flannel.conflist volumeMounts: - name: cni mountPath: /etc/cni/net.d - name: flannel-cfg mountPath: /etc/kube-flannel/ containers: - name: kube-flannel image: quay.io/coreos/flannel:v0.11.0-arm64 command: - /opt/bin/flanneld args: - --ip-masq - --kube-subnet-mgr resources: requests: cpu: "100m" memory: "50Mi" limits: cpu: "100m" memory: "50Mi" securityContext: privileged: false capabilities: add: ["NET_ADMIN", "NET_RAW"] env: - name: POD_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: POD_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace volumeMounts: - name: run mountPath: /run/flannel - name: flannel-cfg mountPath: /etc/kube-flannel/ volumes: - name: run hostPath: path: /run/flannel - name: cni hostPath: path: /etc/cni/net.d - name: flannel-cfg configMap: name: kube-flannel-cfg --- apiVersion: apps/v1 kind: DaemonSet metadata: name: kube-flannel-ds-arm namespace: kube-system labels: tier: node app: flannel spec: selector: matchLabels: app: flannel template: metadata: labels: tier: node app: flannel spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: beta.kubernetes.io/arch operator: In values: - arm hostNetwork: true priorityClassName: system-node-critical tolerations: - operator: Exists effect: NoSchedule serviceAccountName: flannel initContainers: - name: install-cni image: quay.io/coreos/flannel:v0.11.0-arm command: - cp args: - -f - /etc/kube-flannel/cni-conf.json - /etc/cni/net.d/10-flannel.conflist volumeMounts: - name: cni mountPath: /etc/cni/net.d - name: flannel-cfg mountPath: /etc/kube-flannel/ containers: - name: kube-flannel image: quay.io/coreos/flannel:v0.11.0-arm command: - /opt/bin/flanneld args: - --ip-masq - --kube-subnet-mgr resources: requests: cpu: "100m" memory: "50Mi" limits: cpu: "100m" memory: "50Mi" securityContext: privileged: false capabilities: add: ["NET_ADMIN", "NET_RAW"] env: - name: POD_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: POD_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace volumeMounts: - name: run mountPath: /run/flannel - name: flannel-cfg mountPath: /etc/kube-flannel/ volumes: - name: run hostPath: path: /run/flannel - name: cni hostPath: path: /etc/cni/net.d - name: flannel-cfg configMap: name: kube-flannel-cfg EOF 在 master 节点执行以下命令: kubectl apply -f kube-flannel.yml 检查 Flannel Pod 状态 kubectl get pods -n kube-system | grep flannel kube-flannel-ds-amd64-2kfbn 1/1 Running 0 3m3s kube-flannel-ds-amd64-cwtpx 1/1 Running 0 3m3s kube-flannel-ds-amd64-fvdlk 1/1 Running 0 3m3s 检查节点状态: kubectl get nodes NAME STATUS ROLES AGE VERSION master02 Ready master 83m v1.15.12 node01 Ready <none> 31m v1.15.12 node02 Ready <none> 31m v1.15.12七、验证网络联通性# 创建测试 Pod kubectl run test-pod --image=busybox:1.28 --command -- sleep 3600 # 查看 Pod IP kubectl get pods -o wide # 进入 Pod 测试 ping 其他节点/Pod kubectl exec -it test-pod -- ping -c 3 10.244.1.2 # 替换为实际 Pod IP八、常见问题解决问题 1:Flannel Pod 启动失败,日志提示 "dial tcp 10.96.0.1:443: connect: no route to host" 原因:master 节点的 apiserver 端口未放行,或 kube-proxy 未正常运行。 # 检查 kube-proxy Pod 状态 kubectl get pods -n kube-system | grep kube-proxy # 重启 kube-proxy(若异常) kubectl rollout restart daemonset kube-proxy -n kube-system # 放行 master 节点 6443 端口 iptables -A INPUT -p tcp --dport 6443 -j ACCEPT 问题 2:Flannel Pod 卡在 Init 状态 原因:缺少 kube-flannel 目录权限 # 在所有节点创建目录并授权 mkdir -p /run/flannel chmod 777 /run/flannel kubectl get pods -n kube-system -w | grep flannel kubectl describe -n kube-system pods kube-flannel-ds-amd64-bvcf5 "network: failed to find plugin "flannel" in path [/opt/cni/bin]]..."这样的报错。 问题2:你安装的flannel 插件/opt/cni/bin 没有flannel程序 # 创建目录(如果不存在) sudo mkdir -p /opt/cni/bin #你有这个目录但是没有flannel这个执行程序 # 下载 CNI 插件(推荐使用 v0.8.6 版本) wget https://github.com/containernetworking/plugins/releases/download/v0.8.6/cni-plugins-linux-amd64-v0.8.6.tgz # 解压到指定目录 sudo tar -xzvf cni-plugins-linux-amd64-v0.8.6.tgz -C /opt/cni/bin/ # 验证 flannel 插件是否已存在 ls -la /opt/cni/bin/ | grep flannel # 设置执行权限 chmod +x /opt/cni/bin/flannel # 重启节点上的容器运行时 # 重启 containerd(根据你的容器运行时选择) sudo systemctl restart containerd # 重启 kubelet sudo systemctl restart kubelet
2026年03月18日
3 阅读
0 评论
2 点赞
2026-01-06
Nginx部署
1.环境准备:所有服务器需安装必要依赖:yum install -y gcc gcc-c++ make pcre-devel zlib-devel openssl-devel wget #如果虚拟机不通外网,可以在本地虚拟机下载离线安装包 yum install -y gcc gcc-c++ make pcre-devel zlib-devel openssl-devel wget --downloadonly --downloaddir=./ #下载完成后将所有的单rpm包传到服务器上,然后安装 yum -y localinstall ./*.rpm2.编译安装 Nginx在所有 Nginx 服务器上执行: (1) 下载并解压源码 wget https://nginx.org/download/nginx-1.24.0.tar.gz tar -zxvf nginx-1.24.0.tar.gz -C /data && cd /data/nginx-1.24.0 (2) 配置编译参数 ./configure \ --prefix=/usr/local/nginx \ --with-http_ssl_module \ --with-http_gzip_static_module \ --with-http_stub_status_module (3) 编译并安装 make && make install (4) 创建软链接方便使用 ln -s /usr/local/nginx/sbin/nginx /usr/sbin/nginx3. 配置 Nginx 负载均衡 (主备负载均衡配置相同)cat /usr/local/nginx/conf/load.conf http { upstream backend { server 10.0.0.143:80 weight=5; # 应用服务器1 server 10.0.0.71:80 weight=5; # 应用服务器2 } server { listen 80; server_name 10.0.0.100; location / { proxy_pass http://backend; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } }4.安装并配置 Keepalivedyum install -y keepalived # 不通外网同上 (1)主负载均衡器配置 cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id LVS_DEVEL } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.100 # VIP地址 } } virtual_server 10.0.0.100 80 { delay_loop 6 lb_algo rr lb_kind NAT persistence_timeout 50 protocol TCP real_server 10.0.0.141 80 { weight 1 SSL_GET { url { path /; digest ff20ad2481f8cd3a1864ed534ff456 } url { path /mrtg/; digest 9b3a0c85a887256d6939da88aabd8cd } connect_timeout 3 retry 3 delay_before_retry 3 } } } (2)备用负载均衡器配置 cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id LVS_DEVEL } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 51 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.100 # VIP地址 } } virtual_server 10.0.0.100 80 { delay_loop 6 lb_algo rr lb_kind NAT persistence_timeout 50 protocol TCP real_server 10.0.0.141 80 { weight 1 SSL_GET { url { path /; digest ff20ad2481f8cd3a1864ed534ff456 } url { path /mrtg/; digest 9b3a0c85a887256d6939da88aabd8cd } connect_timeout 3 retry 3 delay_before_retry 3 } } } # router_id主备要保持一致;state主是MASTER,备是BACKUP;priority优先级备低于主服务器5.启动服务1.启动nginx /usr/sbin/nginx 2.启动Keepalived并设置开机自启 systemctl start keepalived systemctl enable keepalived6.验证部署1.检查 VIP 状态 ip -c a 或者 ip addr show eth0 inet 10.0.0.100/32 scope global eth0 # 主服务器应显示VIP 2.测试负载均衡 curl http://10.0.0.100 # 多次请求应轮询到不同后端服务器 3.模拟故障转移 # 在主服务器上停止Keepalived systemctl stop keepalived # 检查VIP是否漂移到备用服务器 ip -c a 或者 ip addr show eth0
2026年01月06日
11 阅读
0 评论
1 点赞
2026-01-06
Nacos部署
一、单机部署Nacos1.准备工作目录 [root@nacos_141 data]# mkdir -p /data/JAVA_JDK 2.安装JDK [root@nacos_141 ~]# tar -xf jdk-8u371-linux-x64.tar.gz -C /data/JAVA_JDK/ 3.配置jdk环境变量 vim /etc/profile ... export JAVA_HOME=/data/JAVA_JDK/jdk1.8.0_371 export JRE_HOME=/data/JAVA_JDK/jdk1.8.0_371/jre export PATH=$PATH:$JAVA_HOME/bin 4.重新加载环境变量 source /etc/profle 5.安装nacos(需要提前准备数据库环境) [root@nacos_141 ~]# tar -xf nacos-server-2.0.2.tar.gz -C /data/ 6.修改配置文件 ... ### Count of DB: db.num=1 ### Connect URL of DB: # db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC # db.user.0=nacos # db.password.0=nacos db.url.0=jdbc:mysql://10.0.0.114:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC #填写,mysql地址 db.user.0=root #mysql用户 db.password.0=Zy200211@ #mysql密码 7.修改启动脚本 vim /data/nacos/bin/startup.sh ... [ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/data/JAVA_JDK/jdk1.8.0_371 #配置jdk目录,将原来的注释掉 #[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=$HOME/jdk/java #[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/java #[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/opt/taobao/java #[ ! -e "$JAVA_HOME/bin/java" ] && unset JAVA_HOME ... export MODE="standalone" #单机模式 8.启动nacos cd /data/nacos/bin && ./startup.sh 9.查看启动日志 cat /data/nacos/logs/start.out 10.检查启动是否成功 [root@nacos_141 logs]# ps -ef|grep nacos root 16681 1 95 20:58 pts/1 00:00:20 /data/JAVA_JDK/jdk1.8.0_371/bin/java -Xms512m -Xmx512m -Xmn256m -Dnacos.standalone=true -Dnacos.member.list= -Djava.ext.dirs=/data/JAVA_JDK/jdk1.8.0_371/jre/lib/ext:/data/JAVA_JDK/jdk1.8.0_371/lib/ext -Xloggc:/data/nacos/logs/nacos_gc.log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M -Dloader.path=/data/nacos/plugins/health,/data/nacos/plugins/cmdb -Dnacos.home=/data/nacos -jar /data/nacos/target/nacos-server.jar --spring.config.additional-location=file:/data/nacos/conf/ --logging.config=/data/nacos/conf/nacos-logback.xml --server.max-http-header-size=524288 nacos.nacos root 16718 16563 0 20:59 pts/1 00:00:00 grep --color=auto nacos [root@nacos_141 logs]# netstat -tnulp|grep 8848 tcp6 0 0 :::8848 :::* LISTEN 16681/java 11.访问nacos的web页面 http://10.0.0.141:8848/nacos/ 初始默认用户密码都是nacos二、集群部署nacos1.三个节点都安装jdk和nacos tar -xf jdk-8u371-linux-x64.tar.gz -C /data/JAVA_JDK/ tar -xf nacos-server-2.0.2.tar.gz -C /data/ 2.创建nacos普通用户并授权并配置环境变量 useradd nacos && chown -R nacos.nacos /data/nacos vim /etc/profile ... export JAVA_HOME=/data/JAVA_JDK/jdk1.8.0_371 export JRE_HOME=/data/JAVA_JDK/jdk1.8.0_371/jre export PATH=$PATH:$JAVA_HOME/bin source /etc/profile 3.三个节点都要修改配置文件: ... ### Count of DB: db.num=1 ### Connect URL of DB: # db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC # db.user.0=nacos # db.password.0=nacos db.url.0=jdbc:mysql://10.0.0.114:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC #填写,mysql地址 db.user.0=root #mysql用户 db.password.0=Zy200211@ #mysql密码 4.三个节点都要修改启动脚本: vim /data/nacos/bin/startup.sh ... [ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/data/JAVA_JDK/jdk1.8.0_371 #配置jdk目录,将原来的注释掉 #[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=$HOME/jdk/java #[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/java #[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/opt/taobao/java #[ ! -e "$JAVA_HOME/bin/java" ] && unset JAVA_HOME ... export MODE="cluster" #集群模式 5.修改集群配置文件 [root@nacos_141 conf]# cp cluster.conf.example cluster.conf vim cluster.conf #添加nacos三个节点ip和端口 10.0.0.141:8848 10.0.0.142:8848 10.0.0.143:8848 6.进入mysql服务器节点导入mysql表(将/data/nacos/conf/nacos-mysql.sql文件导入mysql) 1)将sql文件复制mysql节点上 [root@nacos_141 conf]# scp nacos-mysql.sql 10.0.0.114:/root/ 创建nacos数据库: mysql> CREATE DATABASE IF NOT EXISTS nacos_config CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; mysql> CREATE USER 'nacos_config' IDENTIFIED BY 'Zy200211@'; 修改nacos密码 mysql> GRANT ALL PRIVILEGES ON nacos_config.* TO 'nacos_config'; mysql> FLUSH PRIVILEGES; mysql> use nacos_config; #进入nacos库 mysql> SOURCE /root/nacos-mysql.sql # 验证 SHOW TABLES; SELECT COUNT(*) FROM config_info; 7.编写System启动脚本 vim /etc/systemd/system/nacos.service [Unit] Description=Nacos Server After=network.target [Service] Type=forking User=nacos Group=nacos Environment="JAVA_HOME=/data/JAVA_JDK/jdk1.8.0_371" Environment="MODE=cluster" ExecStart=/data/nacos/bin/startup.sh ExecStop=/data/nacos/bin/shutdown.sh Restart=on-failure RestartSec=10 LimitNOFILE=65536 [Install] WantedBy=multi-user.target #将文件拷贝其他节点上 scp /etc/systemd/system/nacos.service 10.0.0.142:/etc/systemd/system/nacos.service scp /etc/systemd/system/nacos.service 10.0.0.143:/etc/systemd/system/nacos.service 8.启动nacos集群,在每个节点执行 systemctl daemon-reload systemctl start nacos.service systemctl enable nacos.service 检查状态 systemctl status nacos.service 停止 systemctl stop nacos.service 9.集群验证 [root@nacos_141 logs]# curl http://10.0.0.141:8848/nacos/v1/ns/operator/servers {"servers":[{"ip":"10.0.0.141","port":8848,"state":"UP","extendInfo":{"lastRefreshTime":1767541268714,"raftMetaData":{"metaDataMap":{"naming_instance_metadata":{"leader":"10.0.0.141:7848","raftGroupMember":["10.0.0.141:7848","10.0.0.142:7848","10.0.0.143:7848"],"term":4},"naming_persistent_service":{"leader":"10.0.0.141:7848","raftGroupMember":["10.0.0.141:7848","10.0.0.143:7848","10.0.0.142:7848"],"term":3},"naming_persistent_service_v2":{"leader":"10.0.0.141:7848","raftGroupMember":["10.0.0.141:7848","10.0.0.142:7848","10.0.0.143:7848"],"term":4},"naming_service_metadata":{"leader":"10.0.0.141:7848","raftGroupMember":["10.0.0.141:7848","10.0.0.142:7848","10.0.0.143:7848"],"term":4}}},"raftPort":"7848","readyToUpgrade":true,"version":"2.0.2"},"address":"10.0.0.141:8848","failAccessCnt":0,"abilities":{"remoteAbility":{"supportRemoteConnection":true},"configAbility":{"supportRemoteMetrics":false},"namingAbility":{"supportJraft":true}}},{"ip":"10.0.0.143","port":8848,"state":"UP","extendInfo":{"lastRefreshTime":1767541296760,"raftMetaData":{"metaDataMap":{"naming_instance_metadata":{"leader":"10.0.0.141:7848","raftGroupMember":["10.0.0.141:7848","10.0.0.142:7848","10.0.0.143:7848"],"term":4},"naming_persistent_service":{"leader":"10.0.0.141:7848","raftGroupMember":["10.0.0.141:7848","10.0.0.143:7848","10.0.0.142:7848"],"term":3},"naming_persistent_service_v2":{"leader":"10.0.0.141:7848","raftGroupMember":["10.0.0.141:7848","10.0.0.142:7848","10.0.0.143:7848"],"term":4},"naming_service_metadata":{"leader":"10.0.0.141:7848","raftGroupMember":["10.0.0.141:7848","10.0.0.142:7848","10.0.0.143:7848"],"term":4}}},"raftPort":"7848","readyToUpgrade":true,"version":"2.0.2"},"address":"10.0.0.143:8848","failAccessCnt":0,"abilities":{"remoteAbility":{"supportRemoteConnection":true},"configAbility":{"supportRemoteMetrics":false},"namingAbility":{"supportJraft":true}}},{"ip":"10.0.0.142","port":8848,"state":"UP","extendInfo":{"lastRefreshTime":1767541295863,"raftMetaData":{"metaDataMap":{"naming_instance_metadata":{"leader":"10.0.0.141:7848","raftGroupMember":["10.0.0.141:7848","10.0.0.142:7848","10.0.0.143:7848"],"term":4},"naming_persistent_service":{"leader":"10.0.0.141:7848","raftGroupMember":["10.0.0.141:7848","10.0.0.143:7848","10.0.0.142:7848"],"term":3},"naming_persistent_service_v2":{"leader":"10.0.0.141:7848","raftGroupMember":["10.0.0.141:7848","10.0.0.142:7848","10.0.0.143:7848"],"term":4},"naming_service_metadata":{"leader":"10.0.0.141:7848","raftGroupMember":["10.0.0.141:7848","10.0.0.142:7848","10.0.0.143:7848"],"term":4}}},"raftPort":"7848","readyToUpgrade":true,"version":"2.0.2"},"address":"10.0.0.142:8848","failAccessCnt":0,"abilities":{"remoteAbility":{"supportRemoteConnection":true},"configAbility":{"supportRemoteMetrics":false},"namingAbility":{"supportJraft":true}}}]}[root@nacos_141 logs]# 10.进入nacos的web页面,查看集群管理列表(三个节点都为UP表示集群正常)
2026年01月06日
4 阅读
0 评论
1 点赞
1
2
...
4