TL; DR
- ã³ã³ãããŒãšãã€ã¯ããµãŒãã¹ã®é«ãå¯èŠ³æž¬æ§ãå®çŸããã«ã¯ããã°ãšäž»èŠãªã¡ããªã¯ã¹ã ãã§ã¯ååã§ã¯ãããŸããã
- ããè¿ éãªå埩ãšåŸ©å åã®åäžã®ããã«ãã¢ããªã±ãŒã·ã§ã³ã¯é«å¯èŠ³æž¬æ§åå (HOP) ãé©çšããå¿ èŠããããŸãã
- ã¢ããªã±ãŒã·ã§ã³ ã¬ãã«ã§ã¯ãNOP ã«ã¯é©åãªãã®ã³ã°ã綿å¯ãªç£èŠãå¥å šæ§ãã§ãã¯ãããã³ããã©ãŒãã³ã¹/é·ç§»ãã¬ãŒã¹ãå¿ èŠã§ãã
- NOR ã®èŠçŽ ãšããŠãã§ãã¯ã䜿çšãã ã¬ãã£ãã¹ãããŒã О ã©ã€ããã¹ãããŒã Kubernetesã
ãã«ã¹ãã§ãã¯ãã³ãã¬ãŒããšã¯äœã§ãã?
ããã·ã§ã³ã¯ãªãã£ã«ã«ã§å¯çšæ§ã®é«ãã¢ããªã±ãŒã·ã§ã³ãèšèšããå Žåããã©ãŒã«ã ãã¬ã©ã³ã¹ãªã©ã®åŽé¢ãèæ ®ããããšãéåžžã«éèŠã§ãã ã¢ããªã±ãŒã·ã§ã³ãé害ããè¿ éã«å埩ããå Žåããã®ã¢ããªã±ãŒã·ã§ã³ã¯ãã©ãŒã«ã ãã¬ã©ã³ãã§ãããšã¿ãªãããŸãã äžè¬çãªã¯ã©ãŠã ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãåã³ã³ããŒãã³ããåå¥ã®ã³ã³ãããŒã«é 眮ããããã€ã¯ããµãŒãã¹ ã¢ãŒããã¯ãã£ã䜿çšãããŸãã ãŸããã¯ã©ã¹ã¿ãŒãèšèšãããšãã« k8s äžã®ã¢ããªã±ãŒã·ã§ã³ã®å¯çšæ§ã確å®ã«é«ããã«ã¯ãç¹å®ã®ãã¿ãŒã³ã«åŸãå¿ èŠããããŸãã ãã®äžã«ã¯ãã«ã¹ãã§ãã¯ãã³ãã¬ãŒããå«ãŸããŸãã ããã¯ãã¢ããªã±ãŒã·ã§ã³ãæ£åžžã§ããããšã k8s ã«äŒããæ¹æ³ãå®çŸ©ããŸãã ããã¯ãããããå®è¡ãããŠãããã©ããã«é¢ããæ å ±ã ãã§ãªãããããããªã¯ãšã¹ããã©ã®ããã«åä¿¡ããŠå¿çãããã«é¢ããæ å ±ã§ããããŸãã Kubernetes ããããã®ç¶æ ãææ¡ããã°ããã»ã©ããã©ãã£ã㯠ã«ãŒãã£ã³ã°ãšããŒã ãã©ã³ã·ã³ã°ã«é¢ããŠããè³¢æãªæ±ºå®ãäžããããã«ãªããŸãã ãããã£ãŠãé«å¯èŠ³æž¬æ§ã®ååã«ãããã¢ããªã±ãŒã·ã§ã³ã¯ãªã¯ãšã¹ãã«ã¿ã€ã ãªãŒã«å¿çã§ããŸãã
é«å¯èŠ³æž¬æ§ã®åå (HOP)
é«ãå¯èŠ³æž¬æ§ã®åçã® XNUMX ã€ã¯æ¬¡ã®ãšããã§ãã
é©åã«èšèšãããã¯ã©ãŠã ã¢ããªã±ãŒã·ã§ã³ã¯ãæšæº I/O ã¹ããªãŒã STDERR ããã³ STDOUT ã䜿çšããŠã¡ã€ã³ ã€ãã³ãããã°ã«èšé²ããŸãã 次ã«ãfilebeatãlogstashãfluentd ãªã©ã®è£å©ãµãŒãã¹ãç»å Žããéäžç£èŠã·ã¹ãã (Prometheus ãªã©) ããã°åéã·ã¹ãã (ELK ãœãããŠã§ã¢ ã¹ã€ãŒã) ã«ãã°ãé ä¿¡ããŸãã 以äžã®å³ã¯ããã«ã¹ ãã¹ã ãã¿ãŒã³ãšé«å¯èŠ³æž¬æ§ã®ååã«åŸã£ãŠã¯ã©ãŠã ã¢ããªã±ãŒã·ã§ã³ãã©ã®ããã«åäœãããã瀺ããŠããŸãã
Kubernetes ã§ãã«ã¹ ãã§ã㯠ãã¿ãŒã³ãé©çšããã«ã¯ã©ãããã°ããã§ãã?
k8s ã¯ãããã«äœ¿çšã§ããã³ã³ãããŒã©ãŒ (
ãã®äŸã§ã¯ãk8s ã¯æ¬¡ã®ããšãè¡ããŸãã æ©èœãã§ãã¯ã ãã®ã¿ã€ãã®æ€èšŒã§ã¯ãkubelet ã¯ã³ã³ããå
ã®ããã»ã¹ã®ç¶æ
ãç¶ç¶çã«ãã§ãã¯ããŸãã ããã»ã¹ãåæ¢ããããšãç解ããããããã»ã¹ãåéããŸãã ã¢ããªã±ãŒã·ã§ã³ãåèµ·åããã ãã§ãšã©ãŒã解決ã§ããããã°ã©ã ããšã©ãŒæã«ã·ã£ããããŠã³ããããã«èšèšãããŠããå ŽåãNOP ãšãã«ã¹ ãã¹ã ãã¿ãŒã³ã«åŸãããã«å¿
èŠãªã®ã¯ããã»ã¹ã®ãã«ã¹ ãã§ãã¯ã ãã§ãã å¯äžæ®å¿µãªã®ã¯ãåèµ·åããŠããã¹ãŠã®ãšã©ãŒã解æ¶ãããããã§ã¯ãªãããšã§ãã ãã®å Žåãk8s ã¯ãããã®åé¡ãç¹å®ããããã® 2 ã€ã®ãã詳现ãªæ¹æ³ãæäŸããŸãã
LivenessProbe
ãã®é ã©ã€ããã¹ãããŒã kubelet 㯠3 çš®é¡ã®ãã§ãã¯ãå®è¡ããŸããããããå®è¡ãããŠãããã©ããã ãã§ãªãããªã¯ãšã¹ããåä¿¡ããŠââé©åã«å¿çããæºåãã§ããŠãããã©ãããå€æããŸãã
- ããããžã® HTTP ãªã¯ãšã¹ããèšå®ããŸãã å¿çã«ã¯ã200 ïœ 399 ã®ç¯å²ã® HTTP å¿çã³ãŒããå«ãŸããŠããå¿ èŠããããŸãããããã£ãŠãã³ãŒã 5xx ãš 4xx ã¯ãããã»ã¹ãå®è¡äžã§ãã£ãŠãããããã«åé¡ãããããšã瀺ããŸãã
- é HTTP ãµãŒãã¹ (Postfix ã¡ãŒã« ãµãŒããŒãªã©) ã䜿çšããŠãããããã¹ãããã«ã¯ãTCP æ¥ç¶ã確ç«ããå¿ èŠããããŸãã
- ãããã«å¯ŸããŠä»»æã®ã³ãã³ããå®è¡ããŸãïŒå éšçã«ïŒã ã³ãã³ãå®äºã³ãŒãã 0 ã®å Žåããã§ãã¯ã¯æåãããšã¿ãªãããŸãã
ãããã©ã®ããã«æ©èœãããã®äŸã 次ã®ãããå®çŸ©ã«ã¯ãHTTP ãªã¯ãšã¹ã㧠500 ãšã©ãŒãã¹ããŒãã NodeJS ã¢ããªã±ãŒã·ã§ã³ãå«ãŸããŠããŸãããã®ãããªãšã©ãŒãåãåã£ããšãã«ã³ã³ããã確å®ã«åèµ·åãããããã«ããã«ã¯ã livenessProbe ãã©ã¡ãŒã¿ã䜿çšããŸãã
apiVersion: v1
kind: Pod
metadata:
name: node500
spec:
containers:
- image: magalix/node500
name: node500
ports:
- containerPort: 3000
protocol: TCP
livenessProbe:
httpGet:
path: /
port: 3000
initialDelaySeconds: 5
ããã¯ä»ã®ãããå®çŸ©ãšå€ãããŸãããããªããžã§ã¯ããè¿œå ããŠããŸãã .spec.containers.livenessProbe
ã ãã©ã¡ãŒã¿ httpGet
HTTP GET ãªã¯ãšã¹ãã®éä¿¡å
ã®ãã¹ãåãå
¥ããŸã (ãã®äŸã§ã¯ããã㯠/
ããããæŠéã·ããªãªã§ã¯æ¬¡ã®ãããªãã®ããããããããŸãã /api/v1/status
ïŒã å¥ã® livenessProbe ã¯ãã©ã¡ãŒã¿ãåãåããŸã initialDelaySeconds
ããã¯ãæ€èšŒæäœãæå®ãããç§æ°åŸ
æ©ããããã«æ瀺ããŸãã ã³ã³ãããŒã®èµ·åã«ã¯æéãå¿
èŠã§ãããåèµ·åãããšãã°ããã®é䜿çšã§ããªããªããããé
延ãå¿
èŠã«ãªããŸãã
ãã®èšå®ãã¯ã©ã¹ã¿ãŒã«é©çšããã«ã¯ã次ã䜿çšããŸãã
kubectl apply -f pod.yaml
æ°ç§åŸã次ã®ã³ãã³ãã䜿çšããŠãããã®å 容ã確èªã§ããŸãã
kubectl describe pods node500
åºåã®æåŸã§ã
ã芧ã®ãšãããlivenessProbe 㯠HTTP GET ãªã¯ãšã¹ããéå§ããã³ã³ãããŒã¯ãšã©ãŒ 500 ãçæã (ãããããã°ã©ã ãããå 容ã§ã)ãkubelet ãã³ã³ãããŒãåèµ·åããŸããã
NideJS ã¢ããªã±ãŒã·ã§ã³ãã©ã®ããã«ããã°ã©ã ããããç¥ãããå Žåã¯ã䜿çšããã app.js ãš Dockerfile ã次ã«ç€ºããŸãã
app.js
var http = require('http');
var server = http.createServer(function(req, res) {
res.writeHead(500, { "Content-type": "text/plain" });
res.end("We have run into an errorn");
});
server.listen(3000, function() {
console.log('Server is running at 3000')
})
ããã«ãŒãã¡ã€ã«
FROM node
COPY app.js /
EXPOSE 3000
ENTRYPOINT [ "node","/app.js" ]
ããã«æ³šæããããšãéèŠã§ããlivenessProbe ã¯ãã³ã³ãããŒã倱æããå Žåã«ã®ã¿ã³ã³ãããŒãåèµ·åããŸãã ã³ã³ãããŒã®å®è¡ã劚ããŠãããšã©ãŒãåèµ·åã«ãã£ãŠä¿®æ£ãããªãå Žåãkubelet ã¯åé¡ãä¿®æ£ããããã®ã¢ã¯ã·ã§ã³ãå®è¡ã§ããŸããã
ã¬ãã£ãã¹ãããŒã
readinessProbe ã¯ããã©ãã«ã·ã¥ãŒãã£ã³ã° ã¢ã¯ã·ã§ã³ãé€ããlivenessProbes (GET ãªã¯ãšã¹ããTCP éä¿¡ãã³ãã³ãå®è¡) ãšåæ§ã«æ©èœããŸãã é害ãæ€åºãããã³ã³ããã¯åèµ·åãããŸããããåä¿¡ãã©ãã£ãã¯ããã¯éé¢ãããŸãã ã³ã³ãããŒã® XNUMX ã€ã倧éã®èšç®ãå®è¡ããŠããããè² è·ãé«ããå¿çæéãå¢å ããŠãããšæ³åããŠãã ããã livenessProbe ã®å Žåãå¿çã®å¯çšæ§ãã§ãã¯ã (timeoutSeconds ãã§ã㯠ãã©ã¡ãŒã¿ãŒçµç±ã§) ããªã¬ãŒããããã®åŸ kubelet ãã³ã³ãããŒãåèµ·åããŸãã ã³ã³ããã¯éå§ããããšããªãœãŒã¹ã倧éã«æ¶è²»ããã¿ã¹ã¯ã®å®è¡ãéå§ããåã³åèµ·åãããŸãã ããã¯ãå¿çé床ãå¿ èŠãªã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠéåžžã«éèŠã§ãã ããšãã°ãéè·¯ãèµ°è¡äžã®è»ããµãŒããŒããã®å¿çãåŸ ã£ãŠããŠãå¿çãé ããŠäºæ ã«éã£ããšããŸãã
GET ãªã¯ãšã¹ãã®å¿çæéã 5 ç§ä»¥å ã«èšå®ãã redinessProbe å®çŸ©ãäœæããŸããããã¢ããªã±ãŒã·ã§ã³ã¯ XNUMX ç§åŸã« GET ãªã¯ãšã¹ãã«å¿çããŸãã pod.yaml ãã¡ã€ã«ã¯æ¬¡ã®ããã«ãªããŸãã
apiVersion: v1
kind: Pod
metadata:
name: nodedelayed
spec:
containers:
- image: afakharany/node_delayed
name: nodedelayed
ports:
- containerPort: 3000
protocol: TCP
readinessProbe:
httpGet:
path: /
port: 3000
timeoutSeconds: 2
kubectl ã䜿çšããŠãããããããã€ããŸãããã
kubectl apply -f pod.yaml
æ°ç§åŸ ã£ãŠãããreadinessProbe ãã©ã®ããã«æ©èœããããèŠãŠã¿ãŸãããã
kubectl describe pods nodedelayed
åºåã®æåŸã§ãããã€ãã®ã€ãã³ããé¡äŒŒããŠããããšãããããŸãã
ã芧ã®ãšããããã§ãã¯æéã 2 ç§ãè¶ ããŠããkubectl ã¯ããããåèµ·åããŸããã§ããã 代ããã«ã圌ã¯ãªã¯ãšã¹ãããã£ã³ã»ã«ããŸããã åä¿¡ããéä¿¡ã¯ãä»ã®åäœäžã®ãããã«ãªãã€ã¬ã¯ããããŸãã
ãããããªãããŒããããã®ã§ãkubectl ã¯ãªã¯ãšã¹ããåã³ãããã«ã«ãŒãã£ã³ã°ããããšã«æ³šæããŠãã ãããGET ãªã¯ãšã¹ããžã®å¿çã¯é 延ããªããªããŸããã
æ¯èŒã®ããã«ãå€æŽããã app.js ãã¡ã€ã«ã以äžã«ç€ºããŸãã
var http = require('http');
var server = http.createServer(function(req, res) {
const sleep = (milliseconds) => {
return new Promise(resolve => setTimeout(resolve, milliseconds))
}
sleep(5000).then(() => {
res.writeHead(200, { "Content-type": "text/plain" });
res.end("Hellon");
})
});
server.listen(3000, function() {
console.log('Server is running at 3000')
})
TL; DR
ã¯ã©ãŠã ã¢ããªã±ãŒã·ã§ã³ãç»å Žããåã¯ããã°ãã¢ããªã±ãŒã·ã§ã³ã®å¥å
šæ§ãç£èŠããã³ãã§ãã¯ããäž»ãªæ段ã§ããã ããããæ¯æ£æªçœ®ãè¬ããæ段ã¯ãããŸããã§ããã ãã°ã¯çŸåšã§ã圹ã«ç«ã¡ãŸããç·æ¥äºæ
ãåæããææ決å®ãè¡ãããã«ã¯ããã°ãåéããŠãã°åéã·ã¹ãã ã«éä¿¡ããå¿
èŠããããŸãã [ããããã¹ãŠã¯ãããšãã° monit ã䜿çšããã¯ã©ãŠã ã¢ããªã±ãŒã·ã§ã³ãªãã§ãå®è¡ã§ããŸãããk8s ã䜿çšãããšã¯ããã«ç°¡åã«ãªããŸãã :) â ç·šéè
泚ã ]
çŸåšã§ã¯ãä¿®æ£ã¯ã»ãŒãªã¢ã«ã¿ã€ã ã§è¡ãå¿ èŠããããããã¢ããªã±ãŒã·ã§ã³ããã©ãã¯ããã¯ã¹ã«ããå¿ èŠã¯ãªããªããŸããã ããããå¿ èŠã«å¿ããŠå³åº§ã«å¿çã§ããããã«ãç£èŠã·ã¹ãã ãããã»ã¹ã®ç¶æ ã«é¢ãã貎éãªããŒã¿ãã¯ãšãªããã³åéã§ããããã«ãããšã³ããã€ã³ãã瀺ãå¿ èŠããããŸãã ããã¯ããã©ãŒãã³ã¹ ãã¹ãèšèšãã¿ãŒã³ãšåŒã°ããé«å¯èŠ³æž¬æ§åå (HOP) ã«æºæ ããŠããŸãã
Kubernetes ã¯ãreadinessProbe ãš livenessProbe ãšãã 2 çš®é¡ã®ãã«ã¹ãã§ãã¯ãããã©ã«ãã§æäŸããŸãã ã©ã¡ããåãã¿ã€ãã®ãã§ã㯠(HTTP GET ãªã¯ãšã¹ããTCP éä¿¡ãã³ãã³ãå®è¡) ã䜿çšããŸãã ãããã¯ããããå ã®åé¡ã«å¿ããŠã©ã®ãããªæ±ºå®ãäžãããç°ãªããŸãã livenessProbe ã¯ãšã©ãŒãåã³çºçããªãããšãæåŸ ããŠã³ã³ãããåèµ·åããreadinessProbe ã¯åé¡ã®åå ã解決ããããŸã§åä¿¡ãã©ãã£ãã¯ããããããéé¢ããŸãã
é©åãªã¢ããªã±ãŒã·ã§ã³èšèšã§ã¯ãäž¡æ¹ã®ã¿ã€ãã®ãã§ãã¯ãçµã¿èŸŒã¿ãç¹ã«äŸå€ãã¹ããŒãããå Žåã«ååãªããŒã¿ãåéãããããã«ããå¿ èŠããããŸãã ãŸããç£èŠã·ã¹ãã (Prometheus) ã«éèŠãªå¥åº·ææšãæäŸããå¿ èŠãª API ãšã³ããã€ã³ãã衚瀺ãããŸãã
åºæïŒ habr.com