specweave 0.3.13 → 0.4.0

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.
Files changed (112) hide show
  1. package/CLAUDE.md +17 -1
  2. package/README.md +1 -1
  3. package/bin/install-all.sh +9 -2
  4. package/bin/install-hooks.sh +57 -0
  5. package/dist/cli/commands/init.d.ts.map +1 -1
  6. package/dist/cli/commands/init.js +55 -0
  7. package/dist/cli/commands/init.js.map +1 -1
  8. package/dist/core/agent-model-manager.d.ts +52 -0
  9. package/dist/core/agent-model-manager.d.ts.map +1 -0
  10. package/dist/core/agent-model-manager.js +120 -0
  11. package/dist/core/agent-model-manager.js.map +1 -0
  12. package/dist/core/cost-tracker.d.ts +108 -0
  13. package/dist/core/cost-tracker.d.ts.map +1 -0
  14. package/dist/core/cost-tracker.js +281 -0
  15. package/dist/core/cost-tracker.js.map +1 -0
  16. package/dist/core/model-selector.d.ts +57 -0
  17. package/dist/core/model-selector.d.ts.map +1 -0
  18. package/dist/core/model-selector.js +115 -0
  19. package/dist/core/model-selector.js.map +1 -0
  20. package/dist/core/phase-detector.d.ts +62 -0
  21. package/dist/core/phase-detector.d.ts.map +1 -0
  22. package/dist/core/phase-detector.js +229 -0
  23. package/dist/core/phase-detector.js.map +1 -0
  24. package/dist/types/cost-tracking.d.ts +43 -0
  25. package/dist/types/cost-tracking.d.ts.map +1 -0
  26. package/dist/types/cost-tracking.js +8 -0
  27. package/dist/types/cost-tracking.js.map +1 -0
  28. package/dist/types/model-selection.d.ts +53 -0
  29. package/dist/types/model-selection.d.ts.map +1 -0
  30. package/dist/types/model-selection.js +12 -0
  31. package/dist/types/model-selection.js.map +1 -0
  32. package/dist/utils/cost-reporter.d.ts +58 -0
  33. package/dist/utils/cost-reporter.d.ts.map +1 -0
  34. package/dist/utils/cost-reporter.js +224 -0
  35. package/dist/utils/cost-reporter.js.map +1 -0
  36. package/dist/utils/pricing-constants.d.ts +70 -0
  37. package/dist/utils/pricing-constants.d.ts.map +1 -0
  38. package/dist/utils/pricing-constants.js +71 -0
  39. package/dist/utils/pricing-constants.js.map +1 -0
  40. package/package.json +1 -1
  41. package/src/agents/architect/AGENT.md +3 -0
  42. package/src/agents/code-reviewer.md +156 -0
  43. package/src/agents/data-scientist/AGENT.md +181 -0
  44. package/src/agents/database-optimizer/AGENT.md +147 -0
  45. package/src/agents/devops/AGENT.md +3 -0
  46. package/src/agents/diagrams-architect/AGENT.md +3 -0
  47. package/src/agents/docs-writer/AGENT.md +3 -0
  48. package/src/agents/kubernetes-architect/AGENT.md +142 -0
  49. package/src/agents/ml-engineer/AGENT.md +150 -0
  50. package/src/agents/mlops-engineer/AGENT.md +201 -0
  51. package/src/agents/network-engineer/AGENT.md +149 -0
  52. package/src/agents/observability-engineer/AGENT.md +213 -0
  53. package/src/agents/payment-integration/AGENT.md +35 -0
  54. package/src/agents/performance/AGENT.md +3 -0
  55. package/src/agents/performance-engineer/AGENT.md +153 -0
  56. package/src/agents/pm/AGENT.md +3 -0
  57. package/src/agents/qa-lead/AGENT.md +3 -0
  58. package/src/agents/security/AGENT.md +3 -0
  59. package/src/agents/sre/AGENT.md +3 -0
  60. package/src/agents/tdd-orchestrator/AGENT.md +169 -0
  61. package/src/agents/tech-lead/AGENT.md +3 -0
  62. package/src/commands/specweave.costs.md +261 -0
  63. package/src/commands/specweave.ml-pipeline.md +292 -0
  64. package/src/commands/specweave.monitor-setup.md +501 -0
  65. package/src/commands/specweave.slo-implement.md +1055 -0
  66. package/src/commands/specweave.sync-github.md +1 -1
  67. package/src/commands/specweave.tdd-cycle.md +199 -0
  68. package/src/commands/specweave.tdd-green.md +842 -0
  69. package/src/commands/specweave.tdd-red.md +135 -0
  70. package/src/commands/specweave.tdd-refactor.md +165 -0
  71. package/src/skills/SKILLS-INDEX.md +18 -10
  72. package/src/skills/billing-automation/SKILL.md +559 -0
  73. package/src/skills/distributed-tracing/SKILL.md +438 -0
  74. package/src/skills/e2e-playwright/README.md +1 -1
  75. package/src/skills/e2e-playwright/package.json +1 -1
  76. package/src/skills/gitops-workflow/SKILL.md +285 -0
  77. package/src/skills/gitops-workflow/references/argocd-setup.md +134 -0
  78. package/src/skills/gitops-workflow/references/sync-policies.md +131 -0
  79. package/src/skills/grafana-dashboards/SKILL.md +369 -0
  80. package/src/skills/helm-chart-scaffolding/SKILL.md +544 -0
  81. package/src/skills/helm-chart-scaffolding/assets/Chart.yaml.template +42 -0
  82. package/src/skills/helm-chart-scaffolding/assets/values.yaml.template +185 -0
  83. package/src/skills/helm-chart-scaffolding/references/chart-structure.md +500 -0
  84. package/src/skills/helm-chart-scaffolding/scripts/validate-chart.sh +244 -0
  85. package/src/skills/k8s-manifest-generator/SKILL.md +511 -0
  86. package/src/skills/k8s-manifest-generator/assets/configmap-template.yaml +296 -0
  87. package/src/skills/k8s-manifest-generator/assets/deployment-template.yaml +203 -0
  88. package/src/skills/k8s-manifest-generator/assets/service-template.yaml +171 -0
  89. package/src/skills/k8s-manifest-generator/references/deployment-spec.md +753 -0
  90. package/src/skills/k8s-manifest-generator/references/service-spec.md +724 -0
  91. package/src/skills/k8s-security-policies/SKILL.md +334 -0
  92. package/src/skills/k8s-security-policies/assets/network-policy-template.yaml +177 -0
  93. package/src/skills/k8s-security-policies/references/rbac-patterns.md +187 -0
  94. package/src/skills/ml-pipeline-workflow/SKILL.md +245 -0
  95. package/src/skills/paypal-integration/SKILL.md +467 -0
  96. package/src/skills/pci-compliance/SKILL.md +466 -0
  97. package/src/skills/prometheus-configuration/SKILL.md +392 -0
  98. package/src/skills/slo-implementation/SKILL.md +329 -0
  99. package/src/skills/stripe-integration/SKILL.md +442 -0
  100. package/src/skills/tdd-workflow/SKILL.md +378 -0
  101. package/src/templates/README.md.template +1 -1
  102. package/src/skills/bmad-method-expert/SKILL.md +0 -626
  103. package/src/skills/bmad-method-expert/scripts/analyze-project.js +0 -318
  104. package/src/skills/bmad-method-expert/scripts/check-setup.js +0 -208
  105. package/src/skills/bmad-method-expert/scripts/generate-template.js +0 -1149
  106. package/src/skills/bmad-method-expert/scripts/validate-documents.js +0 -340
  107. package/src/skills/context-optimizer/SKILL.md +0 -588
  108. package/src/skills/figma-designer/SKILL.md +0 -149
  109. package/src/skills/figma-implementer/SKILL.md +0 -148
  110. package/src/skills/figma-mcp-connector/SKILL.md +0 -136
  111. package/src/skills/figma-to-code/SKILL.md +0 -128
  112. package/src/skills/spec-kit-expert/SKILL.md +0 -1010
