ืฉื™ื˜ื•ืช ืขื‘ื•ื“ื” ืžื•ืžืœืฆื•ืช ืœืžื›ื•ืœื•ืช Kubernetes: ื‘ื“ื™ืงื•ืช ื‘ืจื™ืื•ืช

ืฉื™ื˜ื•ืช ืขื‘ื•ื“ื” ืžื•ืžืœืฆื•ืช ืœืžื›ื•ืœื•ืช Kubernetes: ื‘ื“ื™ืงื•ืช ื‘ืจื™ืื•ืช

TL; DR

  • ื›ื“ื™ ืœื”ืฉื™ื’ ืฆืคื™ื•ืช ื’ื‘ื•ื”ื” ืฉืœ ืงื•ื ื˜ื™ื™ื ืจื™ื ื•ืžื™ืงืจื•-ืฉื™ืจื•ืชื™ื, ื™ื•ืžื ื™ื ื•ืžื“ื“ื™ื ืจืืฉื™ื™ื ืื™ื ื ืžืกืคื™ืงื™ื.
  • ืœื”ืชืื•ืฉืฉื•ืช ืžื”ื™ืจื” ื™ื•ืชืจ ื•ืœื’ืžื™ืฉื•ืช ืžื•ื’ื‘ืจืช, ื™ื™ืฉื•ืžื™ื ืฆืจื™ื›ื™ื ืœื™ื™ืฉื ืืช ืขื™ืงืจื•ืŸ ื”ืชืฆืคื™ืช ื”ื’ื‘ื•ื”ื” (HOP).
  • ื‘ืจืžืช ื”ืืคืœื™ืงืฆื™ื”, NOP ื“ื•ืจืฉ: ืจื™ืฉื•ื ื ื›ื•ืŸ, ื ื™ื˜ื•ืจ ืฆืžื•ื“, ื‘ื“ื™ืงื•ืช ืฉืคื™ื•ืช ื•ืžืขืงื‘ ืื—ืจ ื‘ื™ืฆื•ืขื™ื/ืžืขื‘ืจื™ื.
  • ื”ืฉืชืžืฉ ื‘ื”ืžื—ืื•ืช ื›ืจื›ื™ื‘ ืฉืœ NOR ืžื•ื›ื ื•ืช ื‘ื“ื™ืงื” ะธ livenessProbe ืงื•ื‘ืจื ื˜.

ืžื”ื™ ืชื‘ื ื™ืช ื‘ื“ื™ืงืช ื‘ืจื™ืื•ืช?

