zoukankan      html  css  js  c++  java
  • kubernetes部署spring cloud注册中心 Eureka

    系统环境

    java JDK 1.8

    Docker 18.09.6

    kubernetes 1.16

    创建Eureka Server

    1.Maven引入相应的jar

    引入 SpringBoot 做基础框架,引入 SprigCloud Eureka 依赖来实现 Eureka Server 功能。

    2.spring cloud的配置文件

    需要在application中设置两个参数

    vim application.yml
    server:
      port: 8888

    3.启动类

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
     
    @EnableEurekaServer
    @SpringBootApplication
    public class Application {
     
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
     
    }

    4.mvn编译

    构建Eureka Docker镜像

    1.准备dockerfile

    创建构建 Docker 镜像需要的 Dockerfile 文件,将 Maven 编译的 JAR 复制到镜像内部,然后设置两个变量,分别是:

    • JAVA_OPTS:Java JVM 启动参数变量,这里需要在这里加一个时区参数。
    • APP_OPTS:Spring 容器启动参数变量,方便后续操作时能通过此变量配置 Spring 参数

    Dockerfile内容如下:

    FROM java:8-jdk-alpine
    LABEL maintainer  lizhenliang/www.ctnrs.com
    RUN apk add -U tzdata
    COPY ./target/eureka-service.jar ./
    
    ENV JAVA_OPTS="-Duser.timezone=Asia/Shanghai"
    EXPOSE 8888
    ENV APP_OPTS=""
    ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS  -jar /eureka-service.jar  $APP_OPTS" ]

    2.构建docker镜像

    docker build -t  10.255.20.6/kubernetes/eureka:latest

    kubernetes部署Eureka Server

    创建 Eureka 部署文件,用于在 Kubernetes 中部署 Eureka,这里选择用 StatefulSet (有状态集)方式来部署,这样能保证它 Eureka Pod 名是有序的,如果部署为 Deployment,那么得部署三个 Deployment 对象,比较繁琐。并且 StatefulSet 支持 Service Headless 方式创建 Service 来对内部服务访问,如果是 CluserIP 方式创建 Service 会分一个虚拟 IP 给该 Service,那么服务通过 Service 访问 Pod 每次都需要经过 Kube-proxy 代理流量,这样会增加与注册中心的通信造成一定性能损耗。Headless 方式部署的 Service 不会分配虚拟 IP,而是用轮询的访问,每次都直接与 Pod 的 IP 进行通信。

    为什么使用headless:

        因为给Pod分配一个域,让其他Pod可以通过dnsName访问到这组Eureka的Pod,不懂的话看看另一篇随笔:statefulSet的学习

    1.创建eureka.yml

    ---
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: eureka
      namespace: ms
    spec:
      rules:
        - host: eureka.ctnrs.com
          http:
            paths:
            - path: /
              backend:
                serviceName: eureka
                servicePort: 8888
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: eureka
      namespace: ms
    spec:
      clusterIP: None
      ports:
        - name: eureka
          port: 8888
      selector:
        project: ms
        app: eureka
    ---
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: eureka
      namespace: ms
    spec:
      serviceName: eureka
      replicas: 3
      selector:
        matchLabels:
          project: ms
          app: eureka
      template:
        metadata:
          labels:
            project: ms
            app: eureka
        spec:
          terminationGracePeriodSeconds: 10    #当删除Pod时,等待时间
          imagePullSecrets:
          - name: registry-pull-secret
          containers:
            - name: eureka
              image: 10.255.20.6/kubernetes/eureka:latest
              ports:
                - protocol: TCP
                  containerPort: 8888
              env:
                - name: APP_NAME
                  value: "eureka"
                - name: POD_NAME
                  valueFrom:
                    fieldRef:
                      fieldPath: metadata.name
                - name: APP_OPTS
                  value: "
                         --eureka.instance.hostname=${POD_NAME}.${APP_NAME}
                         --registerWithEureka=true
                         --fetchRegistry=true
                         --eureka.instance.preferIpAddress=false
                         --eureka.client.serviceUrl.defaultZone=http://eureka-0.${APP_NAME}:8888/eureka/,http://eureka-1.${APP_NAME}:8888/eureka/,http://eureka-2.${APP_NAME}:8888/eureka/
                         "
              resources:
                limits:
                  cpu: 1
                  memory: 1024Mi
                requests:
                  cpu: 0.5
                  memory: 125Mi
              readinessProbe:              #就绪探针
                tcpSocket:
                  port: 8888
                initialDelaySeconds: 20    #延迟加载时间
                periodSeconds: 5           #重试时间间隔
                timeoutSeconds: 10         #超时时间设置
                failureThreshold: 5        #探测失败的重试次数
              livenessProbe:               #存活探针
                tcpSocket:
                  port: 8888
                initialDelaySeconds: 60    #延迟加载时间
                periodSeconds: 5           #重试时间间隔
                timeoutSeconds: 5          #超时时间设置
                failureThreshold: 3        #探测失败的重试次数

    env参数说明:

    APP_NAME: 和服务名称一致,将服务名称传入容器环境中。
    POD_NAME: Pod名称,将 Pod 名称传入容器环境中。
    APP_OPTS: Dockerfile 中定义的变量,用于设置 Spring 启动参数,这里主要设置此值与 APP_NAME 和 POD_NAME 两值配合使用
    其他参数说明:

    • resources: 对 Pod 使用计算资源的限制,最好两个值设置成一致,Kubernetes 中会对 Pod 设置 QoS 等级,跟这两个值的设置挂钩,limits 与 request 值一致时 Qos 等级最高,当资源不足时候 QoS 等级低的最先被杀死,等级高的一般不会受太大影响。
    • readinessProbe: 就绪探针,Pod 启动时只有就绪探针探测成功后才对外提供访问,用它可用避免 Pod 启动而内部程序没有启动的情况下就允许外部流量流入这种情况。
    • livenessProbe: 存活探针,定期检测 Docker 内部程序是否存活。
    • spec.podManagementPolicy: pod的启动顺序策略
    • OrderedReady: 顺序启停 Pod,默认设置。
    • Parallel: 并行启停 Pod,而不遵循一个 Pod 启动后再启动另一个这种规则

    2.部署Eureka Server到kubernetes

    kubectl apply -f eureka.yaml
    #如果发现部署错了,可以执行kubectl delete -f erueka.yaml,删除这个yaml部署的所有资源

    3.访问Eurek UI

    由于ingress配置了域名,先配置hosts,把域名解析到ingress-controller的Pod所在的NodeIP

     可以随时刷新,看页面最下面的IP 是rr方式轮训到各个IP提供服务的

     4.spring cloud服务注册进eureka

    cat application.yaml
    
    eureka:
      instance:
        prefer-ip-address: true  #以IP注册进eureka,不以ID注册
      client:
        register-with-eureka: true #注册到eureka为true
        fetch-registry: true
        service-url:
          defaultZone: http://eureka-0.eureka.ms.svc.cluster.local:8888/eureka,http://eureka-1.eureka.ms.svc.cluster.local:8888/eureka,http://eureka-0.eureka.ms.svc.cluster.local:8888/eureka

    Pod的dns记录怎么组成的

    <Pod Name>.<service name>.<namespace name>.svc.cluster.local

    Pod的Name怎么组成的

    statefulSet控制器的Name + 序号 

    https://blog.csdn.net/qq_32641153/article/details/99700281 #参考的这个文档

  • 相关阅读:
    Go语言string,int,int64 ,float转换
    Go 时间相关
    静态顺序表操作
    汇编基础
    C语言字节对齐
    BugkuCTF-游戏过关
    数组越界问题分析
    选择排序(Java)
    杨辉三角(C语言)
    二分查找(Java)
  • 原文地址:https://www.cnblogs.com/chadiandianwenrou/p/11928080.html
Copyright © 2011-2022 走看看