构建高可用eureka镜像

  1. 应用配置
  2. Dockfile
  3. 服务编排

服务注册和发现组件是微服务架构中很重要的一个组件,在生产环境中要避免产生单点故障。一定要跑多个互为备份的实例。本文讲述如何构建一个在k8s环境中可自由扩展实例的eureka镜像。

应用配置

如何创建spring-cloudeureka项目就不多说了,我只列一下application.yaml中的关键配置。

server:
  port: 8761
management:
  server:
    port: 8081
  endpoints:
    web:
      exposure:
        include: '*'
  endpoint:
    health:
      show-details: always
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

Dockfile

Dockerfile是打包的关键,采用openjdk:8-jre-alpine作为基础镜像。

FROM openjdk:8-jre-alpine
MAINTAINER wujiming <wzslw@163.com>

#  安装curl 和 bash
RUN apk add --update \ 
    curl bash \
    && rm -rf /var/cache/apk/*

# 解决容器内时区问题
ENV TZ=Asia/Shanghai

COPY target/*.jar app.jar
COPY entrypoint.sh /entrypoint.sh  
RUN chmod +x /entrypoint.sh
RUN echo $(date) > /image_built_at

ENTRYPOINT ["/entrypoint.sh"]
CMD ["java","-jar","/app.jar", "-Djava.security.egd=file:/dev/./urandom"]

EXPOSE 8081 8761
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

entrypoint.sh

#!/usr/bin/env bash
set -e

#MY_POD_NAME="mypodname"
#MY_IN_SERVICE_NAME="myinservicename"
#MY_POD_NAMESPACE="mypodnamespace"
#EUREKA_REPLICAS=3

EUREKA_HOST_NAME="$MY_POD_NAME.$MY_IN_SERVICE_NAME.$MY_POD_NAMESPACE"
export EUREKA_HOST_NAME=$EUREKA_HOST_NAME

BOOL_REGISTER="true"
BOOL_FETCH="true"

EUREKA_REPLICAS=${EUREKA_REPLICAS:-"1"} # 默认副本数为1

if [ $EUREKA_REPLICAS = 1 ];then
  echo "Eureka副本数为1."
  BOOL_REGISTER="false"
  BOOL_FETCH="false"
  EUREKA_URL_LIST="http://localhost:8761/eureka/,"
  echo "EUREKA_URL_LIST is $EUREKA_URL_LIST"
else
  echo "Eureka副本数为 $EUREKA_REPLICAS"
  BOOL_REGISTER="true"
    BOOL_FETCH="true"
    for ((i=0 ; i<$EUREKA_REPLICAS ; i++))
    do
      temp="http://$MY_POD_NAME-$i.$MY_IN_SERVICE_NAME.$MY_POD_NAMESPACE:8761/eureka/,"
      EUREKA_URL_LIST="$EUREKA_URL_LIST$temp"
    done
fi

EUREKA_URL_LIST=${EUREKA_URL_LIST%?}
echo "EUREKA_URL_LIST is $EUREKA_URL_LIST"

export EUREKA_CLIENT_SERVICEURL_DEFAULTZONE=$EUREKA_URL_LIST
export EUREKA_CLIENT_REGISTERWITHEUREKA=$BOOL_REGISTER
export EUREKA_CLIENT_FETCHREGISTRY=$BOOL_FETCH

exec "$@"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

Dockerfileentrypoint.sh放到项目根目录下,应用程序打包后,构建docker镜像就可以了。

服务编排

上面打包好的镜像需要部署到k8s中,。

apiVersion: v1
kind: Service
metadata:
  name: eureka-server
  labels:
    app: eureka
spec:
  ports:
    - port: 8761
      name: eureka
  clusterIP: None
  selector:
    app: eureka
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: eureka
spec:
  podManagementPolicy: Parallel # 并行启动
  replicas: 2 # 副本数
  selector:
    matchLabels:
      app: eureka
  serviceName: eureka-server
  template:
    metadata:
      labels:
        app: eureka
    spec:
      containers:
      - env:
        - name: EUREKA_REPLICAS
          value: "2" #跟副本数保持一致
        - name: MY_IN_SERVICE_NAME
          value: eureka-server #跟上面定义的Headless Service名字保持一致
        - name: MY_POD_NAME
          valueFrom:
            fieldRef:
              apiVersion: v1
              fieldPath: metadata.name
        - name: MY_POD_NAMESPACE
          valueFrom:
            fieldRef:
              apiVersion: v1
              fieldPath: metadata.namespace
        image: eureka-server # 和你自己的镜像名字保持一致
        livenessProbe:
          failureThreshold: 3
          httpGet:
            path: /actuator/health
            port: 8081 # 与应用配置中的management.server.port保持一致
            scheme: HTTP
          initialDelaySeconds: 10
          periodSeconds: 2
          successThreshold: 1
          timeoutSeconds: 2
        name: eureka-server
        ports:
        - containerPort: 8761
          name: tcp8761
          protocol: TCP
        readinessProbe:
          failureThreshold: 3
          httpGet:
            path: /actuator/health
            port: 8081 # 与应用配置中的management.server.port保持一致
            scheme: HTTP
          initialDelaySeconds: 10
          periodSeconds: 2
          successThreshold: 2
          timeoutSeconds: 2
        resources:
          limits:
            memory: 1Gi
          requests:
            memory: 512Mi
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77

大功告成。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 wzslw@163.com

文章标题:构建高可用eureka镜像

文章字数:639

本文作者:武继明

发布时间:2020-08-17, 13:46:19

最后更新:2020-08-21, 06:30:57

原始链接:https://www.omingo.com/2020/08/17/构建高可用eureka镜像/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

Gitalk 加载中 ...

目录
  1. 应用配置
  2. Dockfile
  3. 服务编排
×

喜欢就点赞,疼爱就打赏