当前位置: 首页 > 知识库问答 >
问题:

将blazor服务器应用程序部署到Kubernetes时出现问题

於德馨
2023-03-14

最近,我试图做一个测试部署的Blazor服务器应用程序在本地托管的库伯内特斯实例运行在docker桌面。

我设法在容器中正确启动了应用程序,应用了迁移等,日志告诉我应用程序正在运行并等待。

使用Docker桌面中的< code > Reset Kubernetes k luster 重置Kubernetes后采取的步骤:

>

  • 修改<code>hosts</code>文件以包含<code>127.0.0.1 scp.com</code>

    向 mssql 添加了包含密钥的机密

    使用 kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.0/deploy/static/provider/cloud/deploy.yaml 安装 Ngnix 控制器

    应用的本地卷声明 - local-pvc.yaml

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
        name: mssql-claim
    spec:
        accessModes:
            - ReadWriteMany
        resources:
            requests:
                storage: 250Mi
    

    应用了mssql实例和集群ip-mssql scanapp depl.yaml

    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应用程序和集群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
    

    应用的Ingress-< code > 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:
      ingressClassName: nginx
      rules:
          - host: scp.com
            http:
                paths:
                - path: /
                  pathType: Prefix
                  backend:
                    service:
                      name: scanapp-clusterip-srv
                      port:
                        number: 8080
    

    所有这些之后,Blazor应用程序开始运行良好,连接到mssql实例,种子数据库并等待客户端。日志如下:

    [15:18:53 INF]正在启动…
    [15:18:53WRN]将密钥存储在目录'/root/中。“aspnet/DataProtection Keys”,可能无法在容器外部持久化。当容器被销毁时,受保护的数据将不可用
    [15:18:55 INF]AuthorizationPolicy Configuration started…
    [15:18:55 INF]Policy'LocationMustBeSady'已成功配置。[15:18:55 INF]授权策略配置完成。[15:18:55 INF]现在正在收听:http://[::]:80[15:18:55INF]应用程序已启动。按Ctrl C关闭。[15:18:55 INF]托管环境:docker[15:18:55INF]内容根路径:/app

    • scp。com
    • scp。com:8080
    • scp。com:5000
    • scp。网址:5001
    • scp.com:5005

    此外,< code>kubectl get ingress现在不像以前那样显示地址值,并且< code>kubectl get services现在在本文末尾显示< code>mssql-loadbalancer和< code > ingress-nginx-controller EXTERNAL-IP-detailed日志待定

    似乎没有任何效果,所以我的配置文件一定有问题,我不知道会是什么。另请注意,这次没有配置 NodePort

    此外,Dockerfile for Blazor 应用:

        # 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
        
        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 ln -sf /usr/share/zoneinfo/posix/Europe/Warsaw /etc/localtime
        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/aspnet:5.0
        WORKDIR /app
        COPY --from=publish /app .
        ENV ASPNETCORE_ENVIRONMENT="docker"
        ENTRYPOINT ["dotnet", "ScanApp.dll"]
    

    kubectl获取入口输出:



    kubectl get pods --all-namespaces output:



    kubectl获取部署--所有命名空间输出



    kubectl获取服务--all-namesspace输出:

    NGINX入口控制器

    版本:v1.1.0

    构建: cacbee86b6ccc45bde8ffc184521bed3022e7dee

    存储库:https://github.com/kubernetes/ingress-nginx

    ngin x版本:ngin x/1.19.9

    W1129 15:00:51.705331 8 client_config.go:615] 既没有指定 --kubeconfig 也没有指定 --master。使用 inClusterConfig。这可能行不通。

    I1129 15:00:51.705452 8main.go:223]"创建API客户端"host="https://10.96.0.1:443"

    I1129 15:00:51.721575 8主。go:267]“在Kubernetes集群中运行”major=“1”minor=“21”git=“v121.5”state=“clean”commit=“aea7bbadd2fc0d689de94a54e5b7b758869d691”platform=“linux/amd64”

    I 1129 15:00:51.872964 8 main . go:104]" SSL假证书已创建" file = "/etc/ingress-controller/SSL/default-fake-certificate . PEM "

    I1129 15:00:51.890273 8ssl.go:531]"加载tls证书"路径="/usr/本地/证书/证书"key="/usr/本地/证书/密钥"

    I1129 15:00:51.910104 8发动机。go:255]“启动NGINX入口控制器”

    I1129 15:00:51.920821 8 event.go:282] 事件(v1.ObjectReference{Kind:“ConfigMap”, Namespace:“ingress-nginx”, Name:“ingress-nginx-controller”, UID:“51060a85-d3a0-40de-b549-cf59e8fa7b08”, APIVersion:“v1”, ResourceVersion:“733”, FieldPath:“”}): type: 'Normal' 原因: 'CREATE' ConfigMap ingress-nginx/ingress-nginx-controller

    I 1129 15:00:53.112043 8 nginx . go:297]"正在启动NGINX进程"

    I1129 15:00:53.112213 8领导人选举。go:248]试图获取leader租约ingress nginx/ingress控制器leader。。。

    I 1129 15:00:53.112275 8 nginx . go:317]"开始验证web hook " address = ":8443 " cert path = "/usr/local/certificates/cert " key path = "/usr/local/certificates/key "

    I 1129 15:00:53.112468 8 controller . go:155]"检测到配置更改,需要后端重新加载"

    I1129 15:00:53.118295 8领导人选举。go:258]成功获得租赁ingress nginx/ingress控制器领导者

    I1129 15:00:53.119467 8状态。go:84]“新领导人当选”identity=“ingress-nginx-controller-54bfb9bb-f6gsf”

    I1129 15:00:53.141609 8controller.go:172]"后端重新加载成功"

    I1129 15:00:53.141804 8控制器。go:183]“初始同步,Hibernate1秒”

    I1129 15:00:53.141908 8 event.go:282] 事件(v1.ObjectReference{Kind:“Pod”, Namespace:“ingress-nginx”, Name:“ingress-nginx-controller-54bfb9bb-f6gsf”, UID:“54e0c0c6-40ea-439e-b1a2-7787f1b37e7a”, APIVersion:“v1”, ResourceVersion:“766”, FieldPath:“}): 类型:”正常“原因:”重新加载“ 由于配置更改而触发的 NGINX 重新加载

    I1129 15:04:25.107359 8admission.go:149]通过准入控制器处理的入口{testedIngres长度: 1 testedIngresTime: 0.022s renderingIngresL的长度: 1 renderingIngresTime: 0受理时间: 17.9kBs testedConfiguration大小: 0.022}

    I1129 15:04:25.107395 8main.go:101]"成功验证配置,接受"ingress-srv/默认"

    I 1129 15:04:25.110109 8 store . go:424]"找到有效的Ingres class " ingress = " default/ingress-SRV " Ingres class = " nginx "

    I1129 15:04:25.110698 8 controller.go:155] “检测到配置更改,需要重新加载后端”

    I1129 15:04:25.111057 8 event.go:282] 事件(v1.ObjectReference{Kind:“Ingress”, Namespace:“default”, Name:“ingress-srv”, UID:“6c15d014-ac14-404e-8b5e-d8526736c52a”, APIVersion:“networking.k8s.io/v1”, ResourceVersion:“1198”, FieldPath:“}): 类型:”正常“ 原因:”同步“ 计划同步

    I1129 15:04:25.143417 8控制器。go:172]“后端已成功重新加载”

    I1129 15:04:25.43767 8事件。go:282]事件(v1.ObjectReference{Kind:“Pod”,命名空间:“ingress nginx”,名称:“ingress-nginx-controller-54bfb9bb-f6gsf”,UID:“54e0c0c6-40ea-439e-b1a2-7787f1b37e7a”,APIVersion:“v1”,ResourceVersion:“766”,FieldPath:“”}):类型:“正常”原因:由于配置更改而触发“RELOAD”nginx重新加载

    I1129 15:06:11.447313 8admission.go:149]通过准入控制器处理的入口{testedIngres长度: 1 testedIngresTime: 0.02s renderingIngresL的长度: 1 renderingIngresTime: 0受理时间: 17.9kBs testedConfiguration大小: 0.02}

    I1129 15:06:11.447349 8 main.go:101] “已成功验证配置,正在接受” 入口=“入口-SRV/默认值”

    I1129 15:06:11.449266 8 event.go:282] 事件(v1.ObjectReference{Kind:“Ingress”, Namespace:“default”, Name:“ingress-srv”, UID:“6c15d014-ac14-404e-8b5e-d8526736c52a”, APIVersion:“networking.k8s.io/v1”, ResourceVersion:“1347”, FieldPath:“}): 类型:”正常“ 原因:”同步“ 计划同步

    I1129 15:06:11.449669 8 controller.go:155] “检测到配置更改,需要重新加载后端”

    I1129 15:06:11.499772 8控制器。go:172]“后端已成功重新加载”

    i1 129 15:06:11.500210 8 Event . go:282]事件(v1。ObjectReference{Kind:"Pod ",命名空间:" ingress-nginx ",名称:" ingress-nginx-controller-54 bfb 9 bb-f 6 gsf ",UID:" 54 E0 c0c 6-40ea-439 e-B1 a2-7787 f1 b 37 e 7 a ",APIVersion:"v1 ",ResourceVersion:"766 ",FieldPath:""}):类型:'正常'原因:' RELOAD '由于配置更改而触发了NGINX重新加载

  • 共有2个答案

    钱瑞
    2023-03-14

    首先,您不需要NodePort服务,只需要ClusterIP。如果您想直接访问服务而无需通过入口控制器,则使用Nodeport。

    如果你想用<code>NodePort</code>测试这个,你需要定义一个,例如

    - 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
    
    扈韬
    2023-03-14

    将重新编辑主要问题
    离开帖子以供将来使用

    我解决了这个问题,或者至少我认为是这样。< br >除了@moonkotte建议将< code > Ingres class name:nginx 添加到< code>ingress-srv.yaml之外,我还更改了入口端口配置,使其现在指向端口< code>80。

    由于这些更改,现在使用< code>scp.com可以正确打开我的应用程序。此外,使用节点端口访问,我可以使用< code>localhost:30080访问我的应用程序,其中30080端口是自动设置的(我从< code>scanapp-np-srv.yaml中删除了< code >节点端口配置行)

    为什么中的端口进入srv。如果clusterIp配置状态将端口8080设置为目标端口80,则yaml必须设置为80-我不知道,我不完全理解Kubernetes配置的内部工作原理-欢迎所有解释。

    主要配置文件的当前状态:

    入口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
    

    < br > < br > < code > 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
    

    其余文件保持不变。

     类似资料:
    • 我在服务器上运行应用程序时出错,它在本地正常工作,我只需输入Run(npm start)并在本地正常运行。但和我在服务器上做的一样,我得到了下面给出的错误。请有人帮帮我。 {“name”:“chakde11”,“version”:“1.0.0”,“private”:false,“homepage”:http://chakde11.com/“,”依赖项“{bootstrap:“4.1.1”,“cha

    • 选中“启用JDBC驱动程序部署”和“在重新部署期间保留会话”

    • pom.xml我有这个用来部署 在设置中。tomcat服务器的xml我有这个 当我试图调用maven deploy时,出现了一个错误: 服务器正在运行。我试图在pom中更改tomcat插件。xml到tomcat7 maven插件,但我得到了相同的错误。据我所知,它正试图将war文件部署到http://localhost:8080/manager/ua/andrfas/SCPI/0.0.1/SCPI

    • 我有一个使用Tomcat服务器部署的JSF应用程序,它在Tomcat 7中完美运行。但是现在我需要部署非常应用程序Weblogic我将其部署到weblogic,但是在显示主页后,我尝试打开的任何链接我都会在我的应用程序中显示错误页面。 我使用JPA作为我的持久性API来连接到数据库。 Weblogic堆栈跟踪 我无法理解我是weblogic的新手请帮忙

    • 我试图将一个spring boot应用程序部署到EAP7服务器上。该应用程序作为使用spring Boot的嵌入式tomcat servlet的独立应用程序运行良好,但是当我试图将其作为WAR部署到EAP7时,我遇到了以下异常: 在将jar文件转换为WAR时,我已经按照spring-boot文档的建议进行了操作。 我删除了并用覆盖受保护的SpringApplicationBuilder配置(Spr

    • 我试图在配置为eclipse的Jboss服务器中部署ear文件,但当我试图部署它时,它总是以超时异常结束。我试图增加我的服务器超时时间,但似乎没有帮助。但是同一个ear当我尝试在eclipse之外的同一台服务器上部署时,它被成功地部署,即使在通过google处理了几个相关问题之后,也无法找到根案例。 根据我的观察,这个问题似乎不是由于jboss配置造成的,因为当直接部署时,同一个ear和服务器似乎