成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Dapr 入門教程之密鑰存儲

云計算 云原生
Dapr 在 Kubernetes 模式下通過 Helm 或 dapr init -k 部署的時候,啟用一個內置的 Kubernetes Secret 存儲,如果你使用另一個 Secret 存儲,你可以使用 disable-builtin-k8s-secret-store 設置禁用 Dapr Kubernetes Secret 存儲。

應用程序通常通過使用專用的 Secret 存儲來存儲敏感信息,如密鑰和 Token,用于與數據庫、服務和外部系統進行身份驗證的 Secret 等。通常這需要涉及到設置一個 Secret 存儲,如 ??Azure Key Vault???、??Hashicorp Vault?? 等,并在那里存儲應用程序級別的私密數據。為了訪問這些 Secret 存儲,應用程序需要導入 Secret 存儲的 SDK,并使用它來訪問私密數據,這可能需要相當數量的代碼,這些代碼與應用程序的實際業務領域無關,因此在可能使用不同供應商特定的 Secret 存儲的多云場景中,這將成為更大的挑戰。

為了使開發者更容易使用應用程序的私密數據,Dapr 有一個專門的 Secret 構建塊 API,允許開發者從 Secret 存儲中獲取私密數據。使用 Dapr 的 Secret 存儲構建塊通常涉及以下內容。

  • 為特定的 Secret 存儲解決方案設置一個組件。
  • 在應用程序代碼中使用 Dapr 的 Secret API 來檢索私密數據。
  • (可選)在 Dapr 組件文件中引用 Secret。

默認情況下,Dapr 在 Kubernetes 模式下通過 Helm 或 dapr init -k 部署的時候,啟用一個內置的 Kubernetes Secret 存儲,如果你使用另一個 Secret 存儲,你可以使用 disable-builtin-k8s-secret-store 設置禁用 Dapr Kubernetes Secret 存儲。

應用程序代碼可以調用 Secret 構建塊 API 從 Dapr 支持的 Secret 存儲中檢索私密數據,這些 Secret 存儲可以在你的代碼中使用。例如,下圖顯示了一個應用程序從配置的云 Secret 存儲庫中的一個名為 vault 的 Secret 存儲庫中請求名為 mysecret 的私密數據。

圖片

Dapr Secret

應用程序可以使用 secrets API 來訪問來自 Kubernetes Secret 存儲的私密數據。在下面的例子中,應用程序從 Kubernetes Secret 存儲中檢索相同的 mysecret。

圖片

Dapr Secret On K8s

本地環境使用 Secrets

同樣我們以 quickstarts 倉庫進行說明。

git clone [-b <dapr_version_tag>] https://github.com/dapr/quickstarts.git
cd quickstarts

然后定位到 secretstore 目錄下面的 node 文件夾:

$ cd tutorials/secretstore/node

在 app.js 中是一個簡單的 Express 應用,它暴露了一些路由和處理程序,我們可以先查看下該文件中的如下內容:

const daprPort = process.env.DAPR_HTTP_PORT || 3500;
const secretStoreName = process.env.SECRET_STORE;
const secretName = "mysecret";

其中 secretStoreName 從環境變量 SECRET_STORE 中讀取,,其為 Kubernetes 部署注入了值 kubernetes,對于本地開發,環境變量必須設置為 localsecretstore 值。

然后我們看看 getsecret 處理程序代碼:

app.get("/getsecret", (_req, res) => {
const url = `${secretsUrl}/${secretStoreName}/${secretName}?metadata.namespace=default`;
console.log("Fetching URL: %s", url);
fetch(url)
.then((res) => res.json())
.then((json) => {
let secretBuffer = new Buffer(json["mysecret"]);
let encodedSecret = secretBuffer.toString("base64");
console.log("Base64 encoded secret is: %s", encodedSecret);
return res.send(encodedSecret);
});
});

該代碼從 secret store 中獲取名為 mysecret 的數據,并顯示該數據的 Base64 編碼數據。

我們在 secrets.json 文件中添加一個 mysecret 的 Secret 數據:

{
"mysecret": "abcd"
}

同樣我們也需要添加一個 Secret 對應的 Component 組件,比如在本地自拓管模式,創建一個如下所示的配置文件:

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: localsecretstore
namespace: default
spec:
type: secretstores.local.file
version: v1
metadata:
- name: secretsFile
value: secrets.json
- name: nestedSeparator
value: ":"

上面的組件定義了一個本地 Secret 存儲庫,其 Secret 文件路徑為 secrets.json 文件。

其中 Secret 存儲 JSON 的路徑是與你調用 dapr run 的位置相關的。

然后我們需要將上面的 Secret Store 名稱設置為環境變量:

export SECRET_STORE="localsecretstore"
set SECRET_STORE=localsecretstore

接下來我們為 Node 應用安裝依賴:

npm install

然后我們使用 Dapr 帶上本地的 secret store 組件運行 Node 應用:

