草庐IT

k8s发布eureka集群,创建微服务项目

方圆师兄 2024-01-06 原文

1.创建eureka服务

1.1创建父级项目,父级项目pom.xml文件中的打包类型为pom

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.digua</groupId>
    <artifactId>cloud</artifactId>
    <version>release</version>
    <packaging>pom</packaging>
    <modules>
        <module>eureka</module>
        <module>order</module>
        <module>monitor</module>
        <module>common</module>
        <module>zuul</module>
    </modules>
    <properties>
        <java.version>1.8</java.version>
        <mybatis.plus.version>3.4.2</mybatis.plus.version>
        <mysql.connect.java.version>8.0.27</mysql.connect.java.version>
        <druid.version>1.2.8</druid.version>
        <spring-boot-dependencies.version>2.3.7.RELEASE</spring-boot-dependencies.version>
        <spring-cloud-dependencies.version>Hoxton.SR12</spring-cloud-dependencies.version>
    </properties>
</project>

1.2创建eureka服务
1.1.2配置pom.xml依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>com.digua</groupId>
		<artifactId>cloud</artifactId>
		<version>release</version>
	</parent>
	<groupId>com</groupId>
	<artifactId>eureka</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>eureka</name>
	<packaging>jar</packaging>
	<properties>
		<java.version>1.8</java.version>
	</properties>
	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>${spring-cloud-dependencies.version}</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
			<!--springboot依赖-->
			<dependency>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-dependencies</artifactId>
				<version>${spring-boot-dependencies.version}</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>
	<dependencies>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
			<version>2.2.9.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
			<version>2.3.7.RELEASE</version>
		</dependency>
	</dependencies>
	<build>
		<finalName>eureka</finalName>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<executions>
					<execution>
						<goals>
							<goal>repackage</goal>
						</goals>
					</execution>
				</executions>
				<configuration>
					<includeSystemScope>true</includeSystemScope>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-surefire-plugin</artifactId>
				<configuration>
					<skipTests>true</skipTests>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

1.1.3创建eureka的application.yml文件

server:
  port: 8001
spring:
  application:
    name: eureka01
