Rancher2.7下微服务架构个人实践

原创
2023/12/21 16:38
阅读数 50

一、概述

    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

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
0 收藏
0
分享
返回顶部
顶部