$ dapr run --app-id nodeapp --components-path ./components --app-port 3000 --dapr-http-port 3500 node app.js
?? Starting Dapr with id nodeapp. HTTP Port: 3500. gRPC Port: 58744
INFO[0000] starting Dapr Runtime -- version 1.8.4 -- commit 18575823c74318c811d6cd6f57ffac76d5debe93 app_id=nodeapp instance=MBP2022.local scope=dapr.runtime type=log ver=1.8.4

INFO[0000] component loaded. name: localsecretstore, type: secretstores.local.file/v1 app_id=nodeapp instance=MBP2022.local scope=dapr.runtime type=log ver=1.8.4
INFO[0000] all outstanding components processed app_id=nodeapp instance=MBP2022.local scope=dapr.runtime type=log ver=1.8.4

== APP == Node App listening on port 3000!
INFO[0000] application discovered on port 3000 app_id=nodeapp instance=MBP2022.local scope=dapr.runtime type=log ver=1.8.4
WARN[0000] [DEPRECATION NOTICE] Adding a default content type to incoming service invocation requests is deprecated and will be removed in the future. See https://docs.dapr.io/operations/support/support-preview-features/ for more details. You can opt into the new behavior today by setting the configuration option `ServiceInvocation.NoDefaultContentType` to true. app_id=nodeapp instance=MBP2022.local scope=dapr.runtime type=log ver=1.8.4
INFO[0000] application configuration loaded app_id=nodeapp instance=MBP2022.local scope=dapr.runtime type=log ver=1.8.4
INFO[0000] actors: state store is not configured - this is okay for clients but services with hosted actors will fail to initialize! app_id=nodeapp instance=MBP2022.local scope=dapr.runtime type=log ver=1.8.4
INFO[0000] actor runtime started. actor idle timeout: 1h0m0s. actor scan interval: 30s app_id=nodeapp instance=MBP2022.local scope=dapr.runtime.actor type=log ver=1.8.4
INFO[0000] dapr initialized. Status: Running. Init Elapsed 326.57000000000005ms app_id=nodeapp instance=MBP2022.local scope=dapr.runtime type=log ver=1.8.4
INFO[0000] placement tables updated, version: 0 app_id=nodeapp instance=MBP2022.local scope=dapr.runtime.actor.internal.placement type=log ver=1.8.4
?? Updating metadata for app command: node app.js
? You're up and running! Both Dapr and your app logs will appear here.

啟動后我們可以使用 dapr list 來查看應用列表:

$ dapr list
APP ID HTTP PORT GRPC PORT APP PORT COMMAND AGE CREATED PID
nodeapp 3500 58744 3000 node app.js 11m 2022-09-27 15:13.46 5906

啟動完成后我們可以直接訪問應用的 getsecret 接口:

$ curl -k http://localhost:3000/getsecret

正常輸出結果是 YWJjZA==,也就是上面的 abcd 做了 base64 編碼后的值。

然后觀察應用的日志會出現類似于如下所示的內容:

== APP == Fetching URL: http://localhost:3500/v1.0/secrets/localsecretstore/mysecret?metadata.namespace=default
== APP == Base64 encoded secret is: YWJjZA==

測試完成后可以使用 dapr stop 命令來停止應用:

dapr stop --app-id nodeapp

Kubernetes 環境使用 Secrets

接下來我們來了解下在 Kubernetes 模式下 Dapr 是如何使用 Secrets store 的,當然首先需要在 Kubernetes 集群中安裝 Dapr 控制平面。

Dapr 可以使用許多不同的 secret stores 來解析 secrets 數據,比如 AWS Secret Manager、 Azure Key Vault、 GCP Secret Manager、 Kubernetes 等,我們這里可以直接使用 Kubernetes 的 Secret 對象進行演示。

首先講 secrets 數據添加到 ./mysecret 文件,比如你的密碼是 abcd,則 ./mysecret 文件內容應該就是 abcd。

然后基于 ./mysecret 文件創建一個 Kubernetes Secret 對象:

$ kubectl create secret generic mysecret --from-file ./mysecret

注意創建的 Secret 對象的名稱 mysecret,后面會使用到。

創建完成后我們可以查看下該對象中的數據是否符合預期:

$ kubectl get secret mysecret -o yaml
apiVersion: v1
data:
mysecret: YWJjZAo=
kind: Secret
metadata:
creationTimestamp: "2022-09-27T07:34:31Z"
name: mysecret
namespace: default
resourceVersion: "5133821"
uid: c9aa573c-5f71-439c-b482-748ac0fe3ae7
type: Opaque

接下來我們就可以部署 Node.js 應用到 Kubernetes 集群中,對應的資源清單文件如下所示:

kind: Service
apiVersion: v1
metadata:
name: nodeapp
labels:
app: node
spec:
selector:
app: node
ports:
- protocol: TCP
port: 80
targetPort: 3000
type: LoadBalancer
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nodeapp
labels:
app: node
spec:
selector:
matchLabels:
app: node
template:
metadata:
labels:
app: node
annotations:
dapr.io/enabled: "true"
dapr.io/app-id: "nodeapp"
dapr.io/app-port: "3000"
spec:
containers:
- name: node
image: ghcr.io/dapr/samples/secretstorenode:latest
env:
- name: SECRET_STORE
value: "kubernetes"
ports:
- containerPort: 3000
imagePullPolicy: Always

