Preface |
|
xi | |
1 Introduction to Cloud Native |
|
1 | (8) |
|
|
1 | (3) |
|
Fallacies of Distributed Systems |
|
|
1 | (2) |
|
|
3 | (1) |
|
|
4 | (2) |
|
Availability and Service-Level Agreements |
|
|
6 | (1) |
|
|
7 | (2) |
2 Fundamentals |
|
9 | (20) |
|
|
9 | (8) |
|
Container Isolation Levels |
|
|
11 | (2) |
|
|
13 | (1) |
|
|
13 | (3) |
|
Kubernetes and Containers |
|
|
16 | (1) |
|
|
17 | (1) |
|
|
18 | (1) |
|
|
19 | (3) |
|
|
19 | (1) |
|
Application Modernization |
|
|
20 | (2) |
|
|
22 | (1) |
|
|
22 | (5) |
|
Benefits of a Microservices Architecture |
|
|
23 | (2) |
|
Challenges with a Microservices Architecture |
|
|
25 | (2) |
|
|
27 | (2) |
3 Designing Cloud Native Applications |
|
29 | (44) |
|
Fundamentals of Cloud Native Applications |
|
|
29 | (5) |
|
|
29 | (2) |
|
|
31 | (2) |
|
Reliability and Availability |
|
|
33 | (1) |
|
|
34 | (1) |
|
Cloud Native versus Traditional Architectures |
|
|
34 | (5) |
|
Functions versus Services |
|
|
39 | (3) |
|
|
39 | (1) |
|
Considerations for Using Functions |
|
|
39 | (1) |
|
Composite of Functions and Services |
|
|
40 | (2) |
|
API Design and Versioning |
|
|
42 | (3) |
|
API Backward and Forward Compatibility |
|
|
44 | (1) |
|
|
45 | (1) |
|
|
45 | (10) |
|
|
46 | (1) |
|
|
47 | (1) |
|
Serialization Considerations |
|
|
48 | (1) |
|
|
49 | (1) |
|
|
49 | (2) |
|
|
51 | (2) |
|
Choosing Between Pub/Sub and Request Response |
|
|
53 | (1) |
|
Synchronous versus Asynchronous |
|
|
54 | (1) |
|
|
55 | (3) |
|
|
55 | (1) |
|
|
56 | (1) |
|
|
57 | (1) |
|
|
58 | (1) |
|
|
58 | (1) |
|
|
59 | (9) |
|
|
68 | (4) |
|
|
72 | (1) |
4 Working with Data |
|
73 | (36) |
|
|
75 | (7) |
|
Objects, Files, and Disks |
|
|
75 | (1) |
|
|
76 | (3) |
|
|
79 | (1) |
|
|
79 | (1) |
|
|
80 | (2) |
|
Data in Multiple Datastores |
|
|
82 | (10) |
|
|
83 | (3) |
|
Write Changes as an Event to a Change Log |
|
|
86 | (1) |
|
|
86 | (2) |
|
Compensating Transactions |
|
|
88 | (1) |
|
Extract, Transform, and Load |
|
|
89 | (1) |
|
Microservices and Data Lakes |
|
|
89 | (3) |
|
|
92 | (4) |
|
Restricted Client Tokens (Valet-Key) |
|
|
93 | (1) |
|
Database Services with Fine-Grained Access Control |
|
|
94 | (1) |
|
|
95 | (1) |
|
|
96 | (4) |
|
|
97 | (1) |
|
|
97 | (1) |
|
Content Delivery Networks |
|
|
98 | (2) |
|
|
100 | (3) |
|
|
100 | (1) |
|
|
100 | (1) |
|
Data Lakes on Object Storage |
|
|
101 | (1) |
|
Data Lakes and Data Warehouses |
|
|
101 | (1) |
|
Distributed Query Engines |
|
|
102 | (1) |
|
|
103 | (4) |
|
|
104 | (1) |
|
|
105 | (1) |
|
|
106 | (1) |
|
|
107 | (2) |
5 DevOps |
|
109 | (50) |
|
|
109 | (3) |
|
|
109 | (1) |
|
|
110 | (1) |
|
Lean Principles and Processes |
|
|
110 | (1) |
|
|
111 | (1) |
|
|
111 | (1) |
|
|
112 | (11) |
|
|
113 | (1) |
|
|
113 | (5) |
|
When to Run Which Types of Tests |
|
|
118 | (1) |
|
|
119 | (1) |
|
|
120 | (3) |
|
Development Environments and Tools |
|
|
123 | (7) |
|
|
124 | (2) |
|
|
126 | (1) |
|
Local Development Environments |
|
|
126 | (1) |
|
Local Development with a Remote Cluster |
|
|
127 | (1) |
|
Skaffold Development Workflow |
|
|
128 | (1) |
|
Remote Cluster Routed to Local Development |
|
|
129 | (1) |
|
Cloud Development Environments |
|
|
130 | (1) |
|
|
130 | (8) |
|
|
131 | (2) |
|
|
133 | (1) |
|
|
133 | (1) |
|
|
134 | (2) |
|
|
136 | (1) |
|
|
137 | (1) |
|
|
138 | (11) |
|
|
139 | (5) |
|
|
144 | (5) |
|
|
149 | (6) |
|
Single-Environment Variable |
|
|
151 | (1) |
|
Multiple-Environment Variables |
|
|
151 | (1) |
|
Adding ConfigMap Data to a Volume |
|
|
151 | (1) |
|
|
152 | (1) |
|
|
153 | (2) |
|
|
155 | (3) |
|
|
158 | (1) |
6 Best Practices |
|
159 | (24) |
|
|
159 | (4) |
|
Breaking Up the Monolith for the Right Reasons |
|
|
159 | (1) |
|
Decouple Simple Services First |
|
|
160 | (1) |
|
Learn to Operate on a Small Scale |
|
|
160 | (1) |
|
Use an Anticorruption Layer Pattern |
|
|
160 | (1) |
|
|
161 | (1) |
|
Come Up with a Data Migration Strategy |
|
|
162 | (1) |
|
Rewrite Any Boilerplate Code |
|
|
162 | (1) |
|
Reconsider Frameworks, Languages, Data Structures, and Datastores |
|
|
163 | (1) |
|
|
163 | (1) |
|
|
163 | (2) |
|
Handle Transient Failures with Retries |
|
|
163 | (1) |
|
Use a Finite Number of Retries |
|
|
164 | (1) |
|
Use Circuit Breakers for Nontransient Failures |
|
|
164 | (1) |
|
|
164 | (1) |
|
|
164 | (1) |
|
Implement Health Checks and Readiness Checks |
|
|
165 | (1) |
|
Define CPU and Memory Limits for Your Containers |
|
|
165 | (1) |
|
Implement Rate Limiting and Throttling |
|
|
165 | (1) |
|
|
165 | (2) |
|
Treat Security Requirements the Same as Any Other Requirements |
|
|
165 | (1) |
|
Incorporate Security in Your Designs |
|
|
166 | (1) |
|
Grant Least-Privileged Access |
|
|
166 | (1) |
|
Use Separate Accounts/Subscriptions/Tenants |
|
|
166 | (1) |
|
Securely Store All Secrets |
|
|
166 | (1) |
|
|
166 | (1) |
|
|
167 | (1) |
|
Use Federated Identity Management |
|
|
167 | (1) |
|
Use Role-Based Access Control |
|
|
167 | (1) |
|
|
167 | (1) |
|
|
167 | (2) |
|
Use Managed Databases and Analytics Services |
|
|
168 | (1) |
|
Use a Datastore That Best Fits Data Requirements |
|
|
168 | (1) |
|
Keep Data in Multiple Regions or Zones |
|
|
168 | (1) |
|
Use Data Partitioning and Replication for Scale |
|
|
168 | (1) |
|
Avoid Overfetching and Chatty I/O |
|
|
169 | (1) |
|
Don't Put Business Logic in the Database |
|
|
169 | (1) |
|
Test with Production-like Data |
|
|
169 | (1) |
|
Handle Transient Failures |
|
|
169 | (1) |
|
Performance and Scalability |
|
|
169 | (2) |
|
Design Stateless Services That Scale Out |
|
|
170 | (1) |
|
Use Platform Autoscaling Features |
|
|
170 | (1) |
|
|
170 | (1) |
|
Use Partitioning to Scale Beyond Service Limits |
|
|
170 | (1) |
|
|
171 | (1) |
|
Write Single-Purpose Functions |
|
|
171 | (1) |
|
|
171 | (1) |
|
Keep Functions Light and Simple |
|
|
171 | (1) |
|
|
171 | (1) |
|
Separate Function Entry Point from the Function Logic |
|
|
171 | (1) |
|
Avoid Long-Running Functions |
|
|
172 | (1) |
|
Use Queues for Cross-Function Communication |
|
|
172 | (1) |
|
|
172 | (2) |
|
Deployments and Releases Are Separate Activities |
|
|
172 | (1) |
|
|
172 | (1) |
|
CI/CD Definition Lives with the Component |
|
|
172 | (1) |
|
Consistent Application Deployment |
|
|
173 | (1) |
|
Use Zero-Downtime Releases |
|
|
173 | (1) |
|
Don't Modify Deployed Infrastructure |
|
|
173 | (1) |
|
|
173 | (1) |
|
Describe Infrastructure Using Code |
|
|
173 | (1) |
|
Use Namespaces to Organize Services in Kubernetes |
|
|
173 | (1) |
|
|
173 | (1) |
|
Separate Function Source Code |
|
|
173 | (1) |
|
Correlate Deployments with Commits |
|
|
174 | (1) |
|
Logging, Monitoring, and Alerting |
|
|
174 | (2) |
|
Use a Unified Logging System |
|
|
174 | (1) |
|
|
174 | (1) |
|
Include Context with Log Entries |
|
|
174 | (1) |
|
Common and Structured Logging Format |
|
|
174 | (1) |
|
Tag Your Metrics Appropriately |
|
|
175 | (1) |
|
|
175 | (1) |
|
Define and Alert on Key Performance Indicators |
|
|
175 | (1) |
|
Continuous Testing in Production |
|
|
175 | (1) |
|
|
176 | (1) |
|
|
176 | (2) |
|
Design for Backward and Forward Compatibility |
|
|
176 | (1) |
|
Define Service Contracts That Do Not Leak Internal Details |
|
|
177 | (1) |
|
Prefer Asynchronous Communication |
|
|
177 | (1) |
|
Use Efficient Serialization Techniques |
|
|
177 | (1) |
|
Use Queues or Streams to Handle Heavy Loads and Traffic Spikes |
|
|
178 | (1) |
|
Batch Requests for Efficiency |
|
|
178 | (1) |
|
|
178 | (1) |
|
|
178 | (3) |
|
Store Images in a Trusted Registry |
|
|
179 | (1) |
|
Utilize the Docker Build Cache |
|
|
179 | (1) |
|
Don't Run Containers in Privileged Mode |
|
|
179 | (1) |
|
Use Explicit Container Image Tags |
|
|
179 | (1) |
|
Keep Container Images Small |
|
|
179 | (1) |
|
Run One Application per Container |
|
|
180 | (1) |
|
Use Verified Images from Trusted Repositories |
|
|
180 | (1) |
|
Use Vulnerability Scanning Tools on Images |
|
|
180 | (1) |
|
Don't Store Data in Containers |
|
|
181 | (1) |
|
Never Store Secrets or Configuration Inside an Image |
|
|
181 | (1) |
|
|
181 | (2) |
7 Portability |
|
183 | (14) |
|
Why Make Applications Portable? |
|
|
183 | (1) |
|
|
184 | (1) |
|
Data Gravity and Portability |
|
|
185 | (1) |
|
When and How to Implement Portability |
|
|
185 | (10) |
|
|
186 | (1) |
|
Common Services and Features |
|
|
187 | (1) |
|
|
187 | (2) |
|
Managed Services from Other Vendors |
|
|
189 | (1) |
|
|
190 | (3) |
|
Kubernetes as a Portability Layer |
|
|
193 | (2) |
|
|
195 | (2) |
Index |
|
197 | |