ื‘ืขืช ืชื›ื ื•ืŸ ืืคืœื™ืงืฆื™ื” ืงืจื™ื˜ื™ืช ืœืžืฉื™ืžื” ื•ื–ืžื™ื ื” ืžืื•ื“, ื—ืฉื•ื‘ ืžืื•ื“ ืœื—ืฉื•ื‘ ืขืœ ื”ื™ื‘ื˜ ื›ื–ื” ื›ืžื• ืกื•ื‘ืœื ื•ืช ืœืชืงืœื•ืช. ืืคืœื™ืงืฆื™ื” ื ื—ืฉื‘ืช ืกื•ื‘ืœื ื™ืช ืœืชืงืœื•ืช ืื ื”ื™ื ืžืชืื•ืฉืฉืช ื‘ืžื”ื™ืจื•ืช ืžื›ืฉืœ. ืืคืœื™ืงืฆื™ื™ืช ืขื ืŸ ื˜ื™ืคื•ืกื™ืช ืžืฉืชืžืฉืช ื‘ืืจื›ื™ื˜ืงื˜ื•ืจืช microservices - ื›ืืฉืจ ื›ืœ ืจื›ื™ื‘ ืžืžื•ืงื ื‘ืงื•ื ื˜ื™ื™ื ืจ ื ืคืจื“. ื•ื›ื“ื™ ืœื•ื•ื“ื ืฉื”ืืคืœื™ืงืฆื™ื” ื‘-k8s ื–ืžื™ื ื” ืžืื•ื“ ื›ืฉืืชื” ืžืขืฆื‘ ืืฉื›ื•ืœ, ืืชื” ืฆืจื™ืš ืœืขืงื•ื‘ ืื—ืจ ื“ืคื•ืกื™ื ืžืกื•ื™ืžื™ื. ื‘ื™ื ื™ื”ื ื™ืฉ ืืช ืชื‘ื ื™ืช ื‘ื“ื™ืงืช ื”ื‘ืจื™ืื•ืช. ื–ื” ืžื’ื“ื™ืจ ืื™ืš ื”ืืคืœื™ืงืฆื™ื” ืžืชืงืฉืจืช ืœ-k8s ืฉื”ื™ื ื‘ืจื™ืื”. ื–ื” ืœื ืจืง ืžื™ื“ืข ืขืœ ื”ืื ื”ืคื•ื“ ืคื•ืขืœ, ืืœื ื’ื ืขืœ ื”ืื•ืคืŸ ืฉื‘ื• ื”ื•ื ืžืงื‘ืœ ื•ืžื’ื™ื‘ ืœื‘ืงืฉื•ืช. ื›ื›ืœ ืฉ-Kubernetes ื™ื•ื“ืข ื™ื•ืชืจ ืขืœ ื‘ืจื™ืื•ืช ื”ืคื•ื“, ื›ืš ื”ื•ื ืžืงื‘ืœ ื”ื—ืœื˜ื•ืช ื—ื›ืžื•ืช ื™ื•ืชืจ ืœื’ื‘ื™ ื ื™ืชื•ื‘ ืชื ื•ืขื” ื•ืื™ื–ื•ืŸ ืขื•ืžืกื™ื. ืœืคื™ื›ืš, ืขื™ืงืจื•ืŸ High Observability ืžืืคืฉืจ ืœืืคืœื™ืงืฆื™ื” ืœื”ื’ื™ื‘ ืœื‘ืงืฉื•ืช ื‘ื–ืžืŸ.

ืขืงืจื•ืŸ ืฆืคื™ื•ืช ื’ื‘ื•ื” (HOP)

ื”ืขื™ืงืจื•ืŸ ืฉืœ ืฆืคื™ื•ืช ื’ื‘ื•ื”ื” ื”ื•ื ืื—ื“ ืžื”ื ืขืงืจื•ื ื•ืช ืœืชื›ื ื•ืŸ ื™ื™ืฉื•ืžื™ื ืžื›ื•ืœื™ื. ื‘ืืจื›ื™ื˜ืงื˜ื•ืจืช ืžื™ืงืจื•-ืฉื™ืจื•ืชื™ื, ืœืฉื™ืจื•ืชื™ื ืœื ืื›ืคืช ืื™ืš ืžืขื•ื‘ื“ื™ื ืืช ื”ื‘ืงืฉื” ืฉืœื”ื (ื•ื‘ืฆื“ืง), ืื‘ืœ ืžื” ืฉื—ืฉื•ื‘ ื”ื•ื ืื™ืš ื”ื ืžืงื‘ืœื™ื ืชื’ื•ื‘ื•ืช ืžื”ืฉื™ืจื•ืชื™ื ื”ืžืงื‘ืœื™ื. ืœื“ื•ื’ืžื”, ื›ื“ื™ ืœืืžืช ืžืฉืชืžืฉ, ืงื•ื ื˜ื™ื™ื ืจ ืื—ื“ ืฉื•ืœื— ื‘ืงืฉืช HTTP ืœืื—ืจืช, ืžืฆืคื” ืœืชื’ื•ื‘ื” ื‘ืคื•ืจืžื˜ ืžืกื•ื™ื - ื–ื” ื”ื›ืœ. PythonJS ื™ื›ื•ืœ ื’ื ืœืขื‘ื“ ืืช ื”ื‘ืงืฉื”, ื•-Python Flask ื™ื›ื•ืœ ืœื”ื’ื™ื‘. ืžื™ื›ืœื™ื ื”ื ื›ืžื• ืงื•ืคืกืื•ืช ืฉื—ื•ืจื•ืช ืขื ืชื•ื›ืŸ ืžื•ืกืชืจ ื–ื” ืœื–ื”. ืขื ื–ืืช, ืขื™ืงืจื•ืŸ ื”-NOP ืžื—ื™ื™ื‘ ื›ืœ ืฉื™ืจื•ืช ืœื—ืฉื•ืฃ ืžืกืคืจ ื ืงื•ื“ื•ืช ืงืฆื” ืฉืœ API ื”ืžืฆื™ื™ื ื™ื ืขื“ ื›ืžื” ื”ื•ื ื‘ืจื™ื, ื›ืžื• ื’ื ืืช ืžื•ื›ื ื•ืชื• ื•ืกื•ื‘ืœื ื•ืช ื”ืชืงืœื•ืช ืฉืœื•. Kubernetes ืžื‘ืงืฉ ืืช ื”ืื™ื ื“ื™ืงื˜ื•ืจื™ื ื”ืืœื” ื›ื“ื™ ืœื—ืฉื•ื‘ ืขืœ ื”ืฉืœื‘ื™ื ื”ื‘ืื™ื ืœื ื™ืชื•ื‘ ื•ืื™ื–ื•ืŸ ืขื•ืžืกื™ื.

