Azure 容器应用程序中出现错误的运行状况探测

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

我有一个运行nodejs和redis服务的应用程序。暴露的端口只有3000。这个应用程序是一个在postgresql中查询和存储数据的api。 这些服务在单个容器中运行。 我的问题是,当我检查系统日志时,我不断收到活动、就绪和启动错误,即使我已经配置了它们。 所以我想知道是否有人遇到过这个问题以及如何解决。 我启用了入口类型和 http 类型。 另一件值得一提的重要事情是,该应用程序每天将收到大约 150,000 个请求。 谢谢!

这是我目前的配置:

健康探针配置

我的 Dockerfile

FROM node:21.4-bookworm

RUN apt-get update && \
    apt-get install -y iputils-ping traceroute telnet dnsutils git nano htop redis-server && \
    npm install -g pm2 && \
    ln -fs /usr/share/zoneinfo/America/Santiago /etc/localtime && \
    rm -rf /var/lib/apt/lists/*

RUN echo "user1:password" | chpasswd

RUN adduser -u 2000 user2 && \
    echo "user2:password" | chpasswd

WORKDIR /usr/src/app/CUA-Tunel

COPY . .
    
EXPOSE 3000

COPY entrypoint.sh /entrypoint.sh

RUN chmod +x /entrypoint.sh

ENTRYPOINT ["/entrypoint.sh"]

我的入口点

#!/bin/bash

# Configuración DNS
echo search server01.domain.com > /etc/resolv.conf
echo search server02.domain.com >> /etc/resolv.conf
echo "nameserver xxx.xxx.xxx.xxx" >> /etc/resolv.conf
echo "nameserver xxx.xxx.xxx.xxx" >> /etc/resolv.conf

echo "maxclients 500000" >> /etc/redis/redis.conf

npm install

/etc/init.d/redis-server start

npx pm2 start ecosystem.config.js --no-daemon

我的作文

#version: '2.0'

services:
  tunel-nodejs:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "3000:3000"
javascript node.js docker-compose redis azure-container-apps
1个回答
0
投票

据我所知,您已经在容器应用程序上部署了带有 Redis 和 PostgreSQL 的容器化 Node.js 应用程序,并且您遇到了活性、就绪性和启动探测方面的问题。 现在这可能是由于各种原因造成的。我建议您验证健康端点是否正常工作

Node.js 应用程序中的端点

/healthz
/readyz
/startupz
在访问时应该返回 OK。

curl https://myapp.salmonsky-00bc5d91.eastus.azurecontainerapps.io/healthz
curl https://myapp.salmonsky-00bc5d91.eastus.azurecontainerapps.io/readyz
curl https://myapp.salmonsky-00bc5d91.eastus.azurecontainerapps.io/startupz

enter image description here

然后检查日志 enter image description here

由于您的应用程序每天处理 150,000 个请求,请考虑扩展

az containerapp update \
  --name myapp \
  --resource-group arkorg \
  --min-replicas 2 \
  --max-replicas 10

检查您的 Nodejs 应用程序是否已正确配置探测器

index.js

const express = require('express');
const redis = require('redis');
const { Client } = require('pg');

const app = express();
const port = 3000;

// Connect to Redis
const redisClient = redis.createClient({
  host: process.env.REDIS_HOST || 'localhost',
  port: 6379
});

redisClient.on('error', (err) => console.error('Redis Client Error', err));

// Connect to PostgreSQL
const pgClient = new Client({
  user: process.env.PGUSER || 'psqladminun',
  host: process.env.PGHOST || 'localhost',
  database: process.env.PGDATABASE || 'postgres',
  password: process.env.PGPASSWORD || 'abcdefg',
  port: process.env.PGPORT || 5432,
});

pgClient.connect();

// Liveness Probe
app.get('/healthz', (req, res) => {
  res.status(200).send('OK');
});

// Readiness Probe
app.get('/readyz', (req, res) => {
  res.status(200).send('Ready');
});

// Startup Probe
app.get('/startupz', (req, res) => {
  res.status(200).send('Started');
});

app.listen(port, () => {
  console.log(`App running on port ${port}`);
});

package.json

{
  "name": "myapp",
  "version": "1.0.0",
  "description": "Node.js app with Redis and PostgreSQL",
  "main": "index.js",
  "scripts": {
    "start": "node index.js"
  },
  "dependencies": {
    "express": "^4.17.1",
    "pg": "^8.6.0",
    "redis": "^3.1.2"
  }
}

您也可以从 Azure 门户进行操作

enter image description here

参考-

在azure容器应用程序中配置运行状况探针

验证运行状况探针配置

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