arms-obi est un agent Kubernetes DaemonSet qui découvre et collecte les données pprof Go depuis les Pods d'application sur chaque nœud, puis télécharge ces données vers Cloud Monitor pour le profilage continu via ARMS Profiling.
Principales fonctionnalités
Découverte automatique des Pods sur le nœud actuel qui exposent une interface pprof.
Collecte de cinq types de profils : CPU, heap, goroutine, mutex et block.
Exposition d'un endpoint de vérification d'état pour les sondes de liveness et readiness de Kubernetes.
Collecte simultanée des données depuis plus de 50 Pods par nœud.
Prérequis
Un cluster Kubernetes, version 1.26 ou ultérieure.
Vos Pods d'application exposent l'interface HTTP Go
net/http/pprof.Les conteneurs de votre Pod d'application doivent disposer d'une variable d'environnement spécifiant le port pprof. La variable par défaut est
ILOGTAIL_PROFILE_PORT, que vous pouvez modifier dans la configuration des valeurs.
Intégrer votre application
Votre service Go doit exposer l'interface HTTP pprof et définir une variable d'environnement de port dans son conteneur. Ignorez cette section si les deux éléments sont déjà configurés.
Intégration du code
Dans le package main de votre service Go, importez net/http/pprof et démarrez un serveur HTTP distinct :
import _ "net/http/pprof"
func main() {
// Start the pprof server on a separate port to avoid conflicts with the business port.
go func() {
http.ListenAndServe(":6060", nil)
}()
// ... business logic
}
Variables d'environnement du conteneur
Dans la spécification du conteneur de votre Pod d'application, définissez la variable d'environnement du port pprof. Le nom de la variable est par défaut ILOGTAIL_PROFILE_PORT et est configurable dans les valeurs :
containers:
- name: myapp
env:
- name: ILOGTAIL_PROFILE_PORT # Must match the port_env_name configured in arms-obi
value: "6060"
arms-obi lit cette variable d'environnement pour déterminer le port cible.
Déploiement
Cluster ACK
Connectez-vous à la console Container Service for Kubernetes (ACK). Dans le volet de navigation de gauche, sélectionnez Cluster List, puis cliquez sur le nom du cluster cible.
Dans le volet de navigation de gauche, sélectionnez Components, recherchez le composant
arms-obi, définissez installMode sur profiling, puis cliquez sur Install.Par défaut, l'agent collecte les données des Pods dont la variable d'environnement
ILOGTAIL_PROFILE_PORTest définie, et utilise la valeur du libelléappcomme nom d'application. Pour personnaliser ce comportement, modifiez la configuration du collecteur dans la section profiling lors de l'installation. Pour plus d'informations sur les paramètres de configuration, consultez Configuration du collecteur.
Cluster externe
-
Exécutez la commande
wgetsuivante pour télécharger le package d'installation arms-obi.wget 'https://aliacs-k8s-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/app/charts-incubator/arms-obi-0.9.3.tgz' -
Exécutez la commande suivante pour extraire le package d'installation arms-obi.
tar xvf arms-obi-0.9.3.tgz -
Modifiez le fichier values.yaml dans le package d'installation. Modifiez les paramètres suivants et enregistrez le fichier.
ImportantAssurez-vous que votre compte principal Alibaba Cloud dispose des permissions AliyunARMSFullAccess et AliyunSTSAssumeRoleAccess.
workspace: default-cms-__ACK_UID__-__ACK_REGION_ID__ registry: registry-__ACK_REGION_ID__.ack.aliyuncs.com/acs/ cluster_id: __ACK_CLUSTER_ID__ accessKey: __ACCESSKEY__ accessKeySecret: __ACCESSKEY_SECRET__ uid: "__ACK_UID__" region_id: __ACK_REGION_ID__ installMode: profilingworkspace: remplacez __ACK_UID__ par l'UID de votre compte principal Alibaba Cloud et __ACK_REGION_ID__ par l'ID de la région où vous souhaitez rapporter les données.registry: adresse du dépôt d'images arms-obi. arms-obi comprend trois images. Si votre cluster ne peut pas accéder au réseau public, synchronisez ces images vers votre dépôt interne :registry-cn-hangzhou.ack.aliyuncs.com/acs/obi:obi-app-update-0.9.3 registry-cn-hangzhou.ack.aliyuncs.com/acs/obi:init-0.9.3 registry-cn-hangzhou.ack.aliyuncs.com/acs/obi:pprof-agent-0.9.3cluster_id: ID personnalisé pour votre cluster Kubernetes. Doit être unique.accessKeyetaccessKeySecret: AccessKey ID et AccessKey Secret de votre compte principal Alibaba Cloud. Pour plus d'informations, consultez Créer une paire de clés d'accès.uid: ID de votre compte principal Alibaba Cloud. Vous pouvez le trouver en survolant votre photo de profil dans le coin supérieur droit de la console Alibaba Cloud.region_id: ID de la région Alibaba Cloud. Pour connaître les régions prises en charge, consultez Régions prises en charge.installMode: doit être défini surprofiling. -
Exécutez la commande suivante pour installer arms-obi. Exécutez cette commande depuis l'extérieur du répertoire du package d'installation arms-obi.
helm3 upgrade --install arms-obi arms-obi --namespace obi-system --create-namespace
Configuration
Configuration du collecteur
|**Champ**
|
**Type**
|
**Valeur par défaut**
|
**Description**
| | --- | --- | --- | --- | |
profiles
|
[ ]string
|
Les 5 types
|
Types de profils autorisés. Valeurs valides : cpu, heap, goroutine, mutex et block.
| |
interval
|
int
|
30
|
Intervalle de collecte en secondes.
| |
timeout
|
int
|
30
|
Délai d'expiration d'une seule requête HTTP en secondes.
| |
max_body_size
|
int
|
10240
|
Taille maximale d'un seul corps de réponse en Ko. Les réponses dépassant cette taille sont ignorées.
| |
cpu_duration
|
int
|
10
|
Durée d'échantillonnage du profil CPU en secondes. Cette valeur doit être inférieure à `interval`.
| |
port_env_name
|
string
|
ILOGTAIL_PROFILE_PORT
|
Nom de la variable d'environnement dans le conteneur qui spécifie le port pprof.
| |
pprof_path
|
string
|
/debug/pprof
|
Préfixe de chemin pour l'endpoint HTTP pprof.
|
Les URLs de collecte de profils suivent ce modèle : http://<podIP>:<port><pprof_path>/<profile>
**Type de profil**
|
**Chemin URL**
|
**Remarques**
| | --- | --- | --- | |
cpu
|
/profile?seconds=<cpu_duration>
|
Durée de collecte = cpu_duration secondes
| |
heap
|
/heap
|
Collecte instantanée
| |
goroutine
|
/goroutine
|
Collecte instantanée
| |
mutex
|
/mutex
|
Collecte instantanée
| |
block
|
/block
|
Collecte instantanée
|
Configuration des filtres
Contrôle les Pods à partir desquels effectuer la collecte. Toutes les conditions sont combinées avec ET ; les éléments au sein d'une liste d'autorisation sont combinés avec OU.
|**Champ**
|
**Type**
|
**Valeur par défaut**
|
**Description**
| | --- | --- | --- | --- | |
namespace
|
string
|
""
|
Expression régulière pour faire correspondre le namespace du Pod. Si vide, aucun filtrage n'est appliqué.
| |
pod_name
|
string
|
""
|
Expression régulière pour faire correspondre le nom du Pod. Si vide, aucun filtrage n'est appliqué.
| |
label_whitelist
|
[ ]LabelKV
|
[ ]
|
Libellés de Pod autorisés. Un Pod est mis en correspondance s'il possède l'un de ces libellés.
| |
label_blacklist
|
[ ]LabelKV
|
[ ]
|
Libellés de Pod bloqués. Un Pod est exclu s'il possède l'un de ces libellés.
| |
env_whitelist
|
[ ]LabelKV
|
[ ]
|
Variables d'environnement de conteneur autorisées. Un Pod est mis en correspondance si l'un de ses conteneurs définit l'une de ces variables.
| |
env_blacklist
|
[ ]LabelKV
|
[ ]
|
Variables d'environnement de conteneur bloquées. Un Pod est exclu si l'un de ses conteneurs définit l'une de ces variables.
|
Format LabelKV : {key: "app", value: "myservice"}. Si la valeur est vide, l'agent vérifie uniquement l'existence de la clé.
Le pipeline de filtrage s'exécute dans cet ordre :
Filtrage des nœuds : collecte uniquement depuis les Pods sur le nœud actuel (automatique).
Phase du Pod : conserve uniquement les Pods en phase Running avec une adresse IP attribuée.
Filtrage par expression régulière :
namespace/pod_name.Liste d'autorisation de libellés → Liste de blocage de libellés.
Liste d'autorisation de variables d'environnement → Liste de blocage de variables d'environnement.
Résolution du port : lit la valeur du port à partir de la variable d'environnement du conteneur spécifiée par
port_env_name.
Configuration ARMS
|**Champ**
|
**Type**
|
**Valeur par défaut**
|
**Description**
| | --- | --- | --- | --- | |
arms.license_key
|
string
|
app
|
Clé du libellé du Pod dont la valeur est utilisée comme nom d'application ARMS (appName).
|
Mettre à jour la configuration
Connectez-vous à la console Container Service for Kubernetes (ACK). Dans le volet de navigation de gauche, sélectionnez Cluster List, puis cliquez sur le nom du cluster cible.
Dans le volet de navigation de gauche, sélectionnez Components, recherchez le composant
arms-obi, cliquez sur Configure, puis modifiez la configuration du collecteur de profiling.
Consulter les données de profiling
Connectez-vous à la console Cloud Monitor, sélectionnez l'espace de travail cible et, dans le volet de navigation de gauche, cliquez sur Application Monitoring.
Recherchez l'application portant le nom que vous avez défini lors du déploiement. Cliquez sur Application Diagnostics pour consulter les types de profils. Vous pouvez également télécharger les fichiers de profil pour une analyse locale avec pprof.
FAQ
Les journaux de l'agent indiquent « arms sts not ready yet »
L'agent n'a pas pu obtenir d'identifiants ARMS STS.
Assurez-vous que le réseau du cluster peut accéder à l'API de métadonnées ARMS à l'adresse
<region_id>-intranet-arms.aliyuncs.com.Vous pouvez exécuter
kubectl logspour afficher les messages d'erreur détaillés.
Aucun Pod n'est découvert
Vérifiez votre configuration de filtre :
Confirmez que la variable d'environnement spécifiée par
port_env_name(par défaut : ILOGTAIL_PROFILE_PORT) est définie dans les conteneurs du Pod de votre application.Confirmez que les expressions régulières pour
namespace/pod_name, ainsi que les paramètres de liste d'autorisation et de liste de blocage des libellés et des variables d'environnement dans le sélecteur, sont corrects.Consultez le champ
pod_countdans les journaux de l'agent pour voir combien de Pods ont été découverts.
Échec de la collecte
Causes courantes :
Le Pod de l'application n'expose pas l'interface pprof. Confirmez que vous avez importé
_ "net/http/pprof"et démarré le service HTTP.Le port pprof ne correspond pas au port configuré dans la variable d'environnement
port_env_name.Le
pprof_pathne correspond pas au préfixe de chemin de votre service.Une politique réseau bloque la connexion HTTP depuis le Pod de l'agent vers le Pod de l'application.
Échec du téléchargement
Causes courantes :
L'endpoint privé VPC est inaccessible.
Les identifiants ARMS STS ont expiré. L'agent actualise automatiquement les identifiants. Vérifiez les journaux pour détecter les erreurs d'actualisation STS.