Go เชนเชพเชฒเชฎเชพเช เชชเซเชฐเซเชเซเชฐเชพเชฎเชฟเชเช เชญเชพเชทเชพเช เชชเชฐ เชเชเชพเชงเชฟเชเชพเชฐ เชงเชฐเชพเชตเซ เชเซ เชเซ เชฒเซเชเซ เชเซเชฌเชฐเชจเซเชเซเชธ เชฎเชพเชเซ เชจเชฟเชตเซเชฆเชจเซ เชฒเชเชตเชพเชจเซเช เชชเชธเชเชฆ เชเชฐเซ เชเซ. เชเชจเชพ เชฎเชพเชเซ เชเชฆเซเชฆเซเชถเซเชฏ เชเชพเชฐเชฃเซ เชเซ, เชเซเชฎ เชเซ:
- Go เชฎเชพเช เชเชชเชฐเซเชเชฐเซ เชตเชฟเชเชธเชพเชตเชตเชพ เชฎเชพเชเซ เชเช เชถเชเซเชคเชฟเชถเชพเชณเซ เชฎเชพเชณเชเซเช เชเซ -
เชเชชเชฐเซเชเชฐ SDK . - Docker เช เชจเซ Kubernetes เชเซเชตเซ เชฐเชฎเชค-เชฌเชฆเชฒเชคเซ เชเชชเซเชฒเชฟเชเซเชถเชจเซ Go เชฎเชพเช เชฒเชเซเชฒเซ เชเซ. Go เชฎเชพเช เชคเชฎเชพเชฐเชพ เชเชชเชฐเซเชเชฐเชจเซ เชฒเชเชตเชพเชจเซ เช เชฐเซเชฅ เช เชเซ เชเซ เชเชเซเชธเชฟเชธเซเชเชฎ เชธเชพเชฅเซ เชธเชฎเชพเชจ เชญเชพเชทเชพ เชฌเซเชฒเชตเซ.
- เชเซ เชเชชเซเชฒเซเชเซเชถเชจเชจเซเช เชเชเซเช เชชเซเชฐเชฆเชฐเซเชถเชจ เช เชจเซ เชฌเซเชเซเชธเชจเซ เชฌเชนเชพเชฐ เชธเชเชฎเชคเชฟ เชธเชพเชฅเซ เชเชพเชฎ เชเชฐเชตเชพ เชฎเชพเชเซเชจเชพ เชธเชฐเชณ เชธเชพเชงเชจเซ.
NB: เชฌเชพเชฏ เชง เชตเซ, เชเซเชฎเชพเช เชคเชฎเชพเชฐเซเช เชชเซเชคเชพเชจเซเช เชธเซเชเซเชเชฎเซเชจเซเช เชเซเชตเซ เชฐเซเชคเซ เชฒเชเชตเซเช, เช
เชฎเซ
เชชเชฐเชเชคเซ เชเซ เชคเชฎเชจเซ เชธเชฎเชฏเชจเชพ เช
เชญเชพเชตเซ เช
เชฅเชตเชพ, เชธเชฐเชณ เชถเชฌเซเชฆเซเชฎเชพเช เชเชนเซเช เชคเซ, เชชเซเชฐเซเชฐเชฃเชพเชฅเซ เชเซ เชถเซเชเชตเชพเชฅเซ เช
เชเชเชพเชตเชตเชพเชฎเชพเช เชเชตเซ เชคเซ เชถเซเช? เช เชฒเซเช เชเช เชเชฆเชพเชนเชฐเชฃ เชชเซเชฐเซเช เชชเชพเชกเซ เชเซ เชเซ เชคเชฎเซ เชเซเชตเซ เชฐเซเชคเซ เชเช เชธเซเชฅเซ เชฒเซเชเชชเซเชฐเชฟเชฏ เชญเชพเชทเชพเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชธเชพเชฐเซเช เชจเชฟเชตเซเชฆเชจ เชฒเชเซ เชถเชเซ เชเซ เชเซ เชฒเชเชญเช เชฆเชฐเซเช DevOps เชเชจเซเชเชฟเชจเชฟเชฏเชฐ เชเชพเชฃเซ เชเซ - เชชเชพเชฏเชฅเซเชจ.
เชฎเชณเซ: เชเซเชชเชฟเชฏเชฐ - เชเซเชชเชฟ เชเชชเชฐเซเชเชฐ!
เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, เชเซเชฏเชพเชฐเซ เชจเชตเซเช เชจเซเชฎเชธเซเชชเซเชธ เชฆเซเชเชพเชฏ เช เชฅเชตเชพ เชเซเชฏเชพเชฐเซ เชฌเซ เชเชจเซเชเชฟเชเซเชฎเชพเช เชซเซเชฐเชซเชพเชฐ เชฅเชพเชฏ เชคเซเชฏเชพเชฐเซ เชเซเชจเซเชซเชฟเชเชฎเซเชชเชจเซ เชจเชเชฒ เชเชฐเชตเชพ เชฎเชพเชเซ เชฐเชเชพเชฏเซเชฒ เชเช เชธเชฐเชณ เชจเชฟเชตเซเชฆเชจ เชตเชฟเชเชธเชพเชตเชตเชพเชจเซเช เชตเชฟเชเชพเชฐเซ: เชเซเชจเซเชซเชฟเชเชฎเซเชช เช เชจเซ เชธเชฟเชเซเชฐเซเช. เชตเซเชฏเชตเชนเชพเชฐเชฟเช เชฆเซเชทเซเชเชฟเชเซเชฃเชฅเซ, เชเชชเชฐเซเชเชฐ เชเชชเซเชฒเชฟเชเซเชถเชจ เชฐเซเชชเชฐเซเชเชพเชเชเชจเซเชจเชพ เชเชฅเซเชฅเชพเชฌเชเชง เช เชชเชกเซเช เชฎเชพเชเซ (เชเซเชจเซเชซเชฟเชเชฎเซเชช เช เชชเชกเซเช เชเชฐเซเชจเซ) เช เชฅเชตเชพ เชเซเชชเซเชค เชกเซเชเชพเชจเซ เช เชชเชกเซเช เชเชฐเชตเชพ เชฎเชพเชเซ เชเชชเชฏเซเชเซ เชฅเช เชถเชเซ เชเซ - เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, เชกเซเชเชฐ เชฐเชเชฟเชธเซเชเซเชฐเซ เชธเชพเชฅเซ เชเชพเชฎ เชเชฐเชตเชพ เชฎเชพเชเซเชจเซ เชเชพเชตเซเช (เชจเซเชฎเชธเซเชชเซเชธเชฎเชพเช เชธเชฟเชเซเชฐเซเช เชเชฎเซเชฐเชคเซ เชตเชเชคเซ).
เช เชจเซ เชคเซเชฅเซ, เชเช เชธเชพเชฐเชพ เชเชชเชฐเซเชเชฐ เชชเชพเชธเซ เชถเซเช เชนเซเชตเซเช เชเซเชเช:
- เชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชเชชเชฐเซเชเชฐ เชธเชพเชฅเซเชจเซ เชเซเชฐเชฟเชฏเชพเชชเซเชฐเชคเชฟเชเซเชฐเชฟเชฏเชพ เชนเชพเชฅ เชงเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ
เชเชธเซเชเชฎ เชธเชเชธเชพเชงเชจ เชตเซเชฏเชพเชเซเชฏเชพเช (เชคเซเชฏเชพเชฐเชฌเชพเชฆ CRD เชคเชฐเซเชเซ เชเชณเชเชตเชพเชฎเชพเช เชเชตเซ เชเซ). - เชเชชเชฐเซเชเชฐ เชฐเซเชชเชฐเซเชเชพเชเชเชฟเชค เชเชฐเซ เชถเชเชพเชฏ เชเซ. เช เชเชฐเชตเชพ เชฎเชพเชเซ, เช เชฎเซ เชเชฎเชพเชจเซเชก เชฒเชพเชเชจ เชซเซเชฒเซเชเซเชธ เช เชจเซ เชชเชฐเซเชฏเชพเชตเชฐเชฃ เชตเซเชฐเซเชเชฌเชฒเชจเซ เชเชชเชฏเซเช เชเชฐเซเชถเซเช.
- เชกเซเชเชฐ เชเชจเซเชเซเชจเชฐ เช เชจเซ เชนเซเชฒเซเชฎ เชเชพเชฐเซเชเชจเซเช เชฌเชฟเชฒเซเชก เชกเชฟเชเชพเชเชจ เชเชฐเชตเชพเชฎเชพเช เชเชตเซเชฏเซเช เชเซ เชเซเชฅเซ เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพเช เชธเชฐเชณเชคเชพเชฅเซ (เชถเชพเชฌเซเชฆเชฟเช เชฐเซเชคเซ เชเช เชเชฆเซเชถ เชธเชพเชฅเซ) เชเชชเชฐเซเชเชฐเชจเซ เชคเซเชฎเชจเชพ เชเซเชฌเชฐเชจเซเชเซเชธ เชเซเชฒเชธเซเชเชฐเชฎเชพเช เชเชจเซเชธเซเชเซเชฒ เชเชฐเซ เชถเชเซ.
เชธเซเชเชฐเชกเซ
เชเชชเชฐเซเชเชฐเชจเซ เชเชพเชฃเชตเชพ เชฎเชพเชเซ เชเซ เชเชฏเชพ เชธเชเชธเชพเชงเชจเซเชจเซ เชถเซเชง เชเชฐเชตเซ เช เชจเซ เชเซเชฏเชพเช เชเซเชตเซเช, เชเชชเชฃเซ เชคเซเชจเชพ เชฎเชพเชเซ เชเช เชจเชฟเชฏเชฎ เชธเซเช เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ. เชฆเชฐเซเช เชจเชฟเชฏเชฎเชจเซ เชเช เช CRD เชเชฌเซเชเซเชเซเช เชคเชฐเซเชเซ เชฐเชเซ เชเชฐเชตเชพเชฎเชพเช เชเชตเชถเซ. เช เชธเซเชเชฐเชกเซเชฎเชพเช เชเชฏเชพ เชเซเชทเซเชคเซเชฐเซ เชนเซเชตเชพ เชเซเชเช?
- เชธเชเชธเชพเชงเชจ เชชเซเชฐเชเชพเชฐ, เชเซ เชเชชเชฃเซ เชถเซเชงเซเชถเซเช (เชเซเชจเซเชซเชฟเชเชฎเซเชช เช เชฅเชตเชพ เชธเชฟเชเซเชฐเซเช).
- เชจเซเชฎเชธเซเชชเซเชธเชจเซ เชฏเชพเชฆเซ, เชเซเชฎเชพเช เชธเชเชธเชพเชงเชจเซ เชธเซเชฅเชฟเชค เชนเซเชตเชพ เชเซเชเช.
- เชชเชธเชเชฆเชเซเชเชพเชฐ, เชเซเชจเชพ เชฆเซเชตเชพเชฐเชพ เชเชชเชฃเซ เชจเซเชฎเชธเซเชชเซเชธเชฎเชพเช เชธเชเชธเชพเชงเชจเซ เชถเซเชงเซเชถเซเช.
เชเชพเชฒเซ 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: Python เชฎเชพเชเซ kubernetes เชเซเชฒเชพเชฏเชเชเชจเซเช เชชเซเชคเชพเชจเซเช เชตเชฐเซเชเชจ เชเซ. เชเซเชฒเชพเชฏเชเช เชตเชฐเซเชเชจ เช
เชจเซ เชเซเชฌเชฐเชจเซเชเซเชธ เชตเชฐเซเชเชจ เชตเชเซเชเซ เชธเซเชธเชเชเชคเชคเชพ เชตเชฟเชถเซ เชตเชงเซ เชฎเชพเชนเชฟเชคเซ เชเชฎเชพเช เชฎเชณเซ เชถเชเซ เชเซ
เชนเชตเซ เช เชฎเชพเชฐเซ เชชเซเชฐเซเชเซเชเซเช เชเชจเชพ เชเซเชตเซ เชฆเซเชเชพเชฏ เชเซ:
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 เช
เชจเซ เชเซ เชคเชฎเซ เชเซเชฌเชฐเชจเซเชเซเชธ เชเชตเซเชจเซเชเซเชธ เชธเชพเชฅเซ เชตเซเชฏเชตเชนเชพเชฐ เชเชฐเชตเชพเชฎเชพเช เชเซเชฌ เชเชณเชธเซ เชเซ เช
เชฅเชตเชพ เชคเชฎเซ เชฌเซ
เชถเชจเซ เชเชชเชฏเซเช เชเชฐเชตเชพ เชฎเชพเชเซ เชตเชงเซ เชเซเชตเชพเชฏเซเชฒเชพ เชเซ, เชคเซ เช
เชฎเชพเชฐเชพ เชธเชพเชฅเซเชฆเชพเชฐเซเช เชซเซเชฐเซเชฎเชฎเชพเช เชคเซเชฏเชพเชฐ เชเชเซเชฒ เชคเซเชฏเชพเชฐ เชเชฐเซเชฏเซ เชเซ.
เชชเซ.เชชเซ.เชเชธ.
เช เชฎเชพเชฐเชพ เชฌเซเชฒเซเช เชชเชฐ เชชเชฃ เชตเชพเชเชเซ:
- ยซ
เชถเซเช เชเซเชฌเชฐเชจเซเชเซเชธ เชเซเชฒเชธเซเชเชฐ เชคเซเชฏเชพเชฐ เชเชฐเชตเซเช เชธเชฐเชณ เช เชจเซ เช เชจเซเชเซเชณ เชเซ? เชเชกเชเชจ-เชเชชเชฐเซเชเชฐเชจเซ เชเชพเชนเซเชฐเชพเชค ยป; - ยซ
เชถเซเชฒ-เชเชชเชฐเซเชเชฐเชจเซ เชชเชฐเชฟเชเชฏ: เชเซเชฌเชฐเชจเซเชเซเชธ เชฎเชพเชเซ เชเชชเชฐเซเชเชฐ เชฌเชจเชพเชตเชตเชพเชจเซเช เชธเชฐเชณ เชฌเชจเซเชฏเซเช เชเซ ยป; - ยซ
เชเซเชฌเชฐเชจเซเชเซเชธเชจเซเช เชตเชฟเชธเซเชคเชฐเชฃ เช เชจเซ เชชเซเชฐเช (เชตเชฟเชนเชเชเชพเชตเชฒเซเชเชจ เช เชจเซ เชตเชฟเชกเชฟเชฏเซ เชฐเชฟเชชเซเชฐเซเช) ยป; - ยซ
เชเซเชฒเชพเชเชเชฎเชพเช เชเซเชฌเชฐเชจเซเชเซเชธ เชฎเชพเชเซ เชเชชเชฐเซเชเชฐ เชฒเชเชตเซเช ยป; - ยซ
เชเซเชฌเชฐเชจเซเชเซเชธ เชฎเชพเชเซ เชเชชเชฐเซเชเชฐเซเชธ: เชธเซเชเซเชเชซเซเชฒ เชเชชเซเชฒเชฟเชเซเชถเชจ เชเซเชตเซ เชฐเซเชคเซ เชเชฒเชพเชตเชตเซ ยป.
เชธเซเชฐเซเชธ: www.habr.com