เจเฉ เจฆเจพ เจตเจฐเจคเจฎเจพเจจ เจตเจฟเฉฑเจ เจชเฉเจฐเฉเจเจฐเจพเจฎเจฟเฉฐเจ เจญเจพเจธเจผเจพเจตเจพเจ 'เจคเฉ เจเจเจพเจงเจฟเจเจพเจฐ เจนเฉ เจเฉ เจฒเฉเจ เจเฉเจฌเจฐเจจเฉเจเจธ เจฒเจ เจฌเจฟเจเจจ เจฒเจฟเจเจฃ เจฒเจ เจเฉเจฃเจฆเฉ เจนเจจเฅค เจเจธเจฆเฉ เจฌเจพเจนเจฐเจฎเฉเจเฉ เจเจพเจฐเจจ เจนเจจ, เจเจฟเจตเฉเจ เจเจฟ:
- เจเฉ เจตเจฟเฉฑเจ เจเจชเจฐเฉเจเจฐเจพเจ เจจเฉเฉฐ เจตเจฟเจเจธเจค เจเจฐเจจ เจฒเจ เจเฉฑเจ เจธเจผเจเจคเฉเจธเจผเจพเจฒเฉ เจขเจพเจเจเจพ เจนเฉ -
เจเจชเจฐเฉเจเจฐ SDK . - Docker เจ เจคเฉ Kubernetes เจตเจฐเจเฉเจเจ เจเฉเจฎ เจฌเจฆเจฒเจฃ เจตเจพเจฒเฉเจเจ เจเจชเจฒเฉเจเฉเจธเจผเจจเจพเจ Go เจตเจฟเฉฑเจ เจฒเจฟเจเฉเจเจ เจเจเจเจ เจนเจจเฅค Go เจตเจฟเฉฑเจ เจเจชเจฃเฉ เจเจชเจฐเฉเจเจฐ เจจเฉเฉฐ เจฒเจฟเจเจฃ เจฆเจพ เจฎเจคเจฒเจฌ เจนเฉ เจเจฟ เจเจเฉเจธเจฟเจธเจเจฎ เจจเจพเจฒ เจเจนเฉ เจญเจพเจธเจผเจพ เจฌเฉเจฒเจฃเฉเฅค
- เจเฉ เจเจชเจฒเฉเจเฉเจธเจผเจจเจพเจ เจฆเจพ เจเฉฑเจ เจชเฉเจฐเจฆเจฐเจธเจผเจจ เจ เจคเฉ เจฌเจพเจเจธ เจฆเฉ เจฌเจพเจนเจฐ เจเจเจธเจพเจฐเจคเจพ เจจเจพเจฒ เจเฉฐเจฎ เจเจฐเจจ เจฒเจ เจธเจงเจพเจฐเจจ เจธเจพเจงเจจเฅค
NB: เจคเจฐเฉเจเฉ เจจเจพเจฒ, เจเฉ เจตเจฟเฉฑเจ เจเจชเจฃเจพ เจฌเจฟเจเจจ เจเจฟเจตเฉเจ เจฒเจฟเจเจฃเจพ เจนเฉ, เจ
เจธเฉเจ
เจชเจฐ เจเจฆเฉเจ เจเฉ เจเฉ เจคเฉเจนเจพเจจเฉเฉฐ เจธเจฎเฉเจ เจฆเฉ เจเจพเจ เจเจพเจ, เจธเจฟเฉฑเจงเฉ เจธเจผเจฌเจฆเจพเจ เจตเจฟเจ, เจชเฉเจฐเฉเจฐเจฃเจพ เจฆเฉเจเจฐเจพ เจธเจฟเฉฑเจเจฃ เจคเฉเจ เจฐเฉเจเจฟเจ เจเจพเจเจฆเจพ เจนเฉ? เจฒเฉเจ เจเฉฑเจ เจเจฆเจพเจนเจฐเจฃ เจชเฉเจฐเจฆเจพเจจ เจเจฐเจฆเจพ เจนเฉ เจเจฟ เจคเฉเจธเฉเจ เจธเจญ เจคเฉเจ เจชเฉเจฐเจธเจฟเฉฑเจง เจญเจพเจธเจผเจพเจตเจพเจ เจตเจฟเฉฑเจเฉเจ เจเฉฑเจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ เจเฉฑเจ เจตเจงเฉเจ เจฌเจฟเจเจจ เจเจฟเจตเฉเจ เจฒเจฟเจ เจธเจเจฆเฉ เจนเฉ เจเฉ เจฒเจเจญเจ เจนเจฐ DevOps เจเฉฐเจเฉเจจเฉเจ
เจฐ เจเจพเจฃเจฆเจพ เจนเฉ - เจชเจพเจเจฅเจจ.
เจฎเจฟเจฒเฉ: เจเจพเจชเฉเจฐ - เจเจพเจชเฉ เจเจชเจฐเฉเจเจฐ!
เจเฉฑเจ เจเจฆเจพเจนเจฐเจจ เจฆเฉ เจคเฉเจฐ 'เจคเฉ, เจเฉฑเจ เจธเจงเจพเจฐเจจ เจธเจเฉเจเจฎเฉเจเจ เจตเจฟเจเจธเจฟเจค เจเจฐเจจ 'เจคเฉ เจตเจฟเจเจพเจฐ เจเจฐเฉ เจเฉ เจเฉฑเจ ConfigMap เจฆเฉ เจจเจเจฒ เจเจฐเจจ เจฒเจ เจคเจฟเจเจฐ เจเฉเจคเจพ เจเจฟเจ เจนเฉ เจเจพเจ เจคเจพเจ เจเจฆเฉเจ เจเฉฑเจ เจจเจตเจพเจ เจจเฉเจฎเจธเจชเฉเจธ เจฆเจฟเจเจพเจ เจฆเจฟเฉฐเจฆเจพ เจนเฉ เจเจพเจ เจเจฆเฉเจ เจฆเฉ เจธเฉฐเจธเจฅเจพเจตเจพเจ เจตเจฟเฉฑเจเฉเจ เจเฉฑเจ เจฌเจฆเจฒเจฆเจพ เจนเฉ: ConfigMap เจ เจคเฉ เจธเฉเจเจฐเฉเจเฅค เจตเจฟเจนเจพเจฐเจ เจฆเฉเจฐเจฟเจธเจผเจเฉเจเฉเจฃ เจคเฉเจ, เจเจชเจฐเฉเจเจฐ เจเจชเจฒเฉเจเฉเจธเจผเจจ เจเฉเจเจซเจฟเจเจฐเฉเจธเจผเจจเจพเจ (เจเจจเจซเจฟเจเจฎเฉเจช เจจเฉเฉฐ เจ เฉฑเจชเจกเฉเจ เจเจฐเจเฉ) เจฆเฉ เจฌเจฒเจ เจ เฉฑเจชเจกเฉเจ เจเจฐเจจ เจเจพเจ เจเฉเจชเจค เจกเฉเจเจพ เจจเฉเฉฐ เจ เฉฑเจชเจกเฉเจ เจเจฐเจจ เจฒเจ เจฒเจพเจญเจฆเจพเจเจ เจนเฉ เจธเจเจฆเจพ เจนเฉ - เจเจฆเจพเจนเจฐเจจ เจฒเจ, เจกเฉเจเจฐ เจฐเจเจฟเจธเจเจฐเฉ เจจเจพเจฒ เจเฉฐเจฎ เจเจฐเจจ เจฒเจ เจเฉเฉฐเจเฉเจเจ (เจเจฆเฉเจ เจจเฉเจฎเจธเจชเฉเจธ เจตเจฟเฉฑเจ เจธเฉเจเจฐเฉเจ เจเฉเฉเจฆเฉ เจนเฉเจ)เฅค
เจ เจคเฉ เจเจธ เจคเจฐเฉเจนเจพเจ, เจเฉฑเจ เจเฉฐเจเฉ เจเจชเจฐเฉเจเจฐ เจเฉเจฒ เจเฉ เจนเฉเจฃเจพ เจเจพเจนเฉเจฆเจพ เจนเฉ:
- เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ เจเจชเจฐเฉเจเจฐ เจจเจพเจฒ เจเฉฑเจฒเจฌเจพเจค เจเฉเจคเฉ เจเจพเจเจฆเฉ เจนเฉ
เจเจธเจเจฎ เจธเจฐเฉเจค เจชเจฐเจฟเจญเจพเจธเจผเจพเจตเจพเจ (เจเจธ เจคเฉเจ เจฌเจพเจ เจฆ CRD เจเจฟเจนเจพ เจเจพเจเจฆเจพ เจนเฉ)เฅค - เจเจชเจฐเฉเจเจฐ เจจเฉเฉฐ เจธเฉฐเจฐเจเจฟเจค เจเฉเจคเจพ เจเจพ เจธเจเจฆเจพ เจนเฉเฅค เจ เจเจฟเจนเจพ เจเจฐเจจ เจฒเจ, เจ เจธเฉเจ เจเจฎเจพเจเจก เจฒเจพเจเจจ เจซเจฒเฉเจ เจ เจคเฉ เจตเจพเจคเจพเจตเจฐเจฃ เจตเฉเจฐเฉเจเจฌเจฒ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจพเจเจเฉเฅค
- เจกเฉเจเจฐ เจเฉฐเจเฉเจจเจฐ เจ เจคเฉ เจนเฉเจฒเจฎ เจเจพเจฐเจ เจฆเจพ เจฌเจฟเจฒเจก เจกเจฟเจเจผเจพเจเจจ เจเฉเจคเจพ เจเจฟเจ เจนเฉ เจคเจพเจ เจเฉ เจเจชเจญเฉเจเจคเจพ เจเจธเจพเจจเฉ เจจเจพเจฒ (เจธเจผเจพเจฌเจฆเจฟเจ เจคเฉเจฐ 'เจคเฉ เจเฉฑเจ เจเจฎเจพเจเจก เจจเจพเจฒ) เจเจชเจฐเฉเจเจฐ เจจเฉเฉฐ เจเจชเจฃเฉ เจเฉเจฌเจฐเจจเฉเจเจธ เจเจฒเฉฑเจธเจเจฐ เจตเจฟเฉฑเจ เจธเจฅเจพเจชเจฟเจค เจเจฐ เจธเจเจฃเฅค
เจธเฉ.เจเจฐ.เจกเฉ.
เจเจชเจฐเฉเจเจฐ เจจเฉเฉฐ เจเจน เจเจพเจฃเจจ เจฒเจ เจเจฟ เจเจฟเจนเฉเฉ เจธเจฐเฉเจคเจพเจ เจฆเฉ เจญเจพเจฒ เจเจฐเจจเฉ เจนเฉ เจ เจคเฉ เจเจฟเฉฑเจฅเฉ เจฆเฉเจเจฃเจพ เจนเฉ, เจธเจพเจจเฉเฉฐ เจเจธเจฆเฉ เจฒเจ เจเฉฑเจ เจจเจฟเจฏเจฎ เจจเจฟเจฐเจงเจพเจฐเจค เจเจฐเจจ เจฆเฉ เจฒเฉเฉ เจนเฉเฅค เจนเจฐเฉเจ เจจเจฟเจฏเจฎ เจจเฉเฉฐ เจเฉฑเจ เจธเจฟเฉฐเจเจฒ CRD เจตเจธเจคเฉ เจตเจเฉเจ เจฆเจฐเจธเจพเจเจ เจเจพเจตเฉเจเจพเฅค เจเจธ CRD เจตเจฟเฉฑเจ เจเจฟเจนเฉเฉ เจเฉเจคเจฐ เจนเฉเจฃเฉ เจเจพเจนเฉเจฆเฉ เจนเจจ?
- เจธเจฐเฉเจค เจฆเฉ เจเจฟเจธเจฎ, เจเจฟเจธ เจฆเฉ เจ เจธเฉเจ เจเฉเจ เจเจฐเจพเจเจเฉ (ConfigMap เจเจพเจ เจธเฉเจเจฐเฉเจ)เฅค
- เจจเจพเจฎ-เจธเจฅเจพเจจเจพเจ เจฆเฉ เจธเฉเจเฉ, เจเจฟเจธ เจตเจฟเฉฑเจ เจธเจฐเฉเจค เจธเจฅเจฟเจค เจนเฉเจฃเฉ เจเจพเจนเฉเจฆเฉ เจนเจจเฅค
- เจเฉเจฃเจเจพเจฐ, เจเจฟเจธ เจฆเฉเจเจฐเจพ เจ เจธเฉเจ เจจเฉเจฎเจธเจชเฉเจธ เจตเจฟเฉฑเจ เจธเจฐเฉเจคเจพเจ เจฆเฉ เจเฉเจ เจเจฐเจพเจเจเฉเฅค
เจเจ CRD เจฆเจพ เจตเจฐเจฃเจจ เจเจฐเฉเจ:
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: copyrator.flant.com
spec:
group: flant.com
versions:
- name: v1
served: true
storage: true
scope: Namespaced
names:
plural: copyrators
singular: copyrator
kind: CopyratorRule
shortNames:
- copyr
validation:
openAPIV3Schema:
type: object
properties:
ruleType:
type: string
namespaces:
type: array
items:
type: string
selector:
type: string
เจ
เจคเฉ เจ
เจธเฉเจ เจเจธเจจเฉเฉฐ เจคเฉเจฐเฉฐเจค เจฌเจฃเจพเจตเจพเจเจเฉ เจธเจงเจพเจฐเจจ เจจเจฟเจฏเจฎ - เจจเจพเจฎ เจฆเฉ เจจเจพเจฒ เจจเฉเจฎเจธเจชเฉเจธ เจตเจฟเฉฑเจ เจเฉเจ เจเจฐเจจ เจฒเจ default
เจตเจฐเจเฉ เจฒเฉเจฌเจฒ เจฆเฉ เจจเจพเจฒ เจธเจพเจฐเฉ ConfigMap copyrator: "true"
:
apiVersion: flant.com/v1
kind: CopyratorRule
metadata:
name: main-rule
labels:
module: copyrator
ruleType: configmap
selector:
copyrator: "true"
namespace: default
เจคเจฟเจเจฐ! เจนเฉเจฃ เจธเจพเจจเฉเฉฐ เจเจฟเจธเฉ เจคเจฐเฉเจนเจพเจ เจเจชเจฃเฉ เจจเจฟเจฏเจฎ เจฌเจพเจฐเฉ เจเจพเจฃเจเจพเจฐเฉ เจฒเฉเจฃ เจฆเฉ เจฒเฉเฉ เจนเฉเฅค เจฎเฉเจจเฉเฉฐ เจคเฉเจฐเฉฐเจค เจเฉฑเจ เจฐเจฟเจเจผเจฐเจตเฉเจธเจผเจจ เจเจฐเจจ เจฆเจฟเจ เจเจฟ เจ
เจธเฉเจ เจเจชเจฃเฉ เจเจช เจเจฒเฉฑเจธเจเจฐ API เจธเจฐเจตเจฐ เจจเฉเฉฐ เจฌเฉเจจเจคเฉเจเจ เจจเจนเฉเจ เจฒเจฟเจเจพเจเจเฉเฅค เจ
เจเจฟเจนเจพ เจเจฐเจจ เจฒเจ, เจ
เจธเฉเจ เจเฉฑเจ เจคเจฟเจเจฐ เจชเจพเจเจฅเจจ เจฒเจพเจเจฌเฉเจฐเฉเจฐเฉ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจพเจเจเฉ
import kubernetes
from contextlib import suppress
CRD_GROUP = 'flant.com'
CRD_VERSION = 'v1'
CRD_PLURAL = 'copyrators'
def load_crd(namespace, name):
client = kubernetes.client.ApiClient()
custom_api = kubernetes.client.CustomObjectsApi(client)
with suppress(kubernetes.client.api_client.ApiException):
crd = custom_api.get_namespaced_custom_object(
CRD_GROUP,
CRD_VERSION,
namespace,
CRD_PLURAL,
name,
)
return {x: crd[x] for x in ('ruleType', 'selector', 'namespace')}
เจเจธ เจเฉเจก เจจเฉเฉฐ เจเจฒเจพเจเจฃ เจฆเฉ เจจเจคเฉเจเฉ เจตเจเฉเจ, เจธเจพเจจเฉเฉฐ เจนเฉเจ เจฒเจฟเจเจฟเจเจ เจฎเจฟเจฒเจฆเจพ เจนเฉ:
{'ruleType': 'configmap', 'selector': {'copyrator': 'true'}, 'namespace': ['default']}
เจธเจผเจพเจจเจฆเจพเจฐ: เจ เจธเฉเจ เจเจชเจฐเฉเจเจฐ เจฒเจ เจเฉฑเจ เจจเจฟเจฏเจฎ เจชเฉเจฐเจพเจชเจค เจเจฐเจจ เจตเจฟเฉฑเจ เจเจพเจฎเจฏเจพเจฌ เจนเฉเจ. เจ เจคเฉ เจธเจญ เจคเฉเจ เจฎเจนเฉฑเจคเจตเจชเฉเจฐเจจ, เจ เจธเฉเจ เจเจนเฉ เจเฉเจคเจพ เจเจฟเจธเจจเฉเฉฐ เจเฉเจฌเจฐเจจเฉเจเจธ เจคเจฐเฉเจเจพ เจเจฟเจนเจพ เจเจพเจเจฆเจพ เจนเฉเฅค
เจตเจพเจคเจพเจตเจฐเจฃ เจตเฉเจฐเฉเจเจฌเจฒ เจเจพเจ เจซเจฒเฉเจ? เจ เจธเฉเจ เจธเจญ เจเฉเจ เจฒเฉเจเจฆเฉ เจนเจพเจ!
เจเจ เจฎเฉเฉฑเจ เจเจชเจฐเฉเจเจฐ เจธเฉฐเจฐเจเจจเจพ เจตเฉฑเจฒ เจตเจงเจฆเฉ เจนเจพเจเฅค เจเจชเจฒเฉเจเฉเจธเจผเจจเจพเจ เจจเฉเฉฐ เจเฉเจเจซเจฟเจเจฐ เจเจฐเจจ เจฒเจ เจฆเฉ เจฌเฉเจจเจฟเจเจฆเฉ เจชเจนเฉเฉฐเจ เจนเจจ:
- เจเจฎเจพเจเจก เจฒเจพเจเจจ เจตเจฟเจเจฒเจชเจพเจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเฉ;
- เจตเจพเจคเจพเจตเจฐเจฃ เจตเฉเจฐเฉเจเจฌเจฒ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเฉเฅค
เจเจฎเจพเจเจก เจฒเจพเจเจจ เจตเจฟเจเจฒเจช เจคเฉเจนเจพเจจเฉเฉฐ เจกเจพเจเจพ เจเจฟเจธเจฎ เจฆเฉ เจธเจฎเจฐเจฅเจจ เจ
เจคเฉ เจชเฉเจฐเจฎเจพเจฃเจฟเจเจคเจพ เจฆเฉ เจจเจพเจฒ เจธเฉเจเจฟเฉฐเจเจพเจ เจจเฉเฉฐ เจตเจงเฉเจฐเฉ เจฒเจเจเจฆเจพเจฐ เจขเฉฐเจ เจจเจพเจฒ เจชเฉเฉเจนเจจ เจฆเฉ เจเจเจพเจเจผเจค เจฆเจฟเฉฐเจฆเฉ เจนเจจเฅค เจชเจพเจเจฅเจจ เจฆเฉ เจธเจเฉเจเจกเจฐเจก เจฒเจพเจเจฌเฉเจฐเฉเจฐเฉ เจตเจฟเฉฑเจ เจเฉฑเจ เจฎเฉเจกเฉเจเจฒ เจนเฉ argparser
, เจเฉ เจ
เจธเฉเจ เจตเจฐเจคเจพเจเจเฉเฅค เจเจธ เจฆเฉเจเจ เจธเจฎเจฐเฉฑเจฅเจพเจตเจพเจ เจฆเฉ เจตเฉเจฐเจตเฉ เจ
เจคเฉ เจเจฆเจพเจนเจฐเจฃเจพเจ เจตเจฟเฉฑเจ เจเจชเจฒเจฌเจง เจนเจจ
เจธเจพเจกเฉ เจเฉเจธ เจฒเจ, เจเจน เจนเฉ เจเจฟ เจฐเฉเจกเจฟเฉฐเจ เจเจฎเจพเจเจก เจฒเจพเจเจจ เจซเจฒเฉเจ เจธเจฅเจพเจชเจค เจเจฐเจจ เจฆเฉ เจเฉฑเจ เจเจฆเจพเจนเจฐเจฃ เจเจธ เจคเจฐเฉเจนเจพเจ เจฆเจฟเจเจพเจ เจฆเฉเจตเฉเจเฉ:
parser = ArgumentParser(
description='Copyrator - copy operator.',
prog='copyrator'
)
parser.add_argument(
'--namespace',
type=str,
default=getenv('NAMESPACE', 'default'),
help='Operator Namespace'
)
parser.add_argument(
'--rule-name',
type=str,
default=getenv('RULE_NAME', 'main-rule'),
help='CRD Name'
)
args = parser.parse_args()
เจฆเฉเจเฉ เจชเจพเจธเฉ, เจเฉเจฌเจฐเจจเฉเจเจธ เจตเจฟเฉฑเจ เจตเจพเจคเจพเจตเจฐเจฃ เจตเฉเจฐเฉเจเจฌเจฒ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจนเฉเจ, เจคเฉเจธเฉเจ เจเฉฐเจเฉเจจเจฐ เจฆเฉ เจ เฉฐเจฆเจฐ เจชเฉเจก เจฌเจพเจฐเฉ เจธเฉเจตเจพ เจเจพเจฃเจเจพเจฐเฉ เจจเฉเฉฐ เจเจธเจพเจจเฉ เจจเจพเจฒ เจเฉเจฐเจพเจเจธเจซเจฐ เจเจฐ เจธเจเจฆเฉ เจนเฉเฅค เจเจฆเจพเจนเจฐเจจ เจฒเจ, เจ เจธเฉเจ เจจเจพเจฎ-เจธเจชเฉเจธ เจฌเจพเจฐเฉ เจเจพเจฃเจเจพเจฐเฉ เจชเฉเจฐเจพเจชเจค เจเจฐ เจธเจเจฆเฉ เจนเจพเจ เจเจฟเจธ เจตเจฟเฉฑเจ เจชเฉเจก เจนเฉเจ เจพเจ เจฆเจฟเฉฑเจคเฉ เจจเจฟเจฐเจฎเจพเจฃ เจจเจพเจฒ เจเฉฑเจฒ เจฐเจฟเจนเจพ เจนเฉ:
env:
- name: NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
เจเจชเจฐเฉเจเจฐ เจคเจฐเจ
เจเจน เจธเจฎเจเจฃ เจฒเจ เจเจฟ ConfigMap เจ เจคเฉ เจธเฉเจเจฐเฉเจ เจจเจพเจฒ เจเฉฐเจฎ เจเจฐเจจ เจฆเฉ เจขเฉฐเจเจพเจ เจจเฉเฉฐ เจเจฟเจตเฉเจ เจตเฉฑเจ เจเจฐเจจเจพ เจนเฉ, เจ เจธเฉเจ เจตเจฟเจธเจผเฉเจธเจผ เจจเจเจธเจผเจฟเจเจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจพเจเจเฉเฅค เจซเจฟเจฐ เจ เจธเฉเจ เจธเจฎเจ เจธเจเจฆเฉ เจนเจพเจ เจเจฟ เจธเจพเจจเฉเฉฐ เจเจฌเจเฉเจเจ เจจเฉเฉฐ เจเจฐเฉเจ เจเจฐเจจ เจ เจคเฉ เจฌเจฃเจพเจเจฃ เจฒเจ เจเจฟเจนเฉเฉ เจคเจฐเฉเจเจฟเจเจ เจฆเฉ เจฒเฉเฉ เจนเฉ:
LIST_TYPES_MAP = {
'configmap': 'list_namespaced_config_map',
'secret': 'list_namespaced_secret',
}
CREATE_TYPES_MAP = {
'configmap': 'create_namespaced_config_map',
'secret': 'create_namespaced_secret',
}
เจ เฉฑเจเฉ, เจคเฉเจนเจพเจจเฉเฉฐ API เจธเจฐเจตเจฐ เจคเฉเจ เจเจตเฉเจเจ เจชเฉเจฐเจพเจชเจค เจเจฐเจจ เจฆเฉ เจฒเฉเฉ เจนเฉเฅค เจเจ เจเจธเจจเฉเฉฐ เจนเฉเจ เจฒเจฟเจเฉ เจ เจจเฉเจธเจพเจฐ เจฒเจพเจเฉ เจเจฐเฉเจ:
def handle(specs):
kubernetes.config.load_incluster_config()
v1 = kubernetes.client.CoreV1Api()
# ะะพะปััะฐะตะผ ะผะตัะพะด ะดะปั ัะปะตะถะตะฝะธั ะทะฐ ะพะฑัะตะบัะฐะผะธ
method = getattr(v1, LIST_TYPES_MAP[specs['ruleType']])
func = partial(method, specs['namespace'])
w = kubernetes.watch.Watch()
for event in w.stream(func, _request_timeout=60):
handle_event(v1, specs, event)
เจเจตเฉเจเจ เจชเฉเจฐเจพเจชเจค เจเจฐเจจ เจคเฉเจ เจฌเจพเจ เจฆ, เจ เจธเฉเจ เจเจธเจจเฉเฉฐ เจชเฉเจฐเฉเจธเฉเจธ เจเจฐเจจ เจฆเฉ เจฎเฉเฉฑเจ เจคเจฐเจ เจตเฉฑเจฒ เจตเจงเจฆเฉ เจนเจพเจ:
# ะขะธะฟั ัะพะฑััะธะน, ะฝะฐ ะบะพัะพััะต ะฑัะดะตะผ ัะตะฐะณะธัะพะฒะฐัั
ALLOWED_EVENT_TYPES = {'ADDED', 'UPDATED'}
def handle_event(v1, specs, event):
if event['type'] not in ALLOWED_EVENT_TYPES:
return
object_ = event['object']
labels = object_['metadata'].get('labels', {})
# ะัะตะผ ัะพะฒะฟะฐะดะตะฝะธั ะฟะพ selector'ั
for key, value in specs['selector'].items():
if labels.get(key) != value:
return
# ะะพะปััะฐะตะผ ะฐะบัะธะฒะฝัะต namespace'ั
namespaces = map(
lambda x: x.metadata.name,
filter(
lambda x: x.status.phase == 'Active',
v1.list_namespace().items
)
)
for namespace in namespaces:
# ะัะธัะฐะตะผ ะผะตัะฐะดะฐะฝะฝัะต, ัััะฐะฝะฐะฒะปะธะฒะฐะตะผ namespace
object_['metadata'] = {
'labels': object_['metadata']['labels'],
'namespace': namespace,
'name': object_['metadata']['name'],
}
# ะัะทัะฒะฐะตะผ ะผะตัะพะด ัะพะทะดะฐะฝะธั/ะพะฑะฝะพะฒะปะตะฝะธั ะพะฑัะตะบัะฐ
methodcaller(
CREATE_TYPES_MAP[specs['ruleType']],
namespace,
object_
)(v1)
เจฎเฉเฉฑเจ เจคเจฐเจ เจคเจฟเจเจฐ เจนเฉ! เจนเฉเจฃ เจธเจพเจจเฉเฉฐ เจเจน เจธเจญ เจเฉฑเจ Python เจชเฉเจเฉเจ เจตเจฟเฉฑเจ เจชเฉเจ เจเจฐเจจ เจฆเฉ เจฒเฉเฉ เจนเฉเฅค เจ
เจธเฉเจ เจซเจพเจเจฒ เจคเจฟเจเจฐ เจเจฐเจฆเฉ เจนเจพเจ setup.py
, เจเฉฑเจฅเฉ เจชเฉเจฐเฉเจเฉเจเจ เจฌเจพเจฐเฉ เจฎเฉเจเจพ เจเจพเจฃเจเจพเจฐเฉ เจฒเจฟเจเฉ:
from sys import version_info
from setuptools import find_packages, setup
if version_info[:2] < (3, 5):
raise RuntimeError(
'Unsupported python version %s.' % '.'.join(version_info)
)
_NAME = 'copyrator'
setup(
name=_NAME,
version='0.0.1',
packages=find_packages(),
classifiers=[
'Development Status :: 3 - Alpha',
'Programming Language :: Python',
'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.5',
'Programming Language :: Python :: 3.6',
'Programming Language :: Python :: 3.7',
],
author='Flant',
author_email='[email protected]',
include_package_data=True,
install_requires=[
'kubernetes==9.0.0',
],
entry_points={
'console_scripts': [
'{0} = {0}.cli:main'.format(_NAME),
]
}
)
NB: เจชเจพเจเจฅเจจ เจฒเจ เจเฉเจฌเจฐเจจเฉเจเจธ เจเจฒเจพเจเฉฐเจ เจฆเจพ เจเจชเจฃเจพ เจธเฉฐเจธเจเจฐเจฃ เจนเฉเฅค เจเจฒเจพเจเฉฐเจ เจธเฉฐเจธเจเจฐเจฃเจพเจ เจ
เจคเฉ เจเฉเจฌเจฐเจจเฉเจเจธ เจธเฉฐเจธเจเจฐเจฃเจพเจ เจตเจฟเจเจเจพเจฐ เจ
เจจเฉเจเฉเจฒเจคเจพ เจฌเจพเจฐเฉ เจตเจงเฉเจฐเฉ เจเจพเจฃเจเจพเจฐเฉ เจตเจฟเฉฑเจ เจฒเฉฑเจญเฉ เจเจพ เจธเจเจฆเฉ เจนเฉ
เจนเฉเจฃ เจธเจพเจกเจพ เจชเฉเจฐเฉเจเฉเจเจ เจเจธ เจคเจฐเฉเจนเจพเจ เจฆเจฟเจธเจฆเจพ เจนเฉ:
copyrator
โโโ copyrator
โ โโโ cli.py # ะะพะณะธะบะฐ ัะฐะฑะพัั ั ะบะพะผะฐะฝะดะฝะพะน ัััะพะบะพะน
โ โโโ constant.py # ะะพะฝััะฐะฝัั, ะบะพัะพััะต ะผั ะฟัะธะฒะพะดะธะปะธ ะฒััะต
โ โโโ load_crd.py # ะะพะณะธะบะฐ ะทะฐะณััะทะบะธ CRD
โ โโโ operator.py # ะัะฝะพะฒะฝะฐั ะปะพะณะธะบะฐ ัะฐะฑะพัั ะพะฟะตัะฐัะพัะฐ
โโโ setup.py # ะัะพัะผะปะตะฝะธะต ะฟะฐะบะตัะฐ
เจกเฉเจเจฐ เจ เจคเฉ เจนเฉเจฒเจฎ
เจกเฉเจเจฐเจซเจพเจเจฒ เจฌเจนเฉเจค เจนเฉ เจธเจงเจพเจฐเจจ เจนเฉเจตเฉเจเฉ: เจฌเฉเจธ เจชเจพเจเจฅเจจ-เจเจฒเจชเจพเจเจจ เจเจฟเฉฑเจคเจฐ เจฒเจ เจ เจคเฉ เจธเจพเจกเฉ เจชเฉเจเฉเจ เจจเฉเฉฐ เจธเจฅเจพเจชเจฟเจค เจเจฐเฉเฅค เจเจ เจเจธ เจฆเฉ เจ เจจเฉเจเฉเจฒเจจ เจจเฉเฉฐ เจฌเจฟเจนเจคเจฐ เจธเจฎเฉเจ เจคเฉฑเจ เจฎเฉเจฒเจคเจตเฉ เจเจฐเฉเจ:
FROM python:3.7.3-alpine3.9
ADD . /app
RUN pip3 install /app
ENTRYPOINT ["copyrator"]
เจเจชเจฐเฉเจเจฐ เจฒเจ เจคเฉเจจเจพเจคเฉ เจตเฉ เจฌเจนเฉเจค เจธเจงเจพเจฐเจจ เจนเฉ:
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Chart.Name }}
spec:
selector:
matchLabels:
name: {{ .Chart.Name }}
template:
metadata:
labels:
name: {{ .Chart.Name }}
spec:
containers:
- name: {{ .Chart.Name }}
image: privaterepo.yourcompany.com/copyrator:latest
imagePullPolicy: Always
args: ["--rule-type", "main-rule"]
env:
- name: NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
serviceAccountName: {{ .Chart.Name }}-acc
เจ เฉฐเจค เจตเจฟเฉฑเจ, เจคเฉเจนเจพเจจเฉเฉฐ เจฒเฉเฉเฉเจเจฆเฉ เจ เจงเจฟเจเจพเจฐเจพเจ เจฆเฉ เจจเจพเจฒ เจเจชเจฐเฉเจเจฐ เจฒเจ เจเฉฑเจ เจขเฉเจเจตเฉเจ เจญเฉเจฎเจฟเจเจพ เจฌเจฃเจพเจเจฃ เจฆเฉ เจฒเฉเฉ เจนเฉ:
apiVersion: v1
kind: ServiceAccount
metadata:
name: {{ .Chart.Name }}-acc
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
name: {{ .Chart.Name }}
rules:
- apiGroups: [""]
resources: ["namespaces"]
verbs: ["get", "watch", "list"]
- apiGroups: [""]
resources: ["secrets", "configmaps"]
verbs: ["*"]
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: {{ .Chart.Name }}
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: {{ .Chart.Name }}
subjects:
- kind: ServiceAccount
name: {{ .Chart.Name }}
เจจเจคเฉเจเจพ
เจเจธ เจคเจฐเฉเจนเจพเจ, เจฌเจฟเจจเจพเจ เจเจฟเจธเฉ เจกเจฐ, เจฌเจฆเจจเจพเจฎเฉ, เจเจพเจ เจเฉ เจธเจฟเฉฑเจเจฃ เจฆเฉ, เจ เจธเฉเจ เจชเจพเจเจฅเจจ เจตเจฟเฉฑเจ เจเฉเจฌเจฐเจจเฉเจเจธ เจฒเจ เจเจชเจฃเจพ เจเจชเจฐเฉเจเจฐ เจฌเจฃเจพเจเจฃ เจฆเฉ เจฏเฉเจ เจนเฉ เจเจเฅค เจฌเฉเจธเจผเฉฑเจ, เจเจธ เจตเจฟเฉฑเจ เจ เจเฉ เจตเฉ เจตเจงเจฃ เจฒเจ เจฅเจพเจ เจนเฉ: เจญเจตเจฟเฉฑเจ เจตเจฟเฉฑเจ เจเจน เจเจ เจจเจฟเจฏเจฎเจพเจ เจฆเฉ เจชเฉเจฐเจเจฟเจฐเจฟเจ เจเจฐเจจ เจฆเฉ เจฏเฉเจ เจนเฉเจตเฉเจเจพ, เจฎเจฒเจเฉเจชเจฒ เจฅเจฐเจฟเฉฑเจกเจพเจ เจตเจฟเฉฑเจ เจเฉฐเจฎ เจเจฐเฉเจเจพ, เจธเฉเจคเฉฐเจคเจฐ เจคเฉเจฐ 'เจคเฉ เจเจธเจฆเฉ CRDs เจตเจฟเฉฑเจ เจคเจฌเจฆเฉเจฒเฉเจเจ เจฆเฉ เจจเจฟเจเจฐเจพเจจเฉ เจเจฐเฉเจเจพ...
เจคเฉเจนเจพเจจเฉเฉฐ เจเฉเจก 'เจคเฉ เจจเฉเฉเจฟเจเจ เจจเจเจผเจฐ เจฆเฉเจฃ เจฒเจ, เจ
เจธเฉเจ เจเจธเจจเฉเฉฐ เจชเจพ เจฆเจฟเฉฑเจคเจพ เจนเฉ
PS เจ
เจคเฉ เจเฉเจเจฐ เจคเฉเจธเฉเจ เจเฉเจฌเจฐเจจเฉเจเจธ เจเจตเฉเจเจเจธ เจจเจพเจฒ เจจเจเจฟเฉฑเจ เจฃ เจฒเจ เจฌเจนเฉเจค เจเจฒเจธเฉ เจนเฉ เจเจพเจ เจคเฉเจธเฉเจ เจฌเฉเจธเจผ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจจ เจฆเฉ เจเจผเจฟเจเจฆเจพ เจเจฆเฉ เจนเฉ, เจคเจพเจ เจธเจพเจกเฉ เจธเจนเจฟเจฏเฉเจเฉเจเจ เจจเฉ เจซเจพเจฐเจฎ เจตเจฟเฉฑเจ เจเฉฑเจ เจคเจฟเจเจฐ เจนเฉฑเจฒ เจคเจฟเจเจฐ เจเฉเจคเจพ เจนเฉ
Pps
เจธเจพเจกเฉ เจฌเจฒเฉเจ 'เจคเฉ เจตเฉ เจชเฉเฉเจนเฉ:
- ยซ
เจเฉ เจเฉเจฌเจฐเจจเฉเจเจธ เจเจฒเฉฑเจธเจเจฐ เจคเจฟเจเจฐ เจเจฐเจจเจพ เจเจธเจพเจจ เจ เจคเฉ เจธเฉเจตเจฟเจงเจพเจเจจเจ เจนเฉ? เจเจก-เจเจจ-เจเจชเจฐเฉเจเจฐ เจฆเฉ เจเฉเจธเจผเจฃเจพ เจเฉเจคเฉ เจเจพ เจฐเจนเฉ เจนเฉ "; - ยซ
เจธเจผเฉเฉฑเจฒ-เจเจชเจฐเฉเจเจฐ เจชเฉเจธเจผ เจเจฐเจจเจพ: เจเฉเจฌเจฐเจจเฉเจเจธ เจฒเจ เจเจชเจฐเฉเจเจฐ เจฌเจฃเจพเจเจฃเจพ เจนเฉเจฃเฉ เจเจธเจพเจจ เจนเฉ เจเจฟเจ เจนเฉ "; - ยซ
เจเฉเจฌเจฐเจจเฉเจเจธ เจฆเจพ เจตเจฟเจธเจฅเจพเจฐ เจ เจคเฉ เจชเฉเจฐเจ (เจธเจฎเฉเจเจฟเจ เจ เจคเฉ เจตเฉเจกเฉเจ เจฐเจฟเจชเฉเจฐเจ) "; - ยซ
เจเฉเจฒเฉฐเจ เจตเจฟเฉฑเจ เจเฉเจฌเจฐเจจเฉเจเจธ เจฒเจ เจเฉฑเจ เจเจชเจฐเฉเจเจฐ เจฒเจฟเจเจฃเจพ "; - ยซ
เจเฉเจฌเจฐเจจเฉเจเจธ เจฒเจ เจเจชเจฐเฉเจเจฐ: เจธเจเฉเจเจซเฉเฉฑเจฒ เจเจชเจฒเฉเจเฉเจธเจผเจจเจพเจ เจจเฉเฉฐ เจเจฟเจตเฉเจ เจเจฒเจพเจเจฃเจพ เจนเฉ ".
เจธเจฐเฉเจค: www.habr.com