ื™ื™ืฉื•ื ืขื ืŸ ืžืขื•ืฆื‘ ื”ื™ื˜ื‘ ืจื•ืฉื ืืช ื”ืื™ืจื•ืขื™ื ื”ืขื™ืงืจื™ื™ื ืฉืœื• ื‘ืืžืฆืขื•ืช ื–ืจืžื™ ื”-I/O ื”ืกื˜ื ื“ืจื˜ื™ื™ื STDERR ื•-STDOUT. ื‘ื”ืžืฉืš ืžื’ื™ืข ืฉื™ืจื•ืช ืขื–ืจ, ืœืžืฉืœ filebeat, logstash ืื• fluentd, ืืกืคืงืช ื™ื•ืžื ื™ื ืœืžืขืจื›ืช ื ื™ื˜ื•ืจ ืžืจื›ื–ื™ืช (ืœืžืฉืœ Prometheus) ื•ืžืขืจื›ืช ืื™ืกื•ืฃ ื™ื•ืžื ื™ื (ื—ื‘ื™ืœืช ืชื•ื›ื ื•ืช ELK). ื”ืชืจืฉื™ื ืฉืœื”ืœืŸ ืžืจืื” ื›ื™ืฆื“ ืืคืœื™ืงืฆื™ื™ืช ืขื ืŸ ืคื•ืขืœืช ืขืœ ืคื™ ื“ืคื•ืก ืžื‘ื—ืŸ ื”ื‘ืจื™ืื•ืช ื•ืขืงืจื•ืŸ ื”ืชืฆืคื™ืช ื”ื’ื‘ื•ื”ื”.

ืฉื™ื˜ื•ืช ืขื‘ื•ื“ื” ืžื•ืžืœืฆื•ืช ืœืžื›ื•ืœื•ืช Kubernetes: ื‘ื“ื™ืงื•ืช ื‘ืจื™ืื•ืช

ื›ื™ืฆื“ ืœื™ื™ืฉื ืืช ื“ืคื•ืก ื‘ื“ื™ืงืช ื”ื‘ืจื™ืื•ืช ื‘-Kubernetes?

