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 | apiVersion: apps/v1 |
创建并查看
1 | [root@k8s-master eureka]# kubectl apply -f StatefulSet.yaml |
1.5. 创建service
vim eureka-service.yaml
1 | apiVersion: v1 |
创建并查看
1 | [root@k8s-master eureka]# kubectl apply -f service.yaml |
1.6. 创建ingress
vim eureka-ingress.yaml
1 | --- |
创建并查看
1 | [root@k8s-master eureka]# kubectl apply -f ingress.yaml |
1.7. 访问
先做域名解析在访问查看集群:http://域名
参考: