Spring Cloud Kubernetes 中文文檔

本參考指南介紹瞭如何使用Spring Cloud Kubernetes。

1.爲什麼需要Spring Cloud Kubernetes?
Spring Cloud Kubernetes提供了使用Kubernetes本機服務的Spring Cloud通用接口實現。該存儲庫中提供的項目的主要目的是促進Kubernetes中運行的Spring Cloud和Spring Boot應用程序的集成。

2.首發
入門程序是方便的依賴項描述符,您可以在應用程序中包含它們。包括一個啓動器以獲取功能集的依賴關係和Spring Boot自動配置。

起動機 特徵

org.springframework.cloud
spring-cloud-starter-kubernetes

將服務名稱解析爲Kubernetes Services的Discovery Client實現。

org.springframework.cloud spring-cloud-starter-kubernetes-config 從Kubernetes ConfigMap和Secrets加載應用程序屬性 。 ConfigMap或Secret更改時,重新加載應用程序屬性。 org.springframework.cloud spring-cloud-starter-kubernetes-ribbon 從Kubernetes端點獲取具有服務器列表的功能區客戶端負載均衡器。 org.springframework.cloud spring-cloud-starter-kubernetes-all Spring Cloud Kubernetes的所有功能。
  1. Kubernetes的DiscoveryClient
    該項目提供了Kubernetes的Discovery Client 的實現。通過此客戶端,您可以按名稱查詢Kubernetes端點(請參閱服務)。Kubernetes API服務器通常將服務公開爲代表http和https尋址的端點的集合,並且客戶端可以從作爲Pod運行的Spring Boot應用程序訪問該服務。Spring Cloud Kubernetes Ribbon項目還使用此發現功能來獲取爲要進行負載平衡的應用程序定義的端點列表。

您可以通過在項目內部添加以下依賴項來免費獲得這些東西:

org.springframework.cloud spring-cloud-starter-kubernetes 要啓用的加載DiscoveryClient,請添加@EnableDiscoveryClient到相應的配置或應用程序類中,如以下示例所示:

@SpringBootApplication
@EnableDiscoveryClient
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
然後,您可以簡單地通過自動裝配將客戶端注入代碼中,如以下示例所示:

@Autowired
private DiscoveryClient discoveryClient;
您可以DiscoveryClient通過在中設置以下屬性來選擇從所有名稱空間啓用application.properties:

spring.cloud.kubernetes.discovery.all-namespaces=true
如果出於任何原因需要禁用DiscoveryClient,則可以在中設置以下屬性application.properties:

spring.cloud.kubernetes.discovery.enabled=false
某些Spring Cloud組件使用DiscoveryClient來獲取有關本地服務實例的信息。爲此,您需要將Kubernetes服務名稱與該spring.application.name屬性對齊。