@@ -0,0 +1,724 @@
1
+ # Kubernetes Service Specification Reference
2
+
3
+ Comprehensive reference for Kubernetes Service resources, covering service types, networking, load balancing, and service discovery patterns.
4
+
5
+ ## Overview
6
+
7
+ A Service provides stable network endpoints for accessing Pods. Services enable loose coupling between microservices by providing service discovery and load balancing.
8
+
9
+ ## Service Types
10
+
11
+ ### 1. ClusterIP (Default)
12
+
13
+ Exposes the service on an internal cluster IP. Only reachable from within the cluster.
14
+
15
+ ```yaml
16
+ apiVersion: v1
17
+ kind: Service
18
+ metadata:
19
+ name: backend-service
20
+ namespace: production
21
+ spec:
22
+ type: ClusterIP
23
+ selector:
24
+ app: backend
25
+ ports:
26
+ - name: http
27
+ port: 80
28
+ targetPort: 8080
29
+ protocol: TCP
30
+ sessionAffinity: None
31
+ ```
32
+
33
+ **Use cases:**
34
+ - Internal microservice communication
35
+ - Database services
36
+ - Internal APIs
37
+ - Message queues
38
+
39
+ ### 2. NodePort
40
+
41
+ Exposes the service on each Node's IP at a static port (30000-32767 range).
42
+
43
+ ```yaml
44
+ apiVersion: v1
45
+ kind: Service
46
+ metadata:
47
+ name: frontend-service
48
+ spec:
49
+ type: NodePort
50
+ selector:
51
+ app: frontend
52
+ ports:
53
+ - name: http
54
+ port: 80
55
+ targetPort: 8080
56
+ nodePort: 30080 # Optional, auto-assigned if omitted
57
+ protocol: TCP
58
+ ```
59
+
60
+ **Use cases:**
61
+ - Development/testing external access
62
+ - Small deployments without load balancer
63
+ - Direct node access requirements
64
+
65
+ **Limitations:**
66
+ - Limited port range (30000-32767)
67
+ - Must handle node failures
68
+ - No built-in load balancing across nodes
69
+
70
+ ### 3. LoadBalancer
71
+
72
+ Exposes the service using a cloud provider's load balancer.
73
+
74
+ ```yaml
75
+ apiVersion: v1
76
+ kind: Service
77
+ metadata:
78
+ name: public-api
79
+ annotations:
80
+ service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
81
+ service.beta.kubernetes.io/aws-load-balancer-scheme: "internet-facing"
82
+ spec:
83
+ type: LoadBalancer
84
+ selector:
85
+ app: api
86
+ ports:
87
+ - name: https
88
+ port: 443
89
+ targetPort: 8443
90
+ protocol: TCP
91
+ loadBalancerSourceRanges:
92
+ - 203.0.113.0/24
93
+ ```
94
+
95
+ **Cloud-specific annotations:**
96
+
97
+ **AWS:**
98
+ ```yaml
99
+ annotations:
100
+ service.beta.kubernetes.io/aws-load-balancer-type: "nlb" # or "external"
101
+ service.beta.kubernetes.io/aws-load-balancer-scheme: "internet-facing"
102
+ service.beta.kubernetes.io/aws-load-balancer-cross-zone-load-balancing-enabled: "true"
103
+ service.beta.kubernetes.io/aws-load-balancer-ssl-cert: "arn:aws:acm:..."
104
+ service.beta.kubernetes.io/aws-load-balancer-backend-protocol: "http"
105
+ ```
106
+
107
+ **Azure:**
108
+ ```yaml
109
+ annotations:
110
+ service.beta.kubernetes.io/azure-load-balancer-internal: "true"
111
+ service.beta.kubernetes.io/azure-pip-name: "my-public-ip"
112
+ ```
113
+
114
+ **GCP:**
115
+ ```yaml
116
+ annotations:
117
+ cloud.google.com/load-balancer-type: "Internal"
118
+ cloud.google.com/backend-config: '{"default": "my-backend-config"}'
119
+ ```
120
+
121
+ ### 4. ExternalName
122
+
123
+ Maps service to external DNS name (CNAME record).
124
+
125
+ ```yaml
126
+ apiVersion: v1
127
+ kind: Service
128
+ metadata:
129
+ name: external-db
130
+ spec:
131
+ type: ExternalName
132
+ externalName: db.external.example.com
133
+ ports:
134
+ - port: 5432
135
+ ```
136
+
137
+ **Use cases:**
138
+ - Accessing external services
139
+ - Service migration scenarios
140
+ - Multi-cluster service references
141
+
142
+ ## Complete Service Specification
143
+
144
+ ```yaml
145
+ apiVersion: v1
146
+ kind: Service
147
+ metadata:
148
+ name: my-service
149
+ namespace: production
150
+ labels:
151
+ app: my-app
152
+ tier: backend
153
+ annotations:
154
+ description: "Main application service"
155
+ prometheus.io/scrape: "true"
156
+ spec:
157
+ # Service type
158
+ type: ClusterIP
159
+
160
+ # Pod selector
161
+ selector:
162
+ app: my-app
163
+ version: v1
164
+
165
+ # Ports configuration
166
+ ports:
167
+ - name: http
168
+ port: 80 # Service port
169
+ targetPort: 8080 # Container port (or named port)
170
+ protocol: TCP # TCP, UDP, or SCTP
171
+
172
+ # Session affinity
173
+ sessionAffinity: ClientIP
174
+ sessionAffinityConfig:
175
+ clientIP:
176
+ timeoutSeconds: 10800
177
+
178
+ # IP configuration
179
+ clusterIP: 10.0.0.10 # Optional: specific IP
180
+ clusterIPs:
181
+ - 10.0.0.10
182
+ ipFamilies:
183
+ - IPv4
184
+ ipFamilyPolicy: SingleStack
185
+
186
+ # External traffic policy
187
+ externalTrafficPolicy: Local
188
+
189
+ # Internal traffic policy
190
+ internalTrafficPolicy: Local
191
+
192
+ # Health check
193
+ healthCheckNodePort: 30000
194
+
195
+ # Load balancer config (for type: LoadBalancer)
196
+ loadBalancerIP: 203.0.113.100
197
+ loadBalancerSourceRanges:
198
+ - 203.0.113.0/24
199
+
200
+ # External IPs
201
+ externalIPs:
202
+ - 80.11.12.10
203
+
204
+ # Publishing strategy
205
+ publishNotReadyAddresses: false
206
+ ```
207
+
208
+ ## Port Configuration
209
+
210
+ ### Named Ports
211
+
212
+ Use named ports in Pods for flexibility:
213
+
214
+ **Deployment:**
215
+ ```yaml
216
+ spec:
217
+ template:
218
+ spec:
219
+ containers:
220
+ - name: app
221
+ ports:
222
+ - name: http
223
+ containerPort: 8080
224
+ - name: metrics
225
+ containerPort: 9090
226
+ ```
227
+
228
+ **Service:**
229
+ ```yaml
230
+ spec:
231
+ ports:
232
+ - name: http
233
+ port: 80
234
+ targetPort: http # References named port
235
+ - name: metrics
236
+ port: 9090
237
+ targetPort: metrics
238
+ ```
239
+
240
+ ### Multiple Ports
241
+
242
+ ```yaml
243
+ spec:
244
+ ports:
245
+ - name: http
246
+ port: 80
247
+ targetPort: 8080
248
+ protocol: TCP
249
+ - name: https
250
+ port: 443
251
+ targetPort: 8443
252
+ protocol: TCP
253
+ - name: grpc
254
+ port: 9090
255
+ targetPort: 9090
256
+ protocol: TCP
257
+ ```
258
+
259
+ ## Session Affinity
260
+
261
+ ### None (Default)
262
+
263
+ Distributes requests randomly across pods.
264
+
265
+ ```yaml
266
+ spec:
267
+ sessionAffinity: None
268
+ ```
269
+
270
+ ### ClientIP
271
+
272
+ Routes requests from same client IP to same pod.
273
+
274
+ ```yaml
275
+ spec:
276
+ sessionAffinity: ClientIP
277
+ sessionAffinityConfig:
278
+ clientIP:
279
+ timeoutSeconds: 10800 # 3 hours
280
+ ```
281
+
282
+ **Use cases:**
283
+ - Stateful applications
284
+ - Session-based applications
285
+ - WebSocket connections
286
+
287
+ ## Traffic Policies
288
+
289
+ ### External Traffic Policy
290
+
291
+ **Cluster (Default):**
292
+ ```yaml
293
+ spec:
294
+ externalTrafficPolicy: Cluster
295
+ ```
296
+ - Load balances across all nodes
297
+ - May add extra network hop
298
+ - Source IP is masked
299
+
300
+ **Local:**
301
+ ```yaml
302
+ spec:
303
+ externalTrafficPolicy: Local
304
+ ```
305
+ - Traffic goes only to pods on receiving node
306
+ - Preserves client source IP
307
+ - Better performance (no extra hop)
308
+ - May cause imbalanced load
309
+
310
+ ### Internal Traffic Policy
311
+
312
+ ```yaml
313
+ spec:
314
+ internalTrafficPolicy: Local # or Cluster
315
+ ```
316
+
317
+ Controls traffic routing for cluster-internal clients.
318
+
319
+ ## Headless Services
320
+
321
+ Service without cluster IP for direct pod access.
322
+
323
+ ```yaml
324
+ apiVersion: v1
325
+ kind: Service
326
+ metadata:
327
+ name: database
328
+ spec:
329
+ clusterIP: None # Headless
330
+ selector:
331
+ app: database
332
+ ports:
333
+ - port: 5432
334
+ targetPort: 5432
335
+ ```
336
+
337
+ **Use cases:**
338
+ - StatefulSet pod discovery
339
+ - Direct pod-to-pod communication
340
+ - Custom load balancing
341
+ - Database clusters
342
+
343
+ **DNS returns:**
344
+ - Individual pod IPs instead of service IP
345
+ - Format: `<pod-name>.<service-name>.<namespace>.svc.cluster.local`
346
+
347
+ ## Service Discovery
348
+
349
+ ### DNS
350
+
351
+ **ClusterIP Service:**
352
+ ```
353
+ <service-name>.<namespace>.svc.cluster.local
354
+ ```
355
+
356
+ Example:
357
+ ```bash
358
+ curl http://backend-service.production.svc.cluster.local
359
+ ```
360
+
361
+ **Within same namespace:**
362
+ ```bash
363
+ curl http://backend-service
364
+ ```
365
+
366
+ **Headless Service (returns pod IPs):**
367
+ ```
368
+ <pod-name>.<service-name>.<namespace>.svc.cluster.local
369
+ ```
370
+
371
+ ### Environment Variables
372
+
373
+ Kubernetes injects service info into pods:
374
+
375
+ ```bash
376
+ # Service host and port
377
+ BACKEND_SERVICE_SERVICE_HOST=10.0.0.100
378
+ BACKEND_SERVICE_SERVICE_PORT=80
379
+
380
+ # For named ports
381
+ BACKEND_SERVICE_SERVICE_PORT_HTTP=80
382
+ ```
383
+
384
+ **Note:** Pods must be created after the service for env vars to be injected.
385
+
386
+ ## Load Balancing
387
+
388
+ ### Algorithms
389
+
390
+ Kubernetes uses random selection by default. For advanced load balancing:
391
+
392
+ **Service Mesh (Istio example):**
393
+ ```yaml
394
+ apiVersion: networking.istio.io/v1beta1
395
+ kind: DestinationRule
396
+ metadata:
397
+ name: my-destination-rule
398
+ spec:
399
+ host: my-service
400
+ trafficPolicy:
401
+ loadBalancer:
402
+ simple: LEAST_REQUEST # or ROUND_ROBIN, RANDOM, PASSTHROUGH
403
+ connectionPool:
404
+ tcp:
405
+ maxConnections: 100
406
+ ```
407
+
408
+ ### Connection Limits
409
+
410
+ Use pod disruption budgets and resource limits:
411
+
412
+ ```yaml
413
+ apiVersion: policy/v1
414
+ kind: PodDisruptionBudget
415
+ metadata:
416
+ name: my-app-pdb
417
+ spec:
418
+ minAvailable: 2
419
+ selector:
420
+ matchLabels:
421
+ app: my-app
422
+ ```
423
+
424
+ ## Service Mesh Integration
425
+
426
+ ### Istio Virtual Service
427
+
428
+ ```yaml
429
+ apiVersion: networking.istio.io/v1beta1
430
+ kind: VirtualService
431
+ metadata:
432
+ name: my-service
433
+ spec:
434
+ hosts:
435
+ - my-service
436
+ http:
437
+ - match:
438
+ - headers:
439
+ version:
440
+ exact: v2
441
+ route:
442
+ - destination:
443
+ host: my-service
444
+ subset: v2
445
+ - route:
446
+ - destination:
447
+ host: my-service
448
+ subset: v1
449
+ weight: 90
450
+ - destination:
451
+ host: my-service
452
+ subset: v2
453
+ weight: 10
454
+ ```
455
+
456
+ ## Common Patterns
457
+
458
+ ### Pattern 1: Internal Microservice
459
+
460
+ ```yaml
461
+ apiVersion: v1
462
+ kind: Service
463
+ metadata:
464
+ name: user-service
465
+ namespace: backend
466
+ labels:
467
+ app: user-service
468
+ tier: backend
469
+ spec:
470
+ type: ClusterIP
471
+ selector:
472
+ app: user-service
473
+ ports:
474
+ - name: http
475
+ port: 8080
476
+ targetPort: http
477
+ protocol: TCP
478
+ - name: grpc
479
+ port: 9090
480
+ targetPort: grpc
481
+ protocol: TCP
482
+ ```
483
+
484
+ ### Pattern 2: Public API with Load Balancer
485
+
486
+ ```yaml
487
+ apiVersion: v1
488
+ kind: Service
489
+ metadata:
490
+ name: api-gateway
491
+ annotations:
492
+ service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
493
+ service.beta.kubernetes.io/aws-load-balancer-ssl-cert: "arn:aws:acm:..."
494
+ spec:
495
+ type: LoadBalancer
496
+ externalTrafficPolicy: Local
497
+ selector:
498
+ app: api-gateway
499
+ ports:
500
+ - name: https
501
+ port: 443
502
+ targetPort: 8443
503
+ protocol: TCP
504
+ loadBalancerSourceRanges:
505
+ - 0.0.0.0/0
506
+ ```
507
+
508
+ ### Pattern 3: StatefulSet with Headless Service
509
+
510
+ ```yaml
511
+ apiVersion: v1
512
+ kind: Service
513
+ metadata:
514
+ name: cassandra
515
+ spec:
516
+ clusterIP: None
517
+ selector:
518
+ app: cassandra
519
+ ports:
520
+ - port: 9042
521
+ targetPort: 9042
522
+ ---
523
+ apiVersion: apps/v1
524
+ kind: StatefulSet
525
+ metadata:
526
+ name: cassandra
527
+ spec:
528
+ serviceName: cassandra
529
+ replicas: 3
530
+ selector:
531
+ matchLabels:
532
+ app: cassandra
533
+ template:
534
+ metadata:
535
+ labels:
536
+ app: cassandra
537
+ spec:
538
+ containers:
539
+ - name: cassandra
540
+ image: cassandra:4.0
541
+ ```
542
+
543
+ ### Pattern 4: External Service Mapping
544
+
545
+ ```yaml
546
+ apiVersion: v1
547
+ kind: Service
548
+ metadata:
549
+ name: external-database
550
+ spec:
551
+ type: ExternalName
552
+ externalName: prod-db.cxyz.us-west-2.rds.amazonaws.com
553
+ ---
554
+ # Or with Endpoints for IP-based external service
555
+ apiVersion: v1
556
+ kind: Service
557
+ metadata:
558
+ name: external-api
559
+ spec:
560
+ ports:
561
+ - port: 443
562
+ targetPort: 443
563
+ protocol: TCP
564
+ ---
565
+ apiVersion: v1
566
+ kind: Endpoints
567
+ metadata:
568
+ name: external-api
569
+ subsets:
570
+ - addresses:
571
+ - ip: 203.0.113.100
572
+ ports:
573
+ - port: 443
574
+ ```
575
+
576
+ ### Pattern 5: Multi-Port Service with Metrics
577
+
578
+ ```yaml
579
+ apiVersion: v1
580
+ kind: Service
581
+ metadata:
582
+ name: web-app
583
+ annotations:
584
+ prometheus.io/scrape: "true"
585
+ prometheus.io/port: "9090"
586
+ prometheus.io/path: "/metrics"
587
+ spec:
588
+ type: ClusterIP
589
+ selector:
590
+ app: web-app
591
+ ports:
592
+ - name: http
593
+ port: 80
594
+ targetPort: 8080
595
+ - name: metrics
596
+ port: 9090
597
+ targetPort: 9090
598
+ ```
599
+
600
+ ## Network Policies
601
+
602
+ Control traffic to services:
603
+
604
+ ```yaml
605
+ apiVersion: networking.k8s.io/v1
606
+ kind: NetworkPolicy
607
+ metadata:
608
+ name: allow-frontend-to-backend
609
+ spec:
610
+ podSelector:
611
+ matchLabels:
612
+ app: backend
613
+ policyTypes:
614
+ - Ingress
615
+ ingress:
616
+ - from:
617
+ - podSelector:
618
+ matchLabels:
619
+ app: frontend
620
+ ports:
621
+ - protocol: TCP
622
+ port: 8080
623
+ ```
624
+
625
+ ## Best Practices
626
+
627
+ ### Service Configuration
628
+
629
+ 1. **Use named ports** for flexibility
630
+ 2. **Set appropriate service type** based on exposure needs
631
+ 3. **Use labels and selectors consistently** across Deployments and Services
632
+ 4. **Configure session affinity** for stateful apps
633
+ 5. **Set external traffic policy to Local** for IP preservation
634
+ 6. **Use headless services** for StatefulSets
635
+ 7. **Implement network policies** for security
636
+ 8. **Add monitoring annotations** for observability
637
+
638
+ ### Production Checklist
639
+
640
+ - [ ] Service type appropriate for use case
641
+ - [ ] Selector matches pod labels
642
+ - [ ] Named ports used for clarity
643
+ - [ ] Session affinity configured if needed
644
+ - [ ] Traffic policy set appropriately
645
+ - [ ] Load balancer annotations configured (if applicable)
646
+ - [ ] Source IP ranges restricted (for public services)
647
+ - [ ] Health check configuration validated
648
+ - [ ] Monitoring annotations added
649
+ - [ ] Network policies defined
650
+
651
+ ### Performance Tuning
652
+
653
+ **For high traffic:**
654
+ ```yaml
655
+ spec:
656
+ externalTrafficPolicy: Local
657
+ sessionAffinity: ClientIP
658
+ sessionAffinityConfig:
659
+ clientIP:
660
+ timeoutSeconds: 3600
661
+ ```
662
+
663
+ **For WebSocket/long connections:**
664
+ ```yaml
665
+ spec:
666
+ sessionAffinity: ClientIP
667
+ sessionAffinityConfig:
668
+ clientIP:
669
+ timeoutSeconds: 86400 # 24 hours
670
+ ```
671
+
672
+ ## Troubleshooting
673
+
674
+ ### Service not accessible
675
+
676
+ ```bash
677
+ # Check service exists
678
+ kubectl get service <service-name>
679
+
680
+ # Check endpoints (should show pod IPs)
681
+ kubectl get endpoints <service-name>
682
+
683
+ # Describe service
684
+ kubectl describe service <service-name>
685
+
686
+ # Check if pods match selector
687
+ kubectl get pods -l app=<app-name>
688
+ ```
689
+
690
+ **Common issues:**
691
+ - Selector doesn't match pod labels
692
+ - No pods running (endpoints empty)
693
+ - Ports misconfigured
694
+ - Network policy blocking traffic
695
+
696
+ ### DNS resolution failing
697
+
698
+ ```bash
699
+ # Test DNS from pod
700
+ kubectl run debug --rm -it --image=busybox -- nslookup <service-name>
701
+
702
+ # Check CoreDNS
703
+ kubectl get pods -n kube-system -l k8s-app=kube-dns
704
+ kubectl logs -n kube-system -l k8s-app=kube-dns
705
+ ```
706
+
707
+ ### Load balancer issues
708
+
709
+ ```bash
710
+ # Check load balancer status
711
+ kubectl describe service <service-name>
712
+
713
+ # Check events
714
+ kubectl get events --sort-by='.lastTimestamp'
715
+
716
+ # Verify cloud provider configuration
717
+ kubectl describe node
718
+ ```
719
+
720
+ ## Related Resources
721
+
722
+ - [Kubernetes Service API Reference](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#service-v1-core)
723
+ - [Service Networking](https://kubernetes.io/docs/concepts/services-networking/service/)
724
+ - [DNS for Services and Pods](https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/)