k8s部署eureka集群

1. k8s部署eureka集群

主要是用到了StatefulSet和headless service这两个k8s对象

1.1. StatefulSet

StatefulSet是为了解决有状态服务的问题(对应Deployments和ReplicaSets是为无状态服务而设计),其应用场景包括:

1.稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现;

2.稳定的网络标志,即Pod重新调度后其PodName和HostName不变,基于Headless Service(即没有Cluster IP的Service)来实现;

3.有序部署,有序扩展,即Pod是有顺序的,在部署或者扩展的时候要依据定义的顺序依次依次进行(即从0到N-1,在下一个Pod运行之前所有之前的Pod必须都是Running和Ready状态),基于init containers来实现;

4.有序收缩,有序删除(即从N-1到0);

StatefulSet中每个Pod的DNS格式为:

1
statefulSetName-{0..N-1}.serviceName.namespace.svc.cluster.local

serviceName为Headless Service的名字
0..N-1为Pod所在的序号,从0开始到N-1
statefulSetName为StatefulSet的名字
namespace为服务所在的namespace,Headless Service和StatefulSet必须在相同的namespace
cluster.local为Cluster Domain

1.2. Headless Service

Headless Service 和普通service的一个显著的区别是,Headless Service的对应的每一个Endpoints,即每一个Pod,都会有对应的DNS域名
例如:我们可以用过这种域名来访问某个具体的pod:

1
statefulSetName-0.serviceName.namespace.svc.cluster.local

在实际使用中,将service的clusterIP设置成None,就表明这个service是一个Headless Service。

1.3. StatefulSet和Headless Service的结合

通过 StatefulSet,我们得到了一些列pod,每个pod的name为statefulSetName-{0..N-1}, 加入我们创建了一个名称叫eureka的StatefulSet,并且设置replicas =3,那么部署到k8s后,k8s会为我们生成三个名称依次为eureka-0,eureka-1,eureka-2的pod。
通过Headless Service,我们可以通过pod名称来访问某个pod,

例如,我们在namespace=test的命名空间下创建了一个名称为register-server的service,并且关联了之前StatefulSet创建的pod,那么我们可以在集群内任意地方通过eureka-0.register-server.test.svc.cluster.local这个域名访问到eureka-0这个pod。

1.3.1. 搭建:

有了前面的基础,现在部署eureka集群的方式就逐渐清晰了。

首先明确部署eureka的关键点:需要让每个eureka注册到另外的eureka上。
也就是eureka.client.serviceUrl.defaultZone这个配置,是一组eureka的地址。
通过StatefulSet,我们可以明确知道生成的每个eureka的名称,
通过Headless Service,我们又可以访问到每个eureka,所以eureka.client.serviceUrl.defaultZone的值就是

1
"http://eureka-0.register-server:8000/eureka/,http://eureka-1.register-server:8000/eureka/,http://eureka-2.register-server:8000/eureka/"

由于这三个pod在同一个命名空间内,可以省略.namespace.svc.cluster.local

1.4. 创建StatefulSet.yaml

vim eureka-StatefulSet.yaml

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
apiVersion: apps/v1
kind: StatefulSet
metadata:
namespace: wise
name: register-server
labels:
service: register-server
spec:
replicas: 3
serviceName: register-server
selector:
matchLabels:
service: register-server
template:
metadata:
labels:
service: register-server
annotations:
service: register-server
spec:
containers:
- name: register-server
image: codewjy/eureka:0.1.0
imagePullPolicy: Always
env:
- name: MY_POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
ports:
- name: http
containerPort: 8000
protocol: TCP
readinessProbe:
httpGet:
path: /actuator/health
port: 8001
scheme: HTTP
failureThreshold: 3
initialDelaySeconds: 60
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 10
resources:
limits:
# cpu: 100m
memory: 1.7Gi
requests:
# cpu: 100m
memory: 1.2Gi
volumeMounts:
- mountPath: /Charts
name: data
volumes:
- name: data
podManagementPolicy: "Parallel"

创建并查看

1
2
3
4
5
6
7
[root@k8s-master eureka]# kubectl apply -f StatefulSet.yaml 
statefulset.apps/register-server created

[root@k8s-master eureka]# kubectl get pods -n wise|grep register-server
register-server-0 1/1 Running 0 29m
register-server-1 1/1 Running 0 29m
register-server-2 1/1 Running 0 29m

1.5. 创建service

vim eureka-service.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
apiVersion: v1
kind: Service
metadata:
namespace: wise
name: register-server
labels:
service: register-server
spec:
clusterIP: None
type: ClusterIP
ports:
- port: 8000
targetPort: http
protocol: TCP
name: http
selector:
service: register-server

创建并查看

1
2
3
4
5
6
7
8
9
10
[root@k8s-master eureka]# kubectl apply -f service.yaml 
service/register-server created

[root@k8s-master eureka]# kubectl get pods -n wise|grep register-server
register-server-0 1/1 Running 0 29m
register-server-1 1/1 Running 0 29m
register-server-2 1/1 Running 0 29m

[root@k8s-master eureka]# kubectl get svc -n wise|grep register-server
register-server ClusterIP None <none> 8000/TCP 30m

1.6. 创建ingress

vim eureka-ingress.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
name: register-server
namespace: wise
annotations:
kubernetes.io/ingress.class: traefik-v2.3
spec:
rules:
- host: eureka.heyonggs.com
http:
paths:
- backend:
serviceName: register-server
servicePort: 8000

创建并查看

1
2
3
4
5
[root@k8s-master eureka]# kubectl apply -f ingress.yaml 
ingress.extensions/register-server created

[root@k8s-master eureka]# kubectl get ingress -n wise|grep register-server
register-server <none> eureka.heyonggs.com 80 21m

1.7. 访问

先做域名解析在访问查看集群:http://域名

参考:

https://www.jianshu.com/p/a3829851a97d

-------------本文结束感谢您的阅读-------------