最近,我嘗試在 docker 桌面上運行的本地托管 Kubernetes 實體上對 Blazor 服務器應用程式進行測驗部署。
我設法在容器中正確啟動應用程式,應用了遷移等,日志告訴我應用程式正在運行并等待:
[17:54:39 INF] 啟動...
[17:54:39 WRN] 將密鑰存盤在目錄“/root/.aspnet/DataProtection-Keys”中,該目錄可能不會保留在容器外部。當容器被銷毀時,受保護的資料將不可用。
[17:54:40 WRN] 未配置 XML 加密器。密鑰 {9d879e73-4b80-4e63-8761-7ad2922164a0} 可以以未加密的形式保存在存盤中。
[17:54:40 INF] AuthorizationPolicy 配置開始......
[17:54:40 INF] 策略“LocationMustBeSady”配置成功。
[17:54:40 INF] AuthorizationPolicy 配置完成。
[17:54:41 INF] 現在收聽:http://[::]:80
[17:54:41 INF] 應用程式啟動。按 Ctrl C 關閉。
[17:54:41 INF] 托管環境:生產
[17:54:41 INF] 內容根路徑:/app
該問題通過地址設定為所述應用是,當我試圖從本地機器連接hosts檔案(127.0.0.1 scp.com)
我目前的設定如下:
應用程式 Dockerfile(構建良好):
# https://hub.docker.com/_/microsoft-dotnet
FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /source
EXPOSE 5000
EXPOSE 5001
EXPOSE 5005
EXPOSE 80
EXPOSE 443
ENV ASPNETCORE_ENVIRONMENT="docker"
LABEL name="ScanApp"
# copy csproj and restore as distinct layers
COPY ScanApp/*.csproj ScanApp/
COPY ScanApp.Application/*.csproj ScanApp.Application/
COPY ScanApp.Common/*.csproj ScanApp.Common/
COPY ScanApp.Domain/*.csproj ScanApp.Domain/
COPY ScanApp.Infrastructure/*.csproj ScanApp.Infrastructure/
COPY ScanApp.Tests/*.csproj ScanApp.Tests/
RUN dotnet restore ScanApp/ScanApp.csproj
# copy and build app and libraries
COPY ScanApp/ ScanApp/
COPY ScanApp.Application/ ScanApp.Application/
COPY ScanApp.Common/ ScanApp.Common/
COPY ScanApp.Domain/ ScanApp.Domain/
COPY ScanApp.Infrastructure/ ScanApp.Infrastructure/
COPY ScanApp.Tests/ ScanApp.Tests/
WORKDIR /source/ScanApp
RUN dotnet build -c release --no-restore
# test stage -- exposes optional entrypoint
# target entrypoint with: docker build --target test
FROM build AS test
WORKDIR /source/ScanApp.Tests
COPY tests/ .
ENTRYPOINT ["dotnet", "test", "--logger:trx"]
FROM build AS publish
RUN dotnet publish -c release --no-build -o /app
# final stage/image
# FROM mcr.microsoft.com/dotnet/runtime:5.0
FROM mcr.microsoft.com/dotnet/aspnet:5.0
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "ScanApp.dll"]
所述應用程式的 Kubernetes 部署和集群 ip - scanapp-depl.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: scanapp-depl
spec:
replicas: 1
selector:
matchLabels:
app: scanapp
template:
metadata:
labels:
app: scanapp
spec:
containers:
- name: scanapp
image: scanapp:1.0
---
apiVersion: v1
kind: Service
metadata:
name: scanapp-clusterip-srv
spec:
type: ClusterIP
selector:
app: scanapp
ports:
- name: ui
protocol: TCP
port: 8080
targetPort: 80
- name: ui2
protocol: TCP
port: 8081
targetPort: 443
- name: scanapp0
protocol: TCP
port: 5000
targetPort: 5000
- name: scanapp1
protocol: TCP
port: 5001
targetPort: 5001
- name: scanapp5
protocol: TCP
port: 5005
targetPort: 5005
NodePort 配置 - scanapp-np-srv.yaml
apiVersion: v1
kind: Service
metadata:
name: scanappnpservice-srv
spec:
type: NodePort
selector:
app: scanapp
ports:
- name: ui
port: 8080
targetPort: 80
- name: scanapp0
protocol: TCP
port: 5000
targetPort: 5000
- name: scanapp1
protocol: TCP
port: 5001
targetPort: 5001
- name: scanapp5
protocol: TCP
port: 5005
targetPort: 5005
入口配置 - ingress-srv.yaml:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-srv
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/affinity: "cookie"
nginx.ingress.kubernetes.io/session-cookie-name: "affinity"
nginx.ingress.kubernetes.io/session-cookie-expires: "14400"
nginx.ingress.kubernetes.io/session-cookie-max-age: "14400"
spec:
rules:
- host: scp.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: scanapp-clusterip-srv
port:
number: 8080
此外,還努力與群集IP和負載平衡器SQL Server的配置:
apiVersion: apps/v1
kind: Deployment
metadata:
name: mssql-depl
spec:
replicas: 1
selector:
matchLabels:
app: mssql
template:
metadata:
labels:
app: mssql
spec:
containers:
- name: mssql
image: mcr.microsoft.com/mssql/server:2019-latest
ports:
- containerPort: 1433
env:
- name: MSSQL_PID
value: "Express"
- name: ACCEPT_EULA
value: "Y"
- name: SA_PASSWORD
valueFrom:
secretKeyRef:
name: mssql
key: SA_PASSWORD
volumeMounts:
- mountPath: /var/opt/mssql/data
name: mssqldb
volumes:
- name: mssqldb
persistentVolumeClaim:
claimName: mssql-claim
---
apiVersion: v1
kind: Service
metadata:
name: mssql-clusterip-srv
spec:
type: ClusterIP
selector:
app: mssql
ports:
- name: mssql
protocol: TCP
port: 1433
targetPort: 1433
---
apiVersion: v1
kind: Service
metadata:
name: mssql-loadbalancer
spec:
type: LoadBalancer
selector:
app: mssql
ports:
- protocol: TCP
port: 1433
targetPort: 1433
如開頭所述 - 出于對所有人的熱愛,我無法從瀏覽器進入我的 blazor 應用程式 - 我試過了
- scp.com
- scp.com:8080
- scp.com:5000
- scp.com:5001
- scp.com:5005
Nothing seems to work, so there must be something wrong with my config files and I have no idea what could it be.
And just to be precise, additional details:
Docker desktop is running along with Kubernetes
kubectl get ingress output:
| NAME | CLASS | HOSTS | ADDRESS | PORTS | AGE |
|---|---|---|---|---|---|
| ingress-srv | scp.com | localhost | 80 | 3h58m |
kubectl get pods output:
| NAME | READY | STATUS | RESTARTS | AGE |
|---|---|---|---|---|
| mssql-depl-7f46b5c696-nc6cw | 1/1 | Running | 0 | 157m |
| scanapp-depl-76f56bc6df-nstfd | 1/1 | Running | 0 | 73m |
kubectl get deployments output
| NAME | READY | UP-TO-DATE | AVAILABLE | AGE |
|---|---|---|---|---|
| mssql-depl | 1/1 | 1 | 1 | 171m |
| scanapp-depl | 1/1 | 1 | 1 | 75m |
kubectl get services output:
| NAME | TYPE | CLUSTER-IP | EXTERNAL-IP | PORT(S) | AGE |
|---|---|---|---|---|---|
| kubernetes | ClusterIP | 10.96.0.1 | 443/TCP | 28d | |
| mssql-clusterip-srv | ClusterIP | 10.111.202.104 | 1433/TCP | 3h | |
| mssql-loadbalancer | LoadBalancer | 10.110.249.54 | localhost | 1433:30786/TCP | 3h |
| scanapp-clusterip-srv | ClusterIP | 10.97.75.150 | 8080/TCP,8081/TCP,5000/TCP,5001/TCP,5005/TCP | 4h33m | |
| scanappnpservice-srv | NodePort | 10.103.33.184 | 8080:32119/TCP | 4h46m |
uj5u.com熱心網友回復:
我解決了這個問題,或者至少我是這么認為的。
除了@moonkotte建議添加ingressClassName: nginx到ingress-srv.yaml我還更改了入口埠配置,以便它80現在指向埠。
由于這些更改使用scp.comnow 正確打開我的應用程式。此外,使用 NodePort 訪問,我可以使用 訪問我的應用程式localhost:30080,其中 30080 埠是自動設定的(我nodePort從 中洗掉了配置行scanapp-np-srv.yaml)
ingress-srv.yaml如果clusterIp配置狀態將埠設定8080為目標埠,為什么必須將埠設定為 80 80- 我不知道,我不完全了解 Kubernetes 配置的內部作業原理 -非常歡迎所有解釋。
主要組態檔的當前狀態:
ingress-srv.yaml:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-srv
annotations:
nginx.ingress.kubernetes.io/affinity: "cookie"
nginx.ingress.kubernetes.io/session-cookie-name: "affinity"
nginx.ingress.kubernetes.io/session-cookie-expires: "14400"
nginx.ingress.kubernetes.io/session-cookie-max-age: "14400"
spec:
ingressClassName: nginx
rules:
- host: scp.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: scanapp-clusterip-srv
port:
number: 80
scanapp-np-srv.yaml:
apiVersion: v1
kind: Service
metadata:
name: scanappnpservice-srv
spec:
type: NodePort
selector:
app: scanapp
ports:
- name: ui
port: 8080
targetPort: 80
- name: scanapp0
protocol: TCP
port: 5000
targetPort: 5000
- name: scanapp1
protocol: TCP
port: 5001
targetPort: 5001
- name: scanapp5
protocol: TCP
port: 5005
targetPort: 5005
scanapp-depl.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: scanapp-depl
spec:
replicas: 1
selector:
matchLabels:
app: scanapp
template:
metadata:
labels:
app: scanapp
spec:
containers:
- name: scanapp
image: scanapp:1.0
---
apiVersion: v1
kind: Service
metadata:
name: scanapp-clusterip-srv
spec:
type: ClusterIP
selector:
app: scanapp
ports:
- name: ui
protocol: TCP
port: 8080
targetPort: 80
- name: ui2
protocol: TCP
port: 8081
targetPort: 443
- name: scanapp0
protocol: TCP
port: 5000
targetPort: 5000
- name: scanapp1
protocol: TCP
port: 5001
targetPort: 5001
- name: scanapp5
protocol: TCP
port: 5005
targetPort: 5005
其余檔案保持不變。
uj5u.com熱心網友回復:
首先,您不需要NodePort服務,只需要一個ClusterIP. 如果您想直接訪問服務而不通過入口控制器,則使用節點埠。
如果你想用 a 測驗這個NodePort,你需要定義一個,例如
- name: ui
port: 8080
targetPort: 80
nodePort: 38080 # needs to be higher than 30000
但是看看你的入口規則似乎有點不對勁。我會嘗試以下方法:
spec:
rules:
- host: scp.com
http:
paths:
- path: /
backend:
serviceName: scanapp-clusterip-srv
servicePort: ui
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/369250.html
標籤:c# docker kubernetes yaml blazor
