Dapr + .NET 实战(十-终篇)K8S运行Dapr
工作原理
為了實(shí)現(xiàn)在k8s上安裝Dapr,Dapr需要部署dapr-sidecar-injector、dapr-operator、dapr-placement和dapr-sentry服務(wù)。?
dapr-operator: 管理組件(state stores, pub/subs, etc.)
dapr-sidecar-injector:?將 Dapr 注入?annotated?pods,并添加環(huán)境變量?DAPR_HTTP_PORT?和?DAPR_GRPC_PORT,以使用戶定義的應(yīng)用程序能夠輕松地與 Dapr Sidecar通信,而無需硬編碼 Dapr 端口值。
dapr-placement:?將 actor 實(shí)例映射到 pods。
dapr-sentry:?管理服務(wù)之間的mTLS并作為證書頒發(fā)機(jī)構(gòu)。?
2.安裝K8s集群
通常使用以下方法本地安裝的K8S集群
k8s-for-docker-desktop
kubeadm
我本地已經(jīng)安裝好了這兩種,這次使用kubeadm 1.20版本演示dapr
?3.將Frontend和Backend build成docker Image
vs中分別右擊Frontend和Backend,添加Docker支持,即可生成對應(yīng)的Dockerfile,修改暴露端口
#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS base WORKDIR /app EXPOSE 5001FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build WORKDIR /src COPY ["FrontEnd/FrontEnd.csproj", "FrontEnd/"] RUN dotnet restore "FrontEnd/FrontEnd.csproj" COPY . . WORKDIR "/src/FrontEnd" RUN dotnet build "FrontEnd.csproj" -c Release -o /app/buildFROM build AS publish RUN dotnet publish "FrontEnd.csproj" -c Release -o /app/publishFROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "FrontEnd.dll"]#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS base WORKDIR /app EXPOSE 5000FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build WORKDIR /src COPY ["BackEnd/BackEnd.csproj", "BackEnd/"] RUN dotnet restore "BackEnd/BackEnd.csproj" COPY . . WORKDIR "/src/BackEnd" RUN dotnet build "BackEnd.csproj" -c Release -o /app/buildFROM build AS publish RUN dotnet publish "BackEnd.csproj" -c Release -o /app/publishFROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "BackEnd.dll"]通過以下命令Build Image
docker build -t frontend -f ./FrontEnd/Dockerfile .docker build -t backend -f ./BackEnd/Dockerfile .4.將Docker Image推送到倉庫
我使用阿里云私有倉庫來上傳鏡像,創(chuàng)建frontend和backend兩個(gè)庫
?按照以下提示步驟將frontend和backend Image上傳到指定庫
?5.讓k8s使用私有倉庫拉取鏡像
k8s主節(jié)點(diǎn)登錄阿里云私庫?
docker login --username=xxx registry.cn-beijing.aliyuncs.comdocker登錄之后,會把密鑰存到一個(gè)配置文件,通過下面命令拿到base64編碼信息
cat ~/.docker/config.json | base64新建ali-docker-repo.yaml,.dockerconfigjson就是上一步得到的base64
[root@k8s-master dapr-demo]# cat ali-docker-repo.yaml apiVersion: v1 kind: Secret metadata:name: ali-key type: kubernetes.io/dockerconfigjson data:.dockerconfigjson: ewoJImF1dGhzIjogewoJCSJyZWdpc3RyeS5jbi1iZWlqaW5nLmFsaXl1bmNzLmNvbSI6IHs..............apply secret
[root@k8s-master dapr-demo]# kubectl apply -f ali-docker-repo.yaml6.安裝Dapr CLI
下面命令將DaprCLI安裝到 /usr/local/bin
wget -q https://raw.githubusercontent.com/dapr/cli/master/install/install.sh -O - | /bin/bash7.驗(yàn)證Dapr CLI
dapr?8.初始化Dapr
首先,請確保你的機(jī)器已經(jīng)安裝了?Helm 3?。
然后,添加 Helm 庫并更新
helm repo add dapr https://dapr.github.io/helm-charts/ helm repo update # See which chart versions are available helm search repo dapr --devel --versions將 Dapr 圖表安裝在你的集群的?dapr-system命名空間中。
helm upgrade --install dapr dapr/dapr \ --version=1.2 \ --namespace dapr-system \ --create-namespace \ --wait驗(yàn)證安裝
[root@k8s-master dapr-demo]# kubectl get pods --namespace dapr-system NAME READY STATUS RESTARTS AGE dapr-dashboard-58b4647996-828n8 1/1 Running 2 9d dapr-operator-85bdd7d89d-5d8dw 1/1 Running 19 9d dapr-placement-server-0 1/1 Running 3 9d dapr-sentry-76bfc5f7c7-vn2qt 1/1 Running 2 9d dapr-sidecar-injector-786645f444-dmzm7 1/1 Running 2 9d?9.配置狀態(tài)存儲和訂閱發(fā)布組件
我們?nèi)匀煌ㄟ^helm安裝redis,因?yàn)閞edis是statefulset,因此需要先把redis依賴的storageclass和pv創(chuàng)建好
新建redis-storage-class.yaml
[root@k8s-master dapr-demo]# cat redis-storage-class.yaml kind: StorageClass apiVersion: storage.k8s.io/v1 metadata:name: local-storage-redis provisioner: kubernetes.io/no-provisioner volumeBindingMode: WaitForFirstConsumerapply storageclass
[root@k8s-master dapr-demo]# kubectl apply -f redis-storage-class.yaml由于我們即將安裝的redis,使用默認(rèn)的storageclass,我們需要把我們剛剛新建的storageclass置為默認(rèn)
kubectl patch storageclass local-storage-redis -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'因?yàn)槲覀兗磳惭b的redis集群有四個(gè)節(jié)點(diǎn),我們需新建四個(gè)pv,新建文件redis-pv.yaml
apiVersion: v1 kind: PersistentVolume metadata:name: local-pv-redis spec:capacity:storage: 8Gi# volumeMode field requires BlockVolume Alpha feature gate to be enabled.volumeMode: FilesystemaccessModes:- ReadWriteOncestorageClassName: local-storage-redispersistentVolumeReclaimPolicy: Retainlocal:path: /local-storage/redisnodeAffinity:required:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- k8s-node1--- apiVersion: v1 kind: PersistentVolume metadata:name: local-pv-redis2 spec:capacity:storage: 8Gi# volumeMode field requires BlockVolume Alpha feature gate to be enabled.volumeMode: FilesystemaccessModes:- ReadWriteOncestorageClassName: local-storage-redispersistentVolumeReclaimPolicy: Retainlocal:path: /local-storage/redisnodeAffinity:required:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- k8s-node1--- apiVersion: v1 kind: PersistentVolume metadata:name: local-pv-redis3 spec:capacity:storage: 8Gi# volumeMode field requires BlockVolume Alpha feature gate to be enabled.volumeMode: FilesystemaccessModes:- ReadWriteOncestorageClassName: local-storage-redispersistentVolumeReclaimPolicy: Retainlocal:path: /local-storage/redisnodeAffinity:required:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- k8s-node1--- apiVersion: v1 kind: PersistentVolume metadata:name: local-pv-redis4 spec:capacity:storage: 8Gi# volumeMode field requires BlockVolume Alpha feature gate to be enabled.volumeMode: FilesystemaccessModes:- ReadWriteOncestorageClassName: local-storage-redispersistentVolumeReclaimPolicy: Retainlocal:path: /local-storage/redisnodeAffinity:required:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- k8s-node1因?yàn)槲覀冎付怂膫€(gè)pv調(diào)度在k8s-node1上,所以需要去node1上新建掛載目錄/local-storage/redis
mkdir /local-storage cd /local-storage mkdir /redisapply pv
kubectl apply -f redis-pv.yaml安裝redis到集群
helm repo add bitnami https://charts.bitnami.com/bitnami helm repo update helm install redis bitnami/redis查看redis pod
[root@k8s-master dapr-demo]# kubectl get pod redis-master-0 1/1 Running 0 141m redis-replicas-0 1/1 Running 0 141m redis-replicas-1 1/1 Running 0 141m redis-replicas-2 1/1 Running 0 140m創(chuàng)建storestate組件,新建redis-state.yaml
[root@k8s-master dapr-demo]# cat redis-state.yaml apiVersion: dapr.io/v1alpha1 kind: Component metadata:name: statestorenamespace: default spec:type: state.redisversion: v1metadata:- name: redisHostvalue: redis-master.default.svc.cluster.local:6379- name: redisPasswordsecretKeyRef:name: rediskey: redis-password- name: actorStateStorevalue: "true"新建pubsub組件
[root@k8s-master dapr-demo]# cat redis-pubsub.yaml apiVersion: dapr.io/v1alpha1 kind: Component metadata:name: pubsubnamespace: default spec:type: pubsub.redisversion: v1metadata:- name: redisHostvalue: redis-master.default.svc.cluster.local:6379- name: redisPasswordsecretKeyRef:name: rediskey: redis-passwordapply statestore和pubsub
kubectl apply -f redis-state.yaml kubectl apply -f redis-pubsub.yaml驗(yàn)證
[root@k8s-master dapr-demo]# kubectl get component.dapr.io NAME AGE pubsub 135m statestore 135m10.分別為frontend和backend新建deployment
在 Kubernetes 集群中部署和運(yùn)行啟用 Dapr 的應(yīng)用程序非常簡單,只需向 deployment 方案添加一些annotations
[root@k8s-master dapr-demo]# cat frontend.yaml apiVersion: apps/v1 kind: Deployment metadata:name: frontendlabels:app: frontend spec:replicas: 1selector:matchLabels:app: frontendtemplate:metadata:labels:app: frontendannotations:dapr.io/enabled: "true"dapr.io/app-id: "frontend"dapr.io/app-port: "5001"spec:imagePullSecrets:- name: ali-keycontainers:- name: frontendimage: registry.cn-beijing.aliyuncs.com/chester-dapr/frontend:latestports:- containerPort: 5001imagePullPolicy: Always[root@k8s-master dapr-demo]# cat backend.yaml apiVersion: apps/v1 kind: Deployment metadata:name: backendlabels:app: backend spec:replicas: 1selector:matchLabels:app: backendtemplate:metadata:labels:app: backendannotations:dapr.io/enabled: "true"dapr.io/app-id: "backend"dapr.io/app-port: "5000"spec:imagePullSecrets:- name: ali-keycontainers:- name: backendimage: registry.cn-beijing.aliyuncs.com/chester-dapr/backend:latestports:- containerPort: 5000imagePullPolicy: Always分別apply backend和frontend?
[root@k8s-master dapr-demo]# kubectl apply -f frontend.yaml [root@k8s-master dapr-demo]# kubectl apply -f backend.yaml查看pod
[root@k8s-master dapr-demo]# kubectl get pod NAME READY STATUS RESTARTS AGE backend-7fff74f544-f6xms 2/2 Running 0 134m frontend-5c479c9948-tmz5k 2/2 Running 0 99m redis-master-0 1/1 Running 0 147m redis-replicas-0 1/1 Running 0 147m redis-replicas-1 1/1 Running 0 146m redis-replicas-2 1/1 Running 0 146m11.驗(yàn)證
為frontend創(chuàng)建service
[root@k8s-master dapr-demo]# cat frontend-service.yaml apiVersion: v1 kind: Service metadata:name: frontend-svc spec:type: NodePortselector:app: frontendports:- port: 5001targetPort: 5001nodePort: 31111采用nodeport方式暴露31111端口,apply service
kubectl apply -f frontend-service.yaml訪問http://192.168.43.150:31111/Dapr,其中192.168.43.150是宿主機(jī)ip,結(jié)果顯示訪問成功,k8s部署dapr成功
?最后:整個(gè)教程的源碼
https://github.com/cysnet/dapr-aspnetcore-demo
相關(guān)文章:Dapr實(shí)戰(zhàn)(一) 基礎(chǔ)概念與環(huán)境搭建
Dapr + .NET Core實(shí)戰(zhàn)(二) 服務(wù)調(diào)用
Dapr + .NET Core實(shí)戰(zhàn)(三)狀態(tài)管理
Dapr + .NET 實(shí)戰(zhàn)(四)發(fā)布和訂閱
Dapr + .NET 實(shí)戰(zhàn)(五)Actor
Dapr + .NET 實(shí)戰(zhàn)(六)綁定
Dapr + .NET 實(shí)戰(zhàn)(七)Secrets
Dapr + .NET 實(shí)戰(zhàn)(八)服務(wù)監(jiān)測
Dapr + .NET 實(shí)戰(zhàn)(九)本地調(diào)試
為什么 Dapr 如此令人興奮
總結(jié)
以上是生活随笔為你收集整理的Dapr + .NET 实战(十-终篇)K8S运行Dapr的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Serverless 落地实践
- 下一篇: asp.net ajax控件工具集 Au