ã¹ã±ãŒã©ããªãã£ã¯ã¯ã©ãŠã ã¢ããªã±ãŒã·ã§ã³ã®éèŠãªèŠä»¶ã§ãã Kubernetes ã䜿çšãããšãé©åãªãããã€ã¡ã³ãã®ã¬ããªã«ã®æ°ãå¢ããã ãã§ã¢ããªã±ãŒã·ã§ã³ã®ã¹ã±ãŒãªã³ã°ãç°¡åã«ãªããŸãã ReplicaSet
â ãã ããããã¯æåã®ããã»ã¹ã§ãã
Kubernetes ã䜿çšãããšãã¢ããªã±ãŒã·ã§ã³ãèªåçã«ã¹ã±ãŒãªã³ã°ã§ããŸã (ã€ãŸãããããã€ã¡ã³ãå
ã®ãããã ReplicaSet
) æ°Žå¹³ããã ãªãŒãã¹ã±ãŒã©ãŒä»æ§ã䜿çšãã宣èšçãªæ¹æ³ã§ã èªåã¹ã±ãŒãªã³ã°ã®ããã©ã«ãã®åºæºã¯ CPU 䜿çšçã¡ãââãªã¯ã¹ (ãªãœãŒã¹ ã¡ããªã¯ã¹) ã§ãããã«ã¹ã¿ã ã¡ããªã¯ã¹ãšå€éšæäŸã®ã¡ããªã¯ã¹ãçµ±åã§ããŸãã
ããŒã
ãããã®æ°Žå¹³èªåã¹ã±ãŒãªã³ã°ã®ä»£ããã«ããªãŒãã³ãœãŒã¹ã® Kubernetes ãªãã¬ãŒã¿ãŒã§ãã Kubernetes Event Driven Autoscaling (KEDA) ã䜿çšãããŸãã æ°Žå¹³ããã ãªãŒãã¹ã±ãŒã©ãŒãšãã€ãã£ãã«çµ±åãããã€ãã³ã ããªãã³ã®ã¯ãŒã¯ããŒãã«ã·ãŒã ã¬ã¹ãªèªåã¹ã±ãŒãªã³ã° (ãŒããžã®/ãŒãããã®ã¹ã±ãŒã«ãå«ã) ãæäŸããŸãã ã³ãŒãã¯æ¬¡ã®å Žæã§å
¥æã§ããŸã
ã·ã¹ãã ã®æŠèŠ
ãã®å³ã¯ããã¹ãŠãã©ã®ããã«æ©èœããããç°¡åã«èª¬æãããã®ã§ãã
- ãã®ã¢ããªã±ãŒã·ã§ã³ã¯ãHTTP ããã ã«ãŠã³ã ã¡ããªãã¯ã Prometheus 圢åŒã§æäŸããŸãã
- Prometheus ã¯ããããã®ã¡ããªã¯ã¹ãåéããããã«æ§æãããŠããŸãã
- KEDA ã® Prometheus ã¹ã±ãŒã©ãŒã¯ãHTTP ãããæ°ã«åºã¥ããŠã¢ããªã±ãŒã·ã§ã³ãèªåçã«ã¹ã±ãŒãªã³ã°ããããã«æ§æãããŠããŸãã
ããã§ã¯ããããã®èŠçŽ ã«ã€ããŠè©³ãã説æããŠãããŸãã
KEDAãšããã¡ããŠã¹
Prometheus ã¯ããªãŒãã³ãœãŒã¹ã®ã·ã¹ãã ç£èŠããã³èŠåããŒã«ãããã®äžéšã§ã
KEDA ã¯ã¹ã±ãŒã©ãŒã®æŠå¿µããµããŒãããŠãããKEDA ãšå€éšã·ã¹ãã ã®éã®ããªããžãšããŠæ©èœããŸãã ã¹ã±ãŒã©ãŒã®å®è£ ã¯åã¿ãŒã²ãã ã·ã¹ãã ã«åºæã§ãããããããããŒã¿ãæœåºããŸãã KEDA ã¯ãããã䜿çšããŠèªåã¹ã±ãŒãªã³ã°ãå¶åŸ¡ããŸãã
ã¹ã±ãŒã©ãŒã¯ãKafkaãRedisãPrometheus ãªã©ã®è€æ°ã®ããŒã¿ ãœãŒã¹ããµããŒãããŸãã ã€ãŸããKEDA ã䜿çšãããšãPrometheus ã¡ããªã¯ã¹ãåºæºãšã㊠Kubernetes ãããã€ã¡ã³ããèªåçã«ã¹ã±ãŒãªã³ã°ã§ããŸãã
ãã¹ãã¢ããªã±ãŒã·ã§ã³
Golang ãã¹ã ã¢ããªã±ãŒã·ã§ã³ã¯ HTTP çµç±ã§ã¢ã¯ã»ã¹ãæäŸãã次㮠XNUMX ã€ã®éèŠãªæ©èœãå®è¡ããŸãã
- Prometheus Go ã¯ã©ã€ã¢ã³ã ã©ã€ãã©ãªã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ãèšæž¬ããããã ã«ãŠã³ããå«ã http_requests ã¡ããªã¯ã¹ãæäŸããŸãã Prometheus ã¡ããªã¯ã¹ãå©çšå¯èœãªãšã³ããã€ã³ãã¯ã次㮠URI ã«ãããŸãã
/metrics
.var httpRequestsCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "http_requests", Help: "number of http requests", })
- ãªã¯ãšã¹ãã«å¿ããŠ
GET
ã¢ããªã±ãŒã·ã§ã³ã¯ããŒã®å€ãã€ã³ã¯ãªã¡ã³ãããŸã (access_count
) Redis ã§ã ããã¯ãHTTP ãã³ãã©ãŒã®äžéšãšããŠäœæ¥ãå®è¡ããPrometheus ã¡ããªã¯ã¹ããã§ãã¯ããç°¡åãªæ¹æ³ã§ãã ã¡ããªãã¯å€ã¯å€ãšåãã§ããå¿ èŠããããŸãaccess_count
Redisã§ãfunc main() { http.Handle("/metrics", promhttp.Handler()) http.HandleFunc("/test", func(w http.ResponseWriter, r *http.Request) { defer httpRequestsCounter.Inc() count, err := client.Incr(redisCounterName).Result() if err != nil { fmt.Println("Unable to increment redis counter", err) os.Exit(1) } resp := "Accessed on " + time.Now().String() + "nAccess count " + strconv.Itoa(int(count)) w.Write([]byte(resp)) }) http.ListenAndServe(":8080", nil) }
ã¢ããªã±ãŒã·ã§ã³ã¯æ¬¡ã®æ¹æ³ã§ Kubernetes ã«ãããã€ãããŸãã Deployment
ã ãµãŒãã¹ãçãŸããŸã ClusterIP
ã䜿çšãããšãPrometheus ãµãŒããŒãã¢ããªã±ãŒã·ã§ã³ ã¡ããªã¯ã¹ãååŸã§ããããã«ãªããŸãã
ããã§
ããã¡ããŠã¹ãµãŒããŒ
Prometheus ãããã€ã¡ã³ã ãããã§ã¹ãã¯æ¬¡ã®ãã®ã§æ§æãããŸãã
ConfigMap
â Prometheus æ§æã転éããŸããDeployment
â Kubernetes ã¯ã©ã¹ã¿ãŒã« Prometheus ããããã€ããå ŽåãClusterIP
â UI Prometheus ã«ã¢ã¯ã»ã¹ããããã®ãµãŒãã¹ãClusterRole
,ClusterRoleBinding
ОServiceAccount
â Kubernetes ã§ã®ãµãŒãã¹ã®èªåæ€åº (èªåæ€åº)ã
ããã§
KEDA ããã¡ããŠã¹ ã¹ã±ãŒã«ã ãªããžã§ã¯ã
ã¹ã±ãŒã©ãŒã¯ãKEDA ãšã¡ããªãã¯ãååŸããå¿
èŠãããå€éšã·ã¹ãã ã®éã®ããªããžãšããŠæ©èœããŸãã ScaledObject
ãããã€ã¡ã³ããã€ãã³ã ãœãŒã¹ (ãã®å Žå㯠Prometheus) ãšåæããããã«ãããã€ããå¿
èŠãããã«ã¹ã¿ã ãªãœãŒã¹ã§ãã
ScaledObject
ãããã€ã¡ã³ãã®ã¹ã±ãŒãªã³ã°æ
å ±ãã€ãã³ã ãœãŒã¹ã®ã¡ã¿ããŒã¿ (æ¥ç¶ã·ãŒã¯ã¬ããããã¥ãŒåãªã©)ãããŒãªã³ã°ééãå埩æéããã®ä»ã®ããŒã¿ãå«ãŸããŸãã ããã«ãããå±éãã¹ã±ãŒã«ããããã®å¯Ÿå¿ããèªåã¹ã±ãŒãªã³ã° ãªãœãŒã¹ (HPA å®çŸ©) ãçæãããŸãã
ãªããžã§ã¯ãã®ãšã ScaledObject
ãåé€ããããšã察å¿ãã HPA å®çŸ©ãã¯ãªã¢ãããŸãã
å®çŸ©ã¯æ¬¡ã®ãšããã§ã ScaledObject
ãã®äŸã§ã¯ãã¹ã±ãŒã©ãŒã䜿çšããŸã Prometheus
:
apiVersion: keda.k8s.io/v1alpha1
kind: ScaledObject
metadata:
name: prometheus-scaledobject
namespace: default
labels:
deploymentName: go-prom-app
spec:
scaleTargetRef:
deploymentName: go-prom-app
pollingInterval: 15
cooldownPeriod: 30
minReplicaCount: 1
maxReplicaCount: 10
triggers:
- type: prometheus
metadata:
serverAddress:
http://prometheus-service.default.svc.cluster.local:9090
metricName: access_frequency
threshold: '3'
query: sum(rate(http_requests[2m]))
以äžã®ç¹ã«ã泚æãã ããã
- 圌ã¯ããææãã
Deployment
ååã§go-prom-app
. - ããªã¬ãŒã¿ã€ã -
Prometheus
ã Prometheus ãµãŒããŒã®ã¢ãã¬ã¹ã¯ãã¡ããªãã¯åããããå€ãããã³PromQLã¯ãšãª ã䜿çšãããŸãã PromQL ã¯ãšãª -sum(rate(http_requests[2m]))
. - ã«ãã
pollingInterval
,KEDA 㯠XNUMX ç§ããšã« Prometheus ã«ã¿ãŒã²ãããèŠæ±ããŸãã () ã®äžã«å°ãªããšã XNUMX ã€ä»¥äžminReplicaCount
)ããããã®æ倧æ°ã¯è¶ ããŸããmaxReplicaCount
(ãã®äŸã§ã¯ - XNUMX)ã
èšçœ®å¯èœ minReplicaCount
ãŒãã«çããã ãã®å ŽåãKEDA ã¯ãŒãã㌠XNUMX ãããã€ã¡ã³ããã¢ã¯ãã£ãåããŠããããããªãèªåã¹ã±ãŒãªã³ã°ã®ããã« HPA ãå
¬éããŸãã éã®é åºãã€ãŸã XNUMX ãã XNUMX ãŸã§ã®ã¹ã±ãŒãªã³ã°ãå¯èœã§ãã ãã®äŸã§ã¯ããã㯠HTTP ãµãŒãã¹ã§ãããªã³ããã³ã ã·ã¹ãã ã§ã¯ãªãããããŒããéžæããŸããã§ããã
èªåã¹ã±ãŒãªã³ã°ã®éæ³
ãããå€ã¯ãå±éãæ¡åŒµããããã®ããªã¬ãŒãšããŠäœ¿çšãããŸãã ãã®äŸã§ã¯ãPromQL ã¯ãšãªã¯ sum(rate (http_requests [2m]))
éå» XNUMX åéã«æž¬å®ããããéèšããã HTTP ãªã¯ãšã¹ã ã¬ãŒã (XNUMX ç§ãããã®ãªã¯ãšã¹ãæ°) ãè¿ããŸãã
ãããå€ã XNUMX ã§ãããããå€ãæžå°ããŠããéã« XNUMX ã€äžåãããšã«ãªããŸãã sum(rate (http_requests [2m]))
XNUMXã€æªæºã å€ãå¢å ãããšããã®ãã³ã«ãµããè¿œå ãããŸã sum(rate (http_requests [2m]))
12ã€å¢ããŸãã ããšãã°ãå€ã 14 ïœ XNUMX ã®å Žåããããã®æ°ã¯ XNUMX ã§ãã
ã§ã¯ãå®éã«èšå®ããŠã¿ãŸãããïŒ
ããªã»ãã
å¿
èŠãªã®ã¯ãKubernetes ã¯ã©ã¹ã¿ãŒãšæ§æããããŠãŒãã£ãªãã£ã ãã§ã kubectl
ã ãã®äŸã§ã¯ã¯ã©ã¹ã¿ãŒã䜿çšããŸã minikube
, ãã ããä»ã®ãã®ãéžæããããšãã§ããŸãã ã¯ã©ã¹ã¿ãŒãã€ã³ã¹ããŒã«ããã«ã¯ã
ææ°ããŒãžã§ã³ã Mac ã«ã€ã³ã¹ããŒã«ããŸãã
curl -Lo minikube
https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
&& chmod +x minikube
sudo mkdir -p /usr/local/bin/
sudo install minikube /usr/local/bin/
ã»ãã
ææ°ããŒãžã§ã³ã Mac ã«ã€ã³ã¹ããŒã«ããŸãã
curl -LO
"https://storage.googleapis.com/kubernetes-release/release/$(curl -s
https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/darwin/amd64/kubectl"
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl
kubectl version
KEDAã®ã€ã³ã¹ããŒã«
KEDA ã¯ããã€ãã®æ¹æ³ã§å°å
¥ã§ããŸãããããã®æ¹æ³ã¯æ¬¡ã®ãšããã§ãã
kubectl apply -f
https://raw.githubusercontent.com/kedacore/keda/master/deploy/KedaScaleController.yaml
KEDA ãšãã®ã³ã³ããŒãã³ãã¯åå空éã«ã€ã³ã¹ããŒã«ãããŸã keda
ã 確èªããã³ãã³ã:
kubectl get pods -n keda
KEDA Operator ãèµ·åããã®ãåŸ
ã£ãŠã Running State
ã ãããŠãã®åŸãç¶ããŸãã
Helm ã䜿çšãã Redis ã®ã€ã³ã¹ããŒã«
Helm ãã€ã³ã¹ããŒã«ãããŠããªãå Žåã¯ãããã䜿çšããŠãã ãã
brew install kubernetes-helm
helm init --history-max 200
helm init
ããŒã«ã«ã³ãã³ãã©ã€ã³ã€ã³ã¿ãŒãã§ãŒã¹ãåæåããã€ã³ã¹ããŒã«ãè¡ããŸãã Tiller
Kubernetes ã¯ã©ã¹ã¿ãŒã«æ¥ç¶ããŸãã
kubectl get pods -n kube-system | grep tiller
Tiller ããããå®è¡ç¶æ ã«ãªããŸã§åŸ ã¡ãŸãã
翻蚳è ã®ã¡ã¢: äœæè 㯠Helm@2 ã䜿çšããŠããŸãããããã«ã¯ Tiller ãµãŒã㌠ã³ã³ããŒãã³ããã€ã³ã¹ããŒã«ãããŠããå¿ èŠããããŸãã Helm@3 ã¯é¢é£æ§ãããããµãŒããŒéšåã¯å¿ èŠãããŸããã
Helm ãã€ã³ã¹ããŒã«ããåŸãRedis ãèµ·åããã«ã¯ XNUMX ã€ã®ã³ãã³ãã§ååã§ãã
helm install --name redis-server --set cluster.enabled=false --set
usePassword=false stable/redis
Redis ãæ£åžžã«èµ·åããããšã確èªããŸãã
kubectl get pods/redis-server-master-0
Redis ãç¶æ
ã«ãªããŸã§åŸ
ã¡ãŸã Running
.
ã¢ããªã±ãŒã·ã§ã³ã®å°å ¥
ãããã€ã¡ã³ãã³ãã³ã:
kubectl apply -f go-app.yaml
//output
deployment.apps/go-prom-app created
service/go-prom-app-service created
ãã¹ãŠãéå§ãããããšã確èªããŸãã
kubectl get pods -l=app=go-prom-app
Redis ãç¶æ
ã«ãªããŸã§åŸ
ã¡ãŸã Running
.
Prometheus ãµãŒããŒã®å°å ¥
Prometheus ãããã§ã¹ãã§ã¯ã
kubernetes_sd_configs:
- role: service
relabel_configs:
- source_labels: [__meta_kubernetes_service_label_run]
regex: go-prom-app-service
action: keep
å°å ¥ããã«ã¯:
kubectl apply -f prometheus.yaml
//output
clusterrole.rbac.authorization.k8s.io/prometheus created
serviceaccount/default configured
clusterrolebinding.rbac.authorization.k8s.io/prometheus created
configmap/prom-conf created
deployment.extensions/prometheus-deployment created
service/prometheus-service created
ãã¹ãŠãéå§ãããããšã確èªããŸãã
kubectl get pods -l=app=prometheus-server
ããã¡ããŠã¹ãç¶æ
ã«ãªãã®ãåŸ
ã¡ãŸã Running
.
äœ¿çš kubectl port-forward
Prometheus ãŠãŒã¶ãŒ ã€ã³ã¿ãŒãã§ã€ã¹ (ãŸã㯠API ãµãŒããŒ) ã«ã¢ã¯ã»ã¹ããã«ã¯ã
kubectl port-forward service/prometheus-service 9090
KEDA èªåã¹ã±ãŒãªã³ã°æ§æã®ãããã€
äœæããã³ãã³ã ScaledObject
:
kubectl apply -f keda-prometheus-scaledobject.yaml
KEDA ãªãã¬ãŒã¿ãŒã®ãã°ã確èªããŸãã
KEDA_POD_NAME=$(kubectl get pods -n keda
-o=jsonpath='{.items[0].metadata.name}')
kubectl logs $KEDA_POD_NAME -n keda
çµæã¯æ¬¡ã®ããã«ãªããŸãã
time="2019-10-15T09:38:28Z" level=info msg="Watching ScaledObject:
default/prometheus-scaledobject"
time="2019-10-15T09:38:28Z" level=info msg="Created HPA with
namespace default and name keda-hpa-go-prom-app"
ã¢ããªã±ãŒã·ã§ã³ã®äžã§ç¢ºèªããŠãã ããã XNUMX ã€ã®ã€ã³ã¹ã¿ã³ã¹ãå®è¡ãããŠããå¿
èŠãããããã minReplicaCount
1 ã«çãã:
kubectl get pods -l=app=go-prom-app
HPA ãªãœãŒã¹ãæ£åžžã«äœæãããããšã確èªããŸãã
kubectl get hpa
次ã®ãããªãã®ã衚瀺ãããã¯ãã§ãã
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
keda-hpa-go-prom-app Deployment/go-prom-app 0/3 (avg) 1 10 1 45s
ãã«ã¹ãã§ãã¯: ã¢ããªã±ãŒã·ã§ã³ãžã®ã¢ã¯ã»ã¹
ã¢ããªã±ãŒã·ã§ã³ã® REST ãšã³ããã€ã³ãã«ã¢ã¯ã»ã¹ããã«ã¯ã次ãå®è¡ããŸãã
kubectl port-forward service/go-prom-app-service 8080
ã¢ãã¬ã¹ã䜿çšã㊠Go ã¢ããªã«ã¢ã¯ã»ã¹ã§ããããã«ãªããŸãã
curl http://localhost:8080/test
çµæã¯æ¬¡ã®ããã«ãªããŸãã
Accessed on 2019-10-21 11:29:10.560385986 +0000 UTC
m=+406004.817901246
Access count 1
ãã®æç¹ã§ãRedis ã確èªããŸãã ããŒã access_count
1 ã«å¢å :
kubectl exec -it redis-server-master-0 -- redis-cli get access_count
//output
"1"
ã¡ããªãã¯å€ã次ã§ããããšã確èªããŠãã ããã http_requests
åãïŒ
curl http://localhost:8080/metrics | grep http_requests
//output
# HELP http_requests number of http requests
# TYPE http_requests counter
http_requests 1
è² è·ã®äœæ
æã
ã¯äœ¿çšããã ãã
curl -o hey https://storage.googleapis.com/hey-release/hey_darwin_amd64
&& chmod a+x hey
ãŠãŒãã£ãªãã£ãããŠã³ããŒãããããšãã§ããŸã
ãããå®è¡ããŸãïŒ
./hey http://localhost:8080/test
ããã©ã«ãã§ã¯ããŠãŒãã£ãªãã£ã¯ 200 åã®ãªã¯ãšã¹ããéä¿¡ããŸãã ããã¯ãRedis ã ãã§ãªã Prometheus ã¡ããªã¯ã¹ã䜿çšããŠæ€èšŒã§ããŸãã
curl http://localhost:8080/metrics | grep http_requests
//output
# HELP http_requests number of http requests
# TYPE http_requests counter
http_requests 201
kubectl exec -it redis-server-master-0 -- redis-cli get access_count
//output
201
å®éã®ã¡ããªã¯ã¹ã®å€ (PromQL ã¯ãšãªã«ãã£ãŠè¿ããã) ãæ€èšŒããŸãã
curl -g
'http://localhost:9090/api/v1/query?query=sum(rate(http_requests[2m]))'
//output
{"status":"success","data":{"resultType":"vector","result":[{"metric":{},"value":[1571734214.228,"1.686057971014493"]}]}}
ãã®å Žåãå®éã®çµæã¯æ¬¡ã®ããã«ãªããŸãã 1,686057971014493
ãã£ãŒã«ãã«è¡šç€ºãããŸã value
ã èšå®ãããããå€ã¯ 3 ã§ãããããããã§ã¯ã¹ã±ãŒãªã³ã°ã«ã¯ååã§ã¯ãããŸããã
ãã£ãšè² è·ãïŒ
æ°ããã¿ãŒããã«ã§ãã¢ããªã±ãŒã·ã§ã³ ãããã®æ°ãç£èŠããŸãã
kubectl get pods -l=app=go-prom-app -w
次ã®ã³ãã³ãã䜿çšããŠè² è·ãå¢ãããŠã¿ãŸãããã
./hey -n 2000 http://localhost:8080/test
ãã°ãããããšãHPA ããããã€ã¡ã³ããã¹ã±ãŒãªã³ã°ããæ°ããããããèµ·åããŠããããšãããããŸãã HPA ããã§ãã¯ããŠæ¬¡ã®ããšã確èªããŠãã ããã
kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
keda-hpa-go-prom-app Deployment/go-prom-app 1830m/3 (avg) 1 10 6 4m22s
è² è·ã«äžè²«æ§ããªãå Žåããããã€ã¡ã³ã㯠XNUMX ã€ã®ãããã®ã¿ãå®è¡ããããŸã§çž®å°ãããŸãã å®éã®ã¡ããªã㯠(PromQL ã¯ãšãªã«ãã£ãŠè¿ããã) ã確èªãããå Žåã¯ã次ã®ã³ãã³ãã䜿çšããŸãã
curl -g
'http://localhost:9090/api/v1/query?query=sum(rate(http_requests[2m]))'
ã¯ãªãŒãã³ã°
//Delete KEDA
kubectl delete namespace keda
//Delete the app, Prometheus server and KEDA scaled object
kubectl delete -f .
//Delete Redis
helm del --purge redis-server
ãŸãšã
KEDA ã䜿çšãããšãå€éšã¡ããªãã¯ããã®ããŒã¿ã«åºã¥ããŠãKubernetes ãããã€ã¡ã³ãã (ãŒããž/ãŒããã) èªåçã«ã¹ã±ãŒãªã³ã°ã§ããŸãã ããšãã°ãPrometheus ã¡ããªã¯ã¹ãRedis ã®ãã¥ãŒã®é·ããKafka ãããã¯ã®ã³ã³ã·ã¥ãŒã ã¬ã€ãã³ã·ã«åºã¥ããŸãã
KEDA ã¯å€éšãœãŒã¹ãšçµ±åãããã®ã¡ããªã¯ã¹ã Metrics Server çµç±ã§ horizoâântal Pod Autoscaler ã«æäŸããŸãã
ã°ããã©ãã¯ïŒ
ä»ã«èªãã¹ãããšïŒ
å®çšŒåç°å¢ã§ã³ã³ãããŒãš Kubernetes ãå®è¡ããããã®ãã¹ã ãã©ã¯ãã£ã¹ãšãã¹ã ãã©ã¯ãã£ã¹ .Kubernetes çšã® 90 以äžã®äŸ¿å©ãªããŒã«: ãããã€ã¡ã³ãã管çãã¢ãã¿ãªã³ã°ãã»ãã¥ãªãã£ãªã© .Telegram ã® Kubernetes ã«é¢ããç§ãã¡ã®ãã£ã³ãã« .
åºæïŒ habr.com