ืžื—ื•ืฅ ืœืงื•ืคืกื”, k8s ืžื ื˜ืจ ืืช ืžืฆื‘ ื”ืคื•ื“ื™ื ื‘ืืžืฆืขื•ืช ืื—ื“ ื”ื‘ืงืจื™ื (ืคืจื™ืกื•ืช, ReplicaSets, DaemonSets, StatefulSets ื•ื›ื•' ื•ื›ื•'). ืœืื—ืจ ืฉื’ื™ืœื” ืฉื”ืคื•ื“ ื ืคืœ ืžืกื™ื‘ื” ื›ืœืฉื”ื™, ื”ื‘ืงืจ ืžื ืกื” ืœื”ืคืขื™ืœ ืื•ืชื• ืžื—ื“ืฉ ืื• ืœื”ืขื‘ื™ืจ ืื•ืชื• ืœืฆื•ืžืช ืื—ืจ. ืขื ื–ืืช, ืคื•ื“ ืขืฉื•ื™ ืœื“ื•ื•ื— ืฉื”ื•ื ืคื•ืขืœ, ืืš ื”ื•ื ืขืฆืžื• ืื™ื ื• ืคื•ืขืœ. ื‘ื•ื ื ื™ืชืŸ ื“ื•ื’ืžื”: ื”ืืคืœื™ืงืฆื™ื” ืฉืœืš ืžืฉืชืžืฉืช ื‘- Apache ื›ืฉืจืช ืื™ื ื˜ืจื ื˜, ื”ืชืงื ืช ืืช ื”ืจื›ื™ื‘ ืขืœ ืžืกืคืจ ืคื•ื“ื™ื ืฉืœ ื”ืืฉื›ื•ืœ. ืžืื—ืจ ืฉื”ืกืคืจื™ื™ื” ื”ื•ื’ื“ืจื” ื‘ืฆื•ืจื” ืฉื’ื•ื™ื”, ื›ืœ ื”ื‘ืงืฉื•ืช ืœืืคืœื™ืงืฆื™ื” ืžื’ื™ื‘ื•ืช ื‘ืงื•ื“ 500 (ืฉื’ื™ืืช ืฉืจืช ืคื ื™ืžื™ืช). ื‘ื‘ื“ื™ืงืช ืžืฉืœื•ื—, ื‘ื“ื™ืงืช ืกื˜ื˜ื•ืก ื”ืคื•ื“ื™ื ื ื•ืชื ืช ืชื•ืฆืื” ืžื•ืฆืœื—ืช, ืืš ื”ืœืงื•ื—ื•ืช ื—ื•ืฉื‘ื™ื ืื—ืจืช. ื ืชืืจ ืžืฆื‘ ืœื ืจืฆื•ื™ ื–ื” ื‘ืื•ืคืŸ ื”ื‘ื:

ืฉื™ื˜ื•ืช ืขื‘ื•ื“ื” ืžื•ืžืœืฆื•ืช ืœืžื›ื•ืœื•ืช Kubernetes: ื‘ื“ื™ืงื•ืช ื‘ืจื™ืื•ืช

