@intentius/chant-lexicon-k8s 0.0.22 → 0.0.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/integrity.json +9 -4
- package/dist/manifest.json +1 -1
- package/dist/skills/chant-k8s-aks.md +146 -0
- package/{src/skills/kubernetes-patterns.md → dist/skills/chant-k8s-deployment-strategies.md} +1 -1
- package/dist/skills/chant-k8s-eks.md +156 -0
- package/dist/skills/chant-k8s-gke.md +246 -0
- package/{src/skills/kubernetes-security.md → dist/skills/chant-k8s-security.md} +1 -1
- package/dist/skills/chant-k8s.md +65 -2
- package/package.json +1 -1
- package/src/composites/adot-collector.ts +34 -22
- package/src/composites/agic-ingress.ts +14 -6
- package/src/composites/aks-external-dns-agent.ts +29 -18
- package/src/composites/alb-ingress.ts +14 -6
- package/src/composites/autoscaled-service.ts +25 -20
- package/src/composites/azure-disk-storage-class.ts +14 -6
- package/src/composites/azure-file-storage-class.ts +14 -6
- package/src/composites/azure-monitor-collector.ts +34 -22
- package/src/composites/batch-job.ts +25 -17
- package/src/composites/cockroachdb-cluster.ts +148 -58
- package/src/composites/composites.test.ts +369 -363
- package/src/composites/config-connector-context.ts +15 -8
- package/src/composites/configured-app.ts +21 -15
- package/src/composites/cron-workload.ts +25 -20
- package/src/composites/ebs-storage-class.ts +14 -6
- package/src/composites/efs-storage-class.ts +14 -6
- package/src/composites/external-dns-agent.ts +26 -20
- package/src/composites/filestore-storage-class.ts +14 -6
- package/src/composites/fluent-bit-agent.ts +30 -24
- package/src/composites/gce-ingress.ts +14 -6
- package/src/composites/gce-pd-storage-class.ts +14 -6
- package/src/composites/gke-external-dns-agent.ts +34 -21
- package/src/composites/gke-fluent-bit-agent.ts +34 -22
- package/src/composites/gke-gateway.ts +19 -12
- package/src/composites/gke-otel-collector.ts +34 -22
- package/src/composites/irsa-service-account.ts +22 -14
- package/src/composites/metrics-server.ts +41 -26
- package/src/composites/monitored-service.ts +26 -19
- package/src/composites/namespace-env.ts +26 -17
- package/src/composites/network-isolated-app.ts +21 -16
- package/src/composites/node-agent.ts +33 -22
- package/src/composites/secure-ingress.ts +19 -11
- package/src/composites/sidecar-app.ts +17 -12
- package/src/composites/stateful-app.ts +21 -12
- package/src/composites/web-app.ts +25 -21
- package/src/composites/worker-pool.ts +40 -26
- package/src/composites/workload-identity-sa.ts +22 -14
- package/src/composites/workload-identity-service-account.ts +22 -16
- package/src/plugin.ts +40 -614
- package/src/serializer.ts +3 -0
- package/src/skills/chant-k8s-deployment-strategies.md +183 -0
- package/src/skills/chant-k8s-gke.md +55 -0
- package/src/skills/chant-k8s-patterns.md +245 -0
- package/src/skills/chant-k8s-security.md +237 -0
- package/src/skills/chant-k8s.md +305 -0
|
@@ -5,6 +5,9 @@
|
|
|
5
5
|
* Config Connector to manage GCP resources in a specific namespace.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
+
import { Composite, mergeDefaults } from "@intentius/chant";
|
|
9
|
+
import { Deployment } from "../generated";
|
|
10
|
+
|
|
8
11
|
export interface ConfigConnectorContextProps {
|
|
9
12
|
/** Context name (default: "configconnectorcontext.core.cnrm.cloud.google.com"). */
|
|
10
13
|
name?: string;
|
|
@@ -14,10 +17,14 @@ export interface ConfigConnectorContextProps {
|
|
|
14
17
|
namespace?: string;
|
|
15
18
|
/** Whether to sync status into spec (default: "absent"). */
|
|
16
19
|
stateIntoSpec?: "absent" | "merge";
|
|
20
|
+
/** Per-member defaults for fine-grained overrides. */
|
|
21
|
+
defaults?: {
|
|
22
|
+
context?: Partial<Record<string, unknown>>;
|
|
23
|
+
};
|
|
17
24
|
}
|
|
18
25
|
|
|
19
26
|
export interface ConfigConnectorContextResult {
|
|
20
|
-
context:
|
|
27
|
+
context: InstanceType<typeof Deployment>; // CRD — use Deployment as proxy Declarable
|
|
21
28
|
}
|
|
22
29
|
|
|
23
30
|
/**
|
|
@@ -35,17 +42,17 @@ export interface ConfigConnectorContextResult {
|
|
|
35
42
|
* });
|
|
36
43
|
* ```
|
|
37
44
|
*/
|
|
38
|
-
export
|
|
39
|
-
props: ConfigConnectorContextProps,
|
|
40
|
-
): ConfigConnectorContextResult {
|
|
45
|
+
export const ConfigConnectorContext = Composite<ConfigConnectorContextProps>((props) => {
|
|
41
46
|
const {
|
|
42
47
|
name = "configconnectorcontext.core.cnrm.cloud.google.com",
|
|
43
48
|
googleServiceAccountEmail,
|
|
44
49
|
namespace = "default",
|
|
45
50
|
stateIntoSpec = "absent",
|
|
51
|
+
defaults: defs,
|
|
46
52
|
} = props;
|
|
47
53
|
|
|
48
|
-
|
|
54
|
+
// ConfigConnectorContext is a CRD — use Deployment constructor as a generic Declarable wrapper
|
|
55
|
+
const context = new Deployment(mergeDefaults({
|
|
49
56
|
apiVersion: "core.cnrm.cloud.google.com/v1beta1",
|
|
50
57
|
kind: "ConfigConnectorContext",
|
|
51
58
|
metadata: {
|
|
@@ -56,7 +63,7 @@ export function ConfigConnectorContext(
|
|
|
56
63
|
googleServiceAccount: googleServiceAccountEmail,
|
|
57
64
|
stateIntoSpec,
|
|
58
65
|
},
|
|
59
|
-
};
|
|
66
|
+
}, defs?.context));
|
|
60
67
|
|
|
61
|
-
return { context
|
|
62
|
-
}
|
|
68
|
+
return { context };
|
|
69
|
+
}, "ConfigConnectorContext");
|
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
* Volume.fromSecret(), and container.mount() patterns.
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
+
import { Composite, mergeDefaults } from "@intentius/chant";
|
|
10
|
+
import { Deployment, Service, ConfigMap } from "../generated";
|
|
9
11
|
import type { ContainerSecurityContext } from "./security-context";
|
|
10
12
|
|
|
11
13
|
export interface ConfiguredAppProps {
|
|
@@ -53,12 +55,18 @@ export interface ConfiguredAppProps {
|
|
|
53
55
|
env?: Array<{ name: string; value: string }>;
|
|
54
56
|
/** Container security context (supports PSS restricted fields). */
|
|
55
57
|
securityContext?: ContainerSecurityContext;
|
|
58
|
+
/** Per-member defaults for fine-grained overrides. */
|
|
59
|
+
defaults?: {
|
|
60
|
+
deployment?: Partial<Record<string, unknown>>;
|
|
61
|
+
service?: Partial<Record<string, unknown>>;
|
|
62
|
+
configMap?: Partial<Record<string, unknown>>;
|
|
63
|
+
};
|
|
56
64
|
}
|
|
57
65
|
|
|
58
66
|
export interface ConfiguredAppResult {
|
|
59
|
-
deployment:
|
|
60
|
-
service:
|
|
61
|
-
configMap?:
|
|
67
|
+
deployment: InstanceType<typeof Deployment>;
|
|
68
|
+
service: InstanceType<typeof Service>;
|
|
69
|
+
configMap?: InstanceType<typeof ConfigMap>;
|
|
62
70
|
}
|
|
63
71
|
|
|
64
72
|
/**
|
|
@@ -81,7 +89,7 @@ export interface ConfiguredAppResult {
|
|
|
81
89
|
* });
|
|
82
90
|
* ```
|
|
83
91
|
*/
|
|
84
|
-
export
|
|
92
|
+
export const ConfiguredApp = Composite<ConfiguredAppProps>((props) => {
|
|
85
93
|
const {
|
|
86
94
|
name,
|
|
87
95
|
image,
|
|
@@ -101,6 +109,7 @@ export function ConfiguredApp(props: ConfiguredAppProps): ConfiguredAppResult {
|
|
|
101
109
|
namespace,
|
|
102
110
|
env,
|
|
103
111
|
securityContext,
|
|
112
|
+
defaults: defs,
|
|
104
113
|
} = props;
|
|
105
114
|
|
|
106
115
|
const configMapName = `${name}-config`;
|
|
@@ -175,7 +184,7 @@ export function ConfiguredApp(props: ConfiguredAppProps): ConfiguredAppResult {
|
|
|
175
184
|
}),
|
|
176
185
|
};
|
|
177
186
|
|
|
178
|
-
const
|
|
187
|
+
const deployment = new Deployment(mergeDefaults({
|
|
179
188
|
metadata: {
|
|
180
189
|
name,
|
|
181
190
|
...(namespace && { namespace }),
|
|
@@ -189,9 +198,9 @@ export function ConfiguredApp(props: ConfiguredAppProps): ConfiguredAppResult {
|
|
|
189
198
|
spec: podSpec,
|
|
190
199
|
},
|
|
191
200
|
},
|
|
192
|
-
};
|
|
201
|
+
}, defs?.deployment));
|
|
193
202
|
|
|
194
|
-
const
|
|
203
|
+
const service = new Service(mergeDefaults({
|
|
195
204
|
metadata: {
|
|
196
205
|
name,
|
|
197
206
|
...(namespace && { namespace }),
|
|
@@ -202,23 +211,20 @@ export function ConfiguredApp(props: ConfiguredAppProps): ConfiguredAppResult {
|
|
|
202
211
|
ports: [{ port: 80, targetPort: port, protocol: "TCP", name: "http" }],
|
|
203
212
|
type: "ClusterIP",
|
|
204
213
|
},
|
|
205
|
-
};
|
|
214
|
+
}, defs?.service));
|
|
206
215
|
|
|
207
|
-
const result:
|
|
208
|
-
deployment: deploymentProps,
|
|
209
|
-
service: serviceProps,
|
|
210
|
-
};
|
|
216
|
+
const result: Record<string, any> = { deployment, service };
|
|
211
217
|
|
|
212
218
|
if (configData) {
|
|
213
|
-
result.configMap = {
|
|
219
|
+
result.configMap = new ConfigMap(mergeDefaults({
|
|
214
220
|
metadata: {
|
|
215
221
|
name: configMapName,
|
|
216
222
|
...(namespace && { namespace }),
|
|
217
223
|
labels: { ...commonLabels, "app.kubernetes.io/component": "config" },
|
|
218
224
|
},
|
|
219
225
|
data: configData,
|
|
220
|
-
};
|
|
226
|
+
}, defs?.configMap));
|
|
221
227
|
}
|
|
222
228
|
|
|
223
229
|
return result;
|
|
224
|
-
}
|
|
230
|
+
}, "ConfiguredApp");
|
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
* proper RBAC permissions.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
+
import { Composite, mergeDefaults } from "@intentius/chant";
|
|
9
|
+
import { CronJob, ServiceAccount, Role, RoleBinding } from "../generated";
|
|
8
10
|
import type { ContainerSecurityContext } from "./security-context";
|
|
9
11
|
|
|
10
12
|
export interface CronWorkloadProps {
|
|
@@ -37,13 +39,20 @@ export interface CronWorkloadProps {
|
|
|
37
39
|
env?: Array<{ name: string; value: string }>;
|
|
38
40
|
/** Container security context (supports PSS restricted fields). */
|
|
39
41
|
securityContext?: ContainerSecurityContext;
|
|
42
|
+
/** Per-member defaults for fine-grained overrides. */
|
|
43
|
+
defaults?: {
|
|
44
|
+
cronJob?: Partial<Record<string, unknown>>;
|
|
45
|
+
serviceAccount?: Partial<Record<string, unknown>>;
|
|
46
|
+
role?: Partial<Record<string, unknown>>;
|
|
47
|
+
roleBinding?: Partial<Record<string, unknown>>;
|
|
48
|
+
};
|
|
40
49
|
}
|
|
41
50
|
|
|
42
51
|
export interface CronWorkloadResult {
|
|
43
|
-
cronJob:
|
|
44
|
-
serviceAccount:
|
|
45
|
-
role:
|
|
46
|
-
roleBinding:
|
|
52
|
+
cronJob: InstanceType<typeof CronJob>;
|
|
53
|
+
serviceAccount: InstanceType<typeof ServiceAccount>;
|
|
54
|
+
role: InstanceType<typeof Role>;
|
|
55
|
+
roleBinding: InstanceType<typeof RoleBinding>;
|
|
47
56
|
}
|
|
48
57
|
|
|
49
58
|
/**
|
|
@@ -65,7 +74,7 @@ export interface CronWorkloadResult {
|
|
|
65
74
|
* });
|
|
66
75
|
* ```
|
|
67
76
|
*/
|
|
68
|
-
export
|
|
77
|
+
export const CronWorkload = Composite<CronWorkloadProps>((props) => {
|
|
69
78
|
const {
|
|
70
79
|
name,
|
|
71
80
|
image,
|
|
@@ -80,6 +89,7 @@ export function CronWorkload(props: CronWorkloadProps): CronWorkloadResult {
|
|
|
80
89
|
namespace,
|
|
81
90
|
env,
|
|
82
91
|
securityContext,
|
|
92
|
+
defaults: defs,
|
|
83
93
|
} = props;
|
|
84
94
|
|
|
85
95
|
const saName = `${name}-sa`;
|
|
@@ -92,7 +102,7 @@ export function CronWorkload(props: CronWorkloadProps): CronWorkloadResult {
|
|
|
92
102
|
...extraLabels,
|
|
93
103
|
};
|
|
94
104
|
|
|
95
|
-
const
|
|
105
|
+
const cronJob = new CronJob(mergeDefaults({
|
|
96
106
|
metadata: {
|
|
97
107
|
name,
|
|
98
108
|
...(namespace && { namespace }),
|
|
@@ -123,17 +133,17 @@ export function CronWorkload(props: CronWorkloadProps): CronWorkloadResult {
|
|
|
123
133
|
},
|
|
124
134
|
},
|
|
125
135
|
},
|
|
126
|
-
};
|
|
136
|
+
}, defs?.cronJob));
|
|
127
137
|
|
|
128
|
-
const
|
|
138
|
+
const serviceAccount = new ServiceAccount(mergeDefaults({
|
|
129
139
|
metadata: {
|
|
130
140
|
name: saName,
|
|
131
141
|
...(namespace && { namespace }),
|
|
132
142
|
labels: { ...commonLabels, "app.kubernetes.io/component": "worker" },
|
|
133
143
|
},
|
|
134
|
-
};
|
|
144
|
+
}, defs?.serviceAccount));
|
|
135
145
|
|
|
136
|
-
const
|
|
146
|
+
const role = new Role(mergeDefaults({
|
|
137
147
|
metadata: {
|
|
138
148
|
name: roleName,
|
|
139
149
|
...(namespace && { namespace }),
|
|
@@ -142,9 +152,9 @@ export function CronWorkload(props: CronWorkloadProps): CronWorkloadResult {
|
|
|
142
152
|
rules: rbacRules.length > 0 ? rbacRules : [
|
|
143
153
|
{ apiGroups: [""], resources: ["pods"], verbs: ["get", "list"] },
|
|
144
154
|
],
|
|
145
|
-
};
|
|
155
|
+
}, defs?.role));
|
|
146
156
|
|
|
147
|
-
const
|
|
157
|
+
const roleBinding = new RoleBinding(mergeDefaults({
|
|
148
158
|
metadata: {
|
|
149
159
|
name: bindingName,
|
|
150
160
|
...(namespace && { namespace }),
|
|
@@ -162,12 +172,7 @@ export function CronWorkload(props: CronWorkloadProps): CronWorkloadResult {
|
|
|
162
172
|
...(namespace && { namespace }),
|
|
163
173
|
},
|
|
164
174
|
],
|
|
165
|
-
};
|
|
175
|
+
}, defs?.roleBinding));
|
|
166
176
|
|
|
167
|
-
return {
|
|
168
|
-
|
|
169
|
-
serviceAccount: serviceAccountProps,
|
|
170
|
-
role: roleProps,
|
|
171
|
-
roleBinding: roleBindingProps,
|
|
172
|
-
};
|
|
173
|
-
}
|
|
177
|
+
return { cronJob, serviceAccount, role, roleBinding };
|
|
178
|
+
}, "CronWorkload");
|
|
@@ -4,6 +4,9 @@
|
|
|
4
4
|
* @eks Creates a StorageClass with the `ebs.csi.aws.com` provisioner.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
+
import { Composite, mergeDefaults } from "@intentius/chant";
|
|
8
|
+
import { StorageClass } from "../generated";
|
|
9
|
+
|
|
7
10
|
export interface EbsStorageClassProps {
|
|
8
11
|
/** StorageClass name. */
|
|
9
12
|
name: string;
|
|
@@ -27,10 +30,14 @@ export interface EbsStorageClassProps {
|
|
|
27
30
|
allowVolumeExpansion?: boolean;
|
|
28
31
|
/** Additional labels. */
|
|
29
32
|
labels?: Record<string, string>;
|
|
33
|
+
/** Per-member defaults for fine-grained overrides. */
|
|
34
|
+
defaults?: {
|
|
35
|
+
storageClass?: Partial<Record<string, unknown>>;
|
|
36
|
+
};
|
|
30
37
|
}
|
|
31
38
|
|
|
32
39
|
export interface EbsStorageClassResult {
|
|
33
|
-
storageClass:
|
|
40
|
+
storageClass: InstanceType<typeof StorageClass>;
|
|
34
41
|
}
|
|
35
42
|
|
|
36
43
|
/**
|
|
@@ -49,7 +56,7 @@ export interface EbsStorageClassResult {
|
|
|
49
56
|
* });
|
|
50
57
|
* ```
|
|
51
58
|
*/
|
|
52
|
-
export
|
|
59
|
+
export const EbsStorageClass = Composite<EbsStorageClassProps>((props) => {
|
|
53
60
|
const {
|
|
54
61
|
name,
|
|
55
62
|
type = "gp3",
|
|
@@ -62,6 +69,7 @@ export function EbsStorageClass(props: EbsStorageClassProps): EbsStorageClassRes
|
|
|
62
69
|
volumeBindingMode = "WaitForFirstConsumer",
|
|
63
70
|
allowVolumeExpansion = true,
|
|
64
71
|
labels: extraLabels = {},
|
|
72
|
+
defaults: defs,
|
|
65
73
|
} = props;
|
|
66
74
|
|
|
67
75
|
const commonLabels: Record<string, string> = {
|
|
@@ -80,7 +88,7 @@ export function EbsStorageClass(props: EbsStorageClassProps): EbsStorageClassRes
|
|
|
80
88
|
if (throughput !== undefined) parameters.throughput = String(throughput);
|
|
81
89
|
if (kmsKeyId) parameters.kmsKeyId = kmsKeyId;
|
|
82
90
|
|
|
83
|
-
const
|
|
91
|
+
const storageClass = new StorageClass(mergeDefaults({
|
|
84
92
|
metadata: {
|
|
85
93
|
name,
|
|
86
94
|
labels: { ...commonLabels, "app.kubernetes.io/component": "storage" },
|
|
@@ -90,7 +98,7 @@ export function EbsStorageClass(props: EbsStorageClassProps): EbsStorageClassRes
|
|
|
90
98
|
reclaimPolicy,
|
|
91
99
|
volumeBindingMode,
|
|
92
100
|
allowVolumeExpansion,
|
|
93
|
-
};
|
|
101
|
+
}, defs?.storageClass));
|
|
94
102
|
|
|
95
|
-
return { storageClass
|
|
96
|
-
}
|
|
103
|
+
return { storageClass };
|
|
104
|
+
}, "EbsStorageClass");
|
|
@@ -5,6 +5,9 @@
|
|
|
5
5
|
* EFS provides ReadWriteMany access mode (shared across pods/nodes).
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
+
import { Composite, mergeDefaults } from "@intentius/chant";
|
|
9
|
+
import { StorageClass } from "../generated";
|
|
10
|
+
|
|
8
11
|
export interface EfsStorageClassProps {
|
|
9
12
|
/** StorageClass name. */
|
|
10
13
|
name: string;
|
|
@@ -20,10 +23,14 @@ export interface EfsStorageClassProps {
|
|
|
20
23
|
provisioningMode?: string;
|
|
21
24
|
/** Additional labels. */
|
|
22
25
|
labels?: Record<string, string>;
|
|
26
|
+
/** Per-member defaults for fine-grained overrides. */
|
|
27
|
+
defaults?: {
|
|
28
|
+
storageClass?: Partial<Record<string, unknown>>;
|
|
29
|
+
};
|
|
23
30
|
}
|
|
24
31
|
|
|
25
32
|
export interface EfsStorageClassResult {
|
|
26
|
-
storageClass:
|
|
33
|
+
storageClass: InstanceType<typeof StorageClass>;
|
|
27
34
|
}
|
|
28
35
|
|
|
29
36
|
/**
|
|
@@ -41,7 +48,7 @@ export interface EfsStorageClassResult {
|
|
|
41
48
|
* });
|
|
42
49
|
* ```
|
|
43
50
|
*/
|
|
44
|
-
export
|
|
51
|
+
export const EfsStorageClass = Composite<EfsStorageClassProps>((props) => {
|
|
45
52
|
const {
|
|
46
53
|
name,
|
|
47
54
|
fileSystemId,
|
|
@@ -50,6 +57,7 @@ export function EfsStorageClass(props: EfsStorageClassProps): EfsStorageClassRes
|
|
|
50
57
|
reclaimPolicy = "Delete",
|
|
51
58
|
provisioningMode = "efs-ap",
|
|
52
59
|
labels: extraLabels = {},
|
|
60
|
+
defaults: defs,
|
|
53
61
|
} = props;
|
|
54
62
|
|
|
55
63
|
const commonLabels: Record<string, string> = {
|
|
@@ -58,7 +66,7 @@ export function EfsStorageClass(props: EfsStorageClassProps): EfsStorageClassRes
|
|
|
58
66
|
...extraLabels,
|
|
59
67
|
};
|
|
60
68
|
|
|
61
|
-
const
|
|
69
|
+
const storageClass = new StorageClass(mergeDefaults({
|
|
62
70
|
metadata: {
|
|
63
71
|
name,
|
|
64
72
|
labels: { ...commonLabels, "app.kubernetes.io/component": "storage" },
|
|
@@ -71,7 +79,7 @@ export function EfsStorageClass(props: EfsStorageClassProps): EfsStorageClassRes
|
|
|
71
79
|
basePath,
|
|
72
80
|
},
|
|
73
81
|
reclaimPolicy,
|
|
74
|
-
};
|
|
82
|
+
}, defs?.storageClass));
|
|
75
83
|
|
|
76
|
-
return { storageClass
|
|
77
|
-
}
|
|
84
|
+
return { storageClass };
|
|
85
|
+
}, "EfsStorageClass");
|
|
@@ -5,6 +5,9 @@
|
|
|
5
5
|
* where Ingress/Service hostnames should automatically create DNS records.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
+
import { Composite, mergeDefaults } from "@intentius/chant";
|
|
9
|
+
import { Deployment, ServiceAccount, ClusterRole, ClusterRoleBinding } from "../generated";
|
|
10
|
+
|
|
8
11
|
export interface ExternalDnsAgentProps {
|
|
9
12
|
/** IAM Role ARN for IRSA (needs Route53 permissions). */
|
|
10
13
|
iamRoleArn: string;
|
|
@@ -24,13 +27,20 @@ export interface ExternalDnsAgentProps {
|
|
|
24
27
|
namespace?: string;
|
|
25
28
|
/** Additional labels. */
|
|
26
29
|
labels?: Record<string, string>;
|
|
30
|
+
/** Per-member defaults for fine-grained overrides. */
|
|
31
|
+
defaults?: {
|
|
32
|
+
deployment?: Partial<Record<string, unknown>>;
|
|
33
|
+
serviceAccount?: Partial<Record<string, unknown>>;
|
|
34
|
+
clusterRole?: Partial<Record<string, unknown>>;
|
|
35
|
+
clusterRoleBinding?: Partial<Record<string, unknown>>;
|
|
36
|
+
};
|
|
27
37
|
}
|
|
28
38
|
|
|
29
39
|
export interface ExternalDnsAgentResult {
|
|
30
|
-
deployment:
|
|
31
|
-
serviceAccount:
|
|
32
|
-
clusterRole:
|
|
33
|
-
clusterRoleBinding:
|
|
40
|
+
deployment: InstanceType<typeof Deployment>;
|
|
41
|
+
serviceAccount: InstanceType<typeof ServiceAccount>;
|
|
42
|
+
clusterRole: InstanceType<typeof ClusterRole>;
|
|
43
|
+
clusterRoleBinding: InstanceType<typeof ClusterRoleBinding>;
|
|
34
44
|
}
|
|
35
45
|
|
|
36
46
|
/**
|
|
@@ -49,7 +59,7 @@ export interface ExternalDnsAgentResult {
|
|
|
49
59
|
* });
|
|
50
60
|
* ```
|
|
51
61
|
*/
|
|
52
|
-
export
|
|
62
|
+
export const ExternalDnsAgent = Composite<ExternalDnsAgentProps>((props) => {
|
|
53
63
|
const {
|
|
54
64
|
iamRoleArn,
|
|
55
65
|
domainFilters,
|
|
@@ -60,6 +70,7 @@ export function ExternalDnsAgent(props: ExternalDnsAgentProps): ExternalDnsAgent
|
|
|
60
70
|
image = "registry.k8s.io/external-dns/external-dns:v0.14.0",
|
|
61
71
|
namespace = "kube-system",
|
|
62
72
|
labels: extraLabels = {},
|
|
73
|
+
defaults: defs,
|
|
63
74
|
} = props;
|
|
64
75
|
|
|
65
76
|
const saName = `${name}-sa`;
|
|
@@ -88,7 +99,7 @@ export function ExternalDnsAgent(props: ExternalDnsAgentProps): ExternalDnsAgent
|
|
|
88
99
|
args.push(`--txt-owner-id=${txtOwnerId}`);
|
|
89
100
|
}
|
|
90
101
|
|
|
91
|
-
const
|
|
102
|
+
const deployment = new Deployment(mergeDefaults({
|
|
92
103
|
metadata: {
|
|
93
104
|
name,
|
|
94
105
|
namespace,
|
|
@@ -121,9 +132,9 @@ export function ExternalDnsAgent(props: ExternalDnsAgentProps): ExternalDnsAgent
|
|
|
121
132
|
},
|
|
122
133
|
},
|
|
123
134
|
},
|
|
124
|
-
};
|
|
135
|
+
}, defs?.deployment));
|
|
125
136
|
|
|
126
|
-
const
|
|
137
|
+
const serviceAccount = new ServiceAccount(mergeDefaults({
|
|
127
138
|
metadata: {
|
|
128
139
|
name: saName,
|
|
129
140
|
namespace,
|
|
@@ -132,9 +143,9 @@ export function ExternalDnsAgent(props: ExternalDnsAgentProps): ExternalDnsAgent
|
|
|
132
143
|
"eks.amazonaws.com/role-arn": iamRoleArn,
|
|
133
144
|
},
|
|
134
145
|
},
|
|
135
|
-
};
|
|
146
|
+
}, defs?.serviceAccount));
|
|
136
147
|
|
|
137
|
-
const
|
|
148
|
+
const clusterRole = new ClusterRole(mergeDefaults({
|
|
138
149
|
metadata: {
|
|
139
150
|
name: clusterRoleName,
|
|
140
151
|
labels: { ...commonLabels, "app.kubernetes.io/component": "rbac" },
|
|
@@ -144,9 +155,9 @@ export function ExternalDnsAgent(props: ExternalDnsAgentProps): ExternalDnsAgent
|
|
|
144
155
|
{ apiGroups: ["extensions", "networking.k8s.io"], resources: ["ingresses"], verbs: ["get", "watch", "list"] },
|
|
145
156
|
{ apiGroups: [""], resources: ["nodes"], verbs: ["list", "watch"] },
|
|
146
157
|
],
|
|
147
|
-
};
|
|
158
|
+
}, defs?.clusterRole));
|
|
148
159
|
|
|
149
|
-
const
|
|
160
|
+
const clusterRoleBinding = new ClusterRoleBinding(mergeDefaults({
|
|
150
161
|
metadata: {
|
|
151
162
|
name: bindingName,
|
|
152
163
|
labels: { ...commonLabels, "app.kubernetes.io/component": "rbac" },
|
|
@@ -163,12 +174,7 @@ export function ExternalDnsAgent(props: ExternalDnsAgentProps): ExternalDnsAgent
|
|
|
163
174
|
namespace,
|
|
164
175
|
},
|
|
165
176
|
],
|
|
166
|
-
};
|
|
177
|
+
}, defs?.clusterRoleBinding));
|
|
167
178
|
|
|
168
|
-
return {
|
|
169
|
-
|
|
170
|
-
serviceAccount: serviceAccountProps,
|
|
171
|
-
clusterRole: clusterRoleProps,
|
|
172
|
-
clusterRoleBinding: clusterRoleBindingProps,
|
|
173
|
-
};
|
|
174
|
-
}
|
|
179
|
+
return { deployment, serviceAccount, clusterRole, clusterRoleBinding };
|
|
180
|
+
}, "ExternalDnsAgent");
|
|
@@ -5,6 +5,9 @@
|
|
|
5
5
|
* Filestore provides ReadWriteMany access mode (shared across pods/nodes).
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
+
import { Composite, mergeDefaults } from "@intentius/chant";
|
|
9
|
+
import { StorageClass } from "../generated";
|
|
10
|
+
|
|
8
11
|
export interface FilestoreStorageClassProps {
|
|
9
12
|
/** StorageClass name. */
|
|
10
13
|
name: string;
|
|
@@ -18,10 +21,14 @@ export interface FilestoreStorageClassProps {
|
|
|
18
21
|
volumeBindingMode?: string;
|
|
19
22
|
/** Additional labels. */
|
|
20
23
|
labels?: Record<string, string>;
|
|
24
|
+
/** Per-member defaults for fine-grained overrides. */
|
|
25
|
+
defaults?: {
|
|
26
|
+
storageClass?: Partial<Record<string, unknown>>;
|
|
27
|
+
};
|
|
21
28
|
}
|
|
22
29
|
|
|
23
30
|
export interface FilestoreStorageClassResult {
|
|
24
|
-
storageClass:
|
|
31
|
+
storageClass: InstanceType<typeof StorageClass>;
|
|
25
32
|
}
|
|
26
33
|
|
|
27
34
|
/**
|
|
@@ -40,7 +47,7 @@ export interface FilestoreStorageClassResult {
|
|
|
40
47
|
* });
|
|
41
48
|
* ```
|
|
42
49
|
*/
|
|
43
|
-
export
|
|
50
|
+
export const FilestoreStorageClass = Composite<FilestoreStorageClassProps>((props) => {
|
|
44
51
|
const {
|
|
45
52
|
name,
|
|
46
53
|
tier = "standard",
|
|
@@ -48,6 +55,7 @@ export function FilestoreStorageClass(props: FilestoreStorageClassProps): Filest
|
|
|
48
55
|
reclaimPolicy = "Delete",
|
|
49
56
|
volumeBindingMode = "WaitForFirstConsumer",
|
|
50
57
|
labels: extraLabels = {},
|
|
58
|
+
defaults: defs,
|
|
51
59
|
} = props;
|
|
52
60
|
|
|
53
61
|
const commonLabels: Record<string, string> = {
|
|
@@ -64,7 +72,7 @@ export function FilestoreStorageClass(props: FilestoreStorageClassProps): Filest
|
|
|
64
72
|
parameters.network = network;
|
|
65
73
|
}
|
|
66
74
|
|
|
67
|
-
const
|
|
75
|
+
const storageClass = new StorageClass(mergeDefaults({
|
|
68
76
|
metadata: {
|
|
69
77
|
name,
|
|
70
78
|
labels: { ...commonLabels, "app.kubernetes.io/component": "storage" },
|
|
@@ -73,7 +81,7 @@ export function FilestoreStorageClass(props: FilestoreStorageClassProps): Filest
|
|
|
73
81
|
parameters,
|
|
74
82
|
reclaimPolicy,
|
|
75
83
|
volumeBindingMode,
|
|
76
|
-
};
|
|
84
|
+
}, defs?.storageClass));
|
|
77
85
|
|
|
78
|
-
return { storageClass
|
|
79
|
-
}
|
|
86
|
+
return { storageClass };
|
|
87
|
+
}, "FilestoreStorageClass");
|
|
@@ -5,6 +5,9 @@
|
|
|
5
5
|
* (image, RBAC, CloudWatch output config).
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
+
import { Composite, mergeDefaults } from "@intentius/chant";
|
|
9
|
+
import { DaemonSet, ServiceAccount, ClusterRole, ClusterRoleBinding, ConfigMap } from "../generated";
|
|
10
|
+
|
|
8
11
|
export interface FluentBitAgentProps {
|
|
9
12
|
/** Agent name (default: "fluent-bit"). */
|
|
10
13
|
name?: string;
|
|
@@ -30,14 +33,22 @@ export interface FluentBitAgentProps {
|
|
|
30
33
|
memoryLimit?: string;
|
|
31
34
|
/** IAM Role ARN for IRSA (adds eks.amazonaws.com/role-arn annotation to ServiceAccount). */
|
|
32
35
|
iamRoleArn?: string;
|
|
36
|
+
/** Per-member defaults for fine-grained overrides. */
|
|
37
|
+
defaults?: {
|
|
38
|
+
daemonSet?: Partial<Record<string, unknown>>;
|
|
39
|
+
serviceAccount?: Partial<Record<string, unknown>>;
|
|
40
|
+
clusterRole?: Partial<Record<string, unknown>>;
|
|
41
|
+
clusterRoleBinding?: Partial<Record<string, unknown>>;
|
|
42
|
+
configMap?: Partial<Record<string, unknown>>;
|
|
43
|
+
};
|
|
33
44
|
}
|
|
34
45
|
|
|
35
46
|
export interface FluentBitAgentResult {
|
|
36
|
-
daemonSet:
|
|
37
|
-
serviceAccount:
|
|
38
|
-
clusterRole:
|
|
39
|
-
clusterRoleBinding:
|
|
40
|
-
configMap:
|
|
47
|
+
daemonSet: InstanceType<typeof DaemonSet>;
|
|
48
|
+
serviceAccount: InstanceType<typeof ServiceAccount>;
|
|
49
|
+
clusterRole: InstanceType<typeof ClusterRole>;
|
|
50
|
+
clusterRoleBinding: InstanceType<typeof ClusterRoleBinding>;
|
|
51
|
+
configMap: InstanceType<typeof ConfigMap>;
|
|
41
52
|
}
|
|
42
53
|
|
|
43
54
|
/**
|
|
@@ -56,7 +67,7 @@ export interface FluentBitAgentResult {
|
|
|
56
67
|
* });
|
|
57
68
|
* ```
|
|
58
69
|
*/
|
|
59
|
-
export
|
|
70
|
+
export const FluentBitAgent = Composite<FluentBitAgentProps>((props) => {
|
|
60
71
|
const {
|
|
61
72
|
name = "fluent-bit",
|
|
62
73
|
image = "public.ecr.aws/aws-observability/aws-for-fluent-bit:stable",
|
|
@@ -70,6 +81,7 @@ export function FluentBitAgent(props: FluentBitAgentProps): FluentBitAgentResult
|
|
|
70
81
|
cpuLimit = "200m",
|
|
71
82
|
memoryLimit = "128Mi",
|
|
72
83
|
iamRoleArn,
|
|
84
|
+
defaults: defs,
|
|
73
85
|
} = props;
|
|
74
86
|
|
|
75
87
|
const saName = `${name}-sa`;
|
|
@@ -137,7 +149,7 @@ export function FluentBitAgent(props: FluentBitAgentProps): FluentBitAgentResult
|
|
|
137
149
|
},
|
|
138
150
|
};
|
|
139
151
|
|
|
140
|
-
const
|
|
152
|
+
const daemonSet = new DaemonSet(mergeDefaults({
|
|
141
153
|
metadata: {
|
|
142
154
|
name,
|
|
143
155
|
namespace,
|
|
@@ -159,18 +171,18 @@ export function FluentBitAgent(props: FluentBitAgentProps): FluentBitAgentResult
|
|
|
159
171
|
},
|
|
160
172
|
},
|
|
161
173
|
},
|
|
162
|
-
};
|
|
174
|
+
}, defs?.daemonSet));
|
|
163
175
|
|
|
164
|
-
const
|
|
176
|
+
const serviceAccount = new ServiceAccount(mergeDefaults({
|
|
165
177
|
metadata: {
|
|
166
178
|
name: saName,
|
|
167
179
|
namespace,
|
|
168
180
|
labels: { ...commonLabels, "app.kubernetes.io/component": "agent" },
|
|
169
181
|
...(iamRoleArn ? { annotations: { "eks.amazonaws.com/role-arn": iamRoleArn } } : {}),
|
|
170
182
|
},
|
|
171
|
-
};
|
|
183
|
+
}, defs?.serviceAccount));
|
|
172
184
|
|
|
173
|
-
const
|
|
185
|
+
const clusterRole = new ClusterRole(mergeDefaults({
|
|
174
186
|
metadata: {
|
|
175
187
|
name: clusterRoleName,
|
|
176
188
|
labels: { ...commonLabels, "app.kubernetes.io/component": "rbac" },
|
|
@@ -178,9 +190,9 @@ export function FluentBitAgent(props: FluentBitAgentProps): FluentBitAgentResult
|
|
|
178
190
|
rules: [
|
|
179
191
|
{ apiGroups: [""], resources: ["namespaces", "pods"], verbs: ["get", "list", "watch"] },
|
|
180
192
|
],
|
|
181
|
-
};
|
|
193
|
+
}, defs?.clusterRole));
|
|
182
194
|
|
|
183
|
-
const
|
|
195
|
+
const clusterRoleBinding = new ClusterRoleBinding(mergeDefaults({
|
|
184
196
|
metadata: {
|
|
185
197
|
name: bindingName,
|
|
186
198
|
labels: { ...commonLabels, "app.kubernetes.io/component": "rbac" },
|
|
@@ -197,9 +209,9 @@ export function FluentBitAgent(props: FluentBitAgentProps): FluentBitAgentResult
|
|
|
197
209
|
namespace,
|
|
198
210
|
},
|
|
199
211
|
],
|
|
200
|
-
};
|
|
212
|
+
}, defs?.clusterRoleBinding));
|
|
201
213
|
|
|
202
|
-
const
|
|
214
|
+
const configMap = new ConfigMap(mergeDefaults({
|
|
203
215
|
metadata: {
|
|
204
216
|
name: configMapName,
|
|
205
217
|
namespace,
|
|
@@ -208,13 +220,7 @@ export function FluentBitAgent(props: FluentBitAgentProps): FluentBitAgentResult
|
|
|
208
220
|
data: {
|
|
209
221
|
"fluent-bit.conf": fluentBitConfig,
|
|
210
222
|
},
|
|
211
|
-
};
|
|
223
|
+
}, defs?.configMap));
|
|
212
224
|
|
|
213
|
-
return {
|
|
214
|
-
|
|
215
|
-
serviceAccount: serviceAccountProps,
|
|
216
|
-
clusterRole: clusterRoleProps,
|
|
217
|
-
clusterRoleBinding: clusterRoleBindingProps,
|
|
218
|
-
configMap: configMapProps,
|
|
219
|
-
};
|
|
220
|
-
}
|
|
225
|
+
return { daemonSet, serviceAccount, clusterRole, clusterRoleBinding, configMap };
|
|
226
|
+
}, "FluentBitAgent");
|