eureka:
  client:
    service-url:
      defaultZone: ${EUREKA_URL:http://127.0.0.1:8001/eureka/}

1.2构建项目推送到docke仓库
此步骤省略可参考以下连接
1.2.1-docker安装配置
1.2.2-Dockerfile 文件编写
1.2.3 -jenkins构建项目
1.2.4-Harbor仓库搭建

2.创建k8s对应的yaml文件

2.1 由于eureka是集群形式存在,可以有一个也可以有N个,对于eureka的相互注册要保持有序,所以使用k8s中的StatefulSets来进行
2.1.1- StatefulSet是为了解决有状态服务的问题(对应Deployments和ReplicaSets是为无状态服务而设计),配合Headless Service(无头服务) 进行服务的扩缩容

##格式会程这种样式
statefulSet的名称-0(从0开始每增加一个pod就递增).Headless (无头服务名称).命名空间.svc.cluster.local
statefulSetName-{0...N-1}.serviceName.namespace.svc.cluster.local

2.2 创建 Headless Service 无头服务

apiVersion: v1
kind: Service
metadata:
  name: eureka-hl  ##服务名称
  namespace: test  ##命名空间
spec:
  clusterIP: None  ##无头服务
  ports:
  - name: eureka
    port: 8001
    protocol: TCP
    targetPort: 8001
  selector:
    workload.user.cattle.io/workloadselector: apps.statefulset-test-eureka
  sessionAffinity: None
  type: ClusterIP

2.3 创建 StatefulSet 有状态服务

apiVersion: apps/v1
kind: StatefulSet   ##资源类型
metadata:
  labels:
    workload.user.cattle.io/workloadselector: apps.statefulset-test-eureka
  name: eureka      ##服务名称
  namespace: test   ##命名空间
spec:
  podManagementPolicy: OrderedReady
  replicas: 2        ##副本数目
  revisionHistoryLimit: 10    ##历史最大保留数目
  selector:
    matchLabels:
      workload.user.cattle.io/workloadselector: apps.statefulset-test-eureka
  serviceName: eureka-hl  ## Headless Service 无头服务名称
  template:
    metadata:
      labels:
        workload.user.cattle.io/workloadselector: apps.statefulset-test-eureka
    spec:
      containers:    ##容器信息
      - env:
        - name: EUREKA_URL
        - ##相同的服务内可以简写,如下
          value: http://eureka-0.eureka-hl:8001/eureka/,http://eureka-1.eureka-hl:8001/eureka/
        image: 192.168.34.8:85/hhd/eureka:1   ##镜像
        imagePullPolicy: Always    ##拉取策略
        name: eureka
      restartPolicy: Always        ##重启策略
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
  updateStrategy:
    rollingUpdate:
      partition: 0
    type: RollingUpdate

3.部署查看eureka服务

3.1使用命令部署两个服务

kubectl create -f 文件名称.yaml

3.2.查看服务

kubectl get sts eureka -n test


3.3 通过浏览器查看eureka的dashboard页面
3.3.1 首先暴露eureka的NodePort端口

apiVersion: v1
kind: Service
metadata:
  name: eureka-np
  namespace: test
spec:
  clusterIP: 10.108.244.16
  externalTrafficPolicy: Cluster
  ports:
  - name: eureka
    nodePort: 30001
    port: 8001
    protocol: TCP
    targetPort: 8001
  selector:
    workload.user.cattle.io/workloadselector: apps.statefulset-test-eureka
  sessionAffinity: None
  type: NodePort

4.k8s中部署微服务的其他模块

4.1创建服务对应的pom.xml依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>cloud</artifactId>
        <groupId>com.digua</groupId>
        <version>release</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com</groupId>
    <artifactId>order</artifactId>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud-dependencies.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--springboot依赖-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot-dependencies.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
    </dependencies>
    <build>
        <finalName>order</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <includeSystemScope>true</includeSystemScope>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <skipTests>true</skipTests>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

4.2 配置application.yml文件

server:
  port: 8011
spring:
  application:
    name: order-server01
eureka:
  client:
    service-url:
      defaultZone: ${EUREKA_URL:http://127.0.0.1:8001/eureka/}

4.3 构建发布harbor过程忽略,当前发布的是一个无状态服务,所以用到Deployment无状态服务
请注意,因为是同一个命名空间下,可以直接通过Headless的服务名称访问pod

上边2.2部分创建的Headless,通过 eureka-hl 既可以轮询访问下边的pod
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    workload.user.cattle.io/workloadselector: apps.deployment-test-order
  name: order
  namespace: test
spec:
  progressDeadlineSeconds: 600
  replicas: 0
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      workload.user.cattle.io/workloadselector: apps.deployment-test-order
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      labels:
        workload.user.cattle.io/workloadselector: apps.deployment-test-order
    spec:
      containers:
      - env:
        - name: EUREKA_URL
           ##可以通过Headless 的服务名称直接访问
          value: http://eureka-hl:8001/eureka/
        image: 192.168.34.8:85/hhd/order:1
        imagePullPolicy: Always
        name: order
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler

4.4 发布项目,并在eureka的dashboard页面查看

kubectl apply -f 文件名称.yaml

有关k8s发布eureka集群,创建微服务项目的更多相关文章

  1. ruby - 如何在 Ruby 中顺序创建 PI - 2

    出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits

  2. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

    我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

  3. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  4. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  5. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  6. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  7. ruby-on-rails - 无法使用 Rails 3.2 创建插件? - 2

    我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby​​1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在

  8. ruby - 如何使用 RSpec::Core::RakeTask 创建 RSpec Rake 任务? - 2

    如何使用RSpec::Core::RakeTask初始化RSpecRake任务?require'rspec/core/rake_task'RSpec::Core::RakeTask.newdo|t|#whatdoIputinhere?endInitialize函数记录在http://rubydoc.info/github/rspec/rspec-core/RSpec/Core/RakeTask#initialize-instance_method没有很好的记录;它只是说:-(RakeTask)initialize(*args,&task_block)AnewinstanceofRake

  9. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  10. ruby - 为什么 SecureRandom.uuid 创建一个唯一的字符串? - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?

随机推荐