specweave 0.3.13 → 0.4.1
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/CLAUDE.md +506 -17
- package/README.md +100 -58
- package/bin/install-all.sh +9 -2
- package/bin/install-hooks.sh +57 -0
- package/bin/specweave.js +16 -0
- package/dist/adapters/adapter-base.d.ts +21 -0
- package/dist/adapters/adapter-base.d.ts.map +1 -1
- package/dist/adapters/adapter-base.js +28 -0
- package/dist/adapters/adapter-base.js.map +1 -1
- package/dist/adapters/adapter-interface.d.ts +41 -0
- package/dist/adapters/adapter-interface.d.ts.map +1 -1
- package/dist/adapters/claude/adapter.d.ts +36 -0
- package/dist/adapters/claude/adapter.d.ts.map +1 -1
- package/dist/adapters/claude/adapter.js +135 -0
- package/dist/adapters/claude/adapter.js.map +1 -1
- package/dist/adapters/copilot/adapter.d.ts +25 -0
- package/dist/adapters/copilot/adapter.d.ts.map +1 -1
- package/dist/adapters/copilot/adapter.js +112 -0
- package/dist/adapters/copilot/adapter.js.map +1 -1
- package/dist/adapters/cursor/adapter.d.ts +36 -0
- package/dist/adapters/cursor/adapter.d.ts.map +1 -1
- package/dist/adapters/cursor/adapter.js +140 -0
- package/dist/adapters/cursor/adapter.js.map +1 -1
- package/dist/adapters/generic/adapter.d.ts +25 -0
- package/dist/adapters/generic/adapter.d.ts.map +1 -1
- package/dist/adapters/generic/adapter.js +111 -0
- package/dist/adapters/generic/adapter.js.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +103 -1
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/plugin.d.ts +37 -0
- package/dist/cli/commands/plugin.d.ts.map +1 -0
- package/dist/cli/commands/plugin.js +296 -0
- package/dist/cli/commands/plugin.js.map +1 -0
- package/dist/core/agent-model-manager.d.ts +52 -0
- package/dist/core/agent-model-manager.d.ts.map +1 -0
- package/dist/core/agent-model-manager.js +120 -0
- package/dist/core/agent-model-manager.js.map +1 -0
- package/dist/core/cost-tracker.d.ts +108 -0
- package/dist/core/cost-tracker.d.ts.map +1 -0
- package/dist/core/cost-tracker.js +281 -0
- package/dist/core/cost-tracker.js.map +1 -0
- package/dist/core/model-selector.d.ts +57 -0
- package/dist/core/model-selector.d.ts.map +1 -0
- package/dist/core/model-selector.js +115 -0
- package/dist/core/model-selector.js.map +1 -0
- package/dist/core/phase-detector.d.ts +62 -0
- package/dist/core/phase-detector.d.ts.map +1 -0
- package/dist/core/phase-detector.js +229 -0
- package/dist/core/phase-detector.js.map +1 -0
- package/dist/core/plugin-detector.d.ts +96 -0
- package/dist/core/plugin-detector.d.ts.map +1 -0
- package/dist/core/plugin-detector.js +349 -0
- package/dist/core/plugin-detector.js.map +1 -0
- package/dist/core/plugin-loader.d.ts +111 -0
- package/dist/core/plugin-loader.d.ts.map +1 -0
- package/dist/core/plugin-loader.js +319 -0
- package/dist/core/plugin-loader.js.map +1 -0
- package/dist/core/plugin-manager.d.ts +144 -0
- package/dist/core/plugin-manager.d.ts.map +1 -0
- package/dist/core/plugin-manager.js +393 -0
- package/dist/core/plugin-manager.js.map +1 -0
- package/dist/core/schemas/plugin-manifest.schema.json +253 -0
- package/dist/core/types/plugin.d.ts +252 -0
- package/dist/core/types/plugin.d.ts.map +1 -0
- package/dist/core/types/plugin.js +48 -0
- package/dist/core/types/plugin.js.map +1 -0
- package/dist/integrations/jira/jira-mapper.d.ts +2 -2
- package/dist/integrations/jira/jira-mapper.js +2 -2
- package/dist/types/cost-tracking.d.ts +43 -0
- package/dist/types/cost-tracking.d.ts.map +1 -0
- package/dist/types/cost-tracking.js +8 -0
- package/dist/types/cost-tracking.js.map +1 -0
- package/dist/types/model-selection.d.ts +53 -0
- package/dist/types/model-selection.d.ts.map +1 -0
- package/dist/types/model-selection.js +12 -0
- package/dist/types/model-selection.js.map +1 -0
- package/dist/utils/cost-reporter.d.ts +58 -0
- package/dist/utils/cost-reporter.d.ts.map +1 -0
- package/dist/utils/cost-reporter.js +224 -0
- package/dist/utils/cost-reporter.js.map +1 -0
- package/dist/utils/pricing-constants.d.ts +70 -0
- package/dist/utils/pricing-constants.d.ts.map +1 -0
- package/dist/utils/pricing-constants.js +71 -0
- package/dist/utils/pricing-constants.js.map +1 -0
- package/package.json +13 -9
- package/src/adapters/adapter-base.ts +33 -0
- package/src/adapters/adapter-interface.ts +46 -0
- package/src/adapters/claude/adapter.ts +164 -0
- package/src/adapters/copilot/adapter.ts +138 -0
- package/src/adapters/cursor/adapter.ts +170 -0
- package/src/adapters/generic/adapter.ts +137 -0
- package/src/agents/architect/AGENT.md +3 -0
- package/src/agents/code-reviewer.md +156 -0
- package/src/agents/data-scientist/AGENT.md +181 -0
- package/src/agents/database-optimizer/AGENT.md +147 -0
- package/src/agents/devops/AGENT.md +3 -0
- package/src/agents/diagrams-architect/AGENT.md +3 -0
- package/src/agents/docs-writer/AGENT.md +3 -0
- package/src/agents/kubernetes-architect/AGENT.md +142 -0
- package/src/agents/ml-engineer/AGENT.md +150 -0
- package/src/agents/mlops-engineer/AGENT.md +201 -0
- package/src/agents/network-engineer/AGENT.md +149 -0
- package/src/agents/observability-engineer/AGENT.md +213 -0
- package/src/agents/payment-integration/AGENT.md +35 -0
- package/src/agents/performance/AGENT.md +3 -0
- package/src/agents/performance-engineer/AGENT.md +153 -0
- package/src/agents/pm/AGENT.md +3 -0
- package/src/agents/qa-lead/AGENT.md +3 -0
- package/src/agents/security/AGENT.md +3 -0
- package/src/agents/sre/AGENT.md +3 -0
- package/src/agents/tdd-orchestrator/AGENT.md +169 -0
- package/src/agents/tech-lead/AGENT.md +3 -0
- package/src/commands/specweave.costs.md +261 -0
- package/src/commands/specweave.increment.md +48 -4
- package/src/commands/specweave.ml-pipeline.md +292 -0
- package/src/commands/specweave.monitor-setup.md +501 -0
- package/src/commands/specweave.slo-implement.md +1055 -0
- package/src/commands/specweave.sync-github.md +1 -1
- package/src/commands/specweave.tdd-cycle.md +199 -0
- package/src/commands/specweave.tdd-green.md +842 -0
- package/src/commands/specweave.tdd-red.md +135 -0
- package/src/commands/specweave.tdd-refactor.md +165 -0
- package/src/hooks/post-increment-plugin-detect.sh +142 -0
- package/src/hooks/post-task-completion.sh +53 -11
- package/src/hooks/pre-task-plugin-detect.sh +96 -0
- package/src/skills/SKILLS-INDEX.md +18 -10
- package/src/skills/billing-automation/SKILL.md +559 -0
- package/src/skills/distributed-tracing/SKILL.md +438 -0
- package/src/skills/e2e-playwright/README.md +1 -1
- package/src/skills/e2e-playwright/package.json +1 -1
- package/src/skills/gitops-workflow/SKILL.md +285 -0
- package/src/skills/gitops-workflow/references/argocd-setup.md +134 -0
- package/src/skills/gitops-workflow/references/sync-policies.md +131 -0
- package/src/skills/grafana-dashboards/SKILL.md +369 -0
- package/src/skills/helm-chart-scaffolding/SKILL.md +544 -0
- package/src/skills/helm-chart-scaffolding/assets/Chart.yaml.template +42 -0
- package/src/skills/helm-chart-scaffolding/assets/values.yaml.template +185 -0
- package/src/skills/helm-chart-scaffolding/references/chart-structure.md +500 -0
- package/src/skills/helm-chart-scaffolding/scripts/validate-chart.sh +244 -0
- package/src/skills/k8s-manifest-generator/SKILL.md +511 -0
- package/src/skills/k8s-manifest-generator/assets/configmap-template.yaml +296 -0
- package/src/skills/k8s-manifest-generator/assets/deployment-template.yaml +203 -0
- package/src/skills/k8s-manifest-generator/assets/service-template.yaml +171 -0
- package/src/skills/k8s-manifest-generator/references/deployment-spec.md +753 -0
- package/src/skills/k8s-manifest-generator/references/service-spec.md +724 -0
- package/src/skills/k8s-security-policies/SKILL.md +334 -0
- package/src/skills/k8s-security-policies/assets/network-policy-template.yaml +177 -0
- package/src/skills/k8s-security-policies/references/rbac-patterns.md +187 -0
- package/src/skills/ml-pipeline-workflow/SKILL.md +245 -0
- package/src/skills/paypal-integration/SKILL.md +467 -0
- package/src/skills/pci-compliance/SKILL.md +466 -0
- package/src/skills/prometheus-configuration/SKILL.md +392 -0
- package/src/skills/slo-implementation/SKILL.md +329 -0
- package/src/skills/stripe-integration/SKILL.md +442 -0
- package/src/skills/tdd-workflow/SKILL.md +378 -0
- package/src/templates/README.md.template +1 -1
- package/src/skills/bmad-method-expert/SKILL.md +0 -626
- package/src/skills/bmad-method-expert/scripts/analyze-project.js +0 -318
- package/src/skills/bmad-method-expert/scripts/check-setup.js +0 -208
- package/src/skills/bmad-method-expert/scripts/generate-template.js +0 -1149
- package/src/skills/bmad-method-expert/scripts/validate-documents.js +0 -340
- package/src/skills/context-optimizer/SKILL.md +0 -588
- package/src/skills/figma-designer/SKILL.md +0 -149
- package/src/skills/figma-implementer/SKILL.md +0 -148
- package/src/skills/figma-mcp-connector/SKILL.md +0 -136
- package/src/skills/figma-to-code/SKILL.md +0 -128
- package/src/skills/spec-kit-expert/SKILL.md +0 -1010
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
# Kubernetes ConfigMap Templates
|
|
2
|
+
|
|
3
|
+
---
|
|
4
|
+
# Template 1: Simple Key-Value Configuration
|
|
5
|
+
apiVersion: v1
|
|
6
|
+
kind: ConfigMap
|
|
7
|
+
metadata:
|
|
8
|
+
name: <app-name>-config
|
|
9
|
+
namespace: <namespace>
|
|
10
|
+
labels:
|
|
11
|
+
app.kubernetes.io/name: <app-name>
|
|
12
|
+
app.kubernetes.io/instance: <instance-name>
|
|
13
|
+
data:
|
|
14
|
+
# Simple key-value pairs
|
|
15
|
+
APP_ENV: "production"
|
|
16
|
+
LOG_LEVEL: "info"
|
|
17
|
+
DATABASE_HOST: "db.example.com"
|
|
18
|
+
DATABASE_PORT: "5432"
|
|
19
|
+
CACHE_TTL: "3600"
|
|
20
|
+
MAX_CONNECTIONS: "100"
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
# Template 2: Configuration File
|
|
24
|
+
apiVersion: v1
|
|
25
|
+
kind: ConfigMap
|
|
26
|
+
metadata:
|
|
27
|
+
name: <app-name>-config-file
|
|
28
|
+
namespace: <namespace>
|
|
29
|
+
labels:
|
|
30
|
+
app.kubernetes.io/name: <app-name>
|
|
31
|
+
data:
|
|
32
|
+
# Application configuration file
|
|
33
|
+
application.yaml: |
|
|
34
|
+
server:
|
|
35
|
+
port: 8080
|
|
36
|
+
host: 0.0.0.0
|
|
37
|
+
|
|
38
|
+
logging:
|
|
39
|
+
level: INFO
|
|
40
|
+
format: json
|
|
41
|
+
|
|
42
|
+
database:
|
|
43
|
+
host: db.example.com
|
|
44
|
+
port: 5432
|
|
45
|
+
pool_size: 20
|
|
46
|
+
timeout: 30
|
|
47
|
+
|
|
48
|
+
cache:
|
|
49
|
+
enabled: true
|
|
50
|
+
ttl: 3600
|
|
51
|
+
max_entries: 10000
|
|
52
|
+
|
|
53
|
+
features:
|
|
54
|
+
new_ui: true
|
|
55
|
+
beta_features: false
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
# Template 3: Multiple Configuration Files
|
|
59
|
+
apiVersion: v1
|
|
60
|
+
kind: ConfigMap
|
|
61
|
+
metadata:
|
|
62
|
+
name: <app-name>-multi-config
|
|
63
|
+
namespace: <namespace>
|
|
64
|
+
labels:
|
|
65
|
+
app.kubernetes.io/name: <app-name>
|
|
66
|
+
data:
|
|
67
|
+
# Nginx configuration
|
|
68
|
+
nginx.conf: |
|
|
69
|
+
user nginx;
|
|
70
|
+
worker_processes auto;
|
|
71
|
+
error_log /var/log/nginx/error.log warn;
|
|
72
|
+
pid /var/run/nginx.pid;
|
|
73
|
+
|
|
74
|
+
events {
|
|
75
|
+
worker_connections 1024;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
http {
|
|
79
|
+
include /etc/nginx/mime.types;
|
|
80
|
+
default_type application/octet-stream;
|
|
81
|
+
|
|
82
|
+
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
|
|
83
|
+
'$status $body_bytes_sent "$http_referer" '
|
|
84
|
+
'"$http_user_agent" "$http_x_forwarded_for"';
|
|
85
|
+
|
|
86
|
+
access_log /var/log/nginx/access.log main;
|
|
87
|
+
sendfile on;
|
|
88
|
+
keepalive_timeout 65;
|
|
89
|
+
|
|
90
|
+
include /etc/nginx/conf.d/*.conf;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
# Default site configuration
|
|
94
|
+
default.conf: |
|
|
95
|
+
server {
|
|
96
|
+
listen 80;
|
|
97
|
+
server_name _;
|
|
98
|
+
|
|
99
|
+
location / {
|
|
100
|
+
proxy_pass http://backend:8080;
|
|
101
|
+
proxy_set_header Host $host;
|
|
102
|
+
proxy_set_header X-Real-IP $remote_addr;
|
|
103
|
+
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
104
|
+
proxy_set_header X-Forwarded-Proto $scheme;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
location /health {
|
|
108
|
+
access_log off;
|
|
109
|
+
return 200 "healthy\n";
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
# Template 4: JSON Configuration
|
|
115
|
+
apiVersion: v1
|
|
116
|
+
kind: ConfigMap
|
|
117
|
+
metadata:
|
|
118
|
+
name: <app-name>-json-config
|
|
119
|
+
namespace: <namespace>
|
|
120
|
+
labels:
|
|
121
|
+
app.kubernetes.io/name: <app-name>
|
|
122
|
+
data:
|
|
123
|
+
config.json: |
|
|
124
|
+
{
|
|
125
|
+
"server": {
|
|
126
|
+
"port": 8080,
|
|
127
|
+
"host": "0.0.0.0",
|
|
128
|
+
"timeout": 30
|
|
129
|
+
},
|
|
130
|
+
"database": {
|
|
131
|
+
"host": "postgres.example.com",
|
|
132
|
+
"port": 5432,
|
|
133
|
+
"database": "myapp",
|
|
134
|
+
"pool": {
|
|
135
|
+
"min": 2,
|
|
136
|
+
"max": 20
|
|
137
|
+
}
|
|
138
|
+
},
|
|
139
|
+
"redis": {
|
|
140
|
+
"host": "redis.example.com",
|
|
141
|
+
"port": 6379,
|
|
142
|
+
"db": 0
|
|
143
|
+
},
|
|
144
|
+
"features": {
|
|
145
|
+
"auth": true,
|
|
146
|
+
"metrics": true,
|
|
147
|
+
"tracing": true
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
# Template 5: Environment-Specific Configuration
|
|
153
|
+
apiVersion: v1
|
|
154
|
+
kind: ConfigMap
|
|
155
|
+
metadata:
|
|
156
|
+
name: <app-name>-prod-config
|
|
157
|
+
namespace: production
|
|
158
|
+
labels:
|
|
159
|
+
app.kubernetes.io/name: <app-name>
|
|
160
|
+
environment: production
|
|
161
|
+
data:
|
|
162
|
+
APP_ENV: "production"
|
|
163
|
+
LOG_LEVEL: "warn"
|
|
164
|
+
DEBUG: "false"
|
|
165
|
+
RATE_LIMIT: "1000"
|
|
166
|
+
CACHE_TTL: "3600"
|
|
167
|
+
DATABASE_POOL_SIZE: "50"
|
|
168
|
+
FEATURE_FLAG_NEW_UI: "true"
|
|
169
|
+
FEATURE_FLAG_BETA: "false"
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
# Template 6: Script Configuration
|
|
173
|
+
apiVersion: v1
|
|
174
|
+
kind: ConfigMap
|
|
175
|
+
metadata:
|
|
176
|
+
name: <app-name>-scripts
|
|
177
|
+
namespace: <namespace>
|
|
178
|
+
labels:
|
|
179
|
+
app.kubernetes.io/name: <app-name>
|
|
180
|
+
data:
|
|
181
|
+
# Initialization script
|
|
182
|
+
init.sh: |
|
|
183
|
+
#!/bin/bash
|
|
184
|
+
set -e
|
|
185
|
+
|
|
186
|
+
echo "Running initialization..."
|
|
187
|
+
|
|
188
|
+
# Wait for database
|
|
189
|
+
until nc -z $DATABASE_HOST $DATABASE_PORT; do
|
|
190
|
+
echo "Waiting for database..."
|
|
191
|
+
sleep 2
|
|
192
|
+
done
|
|
193
|
+
|
|
194
|
+
echo "Database is ready!"
|
|
195
|
+
|
|
196
|
+
# Run migrations
|
|
197
|
+
if [ "$RUN_MIGRATIONS" = "true" ]; then
|
|
198
|
+
echo "Running database migrations..."
|
|
199
|
+
./migrate up
|
|
200
|
+
fi
|
|
201
|
+
|
|
202
|
+
echo "Initialization complete!"
|
|
203
|
+
|
|
204
|
+
# Health check script
|
|
205
|
+
healthcheck.sh: |
|
|
206
|
+
#!/bin/bash
|
|
207
|
+
|
|
208
|
+
# Check application health endpoint
|
|
209
|
+
response=$(curl -sf http://localhost:8080/health)
|
|
210
|
+
|
|
211
|
+
if [ $? -eq 0 ]; then
|
|
212
|
+
echo "Health check passed"
|
|
213
|
+
exit 0
|
|
214
|
+
else
|
|
215
|
+
echo "Health check failed"
|
|
216
|
+
exit 1
|
|
217
|
+
fi
|
|
218
|
+
|
|
219
|
+
---
|
|
220
|
+
# Template 7: Prometheus Configuration
|
|
221
|
+
apiVersion: v1
|
|
222
|
+
kind: ConfigMap
|
|
223
|
+
metadata:
|
|
224
|
+
name: prometheus-config
|
|
225
|
+
namespace: monitoring
|
|
226
|
+
labels:
|
|
227
|
+
app.kubernetes.io/name: prometheus
|
|
228
|
+
data:
|
|
229
|
+
prometheus.yml: |
|
|
230
|
+
global:
|
|
231
|
+
scrape_interval: 15s
|
|
232
|
+
evaluation_interval: 15s
|
|
233
|
+
external_labels:
|
|
234
|
+
cluster: 'production'
|
|
235
|
+
region: 'us-west-2'
|
|
236
|
+
|
|
237
|
+
alerting:
|
|
238
|
+
alertmanagers:
|
|
239
|
+
- static_configs:
|
|
240
|
+
- targets:
|
|
241
|
+
- alertmanager:9093
|
|
242
|
+
|
|
243
|
+
rule_files:
|
|
244
|
+
- /etc/prometheus/rules/*.yml
|
|
245
|
+
|
|
246
|
+
scrape_configs:
|
|
247
|
+
- job_name: 'kubernetes-pods'
|
|
248
|
+
kubernetes_sd_configs:
|
|
249
|
+
- role: pod
|
|
250
|
+
relabel_configs:
|
|
251
|
+
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
|
|
252
|
+
action: keep
|
|
253
|
+
regex: true
|
|
254
|
+
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
|
|
255
|
+
action: replace
|
|
256
|
+
target_label: __metrics_path__
|
|
257
|
+
regex: (.+)
|
|
258
|
+
- source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]
|
|
259
|
+
action: replace
|
|
260
|
+
target_label: __address__
|
|
261
|
+
regex: ([^:]+)(?::\d+)?;(\d+)
|
|
262
|
+
replacement: $1:$2
|
|
263
|
+
|
|
264
|
+
---
|
|
265
|
+
# Usage Examples:
|
|
266
|
+
#
|
|
267
|
+
# 1. Mount as environment variables:
|
|
268
|
+
# envFrom:
|
|
269
|
+
# - configMapRef:
|
|
270
|
+
# name: <app-name>-config
|
|
271
|
+
#
|
|
272
|
+
# 2. Mount as files:
|
|
273
|
+
# volumeMounts:
|
|
274
|
+
# - name: config
|
|
275
|
+
# mountPath: /etc/app
|
|
276
|
+
# volumes:
|
|
277
|
+
# - name: config
|
|
278
|
+
# configMap:
|
|
279
|
+
# name: <app-name>-config-file
|
|
280
|
+
#
|
|
281
|
+
# 3. Mount specific keys as files:
|
|
282
|
+
# volumes:
|
|
283
|
+
# - name: nginx-config
|
|
284
|
+
# configMap:
|
|
285
|
+
# name: <app-name>-multi-config
|
|
286
|
+
# items:
|
|
287
|
+
# - key: nginx.conf
|
|
288
|
+
# path: nginx.conf
|
|
289
|
+
#
|
|
290
|
+
# 4. Use individual environment variables:
|
|
291
|
+
# env:
|
|
292
|
+
# - name: LOG_LEVEL
|
|
293
|
+
# valueFrom:
|
|
294
|
+
# configMapKeyRef:
|
|
295
|
+
# name: <app-name>-config
|
|
296
|
+
# key: LOG_LEVEL
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
# Production-Ready Kubernetes Deployment Template
|
|
2
|
+
# Replace all <placeholders> with actual values
|
|
3
|
+
|
|
4
|
+
apiVersion: apps/v1
|
|
5
|
+
kind: Deployment
|
|
6
|
+
metadata:
|
|
7
|
+
name: <app-name>
|
|
8
|
+
namespace: <namespace>
|
|
9
|
+
labels:
|
|
10
|
+
app.kubernetes.io/name: <app-name>
|
|
11
|
+
app.kubernetes.io/instance: <instance-name>
|
|
12
|
+
app.kubernetes.io/version: "<version>"
|
|
13
|
+
app.kubernetes.io/component: <component> # backend, frontend, database, cache
|
|
14
|
+
app.kubernetes.io/part-of: <system-name>
|
|
15
|
+
app.kubernetes.io/managed-by: kubectl
|
|
16
|
+
annotations:
|
|
17
|
+
description: "<application description>"
|
|
18
|
+
contact: "<team-email>"
|
|
19
|
+
spec:
|
|
20
|
+
replicas: 3 # Minimum 3 for production HA
|
|
21
|
+
revisionHistoryLimit: 10
|
|
22
|
+
|
|
23
|
+
selector:
|
|
24
|
+
matchLabels:
|
|
25
|
+
app.kubernetes.io/name: <app-name>
|
|
26
|
+
app.kubernetes.io/instance: <instance-name>
|
|
27
|
+
|
|
28
|
+
strategy:
|
|
29
|
+
type: RollingUpdate
|
|
30
|
+
rollingUpdate:
|
|
31
|
+
maxSurge: 1
|
|
32
|
+
maxUnavailable: 0 # Zero-downtime deployment
|
|
33
|
+
|
|
34
|
+
minReadySeconds: 10
|
|
35
|
+
progressDeadlineSeconds: 600
|
|
36
|
+
|
|
37
|
+
template:
|
|
38
|
+
metadata:
|
|
39
|
+
labels:
|
|
40
|
+
app.kubernetes.io/name: <app-name>
|
|
41
|
+
app.kubernetes.io/instance: <instance-name>
|
|
42
|
+
app.kubernetes.io/version: "<version>"
|
|
43
|
+
annotations:
|
|
44
|
+
prometheus.io/scrape: "true"
|
|
45
|
+
prometheus.io/port: "9090"
|
|
46
|
+
prometheus.io/path: "/metrics"
|
|
47
|
+
|
|
48
|
+
spec:
|
|
49
|
+
serviceAccountName: <app-name>
|
|
50
|
+
|
|
51
|
+
# Pod-level security context
|
|
52
|
+
securityContext:
|
|
53
|
+
runAsNonRoot: true
|
|
54
|
+
runAsUser: 1000
|
|
55
|
+
runAsGroup: 1000
|
|
56
|
+
fsGroup: 1000
|
|
57
|
+
seccompProfile:
|
|
58
|
+
type: RuntimeDefault
|
|
59
|
+
|
|
60
|
+
# Init containers (optional)
|
|
61
|
+
initContainers:
|
|
62
|
+
- name: init-wait
|
|
63
|
+
image: busybox:1.36
|
|
64
|
+
command: ['sh', '-c', 'echo "Initializing..."']
|
|
65
|
+
securityContext:
|
|
66
|
+
allowPrivilegeEscalation: false
|
|
67
|
+
runAsNonRoot: true
|
|
68
|
+
runAsUser: 1000
|
|
69
|
+
|
|
70
|
+
containers:
|
|
71
|
+
- name: <container-name>
|
|
72
|
+
image: <registry>/<image>:<tag> # Never use :latest
|
|
73
|
+
imagePullPolicy: IfNotPresent
|
|
74
|
+
|
|
75
|
+
ports:
|
|
76
|
+
- name: http
|
|
77
|
+
containerPort: 8080
|
|
78
|
+
protocol: TCP
|
|
79
|
+
- name: metrics
|
|
80
|
+
containerPort: 9090
|
|
81
|
+
protocol: TCP
|
|
82
|
+
|
|
83
|
+
# Environment variables
|
|
84
|
+
env:
|
|
85
|
+
- name: POD_NAME
|
|
86
|
+
valueFrom:
|
|
87
|
+
fieldRef:
|
|
88
|
+
fieldPath: metadata.name
|
|
89
|
+
- name: POD_NAMESPACE
|
|
90
|
+
valueFrom:
|
|
91
|
+
fieldRef:
|
|
92
|
+
fieldPath: metadata.namespace
|
|
93
|
+
- name: POD_IP
|
|
94
|
+
valueFrom:
|
|
95
|
+
fieldRef:
|
|
96
|
+
fieldPath: status.podIP
|
|
97
|
+
|
|
98
|
+
# Load from ConfigMap and Secret
|
|
99
|
+
envFrom:
|
|
100
|
+
- configMapRef:
|
|
101
|
+
name: <app-name>-config
|
|
102
|
+
- secretRef:
|
|
103
|
+
name: <app-name>-secret
|
|
104
|
+
|
|
105
|
+
# Resource limits
|
|
106
|
+
resources:
|
|
107
|
+
requests:
|
|
108
|
+
memory: "256Mi"
|
|
109
|
+
cpu: "250m"
|
|
110
|
+
limits:
|
|
111
|
+
memory: "512Mi"
|
|
112
|
+
cpu: "500m"
|
|
113
|
+
|
|
114
|
+
# Startup probe (for slow-starting apps)
|
|
115
|
+
startupProbe:
|
|
116
|
+
httpGet:
|
|
117
|
+
path: /health/startup
|
|
118
|
+
port: http
|
|
119
|
+
initialDelaySeconds: 0
|
|
120
|
+
periodSeconds: 10
|
|
121
|
+
timeoutSeconds: 3
|
|
122
|
+
failureThreshold: 30 # 5 minutes to start
|
|
123
|
+
|
|
124
|
+
# Liveness probe
|
|
125
|
+
livenessProbe:
|
|
126
|
+
httpGet:
|
|
127
|
+
path: /health/live
|
|
128
|
+
port: http
|
|
129
|
+
initialDelaySeconds: 30
|
|
130
|
+
periodSeconds: 10
|
|
131
|
+
timeoutSeconds: 5
|
|
132
|
+
failureThreshold: 3
|
|
133
|
+
|
|
134
|
+
# Readiness probe
|
|
135
|
+
readinessProbe:
|
|
136
|
+
httpGet:
|
|
137
|
+
path: /health/ready
|
|
138
|
+
port: http
|
|
139
|
+
initialDelaySeconds: 5
|
|
140
|
+
periodSeconds: 5
|
|
141
|
+
timeoutSeconds: 3
|
|
142
|
+
failureThreshold: 3
|
|
143
|
+
|
|
144
|
+
# Volume mounts
|
|
145
|
+
volumeMounts:
|
|
146
|
+
- name: tmp
|
|
147
|
+
mountPath: /tmp
|
|
148
|
+
- name: cache
|
|
149
|
+
mountPath: /app/cache
|
|
150
|
+
# - name: data
|
|
151
|
+
# mountPath: /var/lib/app
|
|
152
|
+
|
|
153
|
+
# Container security context
|
|
154
|
+
securityContext:
|
|
155
|
+
allowPrivilegeEscalation: false
|
|
156
|
+
readOnlyRootFilesystem: true
|
|
157
|
+
runAsNonRoot: true
|
|
158
|
+
runAsUser: 1000
|
|
159
|
+
capabilities:
|
|
160
|
+
drop:
|
|
161
|
+
- ALL
|
|
162
|
+
|
|
163
|
+
# Lifecycle hooks
|
|
164
|
+
lifecycle:
|
|
165
|
+
preStop:
|
|
166
|
+
exec:
|
|
167
|
+
command: ["/bin/sh", "-c", "sleep 15"] # Graceful shutdown
|
|
168
|
+
|
|
169
|
+
# Volumes
|
|
170
|
+
volumes:
|
|
171
|
+
- name: tmp
|
|
172
|
+
emptyDir: {}
|
|
173
|
+
- name: cache
|
|
174
|
+
emptyDir:
|
|
175
|
+
sizeLimit: 1Gi
|
|
176
|
+
# - name: data
|
|
177
|
+
# persistentVolumeClaim:
|
|
178
|
+
# claimName: <app-name>-data
|
|
179
|
+
|
|
180
|
+
# Scheduling
|
|
181
|
+
affinity:
|
|
182
|
+
podAntiAffinity:
|
|
183
|
+
preferredDuringSchedulingIgnoredDuringExecution:
|
|
184
|
+
- weight: 100
|
|
185
|
+
podAffinityTerm:
|
|
186
|
+
labelSelector:
|
|
187
|
+
matchLabels:
|
|
188
|
+
app.kubernetes.io/name: <app-name>
|
|
189
|
+
topologyKey: kubernetes.io/hostname
|
|
190
|
+
|
|
191
|
+
topologySpreadConstraints:
|
|
192
|
+
- maxSkew: 1
|
|
193
|
+
topologyKey: topology.kubernetes.io/zone
|
|
194
|
+
whenUnsatisfiable: ScheduleAnyway
|
|
195
|
+
labelSelector:
|
|
196
|
+
matchLabels:
|
|
197
|
+
app.kubernetes.io/name: <app-name>
|
|
198
|
+
|
|
199
|
+
terminationGracePeriodSeconds: 30
|
|
200
|
+
|
|
201
|
+
# Image pull secrets (if using private registry)
|
|
202
|
+
# imagePullSecrets:
|
|
203
|
+
# - name: regcred
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
# Kubernetes Service Templates
|
|
2
|
+
|
|
3
|
+
---
|
|
4
|
+
# Template 1: ClusterIP Service (Internal Only)
|
|
5
|
+
apiVersion: v1
|
|
6
|
+
kind: Service
|
|
7
|
+
metadata:
|
|
8
|
+
name: <app-name>
|
|
9
|
+
namespace: <namespace>
|
|
10
|
+
labels:
|
|
11
|
+
app.kubernetes.io/name: <app-name>
|
|
12
|
+
app.kubernetes.io/instance: <instance-name>
|
|
13
|
+
annotations:
|
|
14
|
+
description: "Internal service for <app-name>"
|
|
15
|
+
spec:
|
|
16
|
+
type: ClusterIP
|
|
17
|
+
selector:
|
|
18
|
+
app.kubernetes.io/name: <app-name>
|
|
19
|
+
app.kubernetes.io/instance: <instance-name>
|
|
20
|
+
ports:
|
|
21
|
+
- name: http
|
|
22
|
+
port: 80
|
|
23
|
+
targetPort: http # Named port from container
|
|
24
|
+
protocol: TCP
|
|
25
|
+
sessionAffinity: None
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
# Template 2: LoadBalancer Service (External Access)
|
|
29
|
+
apiVersion: v1
|
|
30
|
+
kind: Service
|
|
31
|
+
metadata:
|
|
32
|
+
name: <app-name>-lb
|
|
33
|
+
namespace: <namespace>
|
|
34
|
+
labels:
|
|
35
|
+
app.kubernetes.io/name: <app-name>
|
|
36
|
+
annotations:
|
|
37
|
+
# AWS NLB annotations
|
|
38
|
+
service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
|
|
39
|
+
service.beta.kubernetes.io/aws-load-balancer-scheme: "internet-facing"
|
|
40
|
+
service.beta.kubernetes.io/aws-load-balancer-cross-zone-load-balancing-enabled: "true"
|
|
41
|
+
# SSL certificate (optional)
|
|
42
|
+
# service.beta.kubernetes.io/aws-load-balancer-ssl-cert: "arn:aws:acm:..."
|
|
43
|
+
spec:
|
|
44
|
+
type: LoadBalancer
|
|
45
|
+
externalTrafficPolicy: Local # Preserves client IP
|
|
46
|
+
selector:
|
|
47
|
+
app.kubernetes.io/name: <app-name>
|
|
48
|
+
ports:
|
|
49
|
+
- name: http
|
|
50
|
+
port: 80
|
|
51
|
+
targetPort: http
|
|
52
|
+
protocol: TCP
|
|
53
|
+
- name: https
|
|
54
|
+
port: 443
|
|
55
|
+
targetPort: https
|
|
56
|
+
protocol: TCP
|
|
57
|
+
# Restrict access to specific IPs (optional)
|
|
58
|
+
# loadBalancerSourceRanges:
|
|
59
|
+
# - 203.0.113.0/24
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
# Template 3: NodePort Service (Direct Node Access)
|
|
63
|
+
apiVersion: v1
|
|
64
|
+
kind: Service
|
|
65
|
+
metadata:
|
|
66
|
+
name: <app-name>-np
|
|
67
|
+
namespace: <namespace>
|
|
68
|
+
labels:
|
|
69
|
+
app.kubernetes.io/name: <app-name>
|
|
70
|
+
spec:
|
|
71
|
+
type: NodePort
|
|
72
|
+
selector:
|
|
73
|
+
app.kubernetes.io/name: <app-name>
|
|
74
|
+
ports:
|
|
75
|
+
- name: http
|
|
76
|
+
port: 80
|
|
77
|
+
targetPort: 8080
|
|
78
|
+
nodePort: 30080 # Optional, 30000-32767 range
|
|
79
|
+
protocol: TCP
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
# Template 4: Headless Service (StatefulSet)
|
|
83
|
+
apiVersion: v1
|
|
84
|
+
kind: Service
|
|
85
|
+
metadata:
|
|
86
|
+
name: <app-name>-headless
|
|
87
|
+
namespace: <namespace>
|
|
88
|
+
labels:
|
|
89
|
+
app.kubernetes.io/name: <app-name>
|
|
90
|
+
spec:
|
|
91
|
+
clusterIP: None # Headless
|
|
92
|
+
selector:
|
|
93
|
+
app.kubernetes.io/name: <app-name>
|
|
94
|
+
ports:
|
|
95
|
+
- name: client
|
|
96
|
+
port: 9042
|
|
97
|
+
targetPort: 9042
|
|
98
|
+
publishNotReadyAddresses: true # Include not-ready pods in DNS
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
# Template 5: Multi-Port Service with Metrics
|
|
102
|
+
apiVersion: v1
|
|
103
|
+
kind: Service
|
|
104
|
+
metadata:
|
|
105
|
+
name: <app-name>-multi
|
|
106
|
+
namespace: <namespace>
|
|
107
|
+
labels:
|
|
108
|
+
app.kubernetes.io/name: <app-name>
|
|
109
|
+
annotations:
|
|
110
|
+
prometheus.io/scrape: "true"
|
|
111
|
+
prometheus.io/port: "9090"
|
|
112
|
+
prometheus.io/path: "/metrics"
|
|
113
|
+
spec:
|
|
114
|
+
type: ClusterIP
|
|
115
|
+
selector:
|
|
116
|
+
app.kubernetes.io/name: <app-name>
|
|
117
|
+
ports:
|
|
118
|
+
- name: http
|
|
119
|
+
port: 80
|
|
120
|
+
targetPort: 8080
|
|
121
|
+
protocol: TCP
|
|
122
|
+
- name: https
|
|
123
|
+
port: 443
|
|
124
|
+
targetPort: 8443
|
|
125
|
+
protocol: TCP
|
|
126
|
+
- name: grpc
|
|
127
|
+
port: 9090
|
|
128
|
+
targetPort: 9090
|
|
129
|
+
protocol: TCP
|
|
130
|
+
- name: metrics
|
|
131
|
+
port: 9091
|
|
132
|
+
targetPort: 9091
|
|
133
|
+
protocol: TCP
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
# Template 6: Service with Session Affinity
|
|
137
|
+
apiVersion: v1
|
|
138
|
+
kind: Service
|
|
139
|
+
metadata:
|
|
140
|
+
name: <app-name>-sticky
|
|
141
|
+
namespace: <namespace>
|
|
142
|
+
labels:
|
|
143
|
+
app.kubernetes.io/name: <app-name>
|
|
144
|
+
spec:
|
|
145
|
+
type: ClusterIP
|
|
146
|
+
selector:
|
|
147
|
+
app.kubernetes.io/name: <app-name>
|
|
148
|
+
ports:
|
|
149
|
+
- name: http
|
|
150
|
+
port: 80
|
|
151
|
+
targetPort: 8080
|
|
152
|
+
protocol: TCP
|
|
153
|
+
sessionAffinity: ClientIP
|
|
154
|
+
sessionAffinityConfig:
|
|
155
|
+
clientIP:
|
|
156
|
+
timeoutSeconds: 10800 # 3 hours
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
# Template 7: ExternalName Service (External Service Mapping)
|
|
160
|
+
apiVersion: v1
|
|
161
|
+
kind: Service
|
|
162
|
+
metadata:
|
|
163
|
+
name: external-db
|
|
164
|
+
namespace: <namespace>
|
|
165
|
+
spec:
|
|
166
|
+
type: ExternalName
|
|
167
|
+
externalName: db.example.com
|
|
168
|
+
ports:
|
|
169
|
+
- port: 5432
|
|
170
|
+
targetPort: 5432
|
|
171
|
+
protocol: TCP
|