ื‘ื“ื•ื’ืžื” ืฉืœื ื•, k8s ื›ืŸ ื‘ื“ื™ืงืช ืคื•ื ืงืฆื™ื•ื ืœื™ื•ืช. ื‘ืกื•ื’ ื–ื” ืฉืœ ืื™ืžื•ืช, ื”ืงื•ื‘ืœื˜ ื‘ื•ื“ืง ื‘ืื•ืคืŸ ืจืฆื™ืฃ ืืช ืžืฆื‘ ื”ืชื”ืœื™ืš ื‘ืžื™ื›ืœ. ื‘ืจื’ืข ืฉื”ื•ื ื™ื‘ื™ืŸ ืฉื”ืชื”ืœื™ืš ื ืขืฆืจ, ื”ื•ื ื™ืชื—ื™ืœ ืื•ืชื• ืžื—ื“ืฉ. ืื ื ื™ืชืŸ ืœืคืชื•ืจ ืืช ื”ืฉื’ื™ืื” ืคืฉื•ื˜ ืขืœ ื™ื“ื™ ื”ืคืขืœื” ืžื—ื“ืฉ ืฉืœ ื”ื™ื™ืฉื•ื, ื•ื”ืชื•ื›ื ื™ืช ืžืชื•ื›ื ื ืช ืœื›ื‘ื•ืช ืขืœ ื›ืœ ืฉื’ื™ืื”, ืื– ื‘ื“ื™ืงืช ืชืงื™ื ื•ืช ื”ืชื”ืœื™ืš ื”ื™ื ื›ืœ ืžื” ืฉืืชื” ืฆืจื™ืš ื›ื“ื™ ืœืขืงื•ื‘ ืื—ืจ ื”-NOP ื•ื“ืคื•ืก ื‘ื“ื™ืงืช ื”ื‘ืจื™ืื•ืช. ื”ื—ื‘ืœ ื”ื™ื—ื™ื“ ื”ื•ื ืฉืœื ื›ืœ ื”ืฉื’ื™ืื•ืช ื ืžื—ืงื•ืช ืขืœ ื™ื“ื™ ื”ืคืขืœื” ืžื—ื“ืฉ. ื‘ืžืงืจื” ื–ื”, k8s ืžืฆื™ืขื” 2 ื“ืจื›ื™ื ืขืžื•ืงื•ืช ื™ื•ืชืจ ืœื–ื”ื•ืช ื‘ืขื™ื•ืช ืขื ื”ืคื•ื“: livenessProbe ะธ ืžื•ื›ื ื•ืช ื‘ื“ื™ืงื”.

LivenessProbe

ื‘ืžื”ืœืš livenessProbe kubelet ืžื‘ืฆืขืช 3 ืกื•ื’ื™ ื‘ื“ื™ืงื•ืช: ืœื ืจืง ืงื•ื‘ืขืช ืื ื”ืคื•ื“ ืคื•ืขืœ, ืืœื ื’ื ืื ื”ื•ื ืžื•ื›ืŸ ืœืงื‘ืœ ื•ืœื”ื’ื™ื‘ ื›ืจืื•ื™ ืœื‘ืงืฉื•ืช:

  • ื”ื’ื“ืจ ื‘ืงืฉืช HTTP ืœืคื•ื“. ื”ืชื’ื•ื‘ื” ื—ื™ื™ื‘ืช ืœื”ื›ื™ืœ ืงื•ื“ ืชื’ื•ื‘ืช HTTP ื‘ื˜ื•ื•ื— ืฉื‘ื™ืŸ 200 ืœ-399. ืœืคื™ื›ืš, ื”ืงื•ื“ื™ื 5xx ื•-4xx ืžืื•ืชืชื™ื ื›ื™ ื”ืคื•ื“ ื ืชืงืœ ื‘ื‘ืขื™ื•ืช, ืœืžืจื•ืช ืฉื”ืชื”ืœื™ืš ืคื•ืขืœ.
  • ื›ื“ื™ ืœื‘ื“ื•ืง ืคื•ื“ื™ื ืขื ืฉื™ืจื•ืชื™ื ืฉืื™ื ื HTTP (ืœื“ื•ื’ืžื”, ืฉืจืช ื”ื“ื•ืืจ Postfix), ืขืœื™ืš ืœื™ืฆื•ืจ ื—ื™ื‘ื•ืจ TCP.
  • ื‘ืฆืข ืคืงื•ื“ื” ืฉืจื™ืจื•ืชื™ืช ืขื‘ื•ืจ ืชืจืžื™ืœ (ืคื ื™ืžื™). ื”ื‘ื“ื™ืงื” ื ื—ืฉื‘ืช ืžื•ืฆืœื—ืช ืื ืงื•ื“ ื”ืฉืœืžืช ื”ืคืงื•ื“ื” ื”ื•ื 0.

