Kubernetes部署高可用Eureka集群

2,640 阅读2分钟

Kubernetes部署高可用Eureka集群

本地环境

三台centos7虚拟机(主节点为192.168.1.36,从节点为192.168.1.200,192.168.1.203)

docker version :18.06.3-ce

kubernetes Version:v1.13

Eureka配置文件

server:
  tomcat:
    # URI编码
    uri-encoding: "utf-8"
  port: 8761
spring:
  application:
    # 服务名
    name: ${EUREKA_APPLICATION_NAME:se-eureka-server}
  jackson:
    # 属性为null不参加序列化
    default-property-inclusion: "non_null"
    # 使用GMT时间
    time-zone: "GMT"
eureka:
  instance:
    hostname: ${EUREKA_HOST_NAME:peer1} #服务主机名
    appname: ${spring.application.name} #服务名称
  client:
    register-with-eureka: ${BOOL_REGISTER:true} #是否把服务中心当作eureka client注册,默认为true
    fetch-registry: ${BOOL_FETCH:true} #是否拉取eureka server的注册信息,默认为true
    service-url:
      defaultZone: ${EUREKA_URL_LIST:http://peer1:8761/eureka} #指定服务中心eureka-server的地址
  server:
    enable-self-preservation: ${SELF_PRESERVATION:true} #是否开启自我保护模式,默认为true

将Eureka jar包打包为docker 镜像

首先,将jar包保存到虚拟机中,本例中保存到cd root/se/se-eureka/中

[root@host1 se-eureka]# ls
Dockerfile  init.sh  se-eureka-server-2.0.0.jar  se-eureka-service.yaml  se-eureka-statefulset.yaml
#编写Dockerfile文件
[root@host1 se-eureka]# cat Dockerfile 
FROM java:8
#设置端口
EXPOSE 8761
ADD ./se-eureka-server-2.0.0.jar eureka.jar
ADD init.sh /init.sh
RUN rm /bin/sh && ln -s /bin/bash /bin/sh
ENTRYPOINT ["/bin/bash","-c","source /init.sh"]
[root@host1 se-eureka]# cat Dockerfile 
FROM java:8
#设置端口
EXPOSE 8761
ADD ./se-eureka-server-2.0.0.jar eureka.jar
ADD init.sh /init.sh
RUN rm /bin/sh && ln -s /bin/bash /bin/sh
ENTRYPOINT ["/bin/bash","-c","source /init.sh"]
[root@host1 se-eureka]# cat init.sh 
#! /usr/bin/env bash
postFix="svc.cluster.local"
EUREKA_HOST_NAME="$MY_POD_NAME.$MY_IN_SERVICE_NAME.$MY_POD_NAMESPACE.$postFix"
export EUREKA_HOST_NAME=$EUREKA_HOST_NAME
BOOL_REGISTER="true"
BOOL_FETCH="true"
if [ $EUREKA_REPLICAS = 1 ]; then
	echo "the replicas of eureka is 1"
	BOOL_REGISTER="false"
	BOOL_FETCH="false"
	EUREKA_URL_LIST="http://$EUREKA_HOST_NAME:8761/eureka/,"
	echo "EUREKA_URL_LIST is $EUREKA_URL_LIST"
else 
	echo "the replicas of if eureka is $EUREKA_REPLICAS"
	BOOL_REGISTER="true"
	BOOL_FETCH="true"
	for ((i=0 ; i<$EUREKA_REPLICAS ; i++))
	do
	  temp="http://$EUREKA_APPLICATION_NAME-$i.$MY_IN_SERVICE_NAME.$MY_POD_NAMESPACE.$postFix:8761/eureka/,"
	  EUREKA_URL_LIST="$EUREKA_URL_LIST$temp"
	  echo "$EUREKA_URL_LIST"
	done
fi
EUREKA_URL_LIST=${EUREKA_URL_LIST%?}
export EUREKA_URL_LIST=$EUREKA_URL_LIST
export BOOL_FETCH=$BOOL_FETCH
export BOOL_REGISTER=$BOOL_REGISTER
echo "start java - jar"
java -jar eureka.jar

将Eureka打包为镜像

docker build -t 192.168.1.36:5000/se-eureka:v3 .
#上传到docker registry
docker push 192.168.1.36:5000/se-eureka:v3

docker私人仓库的搭建可以参考 www.jianshu.com/p/337a40001…

编写YAML文件

[root@host1 se-eureka]# cat se-eureka-statefulset.yaml 
apiVersion: v1
kind: Service
metadata:
  name: se-eureka-server
  labels:
    app: se-eureka-server
spec:
  clusterIP: None
  selector:
    app: se-eureka-server
  ports:
    - port: 8761
      protocol: TCP
      targetPort: 8761
  type: ClusterIP

---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: se-eureka
spec:
  selector:
    matchLabels:
      app: se-eureka-server
  serviceName: "se-eureka-server"
  replicas: 3
  template:
    metadata:
      labels:
        app: se-eureka-server
    spec:
      terminationGracePeriodSeconds: 10
      containers:
        - name: eureka-container
          image: 192.168.1.36:5000/se-eureka:v4
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 8761
              protocol: TCP
          env:
            - name: MY_NODE_NAME
              valueFrom:
                fieldRef:
                  fieldPath: spec.nodeName
            - name: MY_POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: MY_POD_NAMESPACE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
            - name: MY_POD_IP
              valueFrom:
                fieldRef:
                  fieldPath: status.podIP
            - name: MY_IN_SERVICE_NAME
              value: se-eureka-server
            - name: EUREKA_APPLICATION_NAME
              value: "eureka"
            - name: EUREKA_REPLICAS
              value: "3"

在后续测试中,我们需要向外暴露端口,使得在Kubernetes集群外能够访问到Eureka,所以我们使用Service NodePort的方式暴露端口。

[root@host1 se-eureka]# cat se-eureka-service.yaml 
apiVersion: v1
kind: Service
metadata:
  name: se-eureka
spec:
  selector:
    app: se-eureka-server
  type: NodePort
  ports:
    - port: 8761
      targetPort: 8761
      nodePort: 30000
      protocol: TCP
kubectl create -f se-eureka-statefulset.yaml 
kubectl create -f se-eureka-service.yaml 
[root@host1 se-eureka]# kubectl get pods
NAME                    READY   STATUS    RESTARTS   AGE
se-eureka-0             1/1     Running   0          50m
se-eureka-1             1/1     Running   0          50m
se-eureka-2             1/1     Running   0          50m

等待pods running后,我们访问 http://192.168.1.36:30000/

关于k8s的健康检查没有加上,后续补充。

参考: blog.csdn.net/gujian2517/…

blog.csdn.net/michael_hm/…