Rancher部署k8s集群服务器规划:
建议起码四台机器用来部署,机器为centos7.7及以上,所有机器都需要安装docker
一台机器用来作为rancher服务端,一台机器用来作为k8s master节点,另外两台作为k8s worker节点;如果条件允许的话,k8s master节点和k8s worker节点可以部署多台;
这里以172.16.104.108为rancher服务端和k8s master节点、
172.16.104.109、172.16.104.105为k8s worker节点为例进行举例
1、所有机器centos7.7基本环境配置
安装基本软件包 (这里可以根据机器情况进行调整)
yum install -y gcc gcc-c++ glibc make openssl openssl-devel vim-enhanced tcpdump iftop lrzsz sysstat tree traceroute ntpdate xz unzip wget telnet
修改主机名 (非必须,利于统一管理,给各节点具体标签)
Vim /etc/hosts
172.16.104.108 node108
172.16.104.109 node109
172.16.104.105 node105
关闭selinux
sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
关闭防火墙新手
systemctl stop firewalld.service && systemctl disable firewalld.service
配置主机时间、时区、系统语言同步
yum install -y ntpdate ; ntpdate ntp1.aliyun.com
[root@node109 ~]# crontab -l 定时同步时间,服务器时间保持一致
*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com &> /dev/null
kernel性能调优:
cat >> /etc/sysctl.conf< net.ipv4.ip_forward=1 watchdog_thresh=30 net.bridge.bridge-nf-call-iptables=1 net.ipv4.neigh.default.gc_thresh1=4096 net.ipv4.neigh.default.gc_thresh2=6144 net.ipv4.neigh.default.gc_thresh3=8192 EOF 2、所有机器安装docker-ce 具体版本18.06.3 ##安装docker-ce: 阿里云文档 Docker CE 镜像源站-阿里云开发者社区 ##下载docker-ce的阿里云镜像仓库 yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum makecache fast ##安装执行指定docker-ce版本,否则会有问题;支持的版本:17.03.x 18.06.x 18.09.x yum list docker-ce.x86_64 --showduplicates | sort -r yum install -y docker-ce-18.06.3.ce-3.el7 service docker start || /bin/systemctl start docker.service docker version ##修改docker镜像源站为阿里云镜像源;此镜像地址都可以通过阿里云-容器镜像服务拿到; [root@node108 ~]# cat /etc/docker/daemon.json { "registry-mirrors": ["https://cu4cokke.mirror.aliyuncs.com"] } service docker restart 3、在规划的rancher服务端机器上安装rancher sudo docker run -d --restart=unless-stopped -v /usr/local/docker/rancher/:/var/lib/rancher/ -p 80:80 -p 443:443 rancher/rancher:stable 等待几分钟后,rancher自动部署完成,界面网址为以下: https://172.16.104.108/login 登录账号密码:admin/admin 4、配置阿里云镜像仓库 阿里云镜像仓库服务,命令空间命名空间名字,选择私有空间; 在访问凭证设置固定账号密码; docker login --username=ehealth1 registry.cn-hangzhou.aliyuncs.com 输入密码:XXXXXX 镜像仓库这里创建具体项目的镜像仓库,,命名空间选择刚才创建的空间,仓库名称比如为blade-log,仓库类型为私有; 这样具体的项目镜像仓库就添加好了; 进入到具体的镜像仓库下面,有具体推送和下载仓库的命令学习,可以用到后面项目发布中; 公网镜像仓库地址:registry.cn-hangzhou.aliyuncs.com/yjjktest/blade-log 专网(阿里云内网)镜像仓库地址:registry-vpc.cn-hangzhou.aliyuncs.com/yjjktest/blade-log docker tag [imageid] registry.cn-hangzhou.aliyuncs.com/yjjktest/blade-log:1.0 docker push registry.cn-hangzhou.aliyuncs.com/yjjktest/blade-log:1.0 docker pull registry.cn-hangzhou.aliyuncs.com/yjjktest/blade-log:[镜像版本号] 5、rancher界面添加集群部署,添加k8s主机节点 添加集群,选择自定义集群 输入集群名称,其他选项默认; 私有镜像仓库这里选择docker项目部署的私有镜像地址和账号密码(一般为harbor仓库或者阿里云镜像仓库服务) 最后这个是添加主机命令,用于k8s master节点全部角色和k8s worker节点worker角色安装部署的命令;这里不需要改变,勾选不同角色,直接复制出来即可;然后保存集群; Rancher版本为2.3.6 选择172.16.104.108为全部角色(etcd、controller、worker) 选择172.16.104.105、172.16.104.109为worker角色 注意命令中--server https://172.16.104.108 这个配置根据实际机器情况都不同 在108机器上执行全部角色的命令,在105和109机器上执行worker角色的命令,等待几分钟后,在rancher界面上集群下面主机就能看到各个机器加入k8s集群 ###选择worker角色,命令如下: sudo docker run -d --privileged --restart=unless-stopped --net=host -v /etc/kubernetes:/etc/kubernetes -v /var/run:/var/run rancher/rancher-agent:v2.3.6 --server https://172.16.104.108 --token c7zdhsc528tt2fxqm8dtwwgx56ff7fwzbdpvrzzwdn99rnxckfcb85 --ca-checksum d34cb9d02fc288e412280a8099f65a4a3d89504cc02aeebc6a7f572cd7c5b3d4 --worker ##选择全部角色(etcd、controller、worker至少有一台机器需要包含全部角色)命令如下: sudo docker run -d --privileged --restart=unless-stopped --net=host -v /etc/kubernetes:/etc/kubernetes -v /var/run:/var/run registry.cn-hangzhou.aliyuncs.com/rancher/rancher-agent:v2.3.6 --server https://172.16.104.108 --token c7zdhsc528tt2fxqm8dtwwgx56ff7fwzbdpvrzzwdn99rnxckfcb85 --ca-checksum d34cb9d02fc288e412280a8099f65a4a3d89504cc02aeebc6a7f572cd7c5b3d4 --etcd --controlplane --worker 到这里,rancher部署k8s集群就自动完成了; 6、安装k8s的kubectl命令,通过kubectl(k8s客户端命令)命令方式部署k8s应用 准备一台专用于发布的机器,安装docker;一般是jenkins部署的机器;下载rancher界面上面的kubectl命令放置在机器的/usr/local/bin/kubectl下面;把配置文件拷贝到到/root/.kube/config里面 使用kubectl get nodes确认kubectl已经连接上k8s master可用,并且集群状态ready正常 [root@localhost ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION node104 Ready worker 142d v1.17.4 node106 Ready,SchedulingDisabled worker 132d v1.17.4 node108 Ready controlplane,etcd,worker 160d v1.17.4 node109 Ready worker 160d v1.17.4 [root@localhost ~]# 7、rancher界面添加集群下的具体项目,以及通过jenkins编译、脚本发布 点击rancher 工作负载,部署服务,填写名字、docker镜像地址、端口映射;如果有共享存储挂载也可以挂载(在最后附录展示),没有的话这样就可以点击保存了;第一次镜像地址可能没有构建过,可以时间点随意写一个,jenkins版本更新后就会替换成新的 举例镜像地址:registry.cn-hangzhou.aliyuncs.com/yjjktest/blade-log:202008201139 Jenkins部署项目,编译好之后,利用脚本build-blade-project-image-docker.sh、blade-log-dockerfile文件、deploy-k8s.sh三个脚本文件来进行rancher k8s项目的版本升级 ##jenkins项目内容:打包编译好之后,制作成镜像#################### #!/bin/bash NAME=blade-log tag=$(date "+%Y%m%d%H%M") source /etc/profile cd /opt/docker sh build-blade-project-image-docker.sh $NAME $tag ##部署 sh deploy-k8s.sh $NAME $tag sh delete-history-image.sh ##删除本地服务器历史镜像版本 下面四个脚本附件和脚本具体内容: ############build-blade-project-image-docker.sh脚本############################### #操作/项目路径(Dockerfile存放的路劲) BASE_PATH=/opt/docker #docker 镜像/容器名字或者jar名字 这里都命名为这个 SERVER_NAME=$1 tag=$2 #tag=$(date "+%Y%m%d%H%M") # 源jar路径 即jenkins构建后存放的路径 SOURCE_PATH=/root/.jenkins/workspace/docker/$SERVER_NAME/target #docker file针对应用的名称 DOCKERFILENAME=$SERVER_NAME-dockerfile #项目路径 APP_PATH=/opt/docker/$SERVER_NAME #容器id CID=$(docker ps | grep "$SERVER_NAME" | awk '{print $1}') #镜像id IID=$(docker images | grep "$SERVER_NAME" | grep "$tag" | awk '{print $3}') #仓库地址 注意这里的镜像仓库地址改成自己的 RID=registry.cn-hangzhou.aliyuncs.com/yjjktest echo "最新构建代码 $SOURCE_PATH/$SERVER_NAME.jar 迁移至 $APP_PATH ...." #把项目从jenkins构建后的目录移动到我们的项目目录下同时重命名下 mkdir -pv $APP_PATH \cp -rf $SOURCE_PATH/$SERVER_NAME.jar $APP_PATH/$SERVER_NAME.jar #修改文件的权限 chmod 644 $APP_PATH/$SERVER_NAME.jar echo "$SERVER_NAME 拷贝完成" # 构建docker镜像 if [ -n "$IID" ]; then echo "存在$SERVER_NAME:$tag镜像,IID=$IID" cd $APP_PATH docker build --build-arg PKG_NAME=$SERVER_NAME -f $DOCKERFILENAME -t $RID/$SERVER_NAME:$tag . else echo "不存在$SERVER_NAME:$tag镜像,开始构建镜像" cd $APP_PATH docker build --build-arg PKG_NAME=$SERVER_NAME -f $DOCKERFILENAME -t $RID/$SERVER_NAME:$tag . fi #push docker 镜像 sudo docker push $RID/$SERVER_NAME:$tag if [ $? -eq 0 ];then echo "$SERVER_NAME镜像推送完成,镜像tag是$tag" else echo "$SERVER_NAME容器推送失败...请注意" echo 1 fi docker images | grep " if [ $? -eq 0 ];then docker rmi `docker images | grep " echo "删除历史的版本成功" else echo "没有需要删除的历史的版本" Fi #######blade-log-dockerfile文件,用于制作docker镜像,需要学习命令######### [root@localhost docker]# cat /opt/docker/blade-log/blade-log-dockerfile FROM openjdk:8-alpine ##底层镜像 MAINTAINER [email protected] ARG PKG_NAME RUN cp /etc/apk/repositories /etc/apk/repositories.bak && \ echo "http://mirrors.aliyun.com/alpine/v3.8/main/" > /etc/apk/repositories && \ echo "http://mirrors.aliyun.com/alpine/v3.8/community/" >> /etc/apk/repositories && \ apk update && apk upgrade && \ apk add tzdata && rm -rf /etc/localtime && ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime WORKDIR /usr/local/docker/$PKG_NAME ADD $PKG_NAME.jar $PKG_NAME.jar EXPOSE 8103 ##修改服务对应的端口 ENTRYPOINT ["java","-jar","./blade-log.jar","--spring.profiles.active=test"] ##启动命令 #######deploy-k8s.sh脚本 获取最新的镜像版本通过kubectl命令进行替换rancher项目中的镜像tag版本来达到发布的目的########### [root@localhost docker]# cat /opt/docker/deploy-k8s.sh #!/bin/bash # source /etc/profile #仓库地址 RID=registry.cn-hangzhou.aliyuncs.com/yjjktest ##namespace命令空间 ns=default ##应用名称 deployment_name=$1 ##升级的镜像版本 image_tag=$2 ##获取最新版本的digest digest=$(docker images registry.cn-hangzhou.aliyuncs.com/yjjktest/${deployment_name} --digests | awk {'print $3'} | head -2 | tail -1) ##获取现在deployment的版本号 now_deploy_image=$(kubectl describe deploy/${deployment_name} |grep Image | awk {'print $2'} | awk -F':' {'print $2'}) kubectl cluster-info if [ $? -eq 0 ];then echo "有kubectl命令,能正常连上集群" else echo "没有kubectl命令,或者不能连接上集群,退出脚本..." exit 1 fi ##查看deployment历史修订版本 echo "查看${deployment_name}历史版本个数" kubectl rollout history deploy/${deployment_name} ##升级deployment镜像版本 if [ ${now_deploy_image} == ${image_tag} ];then echo "${deployment_name} 同一个tag升级,${image_tag}" kubectl set image deploy/${deployment_name} ${deployment_name}=${RID}/${deployment_name}@${digest} --record else echo "升级${deployment_name}到${image_tag}版本" kubectl set image deploy/${deployment_name} ${deployment_name}=${RID}/${deployment_name}:${image_tag} --record fi ##查看deployment升级状态 echo "${deployment_name}升级后的状态查看:" kubectl rollout status deploy/${deployment_name} ##查看当前pod状态 sleep 3 echo "查看当前所有pod的状态" kubectl get pods -o wide -n ${ns} ##########delete-history-image.sh定时删除服务器本地历史镜像版本################# [root@localhost docker]# cat /opt/docker/delete-history-image.sh #!/bin/bash # image_name=(blade-gateway blade-auth blade-resource blade-desk blade-log blade-system blade-user blade-admin mechc-im mechc-older yj-older-task xxl-job-admin mechc-survey mechc-iot mechc-pay mechc-organ) for var in ${image_name[@]} do num=$(docker images | grep $var | wc -l) if [ $num -ge 2 ];then docker images | grep $var docker rmi -f `docker images | grep $var | tail -1 | awk '{print $3}'` &> /dev/null echo "$var 删除大于3个保留的镜像成功" else echo "$var 没有保留的镜像大于3个" fi Done ############附录1 养老rancher项目目前端口规划############################### 应用端口 容器映射端口 blade-gateway 80 | 30001 blade-auth 8100 8721 | 30002 30721 blade-resource 8010 8720 | 30003 30720 blade-desk 8105 | 30004 blade-log 8103 8720 | 30005 30820 blade-system 8106 8719 | 30006 30719 blade-user 8102 8722 | 30007 30722 blade-admin 7002 | 30008 | mechc-im 8108 8721 | 30009 30821 mechc-older 8104 8723 | 30010 30723 | yj-older-task-0.0.1-SNAPSHOT 8089 9999 | 30011 30999 xxl-job-admin 8081 | 30012 mechc-survey 8109 8720 | 30013 30920 mechc-iot 8107 | 30015 mechc-pay 8108 | 30016 mechc-organ 8110 | 30017 ############附录2 rancher添加项目时添加共享存储############################ 1、安装NFS服务端,可以按照上面文档安装 2、Rancher 选择集群下面 存储--持久卷,添加PV 3、填写名称,卷插件选择NFS share,容量填写,插件配置填写路径和服务器,访问模式改成多主机读写 4、进入到具体项目下面,PVC,添加PVC,选择刚才添加的PV持久卷 5、工作负载,添加项目,数据库这里打开,填写卷名、选择刚才创建的PVC、容器路径、子路径;这样容器内的有些目录文件可以通过共享存储映射到服务器上使用了; 图片为容器的路径/usr/local/docker/share/ 对应是 服务器的NFS地址+子路径目录