ื“ื•ื’ืžื” ืœืื™ืš ื–ื” ืขื•ื‘ื“. ื”ื’ื“ืจืช ื”ืคื•ื“ ื”ื‘ืื” ืžื›ื™ืœื” ื™ื™ืฉื•ื NodeJS ืฉื–ื•ืจืง ืฉื’ื™ืื” 500 ื‘ื‘ืงืฉื•ืช HTTP. ื›ื“ื™ ืœื•ื•ื“ื ืฉื”ืžื›ืœ ืžื•ืคืขืœ ืžื—ื“ืฉ ื‘ืขืช ืงื‘ืœืช ืฉื’ื™ืื” ื›ื–ื•, ืื ื• ืžืฉืชืžืฉื™ื ื‘ืคืจืžื˜ืจ 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 ื•ื‘ื™ืฆื•ืข ืคืงื•ื“ื•ืช), ืœืžืขื˜ ืคืขื•ืœื•ืช ืœืคืชืจื•ืŸ ื‘ืขื™ื•ืช. ื”ืžื›ื•ืœื” ืฉื‘ื” ืžื–ื•ื”ื” ื”ื›ืฉืœ ืื™ื ื• ืžื•ืคืขืœ ืžื—ื“ืฉ, ืืœื ืžื‘ื•ื“ื“ ืžืชืขื‘ื•ืจื” ื ื›ื ืกืช. ืชืืจื• ืœืขืฆืžื›ื ืฉืื—ืช ืžื”ืžื›ื•ืœื•ืช ืžื‘ืฆืขืช ื”ืจื‘ื” ื—ื™ืฉื•ื‘ื™ื ืื• ื ืžืฆืืช ื‘ืขื•ืžืก ืจื‘, ืžื” ืฉื’ื•ืจื ืœื–ืžื ื™ ื”ืชื’ื•ื‘ื” ืœืขืœื•ืช. ื‘ืžืงืจื” ืฉืœ livenessProbe, ื‘ื“ื™ืงืช ื–ืžื™ื ื•ืช ื”ืชื’ื•ื‘ื” ืžื•ืคืขืœืช (ื‘ืืžืฆืขื•ืช ื”ืคืจืžื˜ืจ timeoutSeconds check), ื•ืœืื—ืจ ืžื›ืŸ ื”-kubelet ืžืคืขื™ืœื” ืžื—ื“ืฉ ืืช ื”ืžื™ื›ืœ. ืขื ื”ืคืขืœืชื•, ื”ืžื™ื›ืœ ืžืชื—ื™ืœ ืœื‘ืฆืข ืžืฉื™ืžื•ืช ืขืชื™ืจื•ืช ืžืฉืื‘ื™ื ื•ืžื•ืคืขืœ ืžื—ื“ืฉ ืฉื•ื‘. ื–ื” ื™ื›ื•ืœ ืœื”ื™ื•ืช ืงืจื™ื˜ื™ ืขื‘ื•ืจ ื™ื™ืฉื•ืžื™ื ืฉื–ืงื•ืงื™ื ืœืžื”ื™ืจื•ืช ืชื’ื•ื‘ื”. ืœื“ื•ื’ืžื, ืจื›ื‘ ื‘ื ืกื™ืขื” ืžืžืชื™ืŸ ืœืชื’ื•ื‘ื” ืžื”ืฉืจืช, ื”ืชื’ื•ื‘ื” ืžืชืขื›ื‘ืช - ื•ื”ืžื›ื•ื ื™ืช ื ืงืœืขืช ืœืชืื•ื ื”.

ื‘ื•ื ื ื›ืชื•ื‘ ื”ื’ื“ืจืช redinessProbe ืฉืชื’ื“ื™ืจ ืืช ื–ืžืŸ ื”ืชื’ื•ื‘ื” ืœื‘ืงืฉืช GET ืœืœื ื™ื•ืชืจ ืžืฉืชื™ ืฉื ื™ื•ืช, ื•ื”ืืคืœื™ืงืฆื™ื” ืชื’ื™ื‘ ืœื‘ืงืฉืช GET ืœืื—ืจ 5 ืฉื ื™ื•ืช. ื”ืงื•ื‘ืฅ 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