spring.application.name 對於在Kubernetes中爲該應用程序註冊的名稱無效
Spring Cloud Kubernetes還可以監視Kubernetes服務目錄中的更改並相應地更新 DiscoveryClient實現。爲了啓用此功能,您需要@EnableScheduling在應用程序中添加 配置類。

  1. Kubernetes本機服務發現
    Kubernetes本身具有(服務器端)服務發現的能力(請參閱:kubernetes.io/docs/concepts/services-networking/service/#discovering-services)。使用本機kubernetes服務發現可確保與其他工具的兼容性,例如Istio(istio.io),該服務網具有負載平衡,功能區,斷路器,故障轉移等功能。

然後,調用者服務僅需要引用特定Kubernetes羣集中可解析的名稱。一個簡單的實現可以使用一個彈簧RestTemplate來引用一個完全限定域名(FQDN),例如{service-name}.{namespace}.svc.{cluster}.local:{service-port}。

此外,您可以將Hystrix用於:

調用方的斷路器實現,方法是在Spring Boot應用程序類中添加註釋 @EnableCircuitBreaker

後備功能,通過使用註釋相應的方法 @HystrixCommand(fallbackMethod=

  1. Kubernetes PropertySource實現
    配置Spring Boot應用程序的最常見方法是創建一個application.propertiesor或application.yamlor application-profile.properties或application-profile.yaml文件,其中包含爲應用程序或Spring Boot啓動器提供自定義值的鍵值對。您可以通過指定系統屬性或環境變量來覆蓋這些屬性。

5.1。用一個ConfigMap PropertySource
Kubernetes提供了一個資源ConfigMap,用於以鍵值對或嵌入式application.properties或application.yaml文件的形式將參數外部化以傳遞給您的應用程序。在春季雲Kubernetes配置項目,使Kubernetes ConfigMap在應用程序引導可用實例和觸發器時觀察到的檢測到更改熱重裝豆類或Spring上下文的ConfigMap實例。

默認行爲是創建一個ConfigMapPropertySource基於一個Kubernetes ConfigMap具有metadata.nameSpring應用程序的任何名稱的值(由它的定義spring.application.name屬性)或中定義的自定義名稱 bootstrap.properties下面的項下的文件:spring.cloud.kubernetes.config.name。

但是,可以在其中使用多個ConfigMap實例的情況下進行更高級的配置。該spring.cloud.kubernetes.config.sources列表使這成爲可能。例如,您可以定義以下ConfigMap實例:

spring:
application:
name: cloud-k8s-app
cloud:
kubernetes:
config:
name: default-name
namespace: default-namespace
sources:
# Spring Cloud Kubernetes looks up a ConfigMap named c1 in namespace default-namespace
- name: c1
# Spring Cloud Kubernetes looks up a ConfigMap named default-name in whatever namespace n2
- namespace: n2
# Spring Cloud Kubernetes looks up a ConfigMap named c3 in namespace n3
- namespace: n3
name: c3
在前面的示例中,如果spring.cloud.kubernetes.config.namespace尚未設置,則將在應用程序運行的名稱空間中查找ConfigMapnamed c1。

ConfigMap找到的所有匹配項均按以下方式處理:

應用單個配置屬性。

應用yaml任何名爲的屬性的內容application.yaml。

將名爲的任何屬性的內容用作屬性文件application.properties。

前述流程的唯一例外是當ConfigMap包含單個表示該文件是YAML或屬性文件的鍵時。在那種情況下,鍵的名稱不必是application.yaml或 application.properties(可以是任何東西),並且屬性的值被正確對待。此功能有助於ConfigMap通過以下方式創建的用例:

kubectl create configmap game-config --from-file=/path/to/app-config.yaml
假設我們有一個名爲Spring Boot的應用程序demo,它使用以下屬性來讀取其線程池配置。

pool.size.core

pool.size.maximum

可以將其外部yaml化爲配置映射,格式如下:

kind: ConfigMap
apiVersion: v1
metadata:
name: demo
data:
pool.size.core: 1
pool.size.max: 16
在大多數情況下,單個屬性都可以正常工作。但是,有時嵌入式yaml更方便。在這種情況下,我們使用一個名爲的屬性application.yaml來嵌入yaml,如下所示:

kind: ConfigMap
apiVersion: v1
metadata:
name: demo
data:
application.yaml: |-
pool:
size:
core: 1
max:16
以下示例也適用:

kind: ConfigMap
apiVersion: v1
metadata:
name: demo
data:
custom-name.yaml: |-
pool:
size:
core: 1
max:16
您還可以根據ConfigMap讀取時合併在一起的活動配置文件來不同地配置Spring Boot應用程序。您可以通過使用application.properties或application.yaml屬性,爲特定配置文件提供不同的屬性值 ,並在各自的文檔中指定特定於配置文件的值(由—順序指示),如下所示:

kind: ConfigMap
apiVersion: v1
metadata:
name: demo
data:
application.yml: |-
greeting:
message: Say Hello to the World
farewell:
message: Say Goodbye

spring:
profiles: development
greeting:
message: Say Hello to the Developers
farewell:
message: Say Goodbye to the Developers

spring:
profiles: production
greeting:
message: Say Hello to the Ops
在上述情況下,使用development概要文件加載到您的Spring Application中的配置如下:

greeting:
message: Say Hello to the Developers
farewell:
message: Say Goodbye to the Developers
但是,如果production概要文件處於活動狀態,則配置將變爲:

greeting:
message: Say Hello to the Ops
farewell:
message: Say Goodbye
如果兩個配置文件均處於活動狀態,則最後出現在該屬性中的屬性將ConfigMap覆蓋所有先前的值。

另一個選擇是爲每個配置文件創建一個不同的配置映射,Spring Boot會根據活動的配置文件自動獲取它

kind: ConfigMap
apiVersion: v1
metadata:
name: demo
data:
application.yml: |-
greeting:
message: Say Hello to the World
farewell:
message: Say Goodbye
kind: ConfigMap
apiVersion: v1
metadata:
name: demo-development
data:
application.yml: |-
spring:
profiles: development
greeting:
message: Say Hello to the Developers
farewell:
message: Say Goodbye to the Developers
kind: ConfigMap
apiVersion: v1
metadata:
name: demo-production
data:
application.yml: |-
spring:
profiles: production
greeting:
message: Say Hello to the Ops
farewell:
message: Say Goodbye
要告訴Spring Boot profile應該在引導程序中啓用它,可以傳遞SPRING_PROFILES_ACTIVE環境變量。爲此,您可以使用環境變量啓動您的Spring Boot應用程序,您可以在容器規範的PodSpec中定義它。部署資源文件,如下:

apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-name
labels:
app: deployment-name
spec:
replicas: 1
selector:
matchLabels:
app: deployment-name
template:
metadata:
labels:
app: deployment-name
spec:
containers:
- name: container-name
image: your-image
env:
- name: SPRING_PROFILES_ACTIVE
value: “development”
您應該檢查安全性配置部分。要從Pod內部訪問配置映射,您需要具有正確的Kubernetes服務帳戶,角色和角色綁定。
使用ConfigMap實例的另一種選擇是通過運行Spring Cloud Kubernetes應用程序並使Spring Cloud Kubernetes從文件系統讀取它們,將它們安裝到Pod中。此行爲由spring.cloud.kubernetes.config.paths屬性控制。您可以使用它作爲上述機制的補充或替代。您可以spring.cloud.kubernetes.config.paths使用,定界符在其中指定多個(精確)文件路徑。

您必須提供每個屬性文件的完整確切路徑,因爲不會遞歸解析目錄。
表1.屬性:
名稱 類型 默認 描述
spring.cloud.kubernetes.config.enabled

Boolean

true

啓用ConfigMap PropertySource

spring.cloud.kubernetes.config.name

String

${spring.application.name}

設置ConfigMap要查找的名稱

spring.cloud.kubernetes.config.namespace

String

客戶端名稱空間

設置Kubernetes命名空間在哪裏查找

spring.cloud.kubernetes.config.paths

List

null

設置ConfigMap實例安裝的路徑

spring.cloud.kubernetes.config.enableApi

Boolean

true

ConfigMap通過API 啓用或禁用使用實例

5.2。祕密PropertySource
Kubernetes具有用於存儲敏感數據(例如密碼,OAuth令牌等)的祕密的概念。該項目提供了與的集成,Secrets以使Spring Boot應用程序可以訪問祕密。您可以通過設置spring.cloud.kubernetes.secrets.enabled屬性來顯式啓用或禁用此功能。

啓用後,將從以下來源SecretsPropertySource查找Kubernetes Secrets:

從祕密坐騎遞歸讀取

以應用程序命名(由定義spring.application.name)

匹配一些標籤

注意:

默認情況下,出於安全原因,未啓用通過API消費機密(以上第2點和第3點)。機密上的權限“列表”允許客戶端檢查指定名稱空間中的機密值。此外,我們建議容器通過安裝的卷共享機密。

如果您通過API啓用使用機密,我們建議您使用授權策略(例如RBAC)限制對機密的訪問。有關通過API使用“機密”時的風險和最佳做法的更多信息,請參閱此文檔。

如果找到了機密,則其數據可供應用程序使用。

假設我們有一個名爲Spring Boot的應用程序demo,它使用屬性讀取其數據庫配置。我們可以使用以下命令創建Kubernetes機密:

oc create secret generic db-secret --from-literal=username=user --from-literal=password=p455w0rd
前面的命令將創建以下祕密(您可以使用來查看oc get secrets db-secret -o yaml):

apiVersion: v1
data:
password: cDQ1NXcwcmQ=
username: dXNlcg==
kind: Secret
metadata:
creationTimestamp: 2017-07-04T09:15:57Z
name: db-secret
namespace: default
resourceVersion: “357496”
selfLink: /api/v1/namespaces/default/secrets/db-secret
uid: 63c89263-6099-11e7-b3da-76d6186905a8
type: Opaque
請注意,數據包含該create命令提供的文字的Base64編碼版本。

然後,您的應用程序可以使用此祕密-例如,通過將祕密的值導出爲環境變量:

apiVersion: v1
kind: Deployment
metadata:
name: ${project.artifactId}
spec:
template:
spec:
containers:
- env:
- name: DB_USERNAME
valueFrom:
secretKeyRef:
name: db-secret
key: username
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: password
您可以通過多種方式選擇要使用的祕密:

通過列出映射機密的目錄:

-Dspring.cloud.kubernetes.secrets.paths=/etc/secrets/db-secret,etc/secrets/postgresql
如果您已將所有機密映射到公共根,則可以將它們設置爲:

-Dspring.cloud.kubernetes.secrets.paths=/etc/secrets
通過設置命名機密:

-Dspring.cloud.kubernetes.secrets.name=db-secret
通過定義標籤列表:

-Dspring.cloud.kubernetes.secrets.labels.broker=activemq
-Dspring.cloud.kubernetes.secrets.labels.db=postgresql
與一樣ConfigMap,在可以使用多個Secret 實例的情況下,也可以進行更高級的配置。該spring.cloud.kubernetes.secrets.sources列表使這成爲可能。例如,您可以定義以下Secret實例:

spring:
application:
name: cloud-k8s-app
cloud:
kubernetes:
secrets:
name: default-name
namespace: default-namespace
sources:
# Spring Cloud Kubernetes looks up a Secret named s1 in namespace default-namespace
- name: s1
# Spring Cloud Kubernetes looks up a Secret named default-name in whatever namespace n2
- namespace: n2
# Spring Cloud Kubernetes looks up a Secret named s3 in namespace n3
- namespace: n3
name: s3
在前面的示例中,如果spring.cloud.kubernetes.secrets.namespace尚未設置,則將在應用程序運行的名稱空間中查找Secretnamed s1。

表2.屬性:
名稱 類型 默認 描述
spring.cloud.kubernetes.secrets.enabled

Boolean

true

啓用祕密 PropertySource

spring.cloud.kubernetes.secrets.name

String

${spring.application.name}

設置要查找的機密名稱

spring.cloud.kubernetes.secrets.namespace

String

客戶端名稱空間

設置Kubernetes命名空間的查找位置

spring.cloud.kubernetes.secrets.labels

Map

null

設置用於查找機密的標籤

spring.cloud.kubernetes.secrets.paths

List

null

設置安裝機密的路徑(示例1)

spring.cloud.kubernetes.secrets.enableApi

Boolean

false

通過API啓用或禁用使用機密(示例2和3)

筆記:

該spring.cloud.kubernetes.secrets.labels屬性的行爲如基於Map的binding所定義 。

該spring.cloud.kubernetes.secrets.paths屬性的行爲與基於Collection的binding定義的行爲相同 。

出於安全原因,可能會限制通過API訪問機密。首選方法是將機密安裝到Pod。

您可以spring-cloud-kubernetes在spring-boot-camel-config上找到使用機密(儘管尚未更新以使用新項目) 的應用程序示例。

5.3。PropertySource重裝
某些應用程序可能需要檢測外部屬性源上的更改並更新其內部狀態以反映新配置。當相關ConfigMap或 Secret更改時,Spring Cloud Kubernetes的重新加載功能能夠觸發應用程序重新加載。

默認情況下,此功能處於禁用狀態。您可以使用spring.cloud.kubernetes.reload.enabled=true配置屬性(例如,在application.properties文件中)啓用它。

支持以下級別的重載(通過設置spring.cloud.kubernetes.reload.strategy屬性):* refresh(默認值):僅重載帶有@ConfigurationProperties或註釋的配置bean @RefreshScope。此重載級別利用了Spring Cloud Context的刷新功能。* restart_context:整個Spring ApplicationContext正常重啓。使用新配置重新創建Bean。* shutdown:ApplicationContext關閉Spring 以激活容器的重新啓動。使用此級別時,請確保所有非守護程序線程的生命週期都已綁定到,ApplicationContext 並且已將複製控制器或副本集配置爲重新啓動Pod。

假設使用默認設置(refresh模式)啓用了重載功能,那麼當配置映射更改時,以下bean會刷新:

@組態
@ConfigurationProperties(前綴=“ bean”)
公共類MyConfig {

private String message =“可以實時更改的消息”;

// getter和setter

}
要查看更改是否有效發生,可以創建另一個bean,該bean定期打印消息,如下所示

@Component
public class MyBean {

@Autowired
private MyConfig config;

@Scheduled(fixedDelay = 5000)
public void hello() {
    System.out.println("The message is: " + config.getMessage());
}

}
您可以使用來更改應用程序打印的消息ConfigMap,如下所示:

apiVersion: v1
kind: ConfigMap
metadata:
name: reload-example
data:
application.properties: |-
bean.message=Hello World!
到命名屬性的任何變化bean.message在ConfigMap與吊艙相關聯的被反映在輸出中。更一般地說,與屬性相關聯的更改將以註釋prefix 字段定義的值爲前綴@ConfigurationProperties被檢測到並反映在應用程序中。 本章前面已說明了將a ConfigMap與pod 關聯。

完整的示例可在中找到spring-cloud-kubernetes-reload-example。

重新加載功能支持兩種操作模式:*事件(默認):使用Kubernetes API(Web套接字)監視配置映射或機密的更改。任何事件都會對配置進行重新檢查,並在發生更改的情況下重新加載。該view服務帳戶的角色需要,以監聽配置圖的變化。edit機密需要更高級別的角色(例如)(默認情況下,機密不會受到監視)。*輪詢:根據配置映射和機密信息定期重新創建配置,以查看配置是否已更改。您可以使用該spring.cloud.kubernetes.reload.period屬性配置輪詢時間,默認爲15秒。它需要與受監視屬性源相同的角色。例如,這意味着對文件掛載的祕密源使用輪詢不需要特定的特權。

表3.屬性:
名稱 類型 默認 描述
spring.cloud.kubernetes.reload.enabled

Boolean

false

啓用監視屬性源和配置重載

spring.cloud.kubernetes.reload.monitoring-config-maps

Boolean

true

允許監視配置映射中的更改

spring.cloud.kubernetes.reload.monitoring-secrets

Boolean

false

允許監視機密更改

spring.cloud.kubernetes.reload.strategy

Enum

refresh

該戰略燒成重載時使用(refresh,restart_context,或shutdown)

spring.cloud.kubernetes.reload.mode

Enum

event

指定如何偵聽屬性源(event或polling)中的更改

spring.cloud.kubernetes.reload.period

Duration

15s

使用polling策略時驗證變更的期限

注意:*請勿spring.cloud.kubernetes.reload在配置映射或機密中使用屬性。在運行時更改此類屬性可能會導致意外結果。*使用refresh關卡時,刪除屬性或整個配置圖不會恢復Bean的原始狀態。

  1. Kubernetes中的功能區發現
    調用微服務的Spring Cloud客戶端應用程序應該對依靠客戶端負載平衡功能感興趣,以便自動發現它可以在哪個端點到達給定服務。該機制已在spring-cloud-kubernetes-ribbon項目中實現,其中Kubernetes客戶端填充了一個Ribbon ServerList,其中包含有關此類端點的信息。

該實現是以下啓動器的一部分,可以通過將其依賴項添加到pom文件中來使用該實現:

org.springframework.cloud spring-cloud-starter-kubernetes-ribbon ${latest.version} 填充端點列表後,Kubernetes客戶端通過匹配功能區客戶端註釋中定義的服務名稱來搜索當前名稱空間或項目中存在的註冊端點,如下所示:

@RibbonClient(name = “name-service”)
您可以使用以下格式application.properties通過(通過應用程序專用的ConfigMap)在您的屬性中提供屬性來配置Ribbon的行爲.ribbon.:

對應於您通過功能區訪問的服務名稱,該名稱是使用@RibbonClient註釋配置的 (例如,name-service在前面的示例中)。

是Ribbon的CommonClientConfigKeyclass定義的Ribbon配置鍵之一 。

此外,該spring-cloud-kubernetes-ribbon項目定義了兩個附加的配置鍵,以進一步控制Ribbon與Kubernetes的交互方式。特別是,如果端點定義了多個端口,則默認行爲是使用找到的第一個端口。要更具體地選擇在多端口服務中使用哪個端口,可以使用PortName鍵。如果您想指定應在哪個Kubernetes命名空間中查找目標服務,則可以使用該KubernetesNamespace密鑰,在這兩個實例中都記住要爲這些密鑰加上您的服務名稱和 ribbon前綴(如前所述)。

表4. Spring Cloud Kubernetes功能區配置
屬性鍵 類型 默認值
spring.cloud.kubernetes.ribbon.enabled

布爾值

真正

spring.cloud.kubernetes.ribbon.mode

KubernetesRibbonMode

spring.cloud.kubernetes.ribbon.cluster-domain

cluster.local

spring.cloud.kubernetes.ribbon.mode支持POD和SERVICE模式。

POD模式是通過獲取Kubernetes的Pod IP地址並使用功能區來實現負載平衡的。POD模式使用功能區的負載平衡不支持Kubernetes負載平衡,不支持的流量策略Istio。

該SERVICE模式直接基於service name功能區的。獲取Kubernetes服務分爲以下幾種service-name.{namespace}.svc.{cluster.domain}:{port}:demo1.default.svc.cluster.local:8080。該SERVICE模式使用Kubernetes服務的負載平衡來支持Istio的流量策略。

spring.cloud.kubernetes.ribbon.cluster-domain設置自定義Kubernetes集羣域後綴。默認值爲:“ cluster.local”

以下示例使用此模塊進行功能區發現:

彈簧雲斷路器和功能區

fabric8-quickstarts-彈簧靴-功能區

Kubeflix-貸款經紀人-銀行

您可以通過spring.cloud.kubernetes.ribbon.enabled=false在應用程序屬性文件中設置密鑰來禁用功能區發現客戶端。
7. Kubernetes生態系統意識
無論您的應用程序是否在Kubernetes中運行,本指南前面介紹的所有功能都可以很好地工作。這對於開發和故障排除確實很有幫助。從開發角度來看,這使您可以啓動Spring Boot應用程序並調試屬於該項目的模塊之一。您無需將其部署在Kubernetes中,因爲該項目的代碼依賴於 Fabric8 Kubernetes Java客戶端,它是一種流利的DSL,可以通過使用http協議與Kubernetes Server的REST API進行通信。

要禁用與Kubernetes的集成,可以設置spring.cloud.kubernetes.enabled爲false。請注意,當spring-cloud-kubernetes-config在classpath上時, spring.cloud.kubernetes.enabled應在bootstrap.{properties|yml}(或配置文件專用的)中設置,否則應在application.{properties|yml}(或配置文件專用的)中設置。還要注意的是,這些特性:spring.cloud.kubernetes.config.enabled和spring.cloud.kubernetes.secrets.enabled才生效時集bootstrap.{properties|yml}

7.1。Kubernetes配置文件自動配置
當應用程序在Kubernetes中作爲pod運行時,名爲的Spring配置文件會kubernetes自動激活。這使您可以自定義配置,以定義在Kubernetes平臺中部署Spring Boot應用程序時要應用的bean(例如,不同的開發和生產配置)。

7.2。Istio意識
當包括spring-cloud-kubernetes-istio在應用程序的類路徑模塊,新的配置文件添加到應用程序,提供的應用運行在Kubernetes集羣裏面Istio安裝。然後,您可以@Profile(“istio”)在Bean和@Configuration類中使用spring 註釋。

Istio感知模塊用於me.snowdrop:istio-client與Istio API進行交互,使我們能夠發現流量規則,斷路​​器等,從而使我們的Spring Boot應用程序可以輕鬆使用此數據,以根據環境動態配置自身。

8.豆莢健康指標
Spring Boot用於HealthIndicator公開有關應用程序運行狀況的信息。這對於將與健康相關的信息提供給用戶非常有用,並且非常適合用作就緒探針。

Kubernetes運行狀況指示器(是核心模塊的一部分)公開以下信息:

窗格名稱,IP地址,名稱空間,服務帳戶,節點名稱及其IP地址

一個標誌,指示Spring Boot應用程序在Kubernetes內部還是外部

9.領導人選舉
<待定>

  1. Kubernetes內部的安全配置
    10.1。命名空間
    該項目中提供的大多數組件都需要知道名稱空間。對於Kubernetes(1.3+),名稱空間作爲服務帳戶密碼的一部分可供Pod使用,並由客戶端自動檢測到。對於早期版本,需要將其指定爲Pod的環境變量。一種快速的方法如下:

    env:

    • name: “KUBERNETES_NAMESPACE”
      valueFrom:
      fieldRef:
      fieldPath: “metadata.namespace”
      10.2。服務帳號
      對於支持集羣內基於角色的更細粒度訪問的Kubernetes發行版,您需要確保與之一起運行的Pod spring-cloud-kubernetes有權訪問Kubernetes API。對於您分配給部署或Pod的任何服務帳戶,您需要確保它們具有正確的角色。

根據要求,你需要get,list並watch在以下資源權限:

表5. Kubernetes資源權限
相依性 資源資源
spring-cloud-starter-kubernetes

吊艙,服務,端點

spring-cloud-starter-kubernetes-config

configmaps,祕密

Spring-Cloud-Starter-Kubernetes-功能區

吊艙,服務,端點

出於開發目的,您可以cluster-reader向default服務帳戶添加權限。在生產系統上,您可能需要提供更精細的權限。

以下Role和RoleBinding是該default帳戶的命名空間權限的示例:

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: YOUR-NAME-SPACE
name: namespace-reader
rules:

  • apiGroups: ["", “extensions”, “apps”]
    resources: [“configmaps”, “pods”, “services”, “endpoints”, “secrets”]
    verbs: [“get”, “list”, “watch”]

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: namespace-reader-binding
namespace: YOUR-NAME-SPACE
subjects:

  • kind: ServiceAccount
    name: default
    apiGroup: “”
    roleRef:
    kind: Role
    name: namespace-reader
    apiGroup: “”
    11.服務註冊中心的實施
    在Kubernetes服務註冊由平臺控制的情況下,應用程序本身不像其他平臺那樣控制註冊。因此,使用spring.cloud.service-registry.auto-registration.enabled 或設置@EnableDiscoveryClient(autoRegister=false)在Spring Cloud Kubernetes中無效。

12.例子
Spring Cloud Kubernetes嘗試通過遵循Spring Cloud接口使應用程序使用Kubernetes Native Services透明化。

在您的應用程序中,您需要將spring-cloud-kubernetes-discovery依賴項添加到類路徑中,並刪除任何其他包含DiscoveryClient實現的依賴項(即Eureka發現客戶端)。這同樣適用於PropertySourceLocator,您需要在的類路徑中添加spring-cloud-kubernetes-config並刪除包含PropertySourceLocator實現(即配置服務器客戶端)的任何其他依賴項。

以下項目重點介紹了這些依賴項的用法,並演示瞭如何從任何Spring Boot應用程序中使用這些庫:

Spring Cloud Kubernetes示例:位於此存儲庫中的示例。

Spring Cloud Kubernetes完整示例:奴才和上司

奴才

老闆

Spring Cloud Kubernetes完整示例:SpringOne Platform Tickets Service

具有Spring Cloud Kubernetes發現和配置的Spring Cloud Gateway

使用Spring Cloud Kubernetes發現和配置進行Spring Boot Admin

13.其他資源
本節列出了其他資源,例如有關Spring Cloud Kubernetes的演示(幻燈片)和視頻。

PKS上的S1P Spring Cloud

Spring Cloud,Docker,Kubernetes→倫敦Java社區2018年7月

請隨時通過拉取請求向此存儲庫提交其他資源。

14.配置屬性
要查看所有與Sleuth相關的配置屬性的列表,請檢查附錄頁面。

15.建築
15.1。基本編譯和測試
要構建源代碼,您將需要安裝JDK 1.7。

Spring Cloud使用Maven進行大多數與構建相關的活動,並且您應該能夠通過克隆您感興趣的項目並鍵入來快速啓動

$ ./mvnw安裝
您還可以自己安裝Maven(> = 3.3.3)並在以下示例mvn中代替./mvnw該位置運行命令。如果這樣做,-P spring則如果本地Maven設置不包含Spring預發行項目的存儲庫聲明,則可能還需要添加。
請注意,通過將MAVEN_OPTS環境變量設置爲,可能需要增加Maven可用的內存量-Xmx512m -XX:MaxPermSize=128m。我們嘗試在.mvn配置中進行介紹,因此,如果您發現必須進行此操作才能使構建成功,請提出票證以將設置添加到源代碼管理中。
有關如何構建項目的提示,請查看.travis.yml是否存在。應該有一個“腳本”,也許還有“安裝”命令。另外,請查看“服務”部分,以查看是否需要在本地運行任何服務(例如mongo或Rabbit)。忽略您可能在“ before_install”中找到的與git相關的位,因爲它們與設置git憑據有關,並且您已經擁有了這些憑據。

需要中間件的項目通常包括 docker-compose.yml,因此請考慮使用 Docker Compose在Docker容器中運行中間件服務器。有關mongo,rabbit和redis常見情況的特定說明,請參見腳本演示存儲庫中的README 。

如果其他所有方法均失敗,則使用.travis.yml(通常爲 ./mvnw install)命令進行構建。
15.2。文獻資料
spring-cloud-build模塊有一個“ docs”配置文件,如果您打開它,將嘗試從中構建asciidoc源 src/main/asciidoc。作爲該過程的一部分,它將查找 README.adoc並通過加載所有包含項來對其進行處理,但不對其進行解析或渲染,只需將其複製到main.basedir{main.basedir} (默認爲{basedir},即項目的根目錄)即可。如果自述文件有任何更改,它將在Maven構建後顯示爲正確位置的已修改文件。只需提交併推動更改即可。

15.3。使用代碼
如果您沒有IDE偏好設置,我們建議您在使用代碼時使用 Spring Tools Suite或 Eclipse。我們使用 m2eclipse eclipse插件來獲得maven支持。只要其他IDE和工具使用Maven 3.3.3或更高版本,它們也應該可以正常工作。

15.3.1。使用m2eclipse導入eclipse
當使用eclipse時,我們建議使用m2eclipse eclipse插件。如果尚未安裝m2eclipse,則可以從“ eclipse市場”中獲得。

較舊的m2e版本不支持Maven 3.3,因此,一旦將項目導入Eclipse,您還需要告訴m2eclipse爲項目使用正確的配置文件。如果您在項目中看到許多與POM相關的錯誤,請檢查您是否具有最新的安裝。如果您無法升級m2e,請在您的中添加“ spring”配置文件settings.xml。或者,您可以將存儲庫設置從父pom的“ spring”配置文件複製到settings.xml。
15.3.2。不使用m2eclipse導入eclipse
如果您不想使用m2eclipse,則可以使用以下命令生成eclipse項目元數據:

$ ./mvnw eclipse:eclipse
可以通過import existing projects 從file菜單中選擇導入生成的Eclipse項目。

16.貢獻
Spring Cloud是在非限制性Apache 2.0許可下發布的,並遵循非常標準的Github開發流程,使用Github跟蹤程序解決問題並將合併請求合併到master中。如果您想貢獻些微不足道的東西,請不要猶豫,但請遵循以下準則。

16.1。簽署貢獻者許可協議
在我們接受不重要的補丁或請求請求之前,我們將需要您簽署“ 貢獻者許可協議”。簽署貢獻者協議並不會授予任何人對主存儲庫的提交權,但這確實意味着我們可以接受您的貢獻,如果這樣做,您將獲得作者的榮譽。可能會要求活躍的貢獻者加入核心團隊,並具有合併合併請求的能力。

16.2。行爲守則
該項目遵守《貢獻者公約》行爲守則。通過參與,您將遵守此代碼。請向[email protected]報告不可接受的行爲。

16.3。規範和內務守則
對於拉取請求,這些都不是必不可少的,但它們都會有所幫助。也可以在原始請求請求之後但在合併之前添加它們。

使用Spring Framework代碼格式約定。如果您使用Eclipse,則可以使用Spring Cloud Build項目中的eclipse-code-formatter.xml文件 導入格式化程序設置 。如果使用IntelliJ,則可以使用 Eclipse Code Formatter插件來導入相同的文件。

確保所有新.java文件都具有簡單的Javadoc類註釋,其中至少包含一個@author用於標識您的 標籤,並且最好至少包含有關該類用途的段落。

將ASF許可證標頭註釋添加到所有新.java文件(從項目中的現有文件複製)

將您自己添加爲@author您進行了實質性修改(不只是外觀更改)的.java文件。

添加一些Javadocs,如果更改名稱空間,則添加一些XSD doc元素。

進行一些單元測試也有很大幫助-有人必須這樣做。

如果沒有其他人在使用您的分支,請根據當前的主節點(或主項目中的其他目標分支)對其進行重新設置。

編寫提交消息時,請遵循以下約定,如果要解決現有問題,請Fixes gh-XXXX在提交消息的末尾添加(其中XXXX是問題編號)。

16.4。Checkstyle
Spring Cloud Build帶有一組checkstyle規則。您可以在spring-cloud-build-tools模塊中找到它們。該模塊下最值得注意的文件是:

spring-cloud-build-tools /
└──src
├──格紋
│└──checkstyle-suppressions.xml
└──主要
└──資源
├──checkstyle-header.txt
└──checkstyle.xml
默認Checkstyle規則
文件頭設置
默認抑制規則
16.4.1。Checkstyle配置
Checkstyle規則默認爲禁用。要將checkstyle添加到項目中,只需定義以下屬性和插件。

pom.xml
<屬性>
<maven-checkstyle-plugin.failsOnError> true </maven-checkstyle-plugin.failsOnError>
<maven-checkstyle-plugin.failsOnViolation>是
</maven-checkstyle-plugin.failsOnViolation>
<maven-checkstyle-plugin.includeTestSourceDirectory> true
</maven-checkstyle-plugin.includeTestSourceDirectory>
</ properties>

<內部版本>
<插件>
<插件>
io.spring.javaformat </ groupId>
spring-javaformat-maven-plugin </ artifactId>
</ plugin>
<插件>
org.apache.maven.plugins </ groupId>
maven-checkstyle-plugin </ artifactId>
</ plugin>
</ plugins>

<報告>
    <插件>
        <插件> 
            <groupId> org.apache.maven.plugins </ groupId>
            <artifactId> maven-checkstyle-plugin </ artifactId>
        </ plugin>
    </ plugins>
</ reporting>

</ build>
因Checkstyle錯誤而無法構建
因Checkstyle違規而無法構建
Checkstyle還分析測試源
添加Spring Java Format插件,該插件將重新格式化您的代碼以通過大多數Checkstyle格式化規則
將Checkstyle插件添加到您的構建和報告階段
如果您需要取消某些規則(例如,行長需要更長),那麼您就可以通過${project.root}/src/checkstyle/checkstyle-suppressions.xml取消操作來定義一個文件。例:

projectRoot / src / checkstyle / checkstyle-suppresions.xml
<?xml version =“ 1.0”?>
<!DOCTYPE禁止發佈
“-//小狗爬網// DTD抑制1.1 // EN”
“ https://www.puppycrawl.com/dtds/suppressions_1_1.dtd“>
<抑制>
<suppress files =“。* ConfigServerApplication \ .java” checks =“ HideUtilityClassConstructor” />
<suppress files =“。* ConfigClientWatch \ .java” checks =“ LineLengthCheck” />
</ suppressions>
建議將springcloudbuild.rootFolder/.editorconfig{spring-cloud-build.rootFolder}/.editorconfig和複製{spring-cloud-build.rootFolder}/.springformat到您的項目中。這樣,將應用一些默認格式設置規則。您可以通過運行以下腳本來這樣做:

$ curl https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/.editorconfig -o .editorconfig
$ touch .springformat
16.5。IDE設置
16.5.1。Intellij IDEA
爲了設置Intellij,您應該導入我們的編碼約定,檢查配置文件並設置checkstyle插件。在Spring Cloud Build項目中可以找到以下文件。

spring-cloud-build-tools /
└──src
├──格紋
│└──checkstyle-suppressions.xml
└──主要
└──資源
├──checkstyle-header.txt
├──checkstyle.xml
└──intellij
├──Intellij_Project_Defaults.xml
└──Intellij_Spring_Boot_Java_Conventions.xml
默認Checkstyle規則
文件頭設置
默認抑制規則
適用於大多數Checkstyle規則的Intellij項目默認值
適用於大多數Checkstyle規則的Intellij的項目樣式約定
代碼風格
圖1.代碼樣式
進入File→交通Settings→交通Editor→交通Code style。單擊該Scheme部分旁邊的圖標。在那裏,單擊Import Scheme值並選擇Intellij IDEA code style XML選項。導入spring-cloud-build-tools/src/main/resources/intellij/Intellij_Spring_Boot_Java_Conventions.xml文件。

代碼風格
圖2.檢查配置文件
進入File→交通Settings→交通Editor→交通Inspections。單擊該Profile部分旁邊的圖標。在那裏,單擊Import Profile並導入spring-cloud-build-tools/src/main/resources/intellij/Intellij_Project_Defaults.xml文件。

Checkstyle
要使Intellij與Checkstyle一起使用,您必須安裝Checkstyle插件。建議還安裝Assertions2Assertj來自動轉換JUnit斷言

Checkstyle
進入File→交通Settings→交通Other settings→交通Checkstyle。單擊+該Configuration file部分中的圖標。在這裏,您必須定義應從何處選擇checkstyle規則。在上圖中,我們從克隆的Spring Cloud Build存儲庫中選擇了規則。但是,您可以指向春雲構建計劃的GitHub的庫(例如用於checkstyle.xml:raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-build-tools/src/main/resources/checkstyle.xml)。我們需要提供以下變量:

checkstyle.header.file-請指向spring-cloud-build-tools/src/main/resources/checkstyle-header.txt克隆存儲庫中或通過raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-build-tools/src/main/resources/checkstyle-header.txtURL 的Spring Cloud Build 文件。

checkstyle.suppressions.file-默認抑制。請將其指向spring-cloud-build-tools/src/checkstyle/checkstyle-suppressions.xml您的克隆存儲庫中或通過raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-build-tools/src/checkstyle/checkstyle-suppressions.xmlURL 的Spring Cloud Build的文件。

checkstyle.additional.suppressions.file-此變量對應於本地項目中的抑制。例如,您正在努力spring-cloud-contract。然後指向該project-root/src/checkstyle/checkstyle-suppressions.xml文件夾。的示例爲spring-cloud-contract:/home/username/spring-cloud-contract/src/checkstyle/checkstyle-suppressions.xml。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章