基于 Probot 的 GitHub 应用程序部署为 AKS(Azure Kubernetes 服务)上的 Docker 容器无法接收 Webhooks

问题描述 投票:0回答:1

我使用 Probot 编写了一个 GitHub 应用程序,并使用 smee.io 在本地进行了成功测试。然后,我尝试将我的应用程序作为 AKS(Azure Kubernetes 服务)上的 docker 容器部署到 Kubernetes 集群,将其投入生产,设置一个入口以从容器上的应用程序接收 Webhooks,但我不断看到 404 错误。

我使用这个 dockerfile 作为示例,并且能够成功构建映像并将其推送到 ACR(Azure 容器注册表)。下面是我的 dockerfile。

FROM my-image-registry/node:18-alpine3.16 as build

# set working directory 
WORKDIR /app/probot/

ENV PATH /app/node_modules/.bin:$PATH

# install and cache app dependencies

COPY ./.npmrc ./
COPY ./package.json ./
# COPY ./tsconfig.json ./

RUN npm cache clean --force && npm install --force --loglevel verbose

FROM my-image-registry/node:18-alpine3.16 as app

WORKDIR /app/probot/

COPY --from=build /app/probot/node_modules ./node_modules
COPY . ./

RUN npm run build

EXPOSE 3005

COPY .env ./

#CMD npm run start
CMD [ "npm", "start" ]

下一步,我使用 kubectl 将容器部署到 Kubernetes,并且能够成功启动并运行它。以下是我的 kubectl 内联配置。

---
kind: Deployment
apiVersion: apps/v1
metadata:
  labels:
    app: probot-service
  name: my-app-pod
  namespace: my-namespace
spec:
  replicas: 1
  selector:
    matchLabels:
      app: probot-service
  template:
    metadata:
      labels:
        app: probot-service
    spec:
      containers:
        - name: probot-service
          image: myacrurl/my-app-docker-image:d1.0
          imagePullPolicy: Always
          ports:
            - containerPort: 3005
      nodeSelector:
        agentpool: apppool

---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: probot-service
  name: probot-service
  namespace: my-namespace
spec:
  ports:
    - name: http
      port: 80
      targetPort: 3005
    - name: https
      protocol: TCP
      port: 443
      targetPort: 3005
  selector:
    app: probot-service
  type: ClusterIP

当我运行

Kubectl logs <podname> -n <namespace>
时,我看到消息

INFO (server): Running Probot v13.0.2 (Node.js: v18.8.0)
INFO (server): Listening on http://localhost:3005

我设置了一个入口,将应用程序中的 Webhook 路由到容器。以下是我的入口配置

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: probot-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /$2
    nginx.ingress.kubernetes.io/use-regex: 'true'
spec:
  rules:
  - host: probot.mydomain.com
    http:
      paths:
      - pathType: Prefix
        path: /probot(/|$)(.*)
        backend:
          service:
            name: probot-service
            port:
              number: 80

我已尝试对我的 Probot 应用程序的应用程序 ID、Webhook 秘密、安装 ID 和其他所需参数进行硬编码。我尝试添加它们的环境变量。我尝试在映像创建过程中将 .env 文件复制到 docker 映像,但似乎没有任何效果。

我可能做错了什么?是否可以在 AKS 上部署 Probot 应用程序?

dockerfile azure-aks nginx-ingress github-app probot
1个回答
0
投票

问题的一个关键部分是:

kubernetes.io/ingress.class: nginx

这是一个已弃用的注释。应使用
spec.ingressClassName: nginx
代替。查看官方文档获取演示入口yaml。

注意:

nginx-ingress
仅通过特定关键字加载您的入口。所以这就是它不起作用的原因之一。


第二期是:

INFO (server): Listening on http://localhost:3005
.
简单来说:
0.0.0.0

一个例子:

2c2d4a84d354:/# kubectl get po -o wide
NAME                      READY STATUS   RESTARTS AGE   IP           NODE                            NOMINATED NODE READINESS GATES
my-nginx-79b55879bb-7kzgz 1/1   Running  0        3m10s 198.18.4.15  aks-userpool-123456-vmss000006  <none>         <none>
my-nginx-79b55879bb-mqv7d 1/1   Running  0        116s  198.18.1.244 aks-userpool-123456-vmss000000  <none>         <none>

进入 Pod

my-nginx-79b55879bb-7kzgz
,并配置 nginxconf,如下所示:

listen       80;
listen  [::]:80;
listen       localhost:8000;
server_name  localhost;

检查 Pod 中的监听状态:

root@my-nginx-79b55879bb-7kzgz:/# lsof -i:80 && lsof -i:8000
COMMAND PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
nginx     1 root    6u  IPv4 4425979      0t0  TCP *:80 (LISTEN)
nginx     1 root    7u  IPv6 4425980      0t0  TCP *:80 (LISTEN)
COMMAND PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
nginx     1 root   13u  IPv6 4462662      0t0  TCP localhost:8000 (LISTEN)
nginx     1 root   14u  IPv4 4462663      0t0  TCP localhost:8000 (LISTEN)

让我们进入另一个 Pod 内部并卷曲此 Pod:

root@my-nginx-79b55879bb-mqv7d:/# curl 198.18.4.15:8000 --head
curl: (7) Failed to connect to 198.18.4.15 port 8000 after 1 ms: Couldn't connect to server
root@my-nginx-79b55879bb-mqv7d:/# curl 198.18.4.15:80 --head
HTTP/1.1 200 OK
Server: nginx/1.25.4
Date: Fri, 01 Mar 2024 09:01:26 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Wed, 14 Feb 2024 16:03:00 GMT
Connection: keep-alive
ETag: "65cce434-267"
Accept-Ranges: bytes

总之,将侦听器绑定到

localhost
使您的后端无法从 Pod 外部访问

© www.soinside.com 2019 - 2024. All rights reserved.