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

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

ืœืžื”?

ื”ืจืขื™ื•ืŸ ืฉืœ ืžืคืขื™ืœ ืžืขื˜ืคืช ื”ื•ื ื“ื™ ืคืฉื•ื˜: ื”ื™ืจืฉื ืœืื™ืจื•ืขื™ื ืžืื•ื‘ื™ื™ืงื˜ื™ื ืฉืœ Kubernetes, ื•ื›ืืฉืจ ืื™ืจื•ืขื™ื ืืœื” ืžืชืงื‘ืœื™ื, ื”ืคืขืœ ืชื•ื›ื ื™ืช ื—ื™ืฆื•ื ื™ืช, ืฉืชืกืคืง ืœื” ืžื™ื“ืข ืขืœ ื”ืื™ืจื•ืข:

ื”ื™ื›ืจื•ืช ืขื ืžืคืขื™ืœ ืžืขื˜ืคืช: ื™ืฆื™ืจืช ืื•ืคืจื˜ื•ืจื™ื ืขื‘ื•ืจ 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

ืจื™ืฆื” ื‘ืžืงื‘ืฅ

ื‘ื•ืื• ื ืกืชื›ืœ ืฉื•ื‘ ืขืœ ื”ื•ื• ื•ื”ืคืขื ื ื›ืชื•ื‘ ืื™ืœื• ืคืขื•ืœื•ืช ื•ืขื ืื™ืœื• ืื•ื‘ื™ื™ืงื˜ื™ื ื”ื•ื ืžื‘ืฆืข ื‘ืืฉื›ื•ืœ:

  1. ื ืจืฉื ืœืื™ืจื•ืขื™ ื™ืฆื™ืจืช ืžืจื—ื‘ ืฉืžื•ืช;
  2. ื™ื•ืฆืจ ืกื•ื“ ื‘ืžืจื—ื‘ื™ ืฉืžื•ืช ืฉืื™ื ื ื–ื” ืฉื‘ื• ื”ื•ื ืžื•ืคืขืœ.

ืžืกืชื‘ืจ ืฉื”ืคื•ื“ ื‘ื• ืชื•ืฉืง ื”ืชืžื•ื ื” ืฉืœื ื• ื—ื™ื™ื‘ ืœื”ื™ื•ืช ื‘ืขืœ ื”ืจืฉืื•ืช ืœื‘ืฆืข ืืช ื”ืคืขื•ืœื•ืช ื”ืœืœื•. ื ื™ืชืŸ ืœืขืฉื•ืช ื–ืืช ืขืœ ื™ื“ื™ ื™ืฆื™ืจืช ื—ืฉื‘ื•ืŸ ืฉื™ืจื•ืช ืžืฉืœืš. ื”ื”ืจืฉืื” ื—ื™ื™ื‘ืช ืœื”ื™ืขืฉื•ืช ื‘ืฆื•ืจื” ืฉืœ 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 ืคืฉื•ื˜ ื ืขืฉืชื” ืงืœื” ื™ื•ืชืจ

ื›ืš, ืกืงืจื™ืคื˜ ืžืขื˜ืคืช ืคืฉื•ื˜ ื”ืคืš ืœืื•ืคืจื˜ื•ืจ ืืžื™ืชื™ ืขื‘ื•ืจ Kubernetes ื•ืขื•ื‘ื“ ื›ื—ืœืง ืžืืฉื›ื•ืœ. ื•ื›ืœ ื–ื” ื‘ืœื™ ื”ืชื”ืœื™ืš ื”ืžื•ืจื›ื‘ ืฉืœ ืคื™ืชื•ื— ืื•ืคืจื˜ื•ืจื™ื ื‘ื’ื•ืœื ื’:

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

ื™ืฉ ืขื•ื“ ื”ืžื—ืฉื” ื‘ืขื ื™ื™ืŸ ื”ื–ื”...ื”ื™ื›ืจื•ืช ืขื ืžืคืขื™ืœ ืžืขื˜ืคืช: ื™ืฆื™ืจืช ืื•ืคืจื˜ื•ืจื™ื ืขื‘ื•ืจ 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 ืงืฆืจ ืขื ืชื•ื•ื™ื•ืช:

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

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

ืืชื” ื™ื›ื•ืœ ืœืงื‘ืœ ืฉื“ื•ืช ืื—ืจื™ื ื‘ืฆื•ืจื” ื“ื•ืžื”.

ืžื” ื”ืœืื”?

