单节点部署
ip:192.32.62.50(static)
主机名:k8s-master-node1
节点:kubernetes集群master,harbor仓库节点、
基础环境配置
设置静态ip
[root@k8s-master-node1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33 
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=9feb4a35-2525-4cd5-b143-62222944c90b
DEVICE=ens33
ONBOOT=yes
IPADDR=192.32.62.50
PREFIX=24
GATEWAY=192.32.62.2
DNS1=192.32.62.2
设置主机映射
[root@k8s-master-node1 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.32.62.50  master
[root@k8s-master-node1 ~]# ping master
PING master (192.32.62.50) 56(84) bytes of data.
64 bytes from master (192.32.62.50): icmp_seq=1 ttl=64 time=0.085 ms
^C
--- master ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.085/0.085/0.085/0.000 ms
关闭防火墙

关闭selinux

部署kubernetes集群环境
脚本部署harbor
使用传输工具将chinaskills_cloud_pass.iso 上传虚拟机,并解压到opt下
 mount chinaskills_cloud_paas.iso /mnt/  ##将源挂载到mnt下面
cp -rf /mnt/* /opt/
指定源路径,因为centos7自带源已经失效

添加kubernetes源,其chinaskills自带
[k8s]
name = kubernetes-repo
baseurl = file:///opt/kubernetes-repo
gpgcheck = 0
enabled = 1

在opt目录下脚本运行
./k8s_harbor_install.sh部署完成

web页面
输入master外网ip
默认账号密码,脚本里面是可以自己更改的虽然
# Harbor 默认账号:admin
# Harbor 默认密码:Harbor12345
上传镜像到harbor仓库
查看chinaskills自带images
进入opt
tree  /opt/images/
使用脚本上传镜像
./k8s_image_push.sh 输入仓库相关信息


web页面在library下

部署kubernetes集群
./k8s_master_install.sh 复制此token

这个每天会过期 后面持续使用通过此方法
输入:
kebectl get secret -n kubernetes-dashboard找到第一个admin的

输入
kubectl describe secret admin的密钥 -n kubernetes-dashboard

web页面
输入:https://对外ip+30000端口
输入密钥


部署jenkins
将CICD_Offline.tar包上传至master节点
将其解压到 /opt 后上传至docker导入
解压后的/opt

上传
cd  /opt
docker load -i  /opt/jenkins.tar
编写jenkins编排文件
创建储存编排文件文件夹

其jenkins编排内容
[root@k8s-master-node1 docker-compose.yaml]# cat docker-jenkins.yaml 
version: '3.1'
services:
  jenkins:
    image: 'jenkins/jenkins:2.262-centos'
    volumes:
      - /home/jenkins_home:/var/jenkins_home
      - /var/run/docker.sock:/var/run/docker.sock
      - /usr/bin/docker:/usr/bin/docker
      - /usr/bin/kubectl:/usr/local/bin/kubectl
      - /root/.kube:/root/.kube
    ports:
      - "8080:8080"
    expose:
      - "8080"
      - "50000"
    privileged: true
    user: root
    restart: always
    container_name: jenkins
启动jenkins
docker-compose -f docker-jenkins.yaml up -d  
-f  指定文件路径
up   启动服务
d     后台运行
安装离线插件
 cp -rfv /opt/plugins/* /home/jenkins_home/plugins/重启此服务

web页面
查找其对外端口

ip+8080
查看其密码

容器内密码,在虚拟机目录上是没有的
docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword

新建管理用户
点击:
系统管理——安全——管理用户
新建用户:
账号springcloud 密码000000

使用新用户登录
创建完用户后,退出admin用户,使用新创建的用户进行登录Jenkins
依次点击 “系统配置”按钮进入系统配置界面,在“Resource root URL”处配置Jenkins URL,完成后点击保存

然后点击“系统管理”的“全局安全配置”,在授权策略中,允许匿名用户具有可读权限

部署gitlab
mkdir -p gitlab
cd gitlab/
vi docker-compose.yaml输入以下:
注意不能带注释 我这里只是演示作用
version: '3'
services: 
  gitlab: 
    container_name: gitlab
    image: gitlab/gitlab-ce:12.9.2-ce.0
    volumes: 
    - /srv/gitlab/config:/etc/gitlab                     #映射配置文件
    - /srv/gitlab/gitlab/logs:/var/log/gitlab          #映射日志文件
    - /srv/gitlab/gitlab/data:/var/opt/gitlab         #映射数据文件
    ports: 
    - 81:80
    - 443:443
    - 1022:22
    privileged: true
    restart: always
    hostname: 192.32.62.50                    ##ip
    environment: 
      TZ: 'Asia/Shanghai'
Gitlab启动较慢,可以通过docker logs查看启动状态。启动完成后,在web端访问Gitlab
日志查询
docker logs  + 服务名称web端口:
http://IP:81设置初始密码,最低8位数

登录
root
你设置的密码
新建gitlab项目
点击“Create a project”,创建项目 springcloud,可见等级选择“Public”

push源代码到gitlab的springcloud项目:
下载git命令,我不知道这里能不能用git bash = =
[root@k8s-master-node1 springcloud]# git config --global user.name "Administrator"  ##设置全局变量,user的用户名
[root@k8s-master-node1 springcloud]# git config --global user.email "admin@ceshi.com"   ##设置全局变量,user的邮箱
[root@k8s-master-node1 springcloud]# git remote remove origin   ##从本地仓库删除origin仓库远程仓库信息,这是默认的远程目录
[root@k8s-master-node1 springcloud]# git remote add origin http://192.32.62.50:81/root/springcloud.git   ##添加新的远程仓库,指定地址为上述我们创建的项目路径
[root@k8s-master-node1 springcloud]# git add . ##将当前springcloud项目add至暂存区
[root@k8s-master-node1 springcloud]# git commit -m "initial commit"  ##将当前暂存区的目录提交至本地仓库,并指定 -m 打上标签,即注释
# 位于分支 master
无文件要提交,干净的工作区
[root@k8s-master-node1 springcloud]# git push -u origin master  ##将在本地仓库的文件push至远程仓库
Username for 'http://192.32.62.50:81': root
Password for 'http://root@192.32.62.50:81': 
Counting objects: 3192, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (1428/1428), done.
Writing objects: 100% (3192/3192), 1.40 MiB | 1.57 MiB/s, done.
Total 3192 (delta 1233), reused 3010 (delta 1207)
remote: Resolving deltas: 100% (1233/1233), done.
To http://192.32.62.50:81/root/springcloud.git
 * [new branch]      master -> master
分支 master 设置为跟踪来自 origin 的远程分支 master。
总体思维
yum install -y git
cd /opt/springcloud
rm -rf .git*                #删除git项目
git config --global user.name "Administrator"           #设置全局用户
git config --global user.name "Administrator"
git init                              #初始化git仓库
git remote add origin http://192.32.62.50:81/root/springcloud.git           #添加远程分支
git add .                  #添加当前文件
git commit -m "Initial commit"               #给此仓库打上标签
git push -u origin master                    #推送分支回到gitlab项目目录下,查看推送的项目

总体思维和使用github一致,用来本地和云端相互交接,也可多端互通
举例:
本地+github+宝塔
jenkins配置
就是让本地的jenkins和gitlab互联,通过token,一般服务都是这个理
可参考:╭(°A°`)╮ 你去哪了?!
1.点击管理区域的扳手图标
点击左侧导航栏的“Settings”→“Network”,设置“Outbound requests”,勾选”Allowrequests to the local network fromweb hooks and services“
并且勾选Save changes


2.创建 Gitlab API Token
点击 Gitlab 用户头像图标,并点击Settings
点击左侧导航栏的“Access Tokens”添加token,勾选所有复选框,token名称为jenkins,点击“Create personal accesstoken”生成 Token,时间为当前日期之后,这里是过期时间,如我写的11-23那么这天就会失效
复制 Token,后面配置 Jenkins 时会用到

最上面已经生成

3.登录 Jenkins 首页,点击“系统管理”→“系统配置”,配置 Gitlab 信息,取消勾选“Enable authentication for’/project’ end-point”
点击“添加”→“Jenkins”添加认证信息,将Gitlab API Token 填入
点击“Test Connection”进行测试

显示success

配置jenkins连接Maven
安装maven
1.将maven包复制到Jenkins容器中,并解压配置
由于Jenkins是采用docker in docker的方式启动的,所以需要在jenkins容器内安装maven:
#容器内部
cp -rf /opt/apache-maven-3.6.3-bin.tar.gz /home/jenkins_home/
docker exec -it jenkins bash
#容器内部
tar -zxvf /var/jenkins_home/apache-maven-3.6.3-bin.tar.gz -C .
mv apache-maven-3.6.3/ /usr/local/maven
vi/etc/profile
#在最后一行添加:
export M2_HOME=/usr/local/maven
export PATH=$PATH:$M2_HOME/bin                                   ##配置环境变量
 
vi /root/.bashrc
#./etc/bashrc在这一行的下面添加:
source /etc/profile                                ##不是最后一行,配置环境变量重载bash
#验证:                         
退出容器重新进入后:mvn -n(验证maven安装是否成功)
退出容器并再次进入,通过配置环境变量路径,配置bash脚本重载再重进容器时进行

2.登录 Jenkins 首页,点击“系统管理”→“全局工具配置”
点击“新增 Maven”,如图所示。取消勾选“自动安装”,填入maven 名称和安装路径,配置完成后点击“保存”

配置CI/CD
1.登录 Jenkins 首页,点击左侧导航栏“新建任务”,如图所示,选择构建一个流水线,并选择触发器,名称为springcloud


2.在流水线中,先去点击“流水线语法”,去生成对应的凭证出来
选择git:Git类型
添加凭证:为gitlab的用户与密码,仓库url一致为gitlab上面拉的仓库


生成流水线脚本并记住
我的是:git credentialsId: ‘ebc2d9f3-05b4-489a-b468-4ffa43cb8db1’, url: ‘http://192.32.62.50:81/root/springcloud.git ‘

3.写好流水线脚本,并点击“保存”
语法:
node{
 
    stage('git clone'){
        //check CODE
        git credentialsId: 'ebc2d9f3-05b4-489a-b468-4ffa43cb8db1', url: 'http://192.32.62.50:81/root/springcloud.git '
    }
    stage('maven build'){
        sh '''/usr/local/maven/bin/mvn package -DskipTests -f /var/jenkins_home/workspace/springcloud'''
    }
    stage('image build'){
        sh '''
              echo $BUILD_ID
              docker build -t 192.32.62.50/springcloud/gateway:$BUILD_ID -f /var/jenkins_home/workspace/springcloud/gateway/Dockerfile  /var/jenkins_home/workspace/springcloud/gateway
              docker build -t 192.32.62.50/springcloud/config:$BUILD_ID -f /var/jenkins_home/workspace/springcloud/config/Dockerfile  /var/jenkins_home/workspace/springcloud/config'''
    }
    stage('test'){
        sh '''docker run -itd --name gateway 192.32.62.50/springcloud/gateway:$BUILD_ID
        docker ps -a|grep springcloud|grep Up
        if [ $? -eq 0 ];then
            echo "Success!"
            docker rm -f gateway
        else
            docker rm -f gateway
            exit 1
            fi
       
        '''
    }
    stage('upload registry'){
        sh '''docker login 192.32.62.50 -u=admin -p=Harbor12345
            docker push 192.32.62.50/springcloud/gateway:$BUILD_ID
            docker push 192.32.62.50/springcloud/config:$BUILD_ID'''
    }
    stage('deploy Rancher'){
        //执行部署脚本
       sh 'sed -i "s/sqshq\\/piggymetrics-gateway/192.32.62.50\\/springcloud\\/gateway:$BUILD_ID/g" /var/jenkins_home/workspace/springcloud/yaml/deployment/gateway-deployment.yaml'
       sh 'sed -i "s/sqshq\\/piggymetrics-config/192.32.62.50\\/springcloud\\/config:$BUILD_ID/g" /var/jenkins_home/workspace/springcloud/yaml/deployment/config-deployment.yaml'
       sh 'kubectl create ns springcloud'
       sh 'kubectl apply -f /var/jenkins_home/workspace/springcloud/yaml/deployment/gateway-deployment.yaml --kubeconfig=/root/.kube/config'
       sh 'kubectl apply -f /var/jenkins_home/workspace/springcloud/yaml/deployment/config-deployment.yaml --kubeconfig=/root/.kube/config'
       sh 'kubectl apply -f /var/jenkins_home/workspace/springcloud/yaml/svc/gateway-svc.yaml --kubeconfig=/root/.kube/config'
       sh 'kubectl apply -f /var/jenkins_home/workspace/springcloud/yaml/svc/config-svc.yaml --kubeconfig=/root/.kube/config'
       
    }
}点击应用

}
4.去Harbor仓库新建一个springcloud项目,并且公开

5.配置Webhook(去springcloud项目的Setting配置)用于推送测试
gitlab的springcloud项目,左侧导航栏settings-webhooks,设置url,并取消ssl
url:http://192.32.62.50:8080/project/springcloud/
改为你的:http://ip:8080/project/springcloud/

6.点击“Add webhook”,然后去测试“Push events”


触发CI/CD
1.构建触发
docker cp /opt/repository/ jenkins:/root/.m2
docker restart jenkins
通过git工具更新上传pig项目代码到gitlab仓库服务中
[root@k8s-master-node1 springcloud]# cd /opt/springcloud/
[root@k8s-master-node1 springcloud]# git add .
[root@k8s-master-node1 springcloud]# git commit -m "Intiial commit"
# 位于分支 master
无文件要提交,干净的工作区
[root@k8s-master-node1 springcloud]# git push -u origin master
Username for 'http://192.32.62.50:81': root
Password for 'http://root@192.32.62.50:81': 
分支 master 设置为跟踪来自 origin 的远程分支 master。
Everything up-to-date单击jenkins主页项目进入

查看其状态

2.查看其自动构建项目
点击右侧下方构建名称 ‘#1’,选择左侧菜单的 ‘ Console Output’查看其自动构建信息


3.在harbor内查看

4.在kubernetes内查看

web页面

一般来说 master不参与调度,所以还是多节点好,本次搭建出现了最后一个服务pod没起来,是因为污点阻挡了。
没起来

问了我的chatgpt,给了我以下参考建议:
若是pod没起来
一般看yaml文件
kubectl get pod config-65c94d6d8c-gwkbk -n springcloud -o yaml
kubectl get pod gateway-769564b9c-68bst -n springcloud -o yaml复制过去给chatgpt 给我的回复是
根据你提供的 Pod YAML 输出,config Pod 处于 Pending 状态,原因是调度失败,具体错误信息如下:
复制代码0/1 nodes are available: 1 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn't tolerate.
问题分析
这条消息表明 Kubernetes 集群中存在一个 taint(污点),它阻止了 Pod 在主节点上调度。具体来说,主节点被标记为 node-role.kubernetes.io/master,而你的 Pod 没有相应的 toleration(容忍)来允许它在这样的节点上运行。
解决方案
要解决这个问题,有几种方法可以考虑:
- 添加容忍(Toleration):
- 如果你希望 configPod 能够在主节点上运行,可以在 Pod 的定义中添加一个容忍。可以通过以下 YAML 修改 Pod 的定义,添加容忍:yaml复制代码tolerations: - key: "node-role.kubernetes.io/master" effect: "NoSchedule" operator: "Exists"
- 你可以通过编辑 Deployment 或 StatefulSet 来添加这个容忍,或者直接修改 Pod 的定义(如果是单独创建的 Pod)。
 
- 如果你希望 
- 将 Pod 移动到工作节点:
- 更常见的做法是将 Pod 调度到一个工作节点上。你需要确保至少有一个工作节点可用,并且没有被标记为 NoSchedule。可以通过添加工作节点来解决这个问题。
- 确保你的集群中有至少一个工作节点,并且该节点没有污点。
 
- 更常见的做法是将 Pod 调度到一个工作节点上。你需要确保至少有一个工作节点可用,并且没有被标记为 
- 移除主节点的污点(不推荐):
- 如果你不希望主节点被标记为 NoSchedule,可以移除主节点的污点。可以使用以下命令:bash复制代码kubectl taint nodes k8s-master-node1 node-role.kubernetes.io/master:NoSchedule-
- 这种做法不推荐,因为主节点通常不应该运行工作负载,除非你有特定的需求。
 
- 如果你不希望主节点被标记为 
示例命令
添加容忍的示例命令(假设你使用的是 Deployment):
- 编辑 Deployment:bash复制代码kubectl edit deployment config -n springcloud
- 在 spec.template.spec部分添加tolerations:yaml复制代码spec: template: spec: tolerations: - key: "node-role.kubernetes.io/master" effect: "NoSchedule" operator: "Exists"
结论
根据你的需求选择合适的解决方案。如果你只是想让这个特定的 Pod 在主节点上运行,可以添加容忍。如果你的集群缺少工作节点,建议添加工作节点以便更好地管理负载。
k8s脚本多节点
连接上面k8s部署,若想部署多节点 在原有基础上更改,这是原有基础上更改 ,前面基础环境条件都需要
环境
master 192.32.62.132
node 192.32.62.133
共享服务搭建
在master节点搭建共享服务,共享/opt目录
打开 主配置文件 /etc/vsfptd/vsftpd.conf
末尾添加anon_root=/opt

设置开机自启与启动

更改node的yum源

缓存建立

更改两台虚拟机映射
两台都一样

集群部署
master三条指令 node 一条
master 
进入 /opt下
依次运行
./k8s_harbor_install.sh
./k8s_image_push.sh 
./k8s_master_install.sh 
完成后  在 node运行  且需要master传输脚本文件至node
k8s_node_install.sh
运行成功截图
master内
./k8s_harbor_install.sh 脚本

./k8s_image_push.sh 脚本


./k8s_master_install.sh 脚本

node内
k8s_node_install.sh 脚本
需要先在master 内 scp到node






MIIEowIBAAKCAQEAzx7PReFWR8yfzHlWY1CxfXodDfgiIUQ0okbyIyE0th6epZFf
ud+ImKao+D3AZplJI3KIox5rQUdTDOvZ2t8hj4adOaQvAPJI+kquaI4D56dEzhoI
b/yHIIEWJBMxC9zm/PwKRezIZ3EocXRqEkspDj3qRmJtTWNmHH68ycKkcjV0ZiLJ
jLy6zxxUEMI/tJKd4eSx9HcbPEgB8tNyTW3h0RwiOcOwfGhXvk3tpst49ucsTRFC
UIeBD9h+bL2tTaCsVbFWNgakb15QbADg0yTVZQbz1RS1UOmWItcy+XR5125iXOzB
RPfRGW75bnv6Jcw3FYjbP9iMEqz++ULvz7AiPQIDAQABAoIBAAauVb1JUYErZpQv
7ctyVOdZQwqqUF+GVbROWY0siwi84B0zHUVfooZaCeVICKbGlwdfsGyilI8cf99Q
1EwtGmYIz5WGaEW9iwEX25xfyFx2ls+XI2KJYMp5n382Z0ScsY7DiolK5AQCMG3I
dYt1hTOCZ8YxcpkmdarBo9FWR/uvEuEfuFzgi9I6qkeTCEMG2X+gKifT5rBvlt74
Py8e/A86ghqyQTBT0Vjd6DuNGBTOufvnv2rl4S1Og0ispt4DizBZOY3x6SfJpP0A
6zx0WF2RqVgp2KbHWGMUjd234eJX03XCfLAGTolRVQO9tF/U6Vo3vf3witi6rSjs
7kZHC0ECgYEA5oqtIFJJyjYdZcVbej3Eed0nwjpDxJP6Uy04izje8CDELMDfdulv
l0jxf7ikVMIzhTYFtQ39rULUbbTBhMJxR6Ya4Baa2SuTilMVnvDqKZzoCzZ9PGZ9
tt1IG1N+EoWnWAeFFlCqWqKcLkU/CsX87O4Iisp8MqOBuV7nQpQ6ENUCgYEA5f4F
WENM1Ka99gQJi9CGYyx/sAfwMBuN8sLOOrbO+5fQKxf4V0so/OycelkK2WEq9XwS
qE67td4B0GStgCM713/TQ5rDVdY5HueFv6ijMy3W3b3uzlW2z7g+z670RaCGo+9y
gywhErmvZJUre6lIAGPq2spOcvPzGJpY3gJiv8kCgYA2IYGdATVKQYKNjtV30mD7
rC3VsRCQa55vQULxjZzrDQaC65aMuSr2fq4VqykKrb6jHJgidvKFaBew2qxFm9I1
XI8a5rPdIho2dGOzOiYBN1JUr6qgMAB8m2B+6g/EEZXFWZ6qKq6VMXEyfBfdU7eb
ehiPXhPjX/jpqZrrSxqHMQKBgGNkTacBHpjfnkRNJlr3uLvvJRdLtu7zWXrJ2Rni
mrx7tQiKiVYgMwxqrIzrIhcjOM9x2RZHQDOuR5Zpi9lOYLQWl5Qls7jKpVDHuTNE
i5K4gpy9UhB1VlWaR/q0nvfgEY+TESfC0GApQrTzCiGc3HLeu0XmG9Ttu+ar/S+k
VEyRAoGBANDSi1ZNgg4ZhM0SuYUoQHor8gwslXbrspiWFo5ZRe5QxNTGd31gQ5Dm
R+ku9wABnl/WOPO+GrX4xd0QHS0koGn8TISM2LkHAkkHT06OXImb3nevHc0HTF8O
RHg/jY0mqhmn+off8Td03sSd4QCxiqIhjqX/5LuW/hTpBbGqv5Fh