เดเดณเตเดเตพ เดเตเดฌเตผเดจเตเดฑเตเดฑเดธเดฟเดจเดพเดฏเดฟ เดชเตเดฐเดธเตเดคเดพเดตเดจเดเตพ เดเดดเตเดคเดพเตป เดคเดฟเดฐเดเตเดเตเดเตเดเตเดเตเดจเตเดจ เดชเตเดฐเตเดเตเดฐเดพเดฎเดฟเดเดเต เดญเดพเดทเดเดณเดฟเตฝ Go- เดฏเตเดเตเดเต เดจเดฟเดฒเดตเดฟเตฝ เดเตเดคเตเดคเดเดฏเตเดฃเตเดเต. เดเดคเดฟเดจเต เดตเดธเตเดคเตเดจเดฟเดทเตเด เดฎเดพเดฏ เดเดพเดฐเดฃเดเตเดเดณเตเดฃเตเดเต, เดเดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต:
- Go-เดฏเดฟเตฝ เดเดชเตเดชเดฑเตเดฑเตเดฑเตผเดฎเดพเดฐเต เดตเดฟเดเดธเดฟเดชเตเดชเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเต เดถเดเตเดคเดฎเดพเดฏ เดเดฐเต เดเดเตเดเดเตเดเตเดเต เดเดฃเตเดเต -
เดเดชเตเดชเดฑเตเดฑเตเดฑเตผ เดเดธเต.เดกเดฟ.เดเต . - Docker, Kubernetes เดชเตเดฒเตเดณเตเดณ เดเตเดฏเดฟเด เดฎเดพเดฑเตเดฑเตเดจเตเดจ เดเดชเตเดฒเดฟเดเตเดเตเดทเดจเตเดเตพ Go-เดฏเดฟเตฝ เดเดดเตเดคเดฟเดฏเดฟเดฐเดฟเดเตเดเตเดจเตเดจเต. Go-เดฏเดฟเตฝ เดจเดฟเดเตเดเดณเตเดเต เดเดชเตเดชเดฑเตเดฑเตเดฑเดฑเต เดเดดเตเดคเตเด เดเดจเตเดจเดคเดฟเดจเตผเดคเตเดฅเด เดเดตเดพเดธเดตเตเดฏเดตเดธเตเดฅเดฏเตเดฎเดพเดฏเดฟ เดเดฐเต เดญเดพเดท เดธเดเดธเดพเดฐเดฟเดเตเดเตเด เดเดจเตเดจเดพเดฃเต.
- Go เดเดชเตเดฒเดฟเดเตเดเตเดทเดจเตเดเดณเตเดเต เดเดฏเตผเดจเตเดจ เดชเตเดฐเดเดเดจเดตเตเด เดฌเตเดเตโเดธเดฟเดจเต เดชเตเดฑเดคเตเดคเต เดธเดฎเดตเดพเดฏเดคเตเดคเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดฒเดณเดฟเดคเดฎเดพเดฏ เดเดชเดเดฐเดฃเดเตเดเดณเตเด.
NB: เดตเดดเดฟเดฏเดฟเตฝ, Go- เตฝ เดจเดฟเดเตเดเดณเตเดเต เดธเตเดตเดจเตเดคเด เดชเตเดฐเดธเตเดคเดพเดตเดจ เดเดเตเดเดจเต เดเดดเตเดคเดพเด, เดเดเตเดเตพ
เดเดจเตเดจเดพเตฝ เดธเดฎเดฏเดเตเดเตเดฑเดตเต เดฒเดณเดฟเดคเดฎเดพเดฏเดฟ เดชเดฑเดเตเดเดพเตฝ เดชเตเดฐเตเดฐเดฃเดฏเต เดเดพเดฐเดฃเด Go เดชเด เดฟเดเตเดเตเดจเตเดจเดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดจเดฟเดเตเดเดณเต เดคเดเดฏเตเดจเตเดจเตเดเตเดเดฟเดฒเต? เดฎเดฟเดเตเดเดตเดพเดฑเตเด เดเดฒเตเดฒเดพ DevOps เดเดเตเดเดฟเดจเตเดฏเตผเดเตเดเตเด เด
เดฑเดฟเดฏเดพเดตเตเดจเตเดจ เดเดฑเตเดฑเดตเตเด เดเดจเดชเตเดฐเดฟเดฏเดฎเดพเดฏ เดญเดพเดทเดเดณเดฟเดฒเตเดจเตเดจเต เดเดชเดฏเตเดเดฟเดเตเดเต เดจเดฟเดเตเดเตพเดเตเดเต เดเดเตเดเดจเต เดเดฐเต เดจเดฒเตเดฒ เดชเตเดฐเดธเตเดคเดพเดตเดจ เดเดดเตเดคเดพเด เดเดจเตเดจเดคเดฟเดจเตเดฑเต เดเดฐเต เดเดฆเดพเดนเดฐเดฃเด เดฒเตเดเดจเด เดจเตฝเดเตเดจเตเดจเต - เดชเตเดคเตเดคเตบ.
เดฎเตเดฑเตเดฑเต: เดเตเดชเตเดชเดฟเดฏเตผ - เดเตเดชเตเดชเดฟ เดเดชเตเดชเดฑเตเดฑเตเดฑเตผ!
เดเดฐเต เดเดฆเดพเดนเดฐเดฃเดฎเดพเดฏเดฟ, เดเดฐเต เดชเตเดคเดฟเดฏ เดจเตเดฏเดฟเดเดธเตโเดชเตเดฏเตโเดธเต เดฆเตเดถเตเดฏเดฎเดพเดเตเดฎเตเดชเตเดดเต เด เดฒเตเดฒเตเดเตเดเดฟเตฝ เดฐเดฃเตเดเต เดเดจเตเดฑเดฟเดฑเตเดฑเดฟเดเดณเดฟเตฝ เดเดจเตเดจเต เดฎเดพเดฑเตเดฎเตเดชเตเดดเต เดเตเตบเดซเดฟเดเตเดฎเดพเดชเตเดชเต เดชเดเตผเดคเตเดคเดพเตป เดฐเตเดชเดเตฝเดชเตเดชเดจ เดเตเดฏเตโเดค เดฒเดณเดฟเดคเดฎเดพเดฏ เดเดฐเต เดชเตเดฐเดธเตเดคเดพเดตเดจ เดตเดฟเดเดธเดฟเดชเตเดชเดฟเดเตเดเตเดจเตเดจเดคเต เดชเดฐเดฟเดเดฃเดฟเดเตเดเตเด: เดเตเตบเดซเดฟเดเตเดฎเดพเดชเตเดชเตเด เดฐเดนเดธเตเดฏเดตเตเด. เดเดฐเต เดชเตเดฐเดพเดฏเตเดเดฟเด เดเดพเดดเตเดเดชเตเดชเดพเดเดฟเตฝ, เดเดชเตเดฒเดฟเดเตเดเตเดทเตป เดเตเตบเดซเดฟเดเดฑเตเดทเดจเตเดเดณเตเดเต เดฌเตพเดเตเดเต เด เดชเตเดกเตเดฑเตเดฑเต เดเตเดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต (เดเตเตบเดซเดฟเดเตเดฎเดพเดชเตเดชเต เด เดชเตเดกเตเดฑเตเดฑเต เดเตเดฏเตเดฏเตเดจเตเดจเดคเดฟเดฒเตเดเต) เด เดฒเตเดฒเตเดเตเดเดฟเตฝ เดฐเดนเดธเตเดฏ เดกเดพเดฑเตเดฑ เด เดชเตเดกเตเดฑเตเดฑเต เดเตเดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต เดเดชเตเดชเดฑเตเดฑเตเดฑเตผเดเตเดเต เดเดชเดฏเตเดเดชเตเดฐเดฆเดฎเดพเดเตเด - เดเดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดกเตเดเตเดเตผ เดฐเดเดฟเดธเตเดเตเดฐเดฟเดฏเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดเตเดเตพ (เดจเตเดฏเดฟเดเดธเตเดชเตเดธเดฟเตฝ เดฐเดนเดธเตเดฏเด เดเตเตผเดเตเดเตเดฎเตเดชเตเตพ).
เด เดเตเดเดจเตเดฏเดพเดฃเตเดเตเดเดฟเตฝ, เดเดฐเต เดจเดฒเตเดฒ เดเดชเตเดชเดฑเตเดฑเตเดฑเตผเดเตเดเต เดเดจเตเดคเต เดตเตเดฃเด:
- เดเดชเตเดชเดฑเตเดฑเตเดฑเดฑเตเดฎเดพเดฏเตเดณเตเดณ เดเดเดชเตเดเตฝ เดเดชเดฏเตเดเดฟเดเตเดเดพเดฃเต เดจเดเดคเตเดคเตเดจเตเดจเดคเต
เดเดธเตเดฑเตเดฑเด เดฑเดฟเดธเตเดดเตเดธเต เดจเดฟเตผเดตเดเดจเดเตเดเตพ (เดเดจเดฟ 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
เดชเตเดฒเตเดณเตเดณ เดฒเตเดฌเดฒเตเดเตพ เดเดณเตเดณ เดเดฒเตเดฒเดพ เดเตเตบเดซเดฟเดเตเดฎเดพเดชเตเดชเตเด 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, Secret เดเดจเตเดจเดฟเดตเดฏเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดฐเตเดคเดฟเดเตพ เดเดเตเดเดจเต เดตเตเตผเดคเดฟเดฐเดฟเดเตเดเดพเด เดเดจเตเดจเต เดฎเดจเดธเดฟเดฒเดพเดเตเดเดพเตป, เดเดเตเดเตพ เดชเตเดฐเดคเตเดฏเตเด เดฎเดพเดชเตเดชเตเดเตพ เดเดชเดฏเตเดเดฟเดเตเดเตเด. เดเดฌเตเดเดเตเดฑเตเดฑเต เดเตเดฐเดพเดเตเดเต เดเตเดฏเตเดฏเดพเดจเตเด เดธเตเดทเตเดเดฟเดเตเดเดพเดจเตเด เดจเดฎเตเดเตเดเต เดเดจเตเดคเต เดฐเตเดคเดฟเดเดณเดพเดฃเต เดเดตเดถเตเดฏเดฎเตเดจเตเดจเต เด เดชเตเดชเตเตพ เดจเดฎเตเดเตเดเต เดฎเดจเดธเตเดธเดฟเดฒเดพเดเตเดเดพเด:
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)
เดชเตเดฐเดงเดพเดจ เดฏเตเดเตเดคเดฟ เดคเดฏเตเดฏเดพเดฑเดพเดฃเต! เดเดชเตเดชเตเตพ เดจเดฎเตเดฎเตพ เดเดคเตเดฒเตเดฒเดพเด เดเดฐเต เดชเตเดคเตเดคเตบ เดชเดพเดเตเดเตเดเดฟเดฒเตเดเตเดเต เดชเดพเดเตเดเตเดเต เดเตเดฏเตเดฏเดฃเด. เดเดเตเดเตพ เดซเดฏเตฝ เดคเดฏเตเดฏเดพเดฑเดพเดเตเดเตเดจเตเดจเต 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: เดชเตเดคเตเดคเดฃเดฟเดจเตเดณเตเดณ kubernetes เดเตเดฒเดฏเดจเตเดฑเดฟเดจเต เด
เดคเดฟเดจเตเดฑเตเดคเดพเดฏ เดชเดคเดฟเดชเตเดชเต เดเดฃเตเดเต. เดเตเดฒเดฏเดจเตเดฑเต เดชเดคเดฟเดชเตเดชเตเดเดณเตเด เดเตเดฌเตเตผเดจเตเดฑเตเดฑเดธเต เดชเดคเดฟเดชเตเดชเตเดเดณเตเด เดคเดฎเตเดฎเดฟเดฒเตเดณเตเดณ เด
เดจเตเดฏเตเดเตเดฏเดคเดฏเตเดเตเดเตเดฑเดฟเดเตเดเตเดณเตเดณ เดเตเดเตเดคเตฝ เดตเดฟเดตเดฐเดเตเดเตพ เดเดฃเตเดเตเดคเตเดคเดพเดจเดพเดเตเด
เดเดชเตเดชเตเตพ เดเดเตเดเดณเตเดเต เดชเตเดฐเตเดเดเตเดฑเตเดฑเต เดเดคเตเดชเตเดฒเต เดเดพเดฃเดชเตเดชเตเดเตเดจเตเดจเต:
copyrator
โโโ copyrator
โ โโโ cli.py # ะะพะณะธะบะฐ ัะฐะฑะพัั ั ะบะพะผะฐะฝะดะฝะพะน ัััะพะบะพะน
โ โโโ constant.py # ะะพะฝััะฐะฝัั, ะบะพัะพััะต ะผั ะฟัะธะฒะพะดะธะปะธ ะฒััะต
โ โโโ load_crd.py # ะะพะณะธะบะฐ ะทะฐะณััะทะบะธ CRD
โ โโโ operator.py # ะัะฝะพะฒะฝะฐั ะปะพะณะธะบะฐ ัะฐะฑะพัั ะพะฟะตัะฐัะพัะฐ
โโโ setup.py # ะัะพัะผะปะตะฝะธะต ะฟะฐะบะตัะฐ
เดกเตเดเตเดเดฑเตเด เดนเตเตฝเดฎเตเด
Dockerfile เด เดตเดฟเดถเตเดตเดธเดจเตเดฏเดฎเดพเดเดตเดฟเดงเด เดฒเดณเดฟเดคเดฎเดพเดฏเดฟเดฐเดฟเดเตเดเตเด: เด เดเดฟเดธเตเดฅเดพเดจ เดชเตเดคเตเดคเตบ-เดเตฝเดชเตเตป เดเดฎเตเดเต เดเดเตเดคเตเดคเต เดเดเตเดเดณเตเดเต เดชเดพเดเตเดเตเดเต เดเตปเดธเตเดฑเตเดฑเดพเตพ เดเตเดฏเตเดฏเตเด. เดจเดฒเตเดฒ เดธเดฎเดฏเด เดตเดฐเต เด เดคเดฟเดจเตเดฑเต เดเดชเตเดฑเตเดฑเดฟเดฎเตเดธเตเดทเตป เดฎเดพเดฑเตเดฑเดฟเดตเดฏเตเดเตเดเดพเด:
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 }}
เดซเดฒเด
เด เดเตเดเดจเตเดฏเดพเดฃเต, เดญเดฏเดชเตเดชเตเดเดพเดคเต, เดจเดฟเดจเตเดฆเดฟเดเตเดเดพเดคเต, เดเต เดชเด เดฟเดเตเดเดพเดคเต, เดชเตเดคเตเดคเดฃเดฟเตฝ เดเตเดฌเตผเดจเตเดฑเตเดฑเดธเดฟเดจเดพเดฏเดฟ เดเดเตเดเดณเตเดเต เดธเตเดตเดจเตเดคเด เดเดชเตเดชเดฑเตเดฑเตเดฑเดฑเต เดจเดฟเตผเดฎเตเดฎเดฟเดเตเดเดพเตป เดเดเตเดเตพเดเตเดเต เดเดดเดฟเดเตเดเต. เดคเตเตผเดเตเดเดฏเดพเดฏเตเด, เดเดคเดฟเดจเต เดเดจเดฟเดฏเตเด เดตเดณเดฐเดพเตป เดเดเดฎเตเดฃเตเดเต: เดญเดพเดตเดฟเดฏเดฟเตฝ เดเดคเดฟเดจเต เดเดจเตเดจเดฟเดฒเดงเดฟเดเด เดจเดฟเดฏเดฎเดเตเดเตพ เดชเตเดฐเตเดธเดธเตเดธเต เดเตเดฏเตเดฏเดพเดจเตเด เดเดจเตเดจเดฟเดฒเดงเดฟเดเด เดคเตเดฐเตเดกเตเดเดณเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเดพเดจเตเด เด เดคเดฟเดจเตเดฑเต CRD-เดเดณเดฟเดฒเต เดฎเดพเดฑเตเดฑเดเตเดเตพ เดธเตเดตเดคเดจเตเดคเตเดฐเดฎเดพเดฏเดฟ เดจเดฟเดฐเตเดเตเดทเดฟเดเตเดเดพเดจเตเด เดเดดเดฟเดฏเตเด ...
เดจเดฟเดเตเดเตพเดเตเดเต เดเตเดกเต เด
เดเตเดคเตเดคเดฑเดฟเดฏเดพเตป, เดเดเตเดเตพ เด
เดคเต เดเตพเดชเตเดชเตเดเตเดคเตเดคเดฟเดฏเดฟเดเตเดเตเดฃเตเดเต
PS เดจเดฟเดเตเดเตพเดเตเดเต เดเตเดฌเตผเดจเตเดฑเตเดฑเดธเต เดเดตเดจเตเดฑเตเดเตพ เดเตเดเดพเดฐเตเดฏเด เดเตเดฏเตเดฏเดพเตป เดฎเดเดฟเดฏเดพเดฃเตเดเตเดเดฟเดฒเต เดฌเดพเดทเต เดเดชเดฏเตเดเดฟเดเตเดเดพเตป เดจเดฟเดเตเดเตพเดเตเดเต เดเตเดเตเดคเตฝ เดถเตเดฒเดฎเดพเดฃเตเดเตเดเดฟเตฝ, เดเดเตเดเดณเตเดเต เดธเดนเดชเตเดฐเดตเตผเดคเตเดคเดเตผ เดซเตเดฎเดฟเตฝ เดเดฐเต เดฑเตเดกเดฟเดฎเตเดฏเตเดกเต เดชเดฐเดฟเดนเดพเดฐเด เดคเดฏเตเดฏเดพเดฑเดพเดเตเดเดฟเดฏเดฟเดเตเดเตเดฃเตเดเต.
เดชเดฟเดชเดฟเดเดธเต
เดเดเตเดเดณเตเดเต เดฌเตเดฒเตเดเดฟเดฒเตเด เดตเดพเดฏเดฟเดเตเดเตเด:
- ยซ
เดเดฐเต เดเตเดฌเตผเดจเตเดฑเตเดฑเดธเต เดเตเดฒเดธเตเดฑเตเดฑเตผ เดคเดฏเตเดฏเดพเดฑเดพเดเตเดเตเดจเตเดจเดคเต เดเดณเตเดชเตเดชเดตเตเด เดธเตเดเดฐเตเดฏเดชเตเดฐเดฆเดตเตเดฎเดพเดฃเต? เดเดกเต-เดเดชเตเดชเดฑเตเดฑเตเดฑเตผ เดชเตเดฐเดเตเดฏเดพเดชเดฟเดเตเดเตเดจเตเดจเต "; - ยซ
เดทเตเตฝ-เดเดชเตเดชเดฑเตเดฑเตเดฑเตผ เด เดตเดคเดฐเดฟเดชเตเดชเดฟเดเตเดเตเดจเตเดจเต: เดเตเดฌเตผเดจเตเดฑเตเดฑเดธเดฟเดจเดพเดฏเดฟ เดเดชเตเดชเดฑเตเดฑเตเดฑเตผเดฎเดพเดฐเต เดธเตเดทเตเดเดฟเดเตเดเตเดจเตเดจเดคเต เดเดชเตเดชเตเตพ เดเดณเตเดชเตเดชเดฎเดพเดฏเดฟ "; - ยซ
เดเตเดฌเตผเดจเตเดฑเตเดฑเดธเต เดตเดฟเดเดธเดฟเดชเตเดชเดฟเดเตเดเตเดเดฏเตเด เดชเตเดฐเดเดฎเดพเดเตเดเตเดเดฏเตเด เดเตเดฏเตเดฏเตเด (เด เดตเดฒเตเดเดจเดตเตเด เดตเตเดกเดฟเดฏเต เดฑเดฟเดชเตเดชเตเตผเดเตเดเตเด) "; - ยซ
เดเตเดฒเดพเดเตเดเดฟเดฒเต เดเตเดฌเตเตผเดจเตเดฑเตเดฑเดธเดฟเดจเดพเดฏเดฟ เดเดฐเต เดเดชเตเดชเดฑเตเดฑเตเดฑเตผ เดเดดเตเดคเตเดจเตเดจเต "; - ยซ
เดเตเดฌเตเตผเดจเตเดฑเตเดฑเดธเดฟเดจเดพเดฏเตเดณเตเดณ เดเดชเตเดชเดฑเตเดฑเตเดฑเตผเดฎเดพเตผ: เดธเตเดฑเตเดฑเตเดฑเตเดฑเตเดซเตเตพ เดเดชเตเดฒเดฟเดเตเดเตเดทเดจเตเดเตพ เดเดเตเดเดจเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเดเตเดเดพเด ".
เด เดตเดฒเดเดฌเด: www.habr.com