一、概述
Docker不断地在项目里普及,Rancher也从1.x使用到了2.x。研读过Rancher官方文档,总感觉自己用的都是皮毛。但也基本满足项目需求,也就没深入的学习,只能说自己不够卷。
本文主要是记录我是如何从0到1运用Rancher运行起来一套Springcloud微服务程序,一方面是留以备忘,还一方面是抛转引玉,看看大佬们有没有更新奇的玩法,享受下嗟来之食。
二、前期准备
由于是开发环境,没准备太多机器,但麻雀虽小,五脏俱全。所有服务都是以线上标准执行的,差距在实例数量上。以下是主要的依赖版本:
1、Rancher:选用2.7版本
2、jdk:21(没看错,21!时代前沿)
3、操作系统:Centos7.9、Ubuntu22.04
4、jenkins:2.436
5、gitlab:7.4.3
6、maven:3.9.6
7、nexus:3
8、git:1.8.3.1
以下是两台机器配置:
1、centos7.9:用做rancher-master,4核8G,下文简称master机器
2、Ubuntu22.04:用作rancher-worker,12核126G,下文简称worker机器
三、安装依赖
3.1、master机器安装nexus
nexus采用docker方式安装,以下是命令:
mkdir -p /home/nexus/data
chmod 777 -R /home/nexus/data
docker run -d --name nexus3 -p 8081:8081 --restart always -v /home/nexus/data:/nexus-data sonatype/nexus3
#密码
cat /home/nexus/data/admin.password
3.2、master机器安装jdk21和Maven
JDK下载地址:https://download.oracle.com/java/21/latest/jdk-21_linux-x64_bin.tar.gz
安装命令:
wget https://download.oracle.com/java/21/latest/jdk-21_linux-x64_bin.tar.gz
tar xvzf jdk-21_linux-x64_bin.tar.gz
vi /etc/profile
#输入如下内容
#export PATH
#export JAVA_HOME=/opt/soft/jdk-21.0.1
#export PATH=$JAVA_HOME/bin:$PATH
#export CLASSPATH=.$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
source /etc/profile
java -version
#输出如下内容表示成功
java version "21.0.1" 2023-10-17 LTS
Java(TM) SE Runtime Environment (build 21.0.1+12-LTS-29)
Java HotSpot(TM) 64-Bit Server VM (build 21.0.1+12-LTS-29, mixed mode, sharing)
Maven下载地址:https://dlcdn.apache.org/maven/maven-3/3.9.6/binaries/apache-maven-3.9.6-bin.tar.gz
安装命令:
wget https://dlcdn.apache.org/maven/maven-3/3.9.6/binaries/apache-maven-3.9.6-bin.tar.gz
tar xvzf apache-maven-3.9.6-bin.tar.gz
vi /etc/profile
#输入如下内容
#export MAVEN_HOME=/opt/soft/apache-maven-3.9.6
#export PATH=$MAVEN_HOME/bin:$PATH
source /etc/profile
mvn -v
#输出如下内容表示安装成功
Apache Maven 3.9.6 (bc0240f3c744dd6b6ec2920b3cd08dcc295161ae)
Maven home: /opt/soft/apache-maven-3.9.6
Java version: 21.0.1, vendor: Oracle Corporation, runtime: /opt/soft/jdk-21.0.1
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-1160.88.1.el7.x86_64", arch: "amd64", family: "unix"
安装完成后,在.m2/repository/settings.xml里配置下nexus地址:
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
http://maven.apache.org/xsd/settings-1.0.0.xsd">
<profiles>
<profile>
<id>dev</id>
<repositories>
<repository>
<id>snapshots</id>
<name>snapshots</name>
<url>http://sit.jenkins.com:8081/repository/maven-snapshots/</url>
<layout>default</layout>
<snapshots><enabled>true</enabled></snapshots>
</repository>
</repositories>
</profile>
</profiles>
<servers>
<server>
<id>snapshots</id>
<username>admin</username>
<password>123</password>
</server>
</servers>
<activeProfiles>
<activeProfile>dev</activeProfile>
</activeProfiles>
<mirrors>
<!-- 阿里云仓库 -->
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>https://maven.aliyun.com/nexus/content/repositories/central/</url>
</mirror>
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
</settings>
3.3、master机器安装jenkins
以下是安装命令:
waget https://mirrors.tuna.tsinghua.edu.cn/jenkins/war/2.436/jenkins.war
java -jar jenkins.war --httpPort=8088 &
3.4、master机器安装harbor
参加之前写的,这里不再重复,传送门:https://my.oschina.net/shyloveliyi/blog/1617206
3.5、master机器安装Rancher
以下是安装命令:
sudo docker run --privileged -d --restart=unless-stopped -p 80:80 -p 443:443 rancher/rancher
3.6、master机器安装git
以下是安装命令:
yum install git -y
3.7、master机器安装gitlab
参加之前写的,这里不再重复,传送门:https://my.oschina.net/shyloveliyi/blog/608043
四、配置CI/CD
4.1、配置jenkins自动构建
目的:当提交代码时,自动构建项目,预编译检查代码质量(后续可加入sonar)
配置:
1、jenkins配置
2、gitlab配置
4.2、制作基础镜像
java,dockerfile,
# 使用Alpine Linux作为基础镜像
#FROM alpine:latest
FROM alpine:3.15
#定义环境变量,以便后续使用
ENV JAVA_HOME :/usr/java/jdk/
ENV PATH $PATH:$JAVA_HOME/bin
COPY *.apk /tmp
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories \
&& apk update && apk add --no-cache curl bash tree tzdata binutils bash-completion curl openssl zstd\
&& rm -rf /var/cache/apk/* \
&& sed -i '1s?/bin/ash?/bin/bash?g' /etc/passwd\
&& sed -i 4d /etc/shells \
&& sed -i '2i/bin/bash' /etc/shells\
&& wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub \
&& cd /tmp && apk add --allow-untrusted glibc-2.31-r0.apk glibc-i18n-2.31-r0.apk glibc-bin-2.31-r0.apk \
&& wget -O /tmp/gcc-libs.tar.zst http://mirrors.ustc.edu.cn/archlinux/pool/packages/gcc-libs-13.2.1-3-x86_64.pkg.tar.zst \
&& /usr/bin/unzstd /tmp/gcc-libs.tar.zst \
&& mkdir /tmp/gcc \
&& tar -xf /tmp/gcc-libs.tar -C /tmp/gcc \
&& mv /tmp/gcc/usr/lib/libgcc* /tmp/gcc/usr/lib/libstdc++* /usr/glibc-compat/lib \
&& strip /usr/glibc-compat/lib/libgcc_s.so.* /usr/glibc-compat/lib/libstdc++.so* \
&& wget http://mirrors.ustc.edu.cn/archlinux/pool/packages/zlib-1%3A1.3-2-x86_64.pkg.tar.zst -O /tmp/libz.tar.zst \
&& mkdir /tmp/libz \
&& /usr/bin/unzstd /tmp/libz.tar.zst \
&& tar -xf /tmp/libz.tar -C /tmp/libz \
&& mv /tmp/libz/usr/lib/libz.so* /usr/glibc-compat/lib \
&& apk del binutils \
&& rm -rf /tmp/* /var/cache/apk/* \
&& ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo 'Asia/Shanghai' > /etc/timezone
# 下载和解压JDK 21
ADD jre21.tar.gz /usr/java/jdk/
WORKDIR /opt
vue,dockerfile
FROM node:16.14.2 as build-stage
WORKDIR /app
COPY package*.json ./
RUN npm config set registry https://registry.npm.taobao.org
RUN npm install
COPY . .
RUN npm run build:prod
# production stage
FROM nginx:stable-alpine as production-stage
COPY --from=build-stage /app/dist /usr/share/nginx/html
COPY ./nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
CMD [\"nginx\", \"-g\", \"daemon off;\"]k
sentinel,dockerfile
# base on java8
FROM ecr.ensonictech.com/common/jre:21.0.1
# run with base path : /opt
WORKDIR /opt
#create apps,logs,scripts
RUN mkdir apps
RUN mkdir logs
# RUN mkdir scripts
# add jar to container
ADD sentinel-dashboard-1.8.6.jar apps
# ADD $image_name.sh scripts
# run with base path : /opt
WORKDIR /opt/apps
# run when container started
# CMD chmod 777 $image_name.sh && ./$image_name.sh start
CMD java -server -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.6.jar
4.3、配置jenkins自动构建镜像
五、配置Rancher
5.1、部署redis
5.2、部署rabbitmq
5.3、部署consul
5.4、部署mqtt
mysql没有容器化,部署在宿主机上,rancher集群内访问,只需要配置一个外部服务即可。
5.5、配置服务发现
至此,整体基本结束,业务程序基于基础镜像进行打包,然后部署在rancher中即可使用。额外注意一下,有状态的服务,如mysql不建议放到容器中,即使挂载宿主机磁盘路径,但这样就限制了容器的灵活性,比如机器驱散、自动扩容缩容等功能。
六、附加
6.1、工作负载类型
共计5中类型:
1、CronJob:调度任务,配置cron定时执行,要求容器是一次性任务(即执行完自我销毁)
2、DaemonSet:守护进程,管理节点上运行的守护进程
3、Deployment:无状态负载,最常用的类型
4、Job:一次性任务,跑批
5、StatefulSet:有状态负载,要配置存储来使用,如果使用默认的存储,只能保证在伸缩时数据不丢失,而重新部署或重启都将会丢失数据,原理上是所有实例共用一个磁盘目录,所以要考虑自身服务的适用性
6.2、service类型
共计5种类型:
1、Cluster IP :集群内IP,只限同一集群,统一命名空间内互通访问
2、External Name:服务映射,映射另一命名空间下的服务到本命名空间内访问
3、Headless:不生成IP或负载,和StatefulSet类型的工作负责配合使用,用来统一StatefulSet的访问入口,外部不可访问
4、Load Balancer:常规http请求负载,只能监控80端口
5、Node Port:每个节点进行负载,无论访问哪个节点,只会转发到实际工作负载中,但限制端口在30000以上
7、相关文件
涉及核心文件已上传至码云:https://gitee.com/loveliyiyi/rancher-softs.git