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