我使用 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 应用程序?
问题的一个关键部分是:
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 外部访问。