下线服务:

curl -X PUT "http://ip:port/eureka/apps/{application}/{instance}/status?value=OUT_OF_SERVICE"
curl -X PUT "http://ip:port/eureka/apps/{USER-WEB-SERVICE}/{172.17.16.100:9461}/status?value=OUT_OF_SERVICE"

image.png

上线服务:

curl -X PUT "http://ip:port/eureka/apps/{application}/{instance}/status?value=UP"
curl -X PUT "http://ip:port/eureka/apps/{USER-WEB-SERVICE}/{172.17.16.100:9461}/status?value=UP"

删除服务:貌似不管用

curl -X DELETE http://ip:port/eureka/apps/{USER-WEB-SERVICE}/{172.17.16.100:9461}

在k8s中可以使用如下两种方法来下线服务:

blog.csdn.net/qq_31960623/article/details/119865937
cnblogs.com/fengjian2016/p/15205477.html
jishuin.proginn.com/p/763bfbd676e9


通过请求接口来让服务主动下线:

lifecycle:
  preStop:
    httpGet:
      path: /unhealthy
      port: http

或者执行脚本来让服务主动下线:

lifecycle:
  preStop:
    exec:
      command: ['/bin/sh','-c','/tmp/preStop.sh']

preStop.sh:这是nacos的eureka同理。

#!/bin/sh

# shell脚本作用
# 在更新pod时先执行这个脚本,把pod应用从nacos中下线,然后再关闭pod

#echo "输出必要的环境变量"
#echo "${NACOS_SERVER_ADDR}"
#echo "${PODNAME}"
#echo "${PODIP}"
#echo "${NACOS_NAMESPACE}"

result=$(curl -X PUT "http://${NACOS_SERVER_ADDR}/nacos/v1/ns/instance?serviceName=${PODNAME}&clusterName=DEFAULT&groupName=DEFAULT_GROUP&ip=${PODIP}&port=8093&enabled=false&namespaceId=${NACOS_NAMESPACE}")

echo "输出curl执行结果result:${result}"

if [ ${result} == "ok" ]; then
  echo "执行成功"
  sleep 45
  exit 0
else
  echo "执行失败"
  exit 1
fi

如何在Pod中获取PodIP:

https://kubernetes.io/zh-cn/docs/tasks/inject-data-application/environment-variable-expose-pod-information/


k8s上部署高可用eureka服务


eureka-statefulset.yaml:

---
apiVersion: v1
kind: Service
metadata:
  name: eureka
  labels:
    app: eureka
spec:
  ports:
    - port: 8761
      name: eureka
  clusterIP: None
  selector:
    app: eureka
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: eureka
spec:
  serviceName: "eureka"
  replicas: 3
  selector:
    matchLabels:
      app: eureka
  template:
    metadata:
      labels:
        app: eureka
    spec:
      containers:
        - name: eureka
          image: freemanliu/eureka:v1.1.1
          ports:
            - containerPort: 8761
          resources:
            limits:
              # jvm会自动发现该限制
              memory: 1Gi
          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-0.eureka:8761/eureka/,http://eureka-1.eureka:8761/eureka/,http://eureka-2.eureka:8761/eureka/"
            - name: EUREKA_INSTANCE_HOSTNAME
              value: ${MY_POD_NAME}.eureka
  podManagementPolicy: "Parallel"

参考地址:

gitee.com/bill_liu_work/eureka/tree/master