建议:

如果内存空间不够,建议开启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端口

image.png

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
image.png
总共48G

1.5对auteman进行扩容
#扩容
gluster volume add-brick auteman node2:/gfs/test1 node2:/gfs/test2 force

#查看 磁盘大小
df -h|grep mnt2
image.png
总共72G (比之前增加了24G)

1.6上传H5游戏压缩包:

image.png

解压:
unzip pupo.zip
image.png

删除多余文件:

rm -rf __MACOSX pupo.zip 

image.png

三台主机都查看/gfs目录结构

tree /gfs

image.png

image.png

image.png
发现不同节点的相同目录下,文件数量是不一样的,验证了此时glusterfs确实实现了分布式存储

此时master主机再查看/mnt2的目录结构:

tree /mnt2

image.png
发现有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 创建是否成功
image.png

物理机访问node2
可以访问,验证成功!!
image.png

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

image.png

docker exec -it gitlab /bin/bash
gitlab-ctl status

# 查看默认登录密码
docker logs gitlab   | grep password

image.png
登录成功!!

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 .



image.png

运行该容器:

 docker run -it -d --name=jenkins -p 8090:8080 --restart always jenkins:1.0 

image.png

访问jenkins

 cat /root/.jenkins/secrets/initialAdminPassword

image.png

4.jenkins和gitlab建立密钥登录

jenkins生成密钥
ssh-keygen -t rsa
cat /root/.ssh/id_rsa.pub
cat /root/.ssh/id_rsa

image.png

image.png

image.png

gitlab添加公钥

image.png

jenkins添加私钥:

image.png
image.png

5.jenkins添加一个任务

image.png

image.png

image.png

image.png

6.预编写Dockerfile

拉取项目,node1(有gitlab的主机)
git clone http://node1:8090/root/pipo.git

image.png

当前路径,编写Dockerfile

FROM 10.0.0.11:5000/nginx:1.8.1
ADD pupo/* /usr/share/nginx/html

编写.dockerfile

Dockerfile

image.png

# 构建docker镜像
docker build -t pupo:v1 .
#创建一个docker容器,测试
docker run -id --name=pupo -p 88:80 pupo:v1 

浏览器访问测试:访问成功!!
image.png

进入容器内部查看是否存在Dockerfile文件(预期结果是不存在Dockerfile文件的)
image.png

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
  

image.png

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

image.png

jenkins构建该任务
image.png

发现版本号和任务构建的此时一致

ls -al /opt/myregistry/docker/registry/v2/repositories/pupo/_manifests//tags/

image.png

kubectl run pupo --image=10.0.0.11:5000/pupo:v1 --replicas=2 

image.png

设置对外访问:

kubectl expose deployment pupo --port=80 --type=NodePort

访问效果:

image.png

8.自动化升级回滚

目标:

一旦jenkins点击构建,就检查gitlab的代码是否修改,若修改,构建新的镜像,上传到私服,并实现k8s自动升级镜像版本

kubectl rollout history deployment pupo

image.png

kubectl set image deployment/pupo pupo=10.0.0.11:5000/pupo:v9
 kubectl rollout undo deployment pupo --to-revision=1

配置jenkins构建时,master的k8s自动更新镜像
image.png

修改git的代码:然后重新构建:
之前是v:12

kubectl edit deployment pupo

image.png
很明显看出,此时版本变成了v:14

此时就实现了一键运行,k8s自动更新配置pupo

回滚操作:

kubectl rollout undo deployment pupo --to-revision=4

此时查看镜像版本:又变成了v12了
image.png

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