這里的核心重點是需要我們配置環境變量 SECRET_STORE,將其值設置為 kubernetes,這樣我們的應用就知道應該通過 Kubernetes 獲取 Secret 數據了。直接部署該應用即可:

$ kubectl apply -f deploy/node.yaml
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nodeapp-6cb5b689cf-vtn74 2/2 Running 0 92
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nodeapp LoadBalancer 10.101.216.73 192.168.0.50 80:32719/TCP 13d
nodeapp-dapr ClusterIP None <none> 80/TCP,50001/TCP,50002/TCP,9090/TCP 13d

部署完成后我們這里可以通過 192.168.0.50 這個 EXTERNAL-IP 訪問到應用:

curl -k http://192.168.0.50/getsecret

正常上面的請求輸出結果為 YWJjZAo=,也可以查看 Node 應用日志:

$ kubectl logs --selector=app=node -c node
Node App listening on port 3000!
Fetching URL: http://localhost:3500/v1.0/secrets/kubernetes/mysecret?metadata.namespace=default
Base64 encoded secret is: YWJjZAo=

從上面日志可以看出 Node 應用程序正在向 dapr 發出請求,以便從 secret store 獲取 secret 數據,注意其中的 mysecret 是上面創建的 Secret 對象名稱。

當然如果你使用的是其他 secret store,比如 HashiCorp Vault 則需要創建一個對應的 Component 組件了,類型為secretstores.hashicorp.vault,如下所示的資源清單:

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: vault
spec:
type: secretstores.hashicorp.vault
version: v1
metadata:
- name: vaultAddr
value: [vault_address]
- name: caCert
value: "[ca_cert]"
- name: caPath
value: "[path_to_ca_cert_file]"
- name: caPem
value : "[encoded_ca_cert_pem]"
- name: skipVerify
value : "[skip_tls_verification]"
- name: tlsServerName
value : "[tls_config_server_name]"
- name: vaultTokenMountPath
value : "[path_to_file_containing_token]"
- name: vaultToken
value : "[path_to_file_containing_token]"
- name: vaultKVPrefix
value : "[vault_prefix]"
- name: vaultKVUsePrefix
value: "[true/false]"
- name: enginePath
value: "secret"
- name: vaultValueType
value: "map"

對于其他 Dapr 支持的 secret store 的配置屬性可以參考官方文檔 https://docs.dapr.io/reference/components-reference/supported-secret-stores/ 了解相關信息。

責任編輯:姜華 來源: k8s技術圈
相關推薦

2022-09-21 21:50:18

Dapr消息隊列

2022-09-19 16:08:31

Dapr發布訂閱

2022-09-30 06:36:25

DaprFastHTTP

2010-08-02 09:36:22

Flex

2009-10-21 14:49:46

VB入門教程

2010-08-16 09:56:05

DivCSS

2011-09-02 14:29:20

jQuery Mobi主題

2009-10-21 18:09:12

VB入門教程

2014-12-31 10:54:44

DockerDocker Remo鏡像命令

2010-05-31 10:56:51

SVN服務器架設

2010-08-16 09:32:01

DivCSS

2010-08-16 10:10:11

DIV+CSS

2009-07-08 15:12:48

Java Servle

2014-05-26 15:35:55

Web組件Web Compone

2010-08-03 13:06:15

Flex Builde

2013-08-29 14:12:52

Storm分布式實時計算

2009-07-17 09:44:40

iBATIS教程

2011-09-02 10:59:10

jQuery Mobi

2013-06-24 13:38:34

HTML5 DataList

2018-03-22 14:59:13

Docker入門容器
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 午夜久久久久 | 91在线视频网址 | av在线一区二区 | 啪一啪在线视频 | 羞羞免费网站 | 久久精品视频网站 | 日一区二区 | 亚洲精品久久久9婷婷中文字幕 | 九九热在线观看视频 | 一级黄色av电影 | 久久久www成人免费无遮挡大片 | 国产亚洲精品综合一区 | 日韩精品一 | 成人在线精品视频 | 亚洲一区二区在线 | 黄色一级免费观看 | 亚洲三级在线 | 丁香综合| 玖玖视频免费 | 色综合中文 | 九九热这里 | 欧美成人一区二区三区片免费 | 在线亚洲欧美 | 免费的网站www | 日日夜夜天天干 | www性色| 久久精品视频免费观看 | 日韩一区二区三区精品 | 五月天综合网 | 亚洲精品91 | 四虎伊人| 日韩中文字幕在线观看 | 一级美国黄色片 | 久久成人精品视频 | 一级中国毛片 | 亚洲自拍偷拍欧美 | 免费毛片网站 | 亚洲精品视频在线播放 | 国产精品爱久久久久久久 | 久久久久免费精品国产小说色大师 | 成人精品一区二区三区四区 |