单节点部署
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):
- 如果你希望
config
Pod 能够在主节点上运行,可以在 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