建议:
如果内存空间不够,建议开启swap分区
swap分区是将内存的部分数据存放在硬盘上,使得所占用的内存减小。
dd if=/dev/zero of=/mnt/swapfile bs=1MB count=2048 ##创建分区
mkswap /mnt/swapfile #格式化分区
swapon /mnt/swapfile #激活分区
chmod -600 /mnt/swapfile #赋予权限
swapon -a #开启分区
vi /etc/fstab
最后一行添加如下信息:
/mnt/swapfile swap swap defaults 0 0
free -h #查看分区使用情况
swapoff /mnt/swapfile #停止使用分区
rm -rf /mnt/swapfile #删除分区
1.glusterfs分布式存储
1.1安装glusterfs-所有节点上都需要执行
所有节点:
yum install centos-release-gluster -y
yum install glusterfs-server -y
systemctl start glusterd.service
systemctl enable glusterd.service
mkdir -p /gfs/test1
mkdir -p /gfs/test2
1.2添加存储资源池
master节点[没有限制在哪个节点上操作]:
gluster peer #查看tab无效果的话 重启一下客户端
gluster pool list #查看资源池
gluster peer probe master
gluster peer probe node1
gluster peer probe node2
gluster pool list
1.3查看gluster端口
1.创建
netstat -lntup #查看gluster端口
1.4卷挂载
在master主机上执行以下命令
#创建分布式复制卷
gluster volume create auteman replica 2 master:/gfs/test1 master:/gfs/test2 node1:/gfs/test1 node1:/gfs/test2 force
#开启卷
gluster volume start auteman
#查看卷信息
gluster volume info auteman
# 挂载目录
mkdir /mnt2
mount -t glusterfs 10.0.0.11:/auteman /mnt2
#这是取消挂载指令 umount /mnt2
#查看 磁盘大小
df -h|grep mnt2
总共48G
1.5对auteman进行扩容
#扩容
gluster volume add-brick auteman node2:/gfs/test1 node2:/gfs/test2 force
#查看 磁盘大小
df -h|grep mnt2
总共72G (比之前增加了24G)
1.6上传H5游戏压缩包:
解压:
unzip pupo.zip
删除多余文件:
rm -rf __MACOSX pupo.zip
三台主机都查看/gfs目录结构
tree /gfs
发现不同节点的相同目录下,文件数量是不一样的,验证了此时glusterfs确实实现了分布式存储
此时master主机再查看/mnt2的目录结构:
tree /mnt2
发现有100个文件,而master(54)、node1(72)、node2(74)的文件数恰好是200,刚好是100的2倍(replica =2)
也证明了glusterfs的分布式存储
1.7创建k8s资源,endpoint、pv、pvc、以及测试的pod
创建gluster_endpoint
vi gluster_endpoint.yaml
apiVersion: v1
kind: Endpoints
metadata:
name: glusterfs
namespace: default
subsets:
- addresses:
- ip: 10.0.0.11
- ip: 10.0.0.12
- ip: 10.0.0.13
ports:
- port: 49152 #这个端口选择之前
protocol: TCP
创建gluster类型pv
vi glusterfs-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: gluster
labels:
type: glusterfs
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany
glusterfs:
endpoints: "glusterfs"
path: "auteman"
readOnly: false
创建gluster类型pvc
vi glusterfs-pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: gluster
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
创建用于测试的pod
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: web
env: glustertest
spec:
containers:
- name: nginx
image: 10.0.0.11:5000/nginx:1.8.1
ports:
- containerPort: 80
hostPort: 80
volumeMounts:
- name: nfs-vol2
mountPath: /usr/share/nginx/html
volumes:
- name: nfs-vol2
persistentVolumeClaim:
claimName: gluster
使用kubectl创建以上资源
1.8验证
查看pod 创建是否成功
物理机访问node2
可以访问,验证成功!!
2.安装gitlab
这里我选择node1进行安装(安装前,建议打快照)
gitlab的安装
sudo docker run -d \
--hostname node1-gitlab \
-p 443:443 -p 8090:80 \
--name gitlab \
--restart always \
-v /srv/gitlab/data:/var/opt/gitlab \
gitlab/gitlab-ce:13.1.0-ce.0
docker exec -it gitlab /bin/bash
gitlab-ctl status
# 查看默认登录密码
docker logs gitlab | grep password
登录成功!!
3.安装jenkins
制作一个jenkins镜像
# 下载一个jenkins的war
wget https://mirror.tuna.tsinghua.edu.cn/jenkins/war/2.357/jenkins.war
在jenkins.war所在目录编写Dockerfile文件
FROM 10.0.0.11:5000/tomcat:9.1
EXPOSE 8080
WORKDIR /usr/local/tomcat/webapps
ADD jenkins.war /usr/local/tomcat/webapps/
docker build -t jenkins:1.0 .
运行该容器:
docker run -it -d --name=jenkins -p 8090:8080 --restart always jenkins:1.0
访问jenkins
cat /root/.jenkins/secrets/initialAdminPassword
4.jenkins和gitlab建立密钥登录
jenkins生成密钥
ssh-keygen -t rsa
cat /root/.ssh/id_rsa.pub
cat /root/.ssh/id_rsa
gitlab添加公钥
jenkins添加私钥:
5.jenkins添加一个任务
6.预编写Dockerfile
拉取项目,node1(有gitlab的主机)
git clone http://node1:8090/root/pipo.git
当前路径,编写Dockerfile
FROM 10.0.0.11:5000/nginx:1.8.1
ADD pupo/* /usr/share/nginx/html
编写.dockerfile
Dockerfile
# 构建docker镜像
docker build -t pupo:v1 .
#创建一个docker容器,测试
docker run -id --name=pupo -p 88:80 pupo:v1
浏览器访问测试:访问成功!!
进入容器内部查看是否存在Dockerfile文件(预期结果是不存在Dockerfile文件的)
7.jenkins拉取文件,打成镜像,上传私服
拉取完项目,更新项目后,重新push项目:
git config --global user.name "root"
git config --global user.email "1834275911@qq.com"
git init
git remote add origin git@node1:8090:root/test.git
git add .
git commit -m "Initial commit"
git push -u origin master
jenkins自动打镜像,上传私服
#!/bin/bash
if [ $GIT_PREVIOUS_SUCCESSFUL_COMMIT == $GIT_COMMIT ];
then
echo "no change,skip build"
exit 0
else
docker build -t 10.0.0.11:5000/pupo:v$BUILD_ID .
docker push 10.0.0.11:5000/pupo:v$BUILD_ID
fi
jenkins构建该任务
发现版本号和任务构建的此时一致
ls -al /opt/myregistry/docker/registry/v2/repositories/pupo/_manifests//tags/
kubectl run pupo --image=10.0.0.11:5000/pupo:v1 --replicas=2
设置对外访问:
kubectl expose deployment pupo --port=80 --type=NodePort
访问效果:
8.自动化升级回滚
目标:
一旦jenkins点击构建,就检查gitlab的代码是否修改,若修改,构建新的镜像,上传到私服,并实现k8s自动升级镜像版本
kubectl rollout history deployment pupo
kubectl set image deployment/pupo pupo=10.0.0.11:5000/pupo:v9
kubectl rollout undo deployment pupo --to-revision=1
配置jenkins构建时,master的k8s自动更新镜像
修改git的代码:然后重新构建:
之前是v:12
kubectl edit deployment pupo
很明显看出,此时版本变成了v:14
此时就实现了一键运行,k8s自动更新配置pupo
回滚操作:
kubectl rollout undo deployment pupo --to-revision=4
此时查看镜像版本:又变成了v12了