ื‘ืžืื’ืจ ื”ืคืจื•ื™ืงื˜ื™ื, ื‘ ืกืคืจื™ื•ืช /examples, ื™ืฉ ื“ื•ื’ืžืื•ืช ืฉืœ ื•ื•ื™ื ืฉืžื•ื›ื ื™ื ืœื”ืคืขืœื” ืขืœ ืืฉื›ื•ืœ. ื›ืฉืืชื” ื›ื•ืชื‘ ื•ื•ื™ื ืžืฉืœืš, ืืชื” ื™ื›ื•ืœ ืœื”ืฉืชืžืฉ ื‘ื”ื ื›ื‘ืกื™ืก.

ืงื™ื™ืžืช ืชืžื™ื›ื” ื‘ืื™ืกื•ืฃ ืžื“ื“ื™ื ื‘ืืžืฆืขื•ืช ืคืจื•ืžืชืื•ืก - ื”ืžื“ื“ื™ื ื”ื–ืžื™ื ื™ื ืžืชื•ืืจื™ื ื‘ืกืขื™ืฃ ืžื“ื“ื™ื.

ื›ืคื™ ืฉืืชื” ื™ื›ื•ืœ ืœื ื—ืฉ, ืื•ืคืจื˜ื•ืจ ื”ืžืขื˜ืคืช ื›ืชื•ื‘ ื‘-Go ื•ืžื•ืคืฅ ืชื—ืช ืจื™ืฉื™ื•ืŸ ืงื•ื“ ืคืชื•ื— (Apache 2.0). ื ื”ื™ื” ืืกื™ืจื™ ืชื•ื“ื” ืขืœ ื›ืœ ืกื™ื•ืข ื‘ืคื™ืชื•ื— ืคืจื•ื™ืงื˜ ื‘- GitHub: ื•ื›ื•ื›ื‘ื™ื, ื•ื‘ืขื™ื•ืช, ื•ื‘ืงืฉื•ืช ืžืฉื™ื›ื”.

ื”ืจื™ื ืืช ืžืกืš ื”ืกื•ื“ื™ื•ืช, ืื ื• ื’ื ื ื•ื“ื™ืข ืœืš ื›ื™ ืžืคืขื™ืœ ืคื’ื– ืงื˜ืŸ ื—ืœืง ืžื”ืžืขืจื›ืช ืฉืœื ื• ืฉื™ื›ื•ืœ ืœืขื“ื›ืŸ ืชื•ืกืคื™ื ืžื•ืชืงื ื™ื ื‘ืืฉื›ื•ืœ Kubernetes ื•ืœื‘ืฆืข ืคืขื•ืœื•ืช ืื•ื˜ื•ืžื˜ื™ื•ืช ืฉื•ื ื•ืช. ืงืจื ืขื•ื“ ืขืœ ืžืขืจื›ืช ื–ื• ืกื™ืคืจ ืžืžืฉ ื‘ื™ื•ื ืฉื ื™ ื‘-HighLoad++ 2019 ื‘ืกื ื˜ ืคื˜ืจืกื‘ื•ืจื’ - ื‘ืงืจื•ื‘ ื ืคืจืกื ืืช ื”ืกืจื˜ื•ืŸ ื•ื”ืชืžืœื™ืœ ืฉืœ ื”ื“ื•"ื— ื”ื–ื”.

ื™ืฉ ืœื ื• ืชื•ื›ื ื™ืช ืœืคืชื•ื— ืืช ืฉืืจ ื”ืžืขืจื›ืช ื”ื–ื•: ืžืคืขื™ืœ ื”ืชื•ืกืคื•ืช ื•ืื•ืกืฃ ื”ื•ื•ื™ื ื•ื”ืžื•ื“ื•ืœื™ื ืฉืœื ื•. ืื’ื‘, ื”-addon-operator ื›ื‘ืจ ื–ืžื™ืŸ ื‘-github, ืื‘ืœ ื”ืชื™ืขื•ื“ ืขื‘ื•ืจื• ืขื“ื™ื™ืŸ ื‘ื“ืจืš. ืฉื—ืจื•ืจ ืื•ืกืฃ ื”ืžื•ื“ื•ืœื™ื ืžืชื•ื›ื ืŸ ืœืงื™ืฅ.

ื”ืžืฉืš ืœืขืงื•ื‘!

ื .ื‘.

ืงืจื ื’ื ื‘ื‘ืœื•ื’ ืฉืœื ื•:

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

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