ื‘ืกื•ืฃ ื”ืคืœื˜ ื ื™ืชืŸ ืœืจืื•ืช ืฉื—ืœืง ืžื”ืื™ืจื•ืขื™ื ื“ื•ืžื™ื ื–ึถื”.

ื›ืคื™ ืฉืืชื” ื™ื›ื•ืœ ืœืจืื•ืช, kubectl ืœื ื”ืคืขื™ืœ ืžื—ื“ืฉ ืืช ื”ืคื•ื“ ื›ืืฉืจ ื–ืžืŸ ื”ื‘ื“ื™ืงื” ืขื‘ืจ 2 ืฉื ื™ื•ืช. ื‘ืžืงื•ื ื–ืืช, ื”ื•ื ื‘ื™ื˜ืœ ืืช ื”ื‘ืงืฉื”. ืชืงืฉื•ืจืช ื ื›ื ืกืช ืžื ื•ืชื‘ืช ืœืชืจืžื™ืœื™ื ืื—ืจื™ื ื”ืคื•ืขืœื™ื.

ืฉื™ืžื• ืœื‘ ืฉื›ืขืช, ื›ืฉื”ืคื•ื“ ืžื•ืจื—ืง, 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 ืžืฆื™ืขื” 2 ืกื•ื’ื™ื ืฉืœ ื‘ื“ื™ืงื•ืช ื‘ืจื™ืื•ืช ื›ื‘ืจื™ืจืช ืžื—ื“ืœ: readinessProbe ื•-livenessProbe. ืฉื ื™ื”ื ืžืฉืชืžืฉื™ื ื‘ืื•ืชื ืกื•ื’ื™ ื‘ื“ื™ืงื•ืช (ื‘ืงืฉื•ืช HTTP GET, ืชืงืฉื•ืจืช TCP ื•ื‘ื™ืฆื•ืข ืคืงื•ื“ื•ืช). ื”ื ืฉื•ื ื™ื ื‘ืื™ืœื• ื”ื—ืœื˜ื•ืช ื”ื ืžืงื‘ืœื™ื ื‘ืชื’ื•ื‘ื” ืœื‘ืขื™ื•ืช ื‘ืชืจืžื™ืœื™ื. livenessProbe ืžืคืขื™ืœ ืžื—ื“ืฉ ืืช ื”ืงื•ื ื˜ื™ื™ื ืจ ื‘ืชืงื•ื•ื” ืฉื”ืฉื’ื™ืื” ืœื ืชื—ื–ื•ืจ ืขืœ ืขืฆืžื”, ื•-readinessProbe ืžื‘ื•ื“ื“ืช ืืช ื”ืคื•ื“ ืžืชืขื‘ื•ืจื” ื ื›ื ืกืช ืขื“ ืœืคืชืจื•ืŸ ื”ื’ื•ืจื ืœื‘ืขื™ื”.

ืชื›ื ื•ืŸ ื ื›ื•ืŸ ืฉืœ ื™ื™ืฉื•ื ืฆืจื™ืš ืœื›ืœื•ืœ ืืช ืฉื ื™ ืกื•ื’ื™ ื”ื‘ื“ื™ืงื•ืช ื•ืœื•ื•ื“ื ืฉื”ื ืื•ืกืคื™ื ืžืกืคื™ืง ื ืชื•ื ื™ื, ื‘ืžื™ื•ื—ื“ ื›ืืฉืจ ื ื–ืจืง ื—ืจื™ื’. ื–ื” ื’ื ืฆืจื™ืš ืœื”ืจืื•ืช ืืช ื ืงื•ื“ื•ืช ื”ืงืฆื” ื”ื“ืจื•ืฉื•ืช ืฉืœ API ื”ืžืกืคืงื•ืช ืœืžืขืจื›ืช ื”ื ื™ื˜ื•ืจ (Prometheus) ืžื“ื“ื™ ื‘ืจื™ืื•ืช ื—ืฉื•ื‘ื™ื.

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”