ã¯ããã«
ã¿ãªããã¯ãGoogle Compute Engine (GCE) ã§NATã€ã³ã¹ã¿ã³ã¹ãéçšããéãéä¿¡ã®è¿œè·¡ãè¡ããconntrackãã®ç®¡çã§å°ã£ãããšã¯ãããŸãããïŒ
倧éã®éä¿¡ãæãç°å¢ã§ã¯ãã«ãŒãã«ãã©ã¡ãŒã¿ã® net.netfilter.nf_conntrack_maxïŒconntrackã®äžéå€ïŒãé©åã«åŒãäžããããšãå®å®éçšã®èŠãšãªããŸãããããããèšå®ããã¯ããªã®ã«åèµ·åãããšå€ãå
ã«æ»ã£ãŠããŸãããããã©ã«ãã®ã¡ããªã¯ã¹ãšããŠçšæãããŠããªããããç£èŠããã«ã¯ç¬èªã®ä»çµã¿ãæ§ç¯ããªããã°ãªããªãããšãã£ãã課é¡ã«çŽé¢ããããšããããŸãã
æ¬èšäºã§ã¯ãåèµ·åã®ãã³ã«èšå®ããªã»ãããããŠããŸãåæååé¡ã®æ ¹æ¬è§£æ±ºãšãGoogle Cloud æšæºã®ãOpsãšãŒãžã§ã³ãããæŽ»çšããç£èŠäœå¶ã®æ§ç¯ããã®2ç¹ã軞ã«ã宿©æ€èšŒã§åŸãããç¥èŠãšããããã€ã³ãã詳ããã玹ä»ããŸãã
第1ç« : åèµ·åã§èšå®ãæ¶ããïŒsysctlèšå®ã®åé¡
éåžžãLinuxã§ã«ãŒãã«ãã©ã¡ãŒã¿ãæ°žç¶åããã«ã¯ /etc/sysctl.conf ãç·šéããŸããããããä»åã®æ€èšŒã§ã¯äžéå€ãåŒãäžããããã«net.netfilter.nf_conntrack_max = 32768 ãšèšè¿°ããŠããåèµ·ååŸã«å€ãããã©ã«ãå€ã§ãã8192ãªã©ã«æ»ã£ãŠããŸãçŸè±¡ãçºçããŸããã
â åå ïŒOSèµ·åæã«ãããã¢ãžã¥ãŒã«ã®ããŒãã¿ã€ãã³ã°
調æ»ã®çµæããã®åå ã¯OSèµ·åããã»ã¹ã«ããããèªã¿èŸŒã¿é åºãã®äžæŽåã«ããããšãåãããŸããã
- sysctlã®èªã¿èŸŒã¿: OSèµ·åã®åææ®µéã§
/etc/sysctl.confãèªã¿èŸŒãŸããŸãã - èšå®ã®ç©ºæ¯ã: ãã®æç¹ã§ã¯ãã³ãã¯ã·ã§ã³è¿œè·¡ãæ
ã
nf_conntrackã¢ãžã¥ãŒã«ããŸã ã«ãŒãã«ã«ããŒããããŠããŸããããã®ãããOSã¯ãèšå®å¯Ÿè±¡ã®é ç®ããŸã ååšããªãããšå€æããèšå®ãç¡èŠãããŠããŸããŸãã - ããã©ã«ãå€ã§ã®åæå: ãã®åŸããããã¯ãŒã¯æ©èœãç«ã¡äžããã¿ã€ãã³ã°ã§ã¢ãžã¥ãŒã«ãããŒããããŸããããã®ç¬éã«ã¢ãžã¥ãŒã«èªèº«ãä¿æããŠããããã©ã«ãå€ã§äžæžããããŠããŸãã®ã§ãã
â 解決çïŒã¢ãžã¥ãŒã«ã®å è¡ããŒãã匷å¶ãã
ãã®åé¡ã解決ããããã«ã¯ãsysctlãèšå®ãã¡ã€ã«ãèªã¿èŸŒããããåã®æ®µéã§ãå åãããŠã¢ãžã¥ãŒã«ãæºåããŠããå¿ èŠããããŸãã
# OSèµ·åæã«nf_conntrackã¢ãžã¥ãŒã«ã匷å¶çã«èªã¿èŸŒãŸããèšå®ã远å echo "nf_conntrack" | sudo tee /etc/modules-load.d/nf_conntrack.conf
ãã®äžè¡ã /etc/modules-load.d/ é
äžã®èšå®ãã¡ã€ã«ã«è¿œèšããããšã§ãåèµ·ååŸãèšå®å€ã確å®ã«ç¶æããããæ°žç¶åããå®çŸããããšãã§ããŸããã
第2ç« : OpsãšãŒãžã§ã³ãã«ããç£èŠæ§ç¯ãšãæš©éã»æ§æãã®çœ
ä»åã®æ§æã§ã¯ãç£èŠç°å¢ã Google Cloud ã®æšæºæ©èœïŒCloud MonitoringïŒã«éçŽããããããã°ãã¡ããªã¯ã¹ã®åéã« OpsãšãŒãžã§ã³ããæ¡çšããŸãããããããconntrack ã¯CPUãã¡ã¢ãªãšç°ãªãããã©ã«ãã®åé察象ã«å«ãŸããŠããªããããã·ã§ã«ã¹ã¯ãªããã§æ°å€ããã°ã«åºåããããããšãŒãžã§ã³ãã«èªã¿èŸŒãŸããæ§æããšããŸããã
å
·äœçã«ã¯ã以äžã®3ã€ã®ã¹ãããã§ä»çµã¿ãæ§ç¯ããŸããã
1. æ°å€æœåºã¹ã¯ãªããã®äœæïŒ/usr/local/bin/conntrack_logger.shïŒ
çŸåšã®ã»ãã·ã§ã³æ°ãšäžéå€ãååŸãã䜿çšçïŒ%ïŒãèšç®ããŠJSON圢åŒã§åºåããŸãã
#!/bin/bash
COUNT=$(cat /proc/sys/net/netfilter/nf_conntrack_count 2>/dev/null || echo 0)
MAX=$(cat /proc/sys/net/netfilter/nf_conntrack_max 2>/dev/null || echo 0)
# æ¶è²»å²åïŒ%ïŒãèšç®ïŒå°æ°ç¹ç¬¬2äœãŸã§ïŒ
USAGE=$(awk "BEGIN {printf \"%.2f\", (${COUNT} / ${MAX}) * 100}")
echo "{\"conntrack_count\": ${COUNT}, \"conntrack_max\": ${MAX}, \"conntrack_usage_pc\": ${USAGE}}" >> /var/log/conntrack.log
2. cronãžã®ç»é²ïŒ1åããšã«å®è¡ïŒ
echo "* * * * * root /usr/local/bin/conntrack_logger.sh" | sudo tee /etc/cron.d/conntrack_logger
3. OpsãšãŒãžã§ã³ãã®èšå®ïŒ/etc/google-cloud-ops-agent/config.yamlïŒ
åºåããããã°ãã¡ã€ã«ãç£èŠããJSONãšããŠããŒã¹ããŠè»¢éããŸãã
logging:
receivers:
conntrack_log:
type: files
include_paths:
- /var/log/conntrack.log
processors:
parse_json:
type: parse_json
service:
pipelines:
conntrack_pipeline:
receivers: [conntrack_log]
processors: [parse_json]
â ããããã€ã³ã1ïŒã¢ã¯ã»ã¹ã¹ã³ãŒããš IAM ããŒã«ã®éã
GCEã€ã³ã¹ã¿ã³ã¹ã®èšå®ã§ãã¢ã¯ã»ã¹ã¹ã³ãŒããã logging-write ã monitoring-write ã«èšå®ããŠããã«ããããããããšãŒãžã§ã³ããæš©éäžè¶³ã«ãããã°éä¿¡ãšã©ãŒãåãåºãããšããããŸããã
解決ç:
ã¢ã¯ã»ã¹ã¹ã³ãŒã㯠VM ã€ã³ã¹ã¿ã³ã¹ããå€éš API ãžãéä¿¡ããŠè¯ãããã®çªå£èšå®ã«éããŸããããããšã¯å¥ã«ãã€ã³ã¹ã¿ã³ã¹ã«çŽã¥ããµãŒãã¹ã¢ã«ãŠã³ãèªäœã« roles/logging.logWriter ããã³ roles/monitoring.metricWriter ãšãã IAM ããŒã«ãä»äžããªããã°ãå®éã«ããŒã¿ãæžãèŸŒãæš©éãåŸããããAPIåŽã§æçµ¶ãããŠããŸããŸãã
â ããããã€ã³ã2ïŒLogging ã¯ãšãªã®å³å¯ãªæ§æã«ãŒã«
Cloud Logging ã®ç»é¢ã§å±ãããã°ã確èªããéãlogId("conntrack_log") ãšæå®ãããšæ§æãšã©ãŒã«ãªããŸãã
解決ç:
æ£è§£ã¯ããã¹ãŠå°æåã§ã¢ã³ããŒã¹ã³ã¢ãçšãã log_id("conntrack_log") ã§ããGoogle Cloud ã®ã¯ãšãªèšèªã®å³å¯ãªã«ãŒã«ã«ã¯æ³šæãå¿
èŠã§ãã
第3ç« : Terraform ã«ããã¡ããªã¯ã¹åãé»ããDISTRIBUTIONåããšãã±ããäžéã®å¶çŽ
åéãããã°ã Cloud Monitoring ã§ã°ã©ãåããããã«ãTerraform ã§ããã°ããŒã¹ã®ææšããäœæããŸãããããã§ã¯ãGoogle Cloud ã®ã¡ããªã¯ã¹ä»æ§ã«èµ·å ãã2ã€ã®å€§ããªå£ãç«ã¡ã¯ã ãããŸããã
â å£1ïŒåçŽãªæ°å€åïŒGAUGEïŒãšããŠã®äœæãèš±å¯ãããªã
æ¬æ¥ãconntrack ã®äœ¿çšçã¯ãã®ç¬éã®å€ã§ãããããã·ã³ãã«ãªæ°å€åã§ãã GAUGE ãšããŠå®çŸ©ããã®ãèªç¶ã§ãããããã以äžã®ãšã©ãŒã§åŽäžãããŸããã
Error 400: A value extractor can only be specified for a DISTRIBUTION value type.
ãã°ããç¹å®ã®æ°å€ãæœåºããæ©èœã§ãã value_extractor ã䜿ãå ŽåãããŒã¿åã¯å¿
ã DISTRIBUTIONïŒååžããŒã¿ïŒ ã§ãªããã°ãªããªããšãã仿§äžã®åŒ·ãå¶éããããŸããããã«äŒŽããmetric_kind ã«ã¯ãã°ã®æ§è³ªã«åãã㊠DELTA ãéžæããŸããã
â å£2ïŒè©Šè¡é¯èª€ã®æ«ã«èŸ¿ãçããããã±ããåå²ãã®éç
åã DISTRIBUTION ã«ä¿®æ£ãããšãååžããŒã¿ãšããŠæ±ã以äžãæ°å€ãä»åããç®±ïŒãã±ããïŒã®èšå®ïŒbucket_optionsïŒãæèšããããæ±ããããŸãã
åœåãããé«ãç²ŸåºŠã§æ°å€ã枬ãããã«ãã±ããæ°ãã1,000åãçšåºŠã§èšå®ããŠãããã€ã詊ã¿ãŸãããããããããã§ Google Cloud API ã®ããã°ããŒã¹ã¡ããªã¯ã¹ã«ããããã±ããæ°ã¯æå€§200åãŸã§ããšããå¶é ã«åŒã£ãããããšã©ãŒãšãªã£ãŠããŸããŸããã
ãã®å¶éãã¯ãªã¢ãã€ã€æå€§éã®ç²ŸåºŠã確ä¿ããããããå¹ 0.5% å»ã¿ã§ãç®±ã 200 åçšæããïŒ0 ã 100% ãå®å šã«ã«ããŒïŒã ãæ¡çšããããšã§è§£æ±ºããŸããã
ãæçµç㪠Terraform ã³ãŒãïŒæç²ïŒã
resource "google_logging_metric" "conntrack_usage" {
name = "conntrack_usage_pc_${var.environment}"
project = var.project_id
filter = "log_id(\"conntrack_log\")"
metric_descriptor {
metric_kind = "DELTA"
value_type = "DISTRIBUTION"
unit = "%"
}
value_extractor = "EXTRACT(jsonPayload.conntrack_usage_pc)"
# åœå1,000åã§ãšã©ãŒãåºããããAPIäžéã®æå€§200åã§0.5%å»ã¿ã®èšèšã«å€æŽ
bucket_options {
linear_buckets {
num_finite_buckets = 200 # APIäžéã®æå€§æ°
width = 0.5 # 0.5%å»ã¿
offset = 0
}
}
}
第4ç« : éçšã®ãŽãŒã«ïŒäžéã® 80% è¶ éãæ€ç¥ããã¢ã©ãŒãèšå®ãšåäžäžèŽã®çœ
ã°ã©ãåã«ããå¯èŠåã®æ¬¡ã¯ãå®éã®éçšã«ããããŽãŒã«ã§ãããã¢ã©ãŒãéç¥ãã®å®è£
ã§ãã
conntrack 䜿çšçã 100% ã«éãããšãã±ãããã¹ïŒNATæ¯æžïŒãçºçããããã察å¿ã®ç¶äºãæãããããã®éŸå€ãšããŠã䜿çšç 80% ãè¶
éããéã«éç¥ããããèšå®ããŸããã
ããã§ãæåŸã®çœ ãåŸ ã£ãŠããŸããã
â å£ïŒæå€§å€ïŒALIGN_MAXïŒæå®ã«ããåã®äžäžèŽãšã©ãŒ
ã¢ã©ãŒãã®ç£èŠæ¡ä»¶ãšããŠãã·ã³ãã«ã«æå€§å€ãç£èŠããããš ALIGN_MAX ãæå®ãããšãããšã©ãŒãçºçããŸããã
åå ã¯ãä»åäœæããã¡ããªã¯ã¹ã DISTRIBUTION åã§ããããã§ããDISTRIBUTION ã¯ãååžããŒã¿å
šäœããä¿æããåã§ãããããåäžã®ã¹ã«ã©ãŒå€ãè¿ã ALIGN_MAX ã®ãããªã¢ã©ã€ããŒãé©çšããããšãããšãåã®äžäžèŽã«ããåŠçã§ããŸããã
解決ç:
ååžããŒã¿ããæ°å€ãæœåºããŠç£èŠããããã«ã¯ãååžåã«å¯Ÿå¿ããŠããã¢ã©ã€ããŒã§ãã 99ããŒã»ã³ã¿ã€ã«ïŒALIGN_PERCENTILE_99ïŒ ãæå®ããå¿
èŠããããŸããã
(â»è£è¶³: ä»åã®æ§æã§ã¯1åã«1åãããã°ãåºåããªããããéèšæéå ã®ãµã³ãã«ã¯å®è³ª1ã€ã§ããååžåïŒDISTRIBUTIONïŒã®ä»æ§äžããã±ããã«ããè¿äŒŒèšç®ã¯è¡ãããŸãããæå³ããéŸå€ç£èŠã«ãããŠå®çšäžååãªç²ŸåºŠã§æå€§å€ä»è¿ãæããããšãã§ããŸãã)
ãTerraform ã«ããã¢ã©ãŒãå®çŸ©ã
resource "google_monitoring_alert_policy" "conntrack_high_usage" {
depends_on = [google_logging_metric.conntrack_usage]
display_name = "NAT Conntrack High Usage Alert over 80%(${var.environment})"
combiner = "OR"
conditions {
display_name = "Conntrack usage exceeds 80%"
condition_threshold {
filter = "metric.type=\"logging.googleapis.com/user/conntrack_usage_pc_${var.environment}\" AND resource.type=\"gce_instance\""
comparison = "COMPARISON_GT"
threshold_value = 80 # 80%ãè¶
ããã
duration = "60s" # 1åéç¶ç¶ããå Žå
aggregations {
alignment_period = "60s"
# DISTRIBUTIONåã®åäžäžèŽãé¿ããããã99ããŒã»ã³ã¿ã€ã«ãéžæ
per_series_aligner = "ALIGN_PERCENTILE_99"
}
}
}
}
第5ç« : èšå®ã®æ°žç¶å確èª
äžé£ã®å¯Ÿçãåæ ããåŸãCloud Monitoring ã®ã°ã©ããéããŠæçµçãªåäœç¢ºèªãè¡ããŸããã
第3ã»4ç« ã§ã¯ã䜿çšçïŒ%ïŒãã®ç£èŠèšå®ã解説ããŸããããããã§ã¯ç¬¬1ç« ã®ãåèµ·åã«ããèšå®åæååé¡ããæ ¹æ¬ãã解決ããããšã蚌æãããããäžéå€ïŒnf_conntrack_maxïŒã®æšç§»ã確èªããŸãã
以äžã®ã°ã©ãã¯ããã®äžéå€ã®æšç§»ã衚ããŠããŸããïŒçžŠè»žïŒconntrack ã®äžéå€ãæšªè»žïŒæéïŒ
å³: Cloud Monitoring ã«ãã nf_conntrack_max ã®æšç§»
æ€èšŒã¿ã€ã ã©ã€ã³ïŒæ¥æ¬æéïŒJSTïŒ
* èµ€æ 16:26é : èšå®è¿œèšã®ã¿ã§åèµ·åããæç¹ã§ããäžéå€ãããã©ã«ãã®8192ã«åæåãããæåã§32768ã«èšå®ãããŸãåèµ·åã§æ»ãããšããåæååé¡ã®åçŸãè¡ã£ãŠããæ§åã§ãã
* ç·æ 16:45é : 察çãšããŠçšæããå
è¡ããŒãèšå®ïŒmodules-load.d ãžã®è¿œèšïŒãåæ ããå床ã€ã³ã¹ã¿ã³ã¹ãåèµ·åããŸããã
* 黿 16:47以é: 察çåæ åŸã®åèµ·åãããã³ãã以éåèµ·åãçµãŠãåæåããããäžéå€ãèšå®éãã®32768ã§ç¶æãããŠããããšã確èªã§ããŸããã
ã°ã©ãã®æšç§»ããããåèµ·åã«ããåæååé¡ã解決ããOpsãšãŒãžã§ã³ãã«ããç£èŠãæ£åžžã«çšŒåããŠããããšãèŠèŠçã«èšŒæãããŸããã
ãããã«
ä»åã®æ€èšŒãéããŠãOSã®åèµ·åæã«ãããèšå®ã®åæååé¡ã解決ããOpsãšãŒãžã§ã³ããçšããç£èŠç°å¢ãæ§ç¯ããããšãã§ããŸããã
äžæ¹ã§ãTerraformã§ç£èŠãèªååããéçšã§ã¯ãDISTRIBUTIONåããã±ããæ°ã®APIäžéããšããå¶çŽã«çŽé¢ããã¯ã©ãŠããã€ãã£ããªç£èŠã¢ãŒããã¯ãã£ãªãã§ã¯ã®ä»æ§ã«åãããé£ãããçæããŸããããŸããOSã®ã¢ãžã¥ãŒã«èµ·åé åºãIAMæš©éã®éããªã©ãã¬ã€ã€ãŒã®ç°ãªããšã©ãŒãäžã€ãã€çŽè§£ããŠããéçšã¯ãã¯ã©ãŠãã€ã³ãã©ãæ§ç¯ããäžã§éåžžã«è¯ãåŠã³ã«ãªããŸããã
æ¬èšäºã§ç޹ä»ããããããã€ã³ãã解決çããåãããã« Google Cloud ã®ç£èŠèšå®ã§æ©ãã§ããæ¹ããã€ã³ãã©ã®å®å®çšŒåã«åãçµãã¿ãªããŸã®åèã«ãªãã°å¹žãã§ãã