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的健康检查没有加上,后续补充。