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,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/)
|