K8S部署eureka高可用

新建eureka-service工程

1. 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">
    <parent>
        <artifactId>test-eureka</artifactId>
        <groupId>com.test</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>eureka-server</artifactId>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <docker.image.prefix>pasq</docker.image.prefix>
        <!--docker harbor地址-->
        <docker.repostory>harborIp:harborPort</docker.repostory>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <version>2.2.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
            <version>1.4.7.RELEASE</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <!-- 使用Maven插件直接將應用打包爲一個Docker鏡像 -->
            <plugin>
                <groupId>com.spotify</groupId>
                <!-- 這裏使用新版dockerfile-maven-plugin插件 -->
                <artifactId>dockerfile-maven-plugin</artifactId>
                <version>1.4.10</version>
                <configuration>
                    <!-- Dockerfile目錄指定 -->
                    <dockerfile>Dockerfile</dockerfile>
                    <repository>${docker.repostory}/${docker.image.prefix}/${project.artifactId}</repository>
                    <!-- 生成鏡像tag 如不指定 默認爲latest -->
                    <tag>1.0.0</tag>
                    <buildArgs>
                        <JAR_FILE>./target/${project.build.finalName}.jar</JAR_FILE>
                    </buildArgs>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

2. yml

server:
  port: ${PORT:9007}
eureka:
  instance:
    hostname: ${EUREKA_INSTANCE_HOSTNAME:${spring.application.name}}
    appname: ${spring.application.name}
  client:
    registerWithEureka: ${BOOL_REGISTER:true}
    fetchRegistry: ${BOOL_FETCH:true}
    serviceUrl:
      defaultZone: ${EUREKA_SERVER:http://${eureka.instance.hostname}:${server.port}/eureka/}
  server:
    enable-self-preservation: ${SELF_PRESERVATION:false}
spring:
  application:
    name: eureka-server-test

3. Dockerfile【與工程src目錄同級】

# 基礎鏡像
FROM openjdk:8-jdk-alpine
# 作者(可選)
MAINTAINER duhyper
# 刪除無用組件 優化容器體積(可選)
RUN rm -rf /var/lib/apt/lists/*
# 創建jar包存放目錄
RUN mkdir -p /usr/local/duhyper
# 獲取pom文件中build參數
ARG JAR_FILE
# copy當前工程jar包至容器內
COPY ${JAR_FILE} /usr/local/duhyper/app.jar
# 運行jar包
ENTRYPOINT ["java","-jar","/usr/local/duhyper/app.jar"]

4. 創建啓動類

package com.test.eureka;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class AppMain {
    public static void main(String[] args) {
        SpringApplication.run(AppMain.class, args);
    }
}

創建成功後打包編譯鏡像並推送至docker harbor

創建K8S配置文件eureka-server.yml

# eureka-statefulset.yaml
---
apiVersion: v1
kind: Service
metadata:
  name: eureka-service-test
  labels:
    app: eureka-service-test
spec:
  ports:
    - port: 9007                                    # service對外提供服務的端口
      targetPort: 9007 
      nodePort: 9007
      name: eureka-service-test
  # clusterIP: None
  type: NodePort
  selector:
    app: eureka-service-test
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: eureka-service-test
spec:
  serviceName: "eureka-service-test"
  replicas: 3
  selector:
    matchLabels:
      app: eureka-service-test
  template:
    metadata:
      labels:
        app: eureka-service-test
    spec:
      containers:
        - name: eureka-service-test
          image: harborIp:harborPort/duhyper/eureka-server:1.0.0
          ports:
            - containerPort: 9007
          resources:
            limits:
              # jvm會自動發現該限制
              memory: 512Mi
          env:
            - name: MY_POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: JAVA_OPTS
              value: -XX:+UnlockExperimentalVMOptions
                -XX:+UseCGroupMemoryLimitForHeap
                -XX:MaxRAMFraction=2
                -XX:CICompilerCount=8
                -XX:ActiveProcessorCount=8
                -XX:+UseG1GC
                -XX:+AggressiveOpts
                -XX:+UseFastAccessorMethods
                -XX:+UseStringDeduplication
                -XX:+UseCompressedOops
                -XX:+OptimizeStringConcat
            - name: EUREKA_SERVER
              value: "http://eureka-service-test-0.eureka-service-test:9007/eureka/,http://eureka-service-test-1.eureka-service-test:9007/eureka/,http://eureka-service-test-2.eureka-service-test:9007/eureka/"
            - name: EUREKA_INSTANCE_HOSTNAME
              value: ${MY_POD_NAME}.eureka
  podManagementPolicy: "Parallel"

運行kubectl create -f eureka-server.yml, 然後訪問k8s任意節點ip:9007訪問eureka如下:
eureka

eureka客戶端配置

eureka:
  instance:
    // k8s部署服務提供方 --與本地環境通信時使用這個配置【配置爲k8s任意節點ip】
    ip-address: 192.168.1.235
    // k8s部署服務提供方 --k8s集羣內部通信時使用這個配置
    # instance-id: ${spring.cloud.client.ip-address}:${server.port}
    // 本地部署 --使用這個配置
    # instance-id: ${spring.cloud.client.ip-address}:${server.port}
    prefer-ip-address: true
  client:
    registerWithEureka: ${BOOL_REGISTER:true}
    fetchRegistry: ${BOOL_FETCH:true}
    serviceUrl:
      // k8s集羣部署 自定義namespace使用這個配置 下面namespace替換爲自己定義的namespace
#      defaultZone: http://eureka-service-test-0.eureka-service-test.namespace:9007/eureka/,http://eureka-service-test-1.eureka-service-test.namespace:9007/eureka/,http://eureka-service-test-2.eureka-service-test.namespace:9007/eureka/,
      // k8s集羣部署 未定義/默認namespace使用這個配置
#      defaultZone: http://eureka-service-test-0.eureka-service-test:9007/eureka/,http://eureka-service-test-1.eureka-service-test:9007/eureka/,http://eureka-service-test-2.eureka-service-test:9007/eureka/,
      // 本地部署使用這個配置 【這裏輸入k8s全部節點,逗號分割】
      defaultZone: http://192.168.1.237:9007/eureka/,
spring:
  application:
    name: eureka-data

server:
  port: 8762
發佈了13 篇原創文章 · 獲贊 25 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章