ืืืจ ืืื ืืืืจืื ืืืืื ืฉืื ื ืฉืืืืจืื ืขื
ืืื?
ืืจืขืืื ืฉื ืืคืขืื ืืขืืคืช ืืื ืื ืคืฉืื: ืืืจืฉื ืืืืจืืขืื ืืืืืืืงืืื ืฉื Kubernetes, ืืืืฉืจ ืืืจืืขืื ืืื ืืชืงืืืื, ืืคืขื ืชืืื ืืช ืืืฆืื ืืช, ืฉืชืกืคืง ืื ืืืืข ืขื ืืืืจืืข:
ืืฆืืจื ืืื ืืชืขืืจืจ ืืืฉืจ ืืืืื ืืคืขืืช ืืฉืืืืืช ืืืื ืืืืคืืข ืืฉืืืืช ืงืื ืืช ืฉืืืืช ืจืฆืื ื ืืืฆืข ืืืืืืฆืื ืืฆืืจื ืื ืืื ื. ืื ืืืฉืืืืช ืืงืื ืืช ืืืื ื ืคืชืจื ืืืืฆืขืืช ืกืงืจืืคืืื ืฉื bash ืคืฉืืืื, ืื ืื, ืืืืืข, ืขืืืฃ ืืืชืื ืืืคืจืืืจืื ืืืืื ื. ืืจืืจ ืฉืืฉืงืขื ืืคืืชืื ืืงื ื ืืืื ืืื ืฉื ืืคืขืื ืขืืืจ ืื ืืฉืืื ืงืื ื ืืื ืื ืชืืื ืืขืืื.
ืืคืขืื ืชืื 15 ืืงืืช
ืืืื ื ืกืชืื ืขื ืืืืื ืฉื ืื ืฉื ืืชื ืืืฆืข ืืืืืืืืช ืืืฉืืื Kubernetes ืืืืฆื ืืคืขืื ืืืขืืคืช ืืืื ืืขืืืจ. ืืืืื ืชืืื ืืืื: ืฉืืคืื ืกืื ืืื ืืืฉืช ื-docker registry.
ืคืืืื ืืืฉืชืืฉืื ืืชืืื ืืช ืืืจืฉื ืคืจืื ืืืืืื ืืืืื ืืื ืืคืกื ืฉืืื ืงืืฉืืจ ืืกืื ืขื ื ืชืื ืื ืืืืฉื ืืจืืฉืื. ืืฉ ืืืฆืืจ ืืช ืืกืื ืืื ืืื ืืจืื ืฉืืืช ืืคื ื ืืฆืืจืช ืชืจืืืืื. ืื ืืืื ืืืืขืฉืืช ืืืืคื ืืื ื, ืืื ืื ื ืืืืจ ืกืืืืืช ืืื ืืืืช, ืื ืืจืื ืืฉืืืช ืฉื ืืคืืืงืฆืื ืืืช ืืืคืื ืืืจืื. ืืื ืื ืืื 2-3 ืคื ืืืช... ืืกืคืจ ืืกืืืืช ืืืคื ืืืืืช ืืืื ืืืื. ืืขืื ืืฉืื ืืืื ืกืืืืช: ืื ื ืจืืฆื ืืฉื ืืช ืืช ืืืคืชื ืืืืฉื ืืจืืฉืื ืืขืช ืืขืช. ืืกืืคื ืฉื ืืืจ, ืคืขืืืืช ืืื ืืืช ืืคืชืจืื ืื ืืขืื ืืืืืืื - ืื ืื ื ืฆืจืืืื ืืืคืื ืืช ืืืฆืืจื ืืืขืืืื ืฉื ืกืืืืช ืืืืืืืืืื.
ืืืืืืฆืื ืคืฉืืื
ืืื ื ืืชืื ืกืงืจืืคื ืืขืืคืช ืฉืจืฅ ืืืช ื-N ืฉื ืืืช ืืืืืง ืืืจืืื ืฉืืืช ืื ืืฉ ืกืื, ืืื ืืื ืกืื ืื ืืื ื ืืฆืจ. ืืืชืจืื ืฉื ืืคืชืจืื ืืื ืืื ืฉืืื ื ืจืื ืืื ืชืกืจืื ืืขืืคืช ื-cron - ืืืฉื ืงืืืกืืช ืืืืื ืช ืืืืื. ืืืืกืจืื ืืื ืฉืืืจืืื ืฉืืื ืืืฉืงืืช ืฉืื ื ืืชื ืืืฆืืจ ืืจืื ืฉืืืช ืืืฉ ืืืืฉื ืืื ืื ืืื ืืืฉืืจ ืืื ืกืื, ืื ืฉืืืืื ืืฉืืืืืช ืืฉืืืืจ ืคืืืื.
ืืืืืืฆืื ืขื ืืคืขืื ืืขืืคืช
ืืื ืฉืืกืงืจืืคื ืฉืื ื ืืขืืื ืืืืื, ืืฉ ืืืืืืฃ ืืช ืืฉืงืช ืืงืจืื ืืงืืืกืืช ืืืฉืงื ืืืฉืจ ืืชืืืกืฃ ืืจืื ืฉืืืช: ืืืงืจื ืื, ืืชื ืืืื ืืืฆืืจ ืกืื ืืคื ื ืืฉืืืืฉ ืื. ืืื ื ืจืื ืืื ืืืืฉื ืืช ืื ืืืืฆืขืืช shell-operator.
ืจืืฉืืช, ืืืื ื ืกืชืื ืขื ืืชืกืจืื. ืกืงืจืืคืืื ืืืื ืืื ืฉื ืืคืขืื ืืขืืคืช ื ืงืจืืื ืืืงืก. ืื ืื ืืืฉืจ ืจืฆืื ืขื ืืื --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
ืืืื! ืืชืืฆืื ืืืืชื ืชืกืจืื ืงืื ืืืคื. ืืื "ืืืืืืช" ืืืชื, ื ืืชืจื ืฉื ื ืฉืืืื: ืืื ืืช ืืชืืื ื ืืืคืขื ืืืชื ืืืฉืืื.
ืืื ืช ืชืืื ื ืขื ืื
ืื ืืชื ืืกืชืื ืขื ืืกืงืจืืคื, ืืชื ืืืื ืืจืืืช ืฉืืคืงืืืืช ืืฉืืฉืืช kubectl
ะธ jq
. ืื ืืืืจ ืฉืืชืืื ื ืืืืืช ืืืืื ืืช ืืืืจืื ืืืืื: ื-hook ืฉืื ื, shell-operator ืฉืื ืืจ ืืืจืืขืื ืืืจืืฅ ืืช ื-hook, ืืืคืงืืืืช ืืืฉืืฉืืช ืืช ื-hook (kubectl ื-jq). ื- Hub.docer.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
ืจืืฆื ืืืงืืฅ
ืืืื ื ืกืชืื ืฉืื ืขื ืืื ืืืคืขื ื ืืชืื ืืืื ืคืขืืืืช ืืขื ืืืื ืืืืืืงืืื ืืื ืืืฆืข ืืืฉืืื:
- ื ืจืฉื ืืืืจืืขื ืืฆืืจืช ืืจืื ืฉืืืช;
- ืืืฆืจ ืกืื ืืืจืืื ืฉืืืช ืฉืืื ื ืื ืฉืื ืืื ืืืคืขื.
ืืกืชืืจ ืฉืืคืื ืื ืชืืฉืง ืืชืืื ื ืฉืื ื ืืืื ืืืืืช ืืขื ืืจืฉืืืช ืืืฆืข ืืช ืืคืขืืืืช ืืืื. ื ืืชื ืืขืฉืืช ืืืช ืขื ืืื ืืฆืืจืช ืืฉืืื ืฉืืจืืช ืืฉืื. ืืืจืฉืื ืืืืืช ืืืืขืฉืืช ืืฆืืจื ืฉื 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
ืืืขืื ื ืืืืช, ื ืืฆืจ ืืจืื ืฉืืืช ื ืคืจื ืฉืื ืืืคืขื ื-Shell-operator ืืืืฉืื ืืื ืืคืกืืื ืฉื ืืฆืจื:
$ kubectl create ns example-monitor-namespaces
$ kubectl -n example-monitor-namespaces apply -f rbac.yaml
$ kubectl -n example-monitor-namespaces apply -f deployment.yaml
ืื ืืื: ื-Shell-operator ืืชืืื, ืืจืฉื ืืืืจืืขื ืืฆืืจืช ืืจืื ืฉืืืช ืืืจืืฅ ืืช ื-hook ืืขืช ืืฆืืจื.
ืื, ืกืงืจืืคื ืืขืืคืช ืคืฉืื ืืคื ืืืืคืจืืืจ ืืืืชื ืขืืืจ Kubernetes ืืขืืื ืืืืง ืืืฉืืื. ืืื ืื ืืื ืืชืืืื ืืืืจืื ืฉื ืคืืชืื ืืืคืจืืืจืื ืืืืื ื:
ืืฉ ืขืื ืืืืฉื ืืขื ืืื ืืื...
ืืช ืืฉืืขืืชื ื ืืฉืืฃ ืืืชืจ ืคืืจืื ืืืื ืืืคืจืกืืืื ืืืืื.
ืกืื ืื
ืืขืงื ืืืจ ืืคืฆืื ืืื ืืื, ืืื ืืขืชืื ืงืจืืืืช ืืฉ ืฆืืจื ืืืืื ืืืืื ืฉืื ืื ืืืคืืื ืื ืืกืืืืื ืฉื ืืืืืืงื, ืืืืืื, ืืื ืืฉื ืืช ืืช ืืกืคืจ ืืขืชืงืื ื-Deployment ืื ืืื ืืฉื ืืช ืชืืืืืช ืืืืืืงื.
ืืืฉืจ ืืืืข ืืืจืืข, ืืคืขืื ืืืขืืคืช ืืงืื ืืช ืืื ืืคืกื JSON ืฉื ืืืืืืืงื. ืื ืื ื ืืืืืื ืืืืืจ ืืช ืืืืคืืื ืื ืฉืืขื ืืื ืื ืืืชื ื ื-JSON ืืื ืืืืคืขืื ืืช ื-hook ืจืง ืืฉืื ืืฉืชื ืื. ืืฉ ืฉืื ืืื jqFilter
, ืฉืื ืขืืื ืืฆืืื ืืช ืืืืื jq ืฉืืืื ืขื ืืื ืืคืกื ืฉื JSON.
ืืืืืื, ืืื ืืืืื ืืฉืื ืืืื ืืชืืืืืช ืขืืืจ ืืืืืืงืื Deployment, ืขืืื ืืกื ื ืืช ืืฉืื labels
ืืืืฅ ืืฉืื metadata
. ืืชืฆืืจื ืชืืื ืื:
cat <<EOF
{
"onKubernetesEvent": [
{ "kind": "deployment",
"event":["update"],
"jqFilter": ".metadata.labels"
}
]}
EOF
ืืืืื jqFilter ืื ืืืคื ืืช ืืื ืืคืกื ืืืจืื ืฉื ื-JSON ืฉื Deployment ื-JSON ืงืฆืจ ืขื ืชืืืืืช:
shell-operator ืืคืขืื ืืช ื-hook ืจืง ืืืฉืจ ื-JSON ืืงืฆืจ ืืื ืืฉืชื ื, ืืฉืื ืืืื ืืืืคืืื ืื ืืืจืื ืืชืขืืื.
ืืงืฉืจ ืืฉืงืช ืืืง
ืชืฆืืจืช ื-hook ืืืคืฉืจืช ืื ืืฆืืื ืืกืคืจ ืืคืฉืจืืืืช ืืืืจืืขืื - ืืืืืื, 2 ืืคืฉืจืืืืช ืืืืจืืขืื ื-Kubernetes ื-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. ืคืจืืื ื ืืกืคืื ื ืืชื ืืืฆืื ื
ืืื ืืืืืื ืืืืข ืืืคืขื ื-hook, ื-Shell-operator ืืืฆืจ ืงืืืฅ ืืื ื ืืืขืืืจ ืืช ืื ืชืื ืืืื ืืืฉืชื ื ื-hook BINDING_CONTEXT_TYPE
. ืืงืืืฅ ืืืื ืชืืืืจ JSON ืฉื ืืกืืื ืืืคืขืืช ื-hook. ืืืืืื, ืื 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
ืืชื ืืืื ืืงืื ืฉืืืช ืืืจืื ืืฆืืจื ืืืื.
ืื ืืืื?
ืืืืืจ ืืคืจืืืงืืื, ื
ืงืืืืช ืชืืืื ืืืืกืืฃ ืืืืื ืืืืฆืขืืช ืคืจืืืชืืืก - ืืืืืื ืืืืื ืื ืืชืืืจืื ืืกืขืืฃ
ืืคื ืฉืืชื ืืืื ืื ืืฉ, ืืืคืจืืืจ ืืืขืืคืช ืืชืื ื-Go ืืืืคืฅ ืชืืช ืจืืฉืืื ืงืื ืคืชืื (Apache 2.0). ื ืืื ืืกืืจื ืชืืื ืขื ืื ืกืืืข ืืคืืชืื
ืืจืื ืืช ืืกื ืืกืืืืืช, ืื ื ืื ื ืืืืข ืื ืื ืืคืขืื ืคืื ืงืื ืืืง ืืืืขืจืืช ืฉืื ื ืฉืืืื ืืขืืื ืชืืกืคืื ืืืชืงื ืื ืืืฉืืื Kubernetes ืืืืฆืข ืคืขืืืืช ืืืืืืืืืช ืฉืื ืืช. ืงืจื ืขืื ืขื ืืขืจืืช ืื
ืืฉ ืื ื ืชืืื ืืช ืืคืชืื ืืช ืฉืืจ ืืืขืจืืช ืืื: ืืคืขืื ืืชืืกืคืืช ืืืืกืฃ ืืืืื ืืืืืืืืื ืฉืื ื. ืืื, ื-addon-operator ืืืจ
ืืืฉื ืืขืงืื!
ื .ื.
ืงืจื ืื ืืืืื ืฉืื ื:
- ยซ
ืืืคืจืืืจืื ืขืืืจ Kubernetes: ืืืฆื ืืืคืขืื ืืืฉืืืื ืกืืืืกืืืื "; - ยซ
ืืชืืืช ืืคืขืื ืขืืืจ Kubernetes ืืืืื ื "; - ยซ
ืืฆืืืื ืชืืกืฃ ืืืฉ ืืืจืืคืื ื - ืคืื ื Statusmap "; - ยซ
ืืฆืืืื ืืช loghouse - ืืขืจืืช ืงืื ืคืชืื ืืขืืืื ืขื ืืืืื ื-Kubernetes "; - ยซ
ืื ื ืืฆืืืื ืจืฉืืืช ืืช dapp - ืืื ืขืืจ DevOps ืืชืืืืงืช CI/CD ".
ืืงืืจ: www.habr.com