我正試圖為dotnet物體框架設定一個資料庫遷移作業。 似乎我不能從kubernetes作業中連接到mysql資料庫服務,但當我轉發埠時,我可以從我的桌面上連接。
這是我的作業MySql部署 服務:
kind: Service
元資料:
name: mysql[/span
規格:
ports:
- port: 3306
targetPort: 3306
選擇器:
應用程式: mysql
型別: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata: Deployment
名稱: mysql
規格:
選擇器:
matchLabels:/span>
應用程式: mysql
戰略:
型別: Recreate
模板:
metadata: metadata:
標簽:/span>
應用程式: mysql
規格:
容器:
- image:mysql:8.0
name: mysql
env:
- name: MYSQL_DATABASE
值: myDatabase
- name: MYSQL_USER
value: myUser
- name: MYSQL_PASSWORD
值: myPassword
- name: MYSQL_ROOT_PASSWORD
值: myRootPassword
埠:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
卷軸:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-pv-claim
為了簡潔起見,我沒有粘貼持久性卷索賠。
這樣做是有效的,因為我在做完之后能夠從我的桌面連接到mysql。
kubectl port-forward deployment/mysql 3306:3306并通過MySQL Workbench連接。
我不能做的是,從使用Dockerfile的作業中運行遷移,該作業有C#資料庫專案和dbContext,以便運行db遷移。
該作業:
apiVersion: batch/v1
kind: Job
metadata: Job
name: candles-downloader-db-migration
規格:
backoffLimit: 0
template:
規格:
容器:
- name: candles-service-migration
image: migration
imagePullPolicy: never
env:
- name:CONNECTION_STRING
value: server=mysql.default.svc.cluster.local:3306;uid=myUser;pwd=myPassword;資料庫=myDatabase
restartPolicy: Never
正如你所看到的,我通過環境變數CONNECTION_STRING傳遞連接字串
。然后是作業的Dockerfile:
FROM mcr.microsoft. com/dotnet/sdk:5.0 AS build-env
RUN dotnet工具安裝--global dotnet-ef --version 5.0.9
ENV PATH $PATH:/root/.dotnet/tools
作業目錄 /app
復制 csproj 和恢復作為 分明層
COPY *.csproj 。
RUN dotnet restore
復制一切 else and build
COPY ./ .
ENTRYPOINT dotnet ef database update -V --connection $CONNECTION_STRING
我已經在我的minikube集群上構建了影像。 當作業啟動時,dockerfile容器會獲得連接字串。為了進行除錯,我使用了-v標志,以獲得粗略的輸出。
下面是失敗的作業的輸出(為簡潔起見,截斷了不重要的部分)。kubectl logs candles-downloader-db-migration-gqndm
尋找IDesignTimeServices的實作 在裝配 'Infrastructure.Persistence.Sql' 。
沒有發現設計-時間服務。
使用資料庫'myDatabase' 在服務器'mysql進行遷移。 default.svc.cluster.local:3306' 。
'CandlesServiceDbContext'被處置。
System.InvalidOperationException。出現了一個例外,可能是對一個瞬時故障造成的。考慮通過添加'EnableRetryOnFailure()' 到'UseMySql'呼叫來啟用瞬時錯誤彈性。
---> MySql.Data.MySqlClient.MySqlException (0x80004005): 無法連接到任何指定的MySQL主機.。
我懷疑是連接字串的問題。
我使用了server=mysql.default.svc.cluster.local:3306;uid=myUser;pwd=myPassword;database=myDatabase。
但我也試過用不同的服務器值:
mysql.default.svc.cluster.local:3306。
mysql.default.cluster.local:3306<
mysql.svc.cluster.local:3306<
mysql:3306。
- 甚至我的mysql服務的本地集群ip
10.97.213.180:3306
他們都沒有作業。我總是在作業日志中得到這個錯誤:
無法連接到任何指定的MySQL主機。
我在不同 pod 上的作業/容器是否應該通過 kubernetes 服務看到其他 pod 上的 mysql 服務器?我想是的,但看起來它是 "不可見的"。
uj5u.com熱心網友回復:
我在閱讀了kubernetes檔案后想明白了。 https://kubernetes.io/docs/tasks/administer-cluster/dns-debugging-resolution/
我已經用以下命令安裝了DNS utils。
kubectl apply -f https://k8s.io/examples/admin/dns/dnsutils.yaml
然后我能夠測驗我的'mysql'服務是否可以通過名字發現。
kubectl exec -i -t dnsutils -- nslookup mysql
并且它是。輸出結果是:
Server: 10.960.10
地址: 10.96.0.10#53
Name: mysql.default.svc.cluster.local
地址: 10.97.213.180
但是在指定了帶有埠的名稱后,失敗了。
kubectl exec -i -t dnsutils -- nslookup mysql:3306
Server: 10.96.0.10。
地址: 10.96.0.10#53。
**服務器不能找不到mysql:3306。NXDOMAIN
命令被終止 with exit 代碼 1
因此,正如我所預期的,錯誤在連接字串中。 我不得不從
改變server=mysql:3306; .../span>
to
server=mysql;port=3306; ...
而我的遷移在作業中運行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/309857.html
標籤:
