ãã§ã«ç§ãã¡ã®ããã°ã«æ¬¡ã®ãããªèšäºãæ²èŒãããŠããŸã
ãªãã§ããïŒ
ã·ã§ã« ãªãã¬ãŒã¿ãŒã®èãæ¹ã¯éåžžã«åçŽã§ããKubernetes ãªããžã§ã¯ãããã®ã€ãã³ãããµãã¹ã¯ã©ã€ããããããã®ã€ãã³ããåä¿¡ãããšãå€éšããã°ã©ã ãèµ·åããŠãã€ãã³ãã«é¢ããæ å ±ãæäŸããŸãã
ãã®å¿ èŠæ§ãçããã®ã¯ãã¯ã©ã¹ã¿ãŒã®éçšäžã«ãæ¬åœã«æ£ããæ¹æ³ã§èªååãããå°ããªã¿ã¹ã¯ãçŸãå§ãããšãã§ãã ãããã®å°ããªã¿ã¹ã¯ã¯ãã¹ãŠãåçŽãª bash ã¹ã¯ãªããã䜿çšããŠè§£æ±ºãããŸãããããåç¥ã®ãšãããæŒç®å㯠Golang ã§äœæããæ¹ãè¯ãã§ãããã æããã«ããã®ãããªå°ããªã¿ã¹ã¯ããšã«ãªãã¬ãŒã¿ãŒã®æ¬æ Œçãªéçºã«æè³ããã®ã¯å¹æçã§ã¯ãããŸããã
ãªãã¬ãŒã¿ãŒã15å以å ã«å¯Ÿå¿
Kubernetes ã¯ã©ã¹ã¿ãŒã§äœãèªååã§ããã®ãããŸãã·ã§ã« ãªãã¬ãŒã¿ãŒãã©ã®ããã«åœ¹ç«ã€ã®ãã®äŸãèŠãŠã¿ãŸãããã äŸãšããŠã¯ãDocker ã¬ãžã¹ããªã«ã¢ã¯ã»ã¹ããããã®ã·ãŒã¯ã¬ããã®è€è£œãæããããŸãã
ãã©ã€ããŒã ã¬ãžã¹ããªã®ã€ã¡ãŒãžã䜿çšãããããã«ã¯ãã¬ãžã¹ããªã«ã¢ã¯ã»ã¹ããããã®ããŒã¿ãå«ãã·ãŒã¯ã¬ãããžã®ãªã³ã¯ããããã§ã¹ãã«å«ããå¿ èŠããããŸãã ãã®ã·ãŒã¯ã¬ããã¯ãããããäœæããåã«ååå空éã§äœæããå¿ èŠããããŸãã ããã¯æåã§è¡ãããšãã§ããŸãããåçãªç°å¢ãã»ããã¢ãããããšã2 ã€ã®ã¢ããªã±ãŒã·ã§ã³ã®åå空éãèšå€§ã«ãªããŸãã ãããŠã3ãXNUMXã®ã¢ããªã±ãŒã·ã§ã³ããªããã°...ã·ãŒã¯ã¬ããã®æ°ã¯éåžžã«å€ããªããŸãã ã·ãŒã¯ã¬ããã«ã€ããŠãã XNUMX ã€èª¬æããŸããã¬ãžã¹ããªã«ã¢ã¯ã»ã¹ããããŒãæã å€æŽããããšèããŠããŸãã æçµçã«ã æåæäœ è§£æ±ºçãšã㊠ãŸã£ããå¹æããªã â ã·ãŒã¯ã¬ããã®äœæãšæŽæ°ãèªååããå¿ èŠããããŸãã
ã·ã³ãã«ãªèªåå
N ç§ããšã«å®è¡ãããåå空éã«ã·ãŒã¯ã¬ãããååšãããã©ããã確èªããã·ãŒã¯ã¬ãããååšããªãå Žåã¯ã·ãŒã¯ã¬ãããäœæãããã·ã§ã« ã¹ã¯ãªãããäœæããŸãããã ãã®ãœãªã¥ãŒã·ã§ã³ã®å©ç¹ã¯ãcron ã®ã·ã§ã« ã¹ã¯ãªããã®ããã«èŠããããšã§ãããå€å žçã§èª°ã«ãšã£ãŠãããããããã¢ãããŒãã§ãã æ¬ ç¹ã¯ãèµ·åã®åéã«æ°ããåå空éãäœæãããå¯èœæ§ãããããã°ããã®éã·ãŒã¯ã¬ãããªãã®ãŸãŸã«ãªãããããããã®èµ·åæã«ãšã©ãŒãçºçããããšã§ãã
ã·ã§ã«ãªãã¬ãŒã¿ãŒã«ããèªåå
ã¹ã¯ãªãããæ£ããåäœããã«ã¯ãåå空éã®è¿œå æã«åŸæ¥ã® cron èµ·åãèµ·åã«çœ®ãæããå¿ èŠããããŸãããã®å Žåã䜿çšããåã«ã·ãŒã¯ã¬ãããäœæã§ããŸãã ã·ã§ã«æŒç®åã䜿çšããŠãããå®è£ ããæ¹æ³ãèŠãŠã¿ãŸãããã
ãŸããã¹ã¯ãªãããèŠãŠã¿ãŸãããã ã·ã§ã«ãªãã¬ãŒã¿ãŒçšèªã§ã®ã¹ã¯ãªããã¯ããã¯ãšåŒã°ããŸãã ãã©ã°ãä»ããŠå®è¡ãããšãã®ãã¹ãŠã®ãã㯠--config
ã·ã§ã«ãªãã¬ãŒã¿ãŒã«ãã®ãã€ã³ãã£ã³ã°ã«ã€ããŠéç¥ããŸãã ã©ã®ãããªã€ãã³ããéå§ãããã«ã€ããŠã ç§ãã¡ã®å Žåã䜿çšããŸã onKubernetesEvent
:
#!/bin/bash
if [[ $1 == "--config" ]] ; then
cat <<EOF
{
"onKubernetesEvent": [
{ "kind": "namespace",
"event":["add"]
}
]}
EOF
fi
ããã§ã¯ãã€ãã³ãã®è¿œå ã«èå³ãããããšã説æãããŠããŸã(add
) åã®ãªããžã§ã¯ã namespace
.
ããã§ãã€ãã³ãã®çºçæã«å®è¡ãããã³ãŒããè¿œå ããå¿ èŠããããŸãã
#!/bin/bash
if [[ $1 == "--config" ]] ; then
# кПМÑОгÑÑаÑОÑ
cat <<EOF
{
"onKubernetesEvent": [
{ "kind": "namespace",
"event":["add"]
}
]}
EOF
else
# ÑеакÑОÑ:
# ÑзМаÑÑ, какПй namespace пПÑвОлÑÑ
createdNamespace=$(jq -r '.[0].resourceName' $BINDING_CONTEXT_PATH)
# ÑПзЎаÑÑ Ð² ÐœÑÐŒ ÐœÑжМÑй ÑекÑеÑ
kubectl create -n ${createdNamespace} -f - <<EOF
apiVersion: v1
kind: Secret
metadata:
...
data:
...
EOF
fi
çŽ æŽãããïŒ ãã®çµæãå°ãããŠçŸããã¹ã¯ãªãããå®æããŸããã ãããã埩掻ããããã«ã¯ãã€ã¡ãŒãžãæºåããŠã¯ã©ã¹ã¿ãŒå ã§èµ·åãããšãã XNUMX ã€ã®æé ãæ®ã£ãŠããŸãã
ããã¯ä»ãã®ç»åãæºåãã
ã¹ã¯ãªãããèŠããšãã³ãã³ãã䜿çšãããŠããããšãããããŸãã kubectl
О jq
ã ããã¯ãã€ã¡ãŒãžã«ã¯ããã¯ãã€ãã³ããç£èŠããŠããã¯ãå®è¡ããã·ã§ã« ãªãã¬ãŒã¿ãŒãããã¯ã§äœ¿çšãããã³ãã³ã (kubectl ããã³ jq) ãå¿
èŠã§ããããšãæå³ããŸãã Hub.docker.com ã«ã¯ãshell-operatorãkubectlãããã³ jq ãããã±ãŒãžåãããæ¢è£œã®ã€ã¡ãŒãžããã§ã«ãããŸãã æ®ã£ãŠããã®ã¯ç°¡åãªããã¯ãè¿œå ããããšã ãã§ã Dockerfile
:
$ cat Dockerfile
FROM flant/shell-operator:v1.0.0-beta.1-alpine3.9
ADD namespace-hook.sh /hooks
$ docker build -t registry.example.com/my-operator:v1 .
$ docker push registry.example.com/my-operator:v1
ã¯ã©ã¹ã¿ãŒå ã§å®è¡ãã
ããã¯ãããäžåºŠèŠãŠã¿ãŸããããä»åºŠã¯ãã¯ã©ã¹ã¿ãŒå ã§ã©ã®ãããªã¢ã¯ã·ã§ã³ãå®è¡ããã©ã®ãªããžã§ã¯ãã䜿çšããŠå®è¡ããããæžãçããŸãã
- åå空éäœæã€ãã³ãããµãã¹ã¯ã©ã€ãããŸãã
- èµ·åãããåå空é以å€ã®åå空éã«ã·ãŒã¯ã¬ãããäœæããŸãã
ã€ã¡ãŒãžãèµ·åããããããã«ã¯ããããã®ã¢ã¯ã·ã§ã³ãå®è¡ããããã®ã¢ã¯ã»ã¹èš±å¯ãå¿ èŠã§ããããšãããããŸããã ããã¯ãç¬èªã® ServiceAccount ãäœæããããšã§å®è¡ã§ããŸãã æš©é㯠ClusterRole ããã³ ClusterRoleBinding ã®åœ¢åŒã§è¡ãå¿ èŠããããŸãã ç§ãã¡ã¯ã¯ã©ã¹ã¿ãŒå šäœã®ãªããžã§ã¯ãã«èå³ããããŸãã
YAML ã§ã®æçµçãªèšè¿°ã¯æ¬¡ã®ããã«ãªããŸãã
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: monitor-namespaces-acc
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
name: monitor-namespaces
rules:
- apiGroups: [""]
resources: ["namespaces"]
verbs: ["get", "watch", "list"]
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "list", "create", "patch"]
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: monitor-namespaces
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: monitor-namespaces
subjects:
- kind: ServiceAccount
name: monitor-namespaces-acc
namespace: example-monitor-namespaces
çµã¿ç«ãŠãããã€ã¡ãŒãžãåçŽãªãããã€ã¡ã³ããšããŠèµ·åã§ããŸãã
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: my-operator
spec:
template:
spec:
containers:
- name: my-operator
image: registry.example.com/my-operator:v1
serviceAccountName: monitor-namespaces-acc
䟿å®äžãã·ã§ã«ãªãã¬ãŒã¿ãŒãèµ·åãããäœæããããããã§ã¹ããé©çšãããå¥ã®åå空éãäœæãããŸãã
$ kubectl create ns example-monitor-namespaces
$ kubectl -n example-monitor-namespaces apply -f rbac.yaml
$ kubectl -n example-monitor-namespaces apply -f deployment.yaml
ããã§ãã¹ãŠã§ããã·ã§ã« ãªãã¬ãŒã¿ãŒãèµ·åããåå空éäœæã€ãã³ãããµãã¹ã¯ã©ã€ãããå¿ èŠã«å¿ããŠããã¯ãå®è¡ããŸãã
ãã®ããã«ã åçŽãªã·ã§ã« ã¹ã¯ãªããã Kubernetes ã®å®éã®ãªãã¬ãŒã¿ãŒã«å€ãããŸãã ã¯ã©ã¹ã¿ãŒã®äžéšãšããŠæ©èœããŸãã ããããã¹ãŠããGolang ã§ãªãã¬ãŒã¿ãŒãéçºããè€éãªããã»ã¹ãªãã§è¡ãããšãã§ããŸãã
ãã®ä»¶ã«é¢ããŠã¯å¥ã®äŸããããŸã...
ãã®æå³ã«ã€ããŠã¯ã次ã®åºçç©ã®ããããã§ããã«è©³ããæããã«ããŸãã
ãã£ã«ã¿ãªã³ã°
ãªããžã§ã¯ãã远跡ããã®ã¯è¯ãããšã§ãããå€ãã®å Žåããªããžã§ã¯ãã«åå¿ããå¿ èŠããããŸãã ããã€ãã®ãªããžã§ã¯ãã®ããããã£ãå€æŽããããšãã°ããããã€ã¡ã³ãå ã®ã¬ããªã«ã®æ°ãå€æŽãããããªããžã§ã¯ãã®ã©ãã«ãå€æŽãããããå Žåã§ãã
ã€ãã³ããå°çãããšãã·ã§ã«ãªãã¬ãŒã¿ãŒã¯ãªããžã§ã¯ãã® JSON ãããã§ã¹ããåãåããŸãã ãã® JSON ã§èå³ã®ããããããã£ãéžæããããã¯ãå®è¡ã§ããŸãã ã®ã¿ 圌ããå€ãããšãã ãã®ãã£ãŒã«ãããããŸã jqFilter
ããã§ãJSON ãããã§ã¹ãã«é©çšããã jq åŒãæå®ããå¿
èŠããããŸãã
ããšãã°ãDeployment ãªããžã§ã¯ãã®ã©ãã«ã®å€æŽã«å¯Ÿå¿ããã«ã¯ããã£ãŒã«ãããã£ã«ã¿ãŒããå¿
èŠããããŸãã labels
éåã®å€ãž metadata
ã æ§æã¯æ¬¡ã®ããã«ãªããŸãã
cat <<EOF
{
"onKubernetesEvent": [
{ "kind": "deployment",
"event":["update"],
"jqFilter": ".metadata.labels"
}
]}
EOF
ãã® jqFilter åŒã¯ãDeployment ã®é·ã JSON ãããã§ã¹ããã©ãã«ä»ãã®çã JSON ã«å€æããŸãã
shell-operator ã¯ããã®çã JSON ãå€æŽãããå Žåã«ã®ã¿ããã¯ãå®è¡ããä»ã®ããããã£ãžã®å€æŽã¯ç¡èŠãããŸãã
ããã¯èµ·åã³ã³ããã¹ã
ããã¯æ§æã䜿çšãããšãã€ãã³ãã«å¯ŸããŠè€æ°ã®ãªãã·ã§ã³ãæå®ã§ããŸããããšãã°ãKubernetes ããã®ã€ãã³ãã«å¯Ÿã㊠2 ã€ã®ãªãã·ã§ã³ãš 2 ã€ã®ã¹ã±ãžã¥ãŒã«ãæå®ã§ããŸãã
{"onKubernetesEvent":[
{"name":"OnCreatePod",
"kind": "pod",
"event":["add"]
},
{"name":"OnModifiedNamespace",
"kind": "namespace",
"event":["update"],
"jqFilter": ".metadata.labels"
}
],
"schedule": [
{ "name":"every 10 min",
"crontab":"* */10 * * * *"
}, {"name":"on Mondays at 12:10",
"crontab": "* 10 12 * * 1"
]}
å°ãäœè«: ã¯ããã·ã§ã«ãªãã¬ãŒã¿ãŒã¯ãµããŒãããŠããŸã crontab ã¹ã¿ã€ã«ã®ã¹ã¯ãªãããå®è¡ããã 詳现ã«ã€ããŠã¯ã以äžãåç
§ããŠãã ããã
ããã¯ãèµ·åãããçç±ãåºå¥ããããã«ãã·ã§ã«ãªãã¬ãŒã¿ãŒã¯äžæãã¡ã€ã«ãäœæãããã®ãã¡ã€ã«ãžã®ãã¹ãå€æ°ã§ããã¯ã«æž¡ããŸãã BINDING_CONTEXT_TYPE
ã ãã¡ã€ã«ã«ã¯ãããã¯ãå®è¡ããçç±ã® JSON èšè¿°ãå«ãŸããŠããŸãã ããšãã°ã10 åããšã«æ¬¡ã®å
容ã®ããã¯ãå®è¡ãããŸãã
[{ "binding": "every 10 min"}]
...æææ¥ã¯ãããªæãã§å§ãŸããŸãã
[{ "binding": "every 10 min"}, { "binding": "on Mondays at 12:10"}]
ã®ããã« onKubernetesEvent
ããã«å€ãã® JSON ããªã¬ãŒãååšããããšã«ãªããŸãã ãªããžã§ã¯ãã®èª¬æãå«ãŸããŠããŸãã
[
{
"binding": "onCreatePod",
"resourceEvent": "add",
"resourceKind": "pod",
"resourceName": "foo",
"resourceNamespace": "bar"
}
]
ãã£ãŒã«ãã®å
容ã¯ãã®ååããç解ã§ãã詳现ã«ã€ããŠã¯æ¬¡ãåç
§ããŠãã ããã resourceName
jq ã®äœ¿çšã¯ãã·ãŒã¯ã¬ãããè€è£œããããã¯ã§ãã§ã«ç€ºãããŠããŸãã
jq -r '.[0].resourceName' $BINDING_CONTEXT_PATH
ä»ã®ãã£ãŒã«ããåæ§ã®æ¹æ³ã§ååŸã§ããŸãã
次ã¯äœã§ããïŒ
ãããžã§ã¯ã ãªããžããªå
ã§ã
Prometheus ã䜿çšããã¡ããªã¯ã¹ã®åéããµããŒããããŠããŸããå©çšå¯èœãªã¡ããªã¯ã¹ã«ã€ããŠã¯ã»ã¯ã·ã§ã³ã§èª¬æãããŠããŸãã
ãæ³åã®ãšãããã·ã§ã« ãªãã¬ãŒã¿ãŒã¯ Go ã§æžãããŠããããªãŒãã³ ãœãŒã¹ ã©ã€ã»ã³ã¹ (Apache 2.0) ã«åºã¥ããŠé
åžãããŠããŸãã éçºæ¯æŽã«æè¬ããããŸã
ç§å¯ã®ããŒã«ãåãé€ããã·ã§ã«ãªãã¬ãŒã¿ãŒãããããšããç¥ããããŸãã å°ãã Kubernetes ã¯ã©ã¹ã¿ãŒã«ã€ã³ã¹ããŒã«ãããŠããã¢ããªã³ãææ°ã®ç¶æ
ã«ä¿ã¡ãããŸããŸãªèªåã¢ã¯ã·ã§ã³ãå®è¡ã§ããã·ã¹ãã ã®äžéšã§ãã ãã®ã·ã¹ãã ã«ã€ããŠè©³ããèªã
ç§ãã¡ã¯ããã®ã·ã¹ãã ã®æ®ãã®éšåãã€ãŸãã¢ããªã³ ãªãã¬ãŒã¿ãŒãšããã¯ãšã¢ãžã¥ãŒã«ã®ã³ã¬ã¯ã·ã§ã³ãå
¬éããèšç»ããããŸãã ã¡ãªã¿ã«ãaddon-operatorã¯ãã§ã«
ä¹ããæåŸ ïŒ
PS
ç§ãã¡ã®ããã°ããèªã¿ãã ãã:
- «
Operators for Kubernetes: ã¹ããŒããã« ã¢ããªã±ãŒã·ã§ã³ãå®è¡ããæ¹æ³ "; - «
Golang 㧠Kubernetes ã®ãªãã¬ãŒã¿ãŒãäœæãã "; - «
Grafana ã®æ°ãããã©ã°ã€ã³ã®çŽ¹ä» - ã¹ããŒã¿ã¹ããã ããã« "; - «
loghouse ã®çŽ¹ä» - Kubernetes ã§ãã°ãæäœããããã®ãªãŒãã³ãœãŒã¹ ã·ã¹ãã "; - «
CI/CD ã¡ã³ããã³ã¹çšã® DevOps ãŠãŒãã£ãªãã£ã§ãã dapp ãæ£åŒã«çºè¡šããŸã 'ã
åºæïŒ habr.com