kubernetes部署spring cloud註冊中心 Eureka

系統環境java

java JDK 1.8spring

Docker 18.09.6docker

kubernetes 1.16vim

 

 

建立Eureka Server

1.Maven引入相應的jarapi

引入 SpringBoot 作基礎框架,引入 SprigCloud Eureka 依賴來實現 Eureka Server 功能。app

2.spring cloud的配置文件框架

須要在application中設置兩個參數less

vim application.yml
server:
  port: 8888

3.啓動類tcp

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 #參考的這個文檔

相關文章
相關標籤/搜索