├── 01-nginx-ingress-operator
└── nginxplus-ingress-operator.yaml
├── 02-virtualserver-resource
├── cafe-secret.yaml
├── cafe-vs.yaml
└── cafe.yaml
├── 03-custom-error-handler
├── cafe-secret.yaml
├── cafe-vs-customerror.yaml
└── cafe.yaml
├── 04-bluegreen
├── bluegreen-deployment.yaml
└── bluegreen-vs.yaml
├── 05-trafficsplit
├── cafe-v2.yaml
└── cafe-vs-advanced-routing.yaml
├── 06-ratelimit
├── cafe-secret.yaml
├── cafe-vs-ratelimiting.yaml
├── cafe.yaml
└── rate-limit-policy.yaml
└── README.md
/01-nginx-ingress-operator/nginxplus-ingress-operator.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: k8s.nginx.org/v1alpha1
2 | kind: NginxIngressController
3 | metadata:
4 | name: nginx-ingress-controller
5 | namespace: nginx-ingress
6 | spec:
7 | type: deployment
8 | image:
9 | repository: {nginx-plus-image}
10 | tag: {nginx-plus-image}
11 | pullPolicy: Always
12 | serviceType: NodePort
13 | enableCRDs: true
14 | nginxPlus: true
15 | ingressClass: nginx-ingress
16 | enableTLSPassthrough: true
17 | replicas: 1
18 | healthStatus:
19 | enable: true
20 | uri: "/my-health"
21 | nginxDebug: true
22 | logLevel: 3
23 | nginxStatus:
24 | enable: true
25 | port: 9090
26 | prometheus:
27 | enable: true
28 | port: 9114
29 | appProtect:
30 | enable: true
31 |
--------------------------------------------------------------------------------
/02-virtualserver-resource/cafe-secret.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: Secret
3 | metadata:
4 | name: cafe-secret
5 | type: Opaque
6 | data:
7 | tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURMakNDQWhZQ0NRREFPRjl0THNhWFdqQU5CZ2txaGtpRzl3MEJBUXNGQURCYU1Rc3dDUVlEVlFRR0V3SlYKVXpFTE1Ba0dBMVVFQ0F3Q1EwRXhJVEFmQmdOVkJBb01HRWx1ZEdWeWJtVjBJRmRwWkdkcGRITWdVSFI1SUV4MApaREViTUJrR0ExVUVBd3dTWTJGbVpTNWxlR0Z0Y0d4bExtTnZiU0FnTUI0WERURTRNRGt4TWpFMk1UVXpOVm9YCkRUSXpNRGt4TVRFMk1UVXpOVm93V0RFTE1Ba0dBMVVFQmhNQ1ZWTXhDekFKQmdOVkJBZ01Ba05CTVNFd0h3WUQKVlFRS0RCaEpiblJsY201bGRDQlhhV1JuYVhSeklGQjBlU0JNZEdReEdUQVhCZ05WQkFNTUVHTmhabVV1WlhoaApiWEJzWlM1amIyMHdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDcDZLbjdzeTgxCnAwanVKL2N5ayt2Q0FtbHNmanRGTTJtdVpOSzBLdGVjcUcyZmpXUWI1NXhRMVlGQTJYT1N3SEFZdlNkd0kyaloKcnVXOHFYWENMMnJiNENaQ0Z4d3BWRUNyY3hkam0zdGVWaVJYVnNZSW1tSkhQUFN5UWdwaW9iczl4N0RsTGM2SQpCQTBaalVPeWwwUHFHOVNKZXhNVjczV0lJYTVyRFZTRjJyNGtTa2JBajREY2o3TFhlRmxWWEgySTVYd1hDcHRDCm42N0pDZzQyZitrOHdnemNSVnA4WFprWldaVmp3cTlSVUtEWG1GQjJZeU4xWEVXZFowZXdSdUtZVUpsc202OTIKc2tPcktRajB2a29QbjQxRUUvK1RhVkVwcUxUUm9VWTNyemc3RGtkemZkQml6Rk8yZHNQTkZ4MkNXMGpYa05MdgpLbzI1Q1pyT2hYQUhBZ01CQUFFd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFLSEZDY3lPalp2b0hzd1VCTWRMClJkSEliMzgzcFdGeW5acS9MdVVvdnNWQTU4QjBDZzdCRWZ5NXZXVlZycTVSSWt2NGxaODFOMjl4MjFkMUpINnIKalNuUXgrRFhDTy9USkVWNWxTQ1VwSUd6RVVZYVVQZ1J5anNNL05VZENKOHVIVmhaSitTNkZBK0NuT0Q5cm4yaQpaQmVQQ0k1ckh3RVh3bm5sOHl3aWozdnZRNXpISXV5QmdsV3IvUXl1aTlmalBwd1dVdlVtNG52NVNNRzl6Q1Y3ClBwdXd2dWF0cWpPMTIwOEJqZkUvY1pISWc4SHc5bXZXOXg5QytJUU1JTURFN2IvZzZPY0s3TEdUTHdsRnh2QTgKN1dqRWVxdW5heUlwaE1oS1JYVmYxTjM0OWVOOThFejM4Zk9USFRQYmRKakZBL1BjQytHeW1lK2lHdDVPUWRGaAp5UkU9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
8 | tls.key: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb3dJQkFBS0NBUUVBcWVpcCs3TXZOYWRJN2lmM01wUHJ3Z0pwYkg0N1JUTnBybVRTdENyWG5LaHRuNDFrCkcrZWNVTldCUU5semtzQndHTDBuY0NObzJhN2x2S2wxd2k5cTIrQW1RaGNjS1ZSQXEzTVhZNXQ3WGxZa1YxYkcKQ0pwaVJ6ejBza0lLWXFHN1BjZXc1UzNPaUFRTkdZMURzcGRENmh2VWlYc1RGZTkxaUNHdWF3MVVoZHErSkVwRwp3SStBM0kreTEzaFpWVng5aU9WOEZ3cWJRcCt1eVFvT05uL3BQTUlNM0VWYWZGMlpHVm1WWThLdlVWQ2cxNWhRCmRtTWpkVnhGbldkSHNFYmltRkNaYkp1dmRySkRxeWtJOUw1S0Q1K05SQlAvazJsUkthaTAwYUZHTjY4NE93NUgKYzMzUVlzeFR0bmJEelJjZGdsdEkxNURTN3lxTnVRbWF6b1Z3QndJREFRQUJBb0lCQVFDUFNkU1luUXRTUHlxbApGZlZGcFRPc29PWVJoZjhzSStpYkZ4SU91UmF1V2VoaEp4ZG01Uk9ScEF6bUNMeUw1VmhqdEptZTIyM2dMcncyCk45OUVqVUtiL1ZPbVp1RHNCYzZvQ0Y2UU5SNThkejhjbk9SVGV3Y290c0pSMXBuMWhobG5SNUhxSkpCSmFzazEKWkVuVVFmY1hackw5NGxvOUpIM0UrVXFqbzFGRnM4eHhFOHdvUEJxalpzVjdwUlVaZ0MzTGh4bndMU0V4eUZvNApjeGI5U09HNU9tQUpvelN0Rm9RMkdKT2VzOHJKNXFmZHZ5dGdnOXhiTGFRTC94MGtwUTYyQm9GTUJEZHFPZVBXCktmUDV6WjYvMDcvdnBqNDh5QTFRMzJQem9idWJzQkxkM0tjbjMyamZtMUU3cHJ0V2wrSmVPRmlPem5CUUZKYk4KNHFQVlJ6NWhBb0dCQU50V3l4aE5DU0x1NFArWGdLeWNrbGpKNkY1NjY4Zk5qNUN6Z0ZScUowOXpuMFRsc05ybwpGVExaY3hEcW5SM0hQWU00MkpFUmgySi9xREZaeW5SUW8zY2czb2VpdlVkQlZHWTgrRkkxVzBxZHViL0w5K3l1CmVkT1pUUTVYbUdHcDZyNmpleHltY0ppbS9Pc0IzWm5ZT3BPcmxEN1NQbUJ2ek5MazRNRjZneGJYQW9HQkFNWk8KMHA2SGJCbWNQMHRqRlhmY0tFNzdJbUxtMHNBRzR1SG9VeDBlUGovMnFyblRuT0JCTkU0TXZnRHVUSnp5K2NhVQprOFJxbWRIQ2JIelRlNmZ6WXEvOWl0OHNaNzdLVk4xcWtiSWN1YytSVHhBOW5OaDFUanNSbmU3NFowajFGQ0xrCmhIY3FIMHJpN1BZU0tIVEU4RnZGQ3haWWRidUI4NENtWmlodnhicFJBb0dBSWJqcWFNWVBUWXVrbENkYTVTNzkKWVNGSjFKelplMUtqYS8vdER3MXpGY2dWQ0thMzFqQXdjaXowZi9sU1JxM0hTMUdHR21lemhQVlRpcUxmZVpxYwpSMGlLYmhnYk9jVlZrSkozSzB5QXlLd1BUdW14S0haNnpJbVpTMGMwYW0rUlk5WUdxNVQ3WXJ6cHpjZnZwaU9VCmZmZTNSeUZUN2NmQ21mb09oREN0enVrQ2dZQjMwb0xDMVJMRk9ycW40M3ZDUzUxemM1em9ZNDR1QnpzcHd3WU4KVHd2UC9FeFdNZjNWSnJEakJDSCtULzZzeXNlUGJKRUltbHpNK0l3eXRGcEFOZmlJWEV0LzQ4WGY2ME54OGdXTQp1SHl4Wlp4L05LdER3MFY4dlgxUE9ucTJBNWVpS2ErOGpSQVJZS0pMWU5kZkR1d29seHZHNmJaaGtQaS80RXRUCjNZMThzUUtCZ0h0S2JrKzdsTkpWZXN3WEU1Y1VHNkVEVXNEZS8yVWE3ZlhwN0ZjanFCRW9hcDFMU3crNlRYcDAKWmdybUtFOEFSek00NytFSkhVdmlpcS9udXBFMTVnMGtKVzNzeWhwVTl6WkxPN2x0QjBLSWtPOVpSY21Vam84UQpjcExsSE1BcWJMSjhXWUdKQ2toaVd4eWFsNmhZVHlXWTRjVmtDMHh0VGwvaFVFOUllTktvCi0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg==
9 |
--------------------------------------------------------------------------------
/02-virtualserver-resource/cafe-vs.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: k8s.nginx.org/v1
2 | kind: VirtualServer
3 | metadata:
4 | name: cafe
5 | spec:
6 | host: cafe.example.com
7 | tls:
8 | secret: cafe-secret
9 | upstreams:
10 | - name: tea
11 | service: tea-svc
12 | port: 80
13 | - name: coffee
14 | service: coffee-svc
15 | port: 80
16 | routes:
17 | - path: /tea
18 | action:
19 | proxy:
20 | upstream: tea
21 | - path: /coffee
22 | action:
23 | proxy:
24 | upstream: coffee
25 |
--------------------------------------------------------------------------------
/02-virtualserver-resource/cafe.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: coffee
5 | spec:
6 | replicas: 2
7 | selector:
8 | matchLabels:
9 | app: coffee
10 | template:
11 | metadata:
12 | labels:
13 | app: coffee
14 | spec:
15 | containers:
16 | - name: coffee
17 | image: nginxdemos/nginx-hello
18 | ports:
19 | - containerPort: 8080
20 | ---
21 | apiVersion: v1
22 | kind: Service
23 | metadata:
24 | name: coffee-svc
25 | spec:
26 | ports:
27 | - port: 80
28 | targetPort: 8080
29 | protocol: TCP
30 | name: http
31 | selector:
32 | app: coffee
33 | ---
34 | apiVersion: apps/v1
35 | kind: Deployment
36 | metadata:
37 | name: tea
38 | spec:
39 | replicas: 3
40 | selector:
41 | matchLabels:
42 | app: tea
43 | template:
44 | metadata:
45 | labels:
46 | app: tea
47 | spec:
48 | containers:
49 | - name: tea
50 | image: nginxdemos/nginx-hello
51 | ports:
52 | - containerPort: 8080
53 | ---
54 | apiVersion: v1
55 | kind: Service
56 | metadata:
57 | name: tea-svc
58 | labels:
59 | spec:
60 | ports:
61 | - port: 80
62 | targetPort: 8080
63 | protocol: TCP
64 | name: http
65 | selector:
66 | app: tea
67 |
68 |
--------------------------------------------------------------------------------
/03-custom-error-handler/cafe-secret.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: Secret
3 | metadata:
4 | name: cafe-secret
5 | type: Opaque
6 | data:
7 | tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURMakNDQWhZQ0NRREFPRjl0THNhWFdqQU5CZ2txaGtpRzl3MEJBUXNGQURCYU1Rc3dDUVlEVlFRR0V3SlYKVXpFTE1Ba0dBMVVFQ0F3Q1EwRXhJVEFmQmdOVkJBb01HRWx1ZEdWeWJtVjBJRmRwWkdkcGRITWdVSFI1SUV4MApaREViTUJrR0ExVUVBd3dTWTJGbVpTNWxlR0Z0Y0d4bExtTnZiU0FnTUI0WERURTRNRGt4TWpFMk1UVXpOVm9YCkRUSXpNRGt4TVRFMk1UVXpOVm93V0RFTE1Ba0dBMVVFQmhNQ1ZWTXhDekFKQmdOVkJBZ01Ba05CTVNFd0h3WUQKVlFRS0RCaEpiblJsY201bGRDQlhhV1JuYVhSeklGQjBlU0JNZEdReEdUQVhCZ05WQkFNTUVHTmhabVV1WlhoaApiWEJzWlM1amIyMHdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDcDZLbjdzeTgxCnAwanVKL2N5ayt2Q0FtbHNmanRGTTJtdVpOSzBLdGVjcUcyZmpXUWI1NXhRMVlGQTJYT1N3SEFZdlNkd0kyaloKcnVXOHFYWENMMnJiNENaQ0Z4d3BWRUNyY3hkam0zdGVWaVJYVnNZSW1tSkhQUFN5UWdwaW9iczl4N0RsTGM2SQpCQTBaalVPeWwwUHFHOVNKZXhNVjczV0lJYTVyRFZTRjJyNGtTa2JBajREY2o3TFhlRmxWWEgySTVYd1hDcHRDCm42N0pDZzQyZitrOHdnemNSVnA4WFprWldaVmp3cTlSVUtEWG1GQjJZeU4xWEVXZFowZXdSdUtZVUpsc202OTIKc2tPcktRajB2a29QbjQxRUUvK1RhVkVwcUxUUm9VWTNyemc3RGtkemZkQml6Rk8yZHNQTkZ4MkNXMGpYa05MdgpLbzI1Q1pyT2hYQUhBZ01CQUFFd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFLSEZDY3lPalp2b0hzd1VCTWRMClJkSEliMzgzcFdGeW5acS9MdVVvdnNWQTU4QjBDZzdCRWZ5NXZXVlZycTVSSWt2NGxaODFOMjl4MjFkMUpINnIKalNuUXgrRFhDTy9USkVWNWxTQ1VwSUd6RVVZYVVQZ1J5anNNL05VZENKOHVIVmhaSitTNkZBK0NuT0Q5cm4yaQpaQmVQQ0k1ckh3RVh3bm5sOHl3aWozdnZRNXpISXV5QmdsV3IvUXl1aTlmalBwd1dVdlVtNG52NVNNRzl6Q1Y3ClBwdXd2dWF0cWpPMTIwOEJqZkUvY1pISWc4SHc5bXZXOXg5QytJUU1JTURFN2IvZzZPY0s3TEdUTHdsRnh2QTgKN1dqRWVxdW5heUlwaE1oS1JYVmYxTjM0OWVOOThFejM4Zk9USFRQYmRKakZBL1BjQytHeW1lK2lHdDVPUWRGaAp5UkU9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
8 | tls.key: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb3dJQkFBS0NBUUVBcWVpcCs3TXZOYWRJN2lmM01wUHJ3Z0pwYkg0N1JUTnBybVRTdENyWG5LaHRuNDFrCkcrZWNVTldCUU5semtzQndHTDBuY0NObzJhN2x2S2wxd2k5cTIrQW1RaGNjS1ZSQXEzTVhZNXQ3WGxZa1YxYkcKQ0pwaVJ6ejBza0lLWXFHN1BjZXc1UzNPaUFRTkdZMURzcGRENmh2VWlYc1RGZTkxaUNHdWF3MVVoZHErSkVwRwp3SStBM0kreTEzaFpWVng5aU9WOEZ3cWJRcCt1eVFvT05uL3BQTUlNM0VWYWZGMlpHVm1WWThLdlVWQ2cxNWhRCmRtTWpkVnhGbldkSHNFYmltRkNaYkp1dmRySkRxeWtJOUw1S0Q1K05SQlAvazJsUkthaTAwYUZHTjY4NE93NUgKYzMzUVlzeFR0bmJEelJjZGdsdEkxNURTN3lxTnVRbWF6b1Z3QndJREFRQUJBb0lCQVFDUFNkU1luUXRTUHlxbApGZlZGcFRPc29PWVJoZjhzSStpYkZ4SU91UmF1V2VoaEp4ZG01Uk9ScEF6bUNMeUw1VmhqdEptZTIyM2dMcncyCk45OUVqVUtiL1ZPbVp1RHNCYzZvQ0Y2UU5SNThkejhjbk9SVGV3Y290c0pSMXBuMWhobG5SNUhxSkpCSmFzazEKWkVuVVFmY1hackw5NGxvOUpIM0UrVXFqbzFGRnM4eHhFOHdvUEJxalpzVjdwUlVaZ0MzTGh4bndMU0V4eUZvNApjeGI5U09HNU9tQUpvelN0Rm9RMkdKT2VzOHJKNXFmZHZ5dGdnOXhiTGFRTC94MGtwUTYyQm9GTUJEZHFPZVBXCktmUDV6WjYvMDcvdnBqNDh5QTFRMzJQem9idWJzQkxkM0tjbjMyamZtMUU3cHJ0V2wrSmVPRmlPem5CUUZKYk4KNHFQVlJ6NWhBb0dCQU50V3l4aE5DU0x1NFArWGdLeWNrbGpKNkY1NjY4Zk5qNUN6Z0ZScUowOXpuMFRsc05ybwpGVExaY3hEcW5SM0hQWU00MkpFUmgySi9xREZaeW5SUW8zY2czb2VpdlVkQlZHWTgrRkkxVzBxZHViL0w5K3l1CmVkT1pUUTVYbUdHcDZyNmpleHltY0ppbS9Pc0IzWm5ZT3BPcmxEN1NQbUJ2ek5MazRNRjZneGJYQW9HQkFNWk8KMHA2SGJCbWNQMHRqRlhmY0tFNzdJbUxtMHNBRzR1SG9VeDBlUGovMnFyblRuT0JCTkU0TXZnRHVUSnp5K2NhVQprOFJxbWRIQ2JIelRlNmZ6WXEvOWl0OHNaNzdLVk4xcWtiSWN1YytSVHhBOW5OaDFUanNSbmU3NFowajFGQ0xrCmhIY3FIMHJpN1BZU0tIVEU4RnZGQ3haWWRidUI4NENtWmlodnhicFJBb0dBSWJqcWFNWVBUWXVrbENkYTVTNzkKWVNGSjFKelplMUtqYS8vdER3MXpGY2dWQ0thMzFqQXdjaXowZi9sU1JxM0hTMUdHR21lemhQVlRpcUxmZVpxYwpSMGlLYmhnYk9jVlZrSkozSzB5QXlLd1BUdW14S0haNnpJbVpTMGMwYW0rUlk5WUdxNVQ3WXJ6cHpjZnZwaU9VCmZmZTNSeUZUN2NmQ21mb09oREN0enVrQ2dZQjMwb0xDMVJMRk9ycW40M3ZDUzUxemM1em9ZNDR1QnpzcHd3WU4KVHd2UC9FeFdNZjNWSnJEakJDSCtULzZzeXNlUGJKRUltbHpNK0l3eXRGcEFOZmlJWEV0LzQ4WGY2ME54OGdXTQp1SHl4Wlp4L05LdER3MFY4dlgxUE9ucTJBNWVpS2ErOGpSQVJZS0pMWU5kZkR1d29seHZHNmJaaGtQaS80RXRUCjNZMThzUUtCZ0h0S2JrKzdsTkpWZXN3WEU1Y1VHNkVEVXNEZS8yVWE3ZlhwN0ZjanFCRW9hcDFMU3crNlRYcDAKWmdybUtFOEFSek00NytFSkhVdmlpcS9udXBFMTVnMGtKVzNzeWhwVTl6WkxPN2x0QjBLSWtPOVpSY21Vam84UQpjcExsSE1BcWJMSjhXWUdKQ2toaVd4eWFsNmhZVHlXWTRjVmtDMHh0VGwvaFVFOUllTktvCi0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg==
9 |
--------------------------------------------------------------------------------
/03-custom-error-handler/cafe-vs-customerror.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: k8s.nginx.org/v1
2 | kind: VirtualServer
3 | metadata:
4 | name: cafe
5 | spec:
6 | host: cafe.example.com
7 | tls:
8 | secret: cafe-secret
9 | upstreams:
10 | - name: tea
11 | service: tea-svc
12 | port: 80
13 | - name: coffee
14 | service: coffee-svc
15 | port: 80
16 | routes:
17 | - path: /tea
18 | action:
19 | proxy:
20 | upstream: tea
21 | - path: /coffee
22 | errorPages:
23 | - codes: [502]
24 | return:
25 | code: 200
26 | body: "
oops this is embarrassing! We will be back shortly!
"
27 | action:
28 | proxy:
29 | upstream: coffee
30 |
--------------------------------------------------------------------------------
/03-custom-error-handler/cafe.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: coffee
5 | spec:
6 | replicas: 2
7 | selector:
8 | matchLabels:
9 | app: coffee
10 | template:
11 | metadata:
12 | labels:
13 | app: coffee
14 | spec:
15 | containers:
16 | - name: coffee
17 | image: nginxdemos/nginx-hello
18 | ports:
19 | - containerPort: 8080
20 | ---
21 | apiVersion: v1
22 | kind: Service
23 | metadata:
24 | name: coffee-svc
25 | spec:
26 | ports:
27 | - port: 80
28 | targetPort: 8080
29 | protocol: TCP
30 | name: http
31 | selector:
32 | app: coffee
33 | ---
34 | apiVersion: apps/v1
35 | kind: Deployment
36 | metadata:
37 | name: tea
38 | spec:
39 | replicas: 3
40 | selector:
41 | matchLabels:
42 | app: tea
43 | template:
44 | metadata:
45 | labels:
46 | app: tea
47 | spec:
48 | containers:
49 | - name: tea
50 | image: nginxdemos/nginx-hello
51 | ports:
52 | - containerPort: 8080
53 | ---
54 | apiVersion: v1
55 | kind: Service
56 | metadata:
57 | name: tea-svc
58 | labels:
59 | spec:
60 | ports:
61 | - port: 80
62 | targetPort: 8080
63 | protocol: TCP
64 | name: http
65 | selector:
66 | app: tea
67 |
68 |
--------------------------------------------------------------------------------
/04-bluegreen/bluegreen-deployment.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: bluegreen-green
5 | spec:
6 | replicas: 2
7 | selector:
8 | matchLabels:
9 | app: greenbullet
10 | template:
11 | metadata:
12 | labels:
13 | app: greenbullet
14 | spec:
15 | containers:
16 | - name: greenbullet
17 | image: mcheo/greenbullet:1.0
18 | ports:
19 | - containerPort: 80
20 | ---
21 | apiVersion: v1
22 | kind: Service
23 | metadata:
24 | name: greenbullet-svc
25 | spec:
26 | ports:
27 | - port: 80
28 | targetPort: 80
29 | protocol: TCP
30 | name: http
31 | selector:
32 | app: greenbullet
33 | ---
34 | apiVersion: apps/v1
35 | kind: Deployment
36 | metadata:
37 | name: bluegreen-blue
38 | spec:
39 | replicas: 2
40 | selector:
41 | matchLabels:
42 | app: bluebullet
43 | template:
44 | metadata:
45 | labels:
46 | app: bluebullet
47 | spec:
48 | containers:
49 | - name: bluebullet
50 | image: mcheo/bluebullet:1.0
51 | ports:
52 | - containerPort: 80
53 | ---
54 | apiVersion: v1
55 | kind: Service
56 | metadata:
57 | name: bluebullet-svc
58 | spec:
59 | ports:
60 | - port: 80
61 | targetPort: 80
62 | protocol: TCP
63 | name: http
64 | selector:
65 | app: bluebullet
66 |
--------------------------------------------------------------------------------
/04-bluegreen/bluegreen-vs.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: k8s.nginx.org/v1
2 | kind: VirtualServer
3 | metadata:
4 | name: bluegreen-vs
5 | spec:
6 | host: bluegreen.example.com
7 | upstreams:
8 | - name: greenbullet
9 | service: greenbullet-svc
10 | port: 80
11 | - name: bluebullet
12 | service: bluebullet-svc
13 | port: 80
14 | routes:
15 | - path: /
16 | splits:
17 | - weight: 10
18 | action:
19 | pass: greenbullet
20 | - weight: 90
21 | action:
22 | pass: bluebullet
23 |
24 |
--------------------------------------------------------------------------------
/05-trafficsplit/cafe-v2.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: coffee-v1
5 | spec:
6 | replicas: 2
7 | selector:
8 | matchLabels:
9 | app: coffee-v1
10 | template:
11 | metadata:
12 | labels:
13 | app: coffee-v1
14 | spec:
15 | containers:
16 | - name: coffee-v1
17 | image: nginxdemos/nginx-hello
18 | ports:
19 | - containerPort: 8080
20 | ---
21 | apiVersion: v1
22 | kind: Service
23 | metadata:
24 | name: coffee-v1-svc
25 | spec:
26 | ports:
27 | - port: 80
28 | targetPort: 8080
29 | protocol: TCP
30 | name: http
31 | selector:
32 | app: coffee-v1
33 | ---
34 | apiVersion: apps/v1
35 | kind: Deployment
36 | metadata:
37 | name: coffee-v2
38 | spec:
39 | replicas: 2
40 | selector:
41 | matchLabels:
42 | app: coffee-v2
43 | template:
44 | metadata:
45 | labels:
46 | app: coffee-v2
47 | spec:
48 | containers:
49 | - name: coffee-v2
50 | image: nginxdemos/nginx-hello
51 | ports:
52 | - containerPort: 8080
53 | ---
54 | apiVersion: v1
55 | kind: Service
56 | metadata:
57 | name: coffee-v2-svc
58 | spec:
59 | ports:
60 | - port: 80
61 | targetPort: 8080
62 | protocol: TCP
63 | name: http
64 | selector:
65 | app: coffee-v2
66 | ---
67 | apiVersion: apps/v1
68 | kind: Deployment
69 | metadata:
70 | name: tea
71 | spec:
72 | replicas: 3
73 | selector:
74 | matchLabels:
75 | app: tea
76 | template:
77 | metadata:
78 | labels:
79 | app: tea
80 | spec:
81 | containers:
82 | - name: tea
83 | image: nginxdemos/nginx-hello
84 | ports:
85 | - containerPort: 8080
86 | ---
87 | apiVersion: v1
88 | kind: Service
89 | metadata:
90 | name: tea-svc
91 | labels:
92 | spec:
93 | ports:
94 | - port: 80
95 | targetPort: 8080
96 | protocol: TCP
97 | name: http
98 | selector:
99 | app: tea
100 |
101 |
--------------------------------------------------------------------------------
/05-trafficsplit/cafe-vs-advanced-routing.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: k8s.nginx.org/v1
2 | kind: VirtualServer
3 | metadata:
4 | name: cafe
5 | spec:
6 | host: cafe.example.com
7 | tls:
8 | secret: cafe-secret
9 | upstreams:
10 | - name: tea
11 | service: tea-svc
12 | port: 80
13 | - name: coffee-v1
14 | service: coffee-v1-svc
15 | port: 80
16 | - name: coffee-v2
17 | service: coffee-v2-svc
18 | port: 80
19 | routes:
20 | - path: /tea
21 | action:
22 | proxy:
23 | upstream: tea
24 | - path: /coffee
25 | matches:
26 | - conditions:
27 | - header: version
28 | value: v2
29 | action:
30 | pass: coffee-v2
31 | action:
32 | pass: coffee-v1
--------------------------------------------------------------------------------
/06-ratelimit/cafe-secret.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: Secret
3 | metadata:
4 | name: cafe-secret
5 | type: Opaque
6 | data:
7 | tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURMakNDQWhZQ0NRREFPRjl0THNhWFdqQU5CZ2txaGtpRzl3MEJBUXNGQURCYU1Rc3dDUVlEVlFRR0V3SlYKVXpFTE1Ba0dBMVVFQ0F3Q1EwRXhJVEFmQmdOVkJBb01HRWx1ZEdWeWJtVjBJRmRwWkdkcGRITWdVSFI1SUV4MApaREViTUJrR0ExVUVBd3dTWTJGbVpTNWxlR0Z0Y0d4bExtTnZiU0FnTUI0WERURTRNRGt4TWpFMk1UVXpOVm9YCkRUSXpNRGt4TVRFMk1UVXpOVm93V0RFTE1Ba0dBMVVFQmhNQ1ZWTXhDekFKQmdOVkJBZ01Ba05CTVNFd0h3WUQKVlFRS0RCaEpiblJsY201bGRDQlhhV1JuYVhSeklGQjBlU0JNZEdReEdUQVhCZ05WQkFNTUVHTmhabVV1WlhoaApiWEJzWlM1amIyMHdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDcDZLbjdzeTgxCnAwanVKL2N5ayt2Q0FtbHNmanRGTTJtdVpOSzBLdGVjcUcyZmpXUWI1NXhRMVlGQTJYT1N3SEFZdlNkd0kyaloKcnVXOHFYWENMMnJiNENaQ0Z4d3BWRUNyY3hkam0zdGVWaVJYVnNZSW1tSkhQUFN5UWdwaW9iczl4N0RsTGM2SQpCQTBaalVPeWwwUHFHOVNKZXhNVjczV0lJYTVyRFZTRjJyNGtTa2JBajREY2o3TFhlRmxWWEgySTVYd1hDcHRDCm42N0pDZzQyZitrOHdnemNSVnA4WFprWldaVmp3cTlSVUtEWG1GQjJZeU4xWEVXZFowZXdSdUtZVUpsc202OTIKc2tPcktRajB2a29QbjQxRUUvK1RhVkVwcUxUUm9VWTNyemc3RGtkemZkQml6Rk8yZHNQTkZ4MkNXMGpYa05MdgpLbzI1Q1pyT2hYQUhBZ01CQUFFd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFLSEZDY3lPalp2b0hzd1VCTWRMClJkSEliMzgzcFdGeW5acS9MdVVvdnNWQTU4QjBDZzdCRWZ5NXZXVlZycTVSSWt2NGxaODFOMjl4MjFkMUpINnIKalNuUXgrRFhDTy9USkVWNWxTQ1VwSUd6RVVZYVVQZ1J5anNNL05VZENKOHVIVmhaSitTNkZBK0NuT0Q5cm4yaQpaQmVQQ0k1ckh3RVh3bm5sOHl3aWozdnZRNXpISXV5QmdsV3IvUXl1aTlmalBwd1dVdlVtNG52NVNNRzl6Q1Y3ClBwdXd2dWF0cWpPMTIwOEJqZkUvY1pISWc4SHc5bXZXOXg5QytJUU1JTURFN2IvZzZPY0s3TEdUTHdsRnh2QTgKN1dqRWVxdW5heUlwaE1oS1JYVmYxTjM0OWVOOThFejM4Zk9USFRQYmRKakZBL1BjQytHeW1lK2lHdDVPUWRGaAp5UkU9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
8 | tls.key: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb3dJQkFBS0NBUUVBcWVpcCs3TXZOYWRJN2lmM01wUHJ3Z0pwYkg0N1JUTnBybVRTdENyWG5LaHRuNDFrCkcrZWNVTldCUU5semtzQndHTDBuY0NObzJhN2x2S2wxd2k5cTIrQW1RaGNjS1ZSQXEzTVhZNXQ3WGxZa1YxYkcKQ0pwaVJ6ejBza0lLWXFHN1BjZXc1UzNPaUFRTkdZMURzcGRENmh2VWlYc1RGZTkxaUNHdWF3MVVoZHErSkVwRwp3SStBM0kreTEzaFpWVng5aU9WOEZ3cWJRcCt1eVFvT05uL3BQTUlNM0VWYWZGMlpHVm1WWThLdlVWQ2cxNWhRCmRtTWpkVnhGbldkSHNFYmltRkNaYkp1dmRySkRxeWtJOUw1S0Q1K05SQlAvazJsUkthaTAwYUZHTjY4NE93NUgKYzMzUVlzeFR0bmJEelJjZGdsdEkxNURTN3lxTnVRbWF6b1Z3QndJREFRQUJBb0lCQVFDUFNkU1luUXRTUHlxbApGZlZGcFRPc29PWVJoZjhzSStpYkZ4SU91UmF1V2VoaEp4ZG01Uk9ScEF6bUNMeUw1VmhqdEptZTIyM2dMcncyCk45OUVqVUtiL1ZPbVp1RHNCYzZvQ0Y2UU5SNThkejhjbk9SVGV3Y290c0pSMXBuMWhobG5SNUhxSkpCSmFzazEKWkVuVVFmY1hackw5NGxvOUpIM0UrVXFqbzFGRnM4eHhFOHdvUEJxalpzVjdwUlVaZ0MzTGh4bndMU0V4eUZvNApjeGI5U09HNU9tQUpvelN0Rm9RMkdKT2VzOHJKNXFmZHZ5dGdnOXhiTGFRTC94MGtwUTYyQm9GTUJEZHFPZVBXCktmUDV6WjYvMDcvdnBqNDh5QTFRMzJQem9idWJzQkxkM0tjbjMyamZtMUU3cHJ0V2wrSmVPRmlPem5CUUZKYk4KNHFQVlJ6NWhBb0dCQU50V3l4aE5DU0x1NFArWGdLeWNrbGpKNkY1NjY4Zk5qNUN6Z0ZScUowOXpuMFRsc05ybwpGVExaY3hEcW5SM0hQWU00MkpFUmgySi9xREZaeW5SUW8zY2czb2VpdlVkQlZHWTgrRkkxVzBxZHViL0w5K3l1CmVkT1pUUTVYbUdHcDZyNmpleHltY0ppbS9Pc0IzWm5ZT3BPcmxEN1NQbUJ2ek5MazRNRjZneGJYQW9HQkFNWk8KMHA2SGJCbWNQMHRqRlhmY0tFNzdJbUxtMHNBRzR1SG9VeDBlUGovMnFyblRuT0JCTkU0TXZnRHVUSnp5K2NhVQprOFJxbWRIQ2JIelRlNmZ6WXEvOWl0OHNaNzdLVk4xcWtiSWN1YytSVHhBOW5OaDFUanNSbmU3NFowajFGQ0xrCmhIY3FIMHJpN1BZU0tIVEU4RnZGQ3haWWRidUI4NENtWmlodnhicFJBb0dBSWJqcWFNWVBUWXVrbENkYTVTNzkKWVNGSjFKelplMUtqYS8vdER3MXpGY2dWQ0thMzFqQXdjaXowZi9sU1JxM0hTMUdHR21lemhQVlRpcUxmZVpxYwpSMGlLYmhnYk9jVlZrSkozSzB5QXlLd1BUdW14S0haNnpJbVpTMGMwYW0rUlk5WUdxNVQ3WXJ6cHpjZnZwaU9VCmZmZTNSeUZUN2NmQ21mb09oREN0enVrQ2dZQjMwb0xDMVJMRk9ycW40M3ZDUzUxemM1em9ZNDR1QnpzcHd3WU4KVHd2UC9FeFdNZjNWSnJEakJDSCtULzZzeXNlUGJKRUltbHpNK0l3eXRGcEFOZmlJWEV0LzQ4WGY2ME54OGdXTQp1SHl4Wlp4L05LdER3MFY4dlgxUE9ucTJBNWVpS2ErOGpSQVJZS0pMWU5kZkR1d29seHZHNmJaaGtQaS80RXRUCjNZMThzUUtCZ0h0S2JrKzdsTkpWZXN3WEU1Y1VHNkVEVXNEZS8yVWE3ZlhwN0ZjanFCRW9hcDFMU3crNlRYcDAKWmdybUtFOEFSek00NytFSkhVdmlpcS9udXBFMTVnMGtKVzNzeWhwVTl6WkxPN2x0QjBLSWtPOVpSY21Vam84UQpjcExsSE1BcWJMSjhXWUdKQ2toaVd4eWFsNmhZVHlXWTRjVmtDMHh0VGwvaFVFOUllTktvCi0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg==
9 |
--------------------------------------------------------------------------------
/06-ratelimit/cafe-vs-ratelimiting.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: k8s.nginx.org/v1
2 | kind: VirtualServer
3 | metadata:
4 | name: cafe
5 | spec:
6 | host: cafe.example.com
7 | tls:
8 | secret: cafe-secret
9 | upstreams:
10 | - name: tea
11 | service: tea-svc
12 | port: 80
13 | - name: coffee
14 | service: coffee-svc
15 | port: 80
16 | routes:
17 | - path: /tea
18 | action:
19 | pass: tea
20 | - path: /coffee
21 | policies:
22 | - name: rate-limit-policy
23 | action:
24 | pass: coffee
25 |
--------------------------------------------------------------------------------
/06-ratelimit/cafe.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: coffee
5 | spec:
6 | replicas: 2
7 | selector:
8 | matchLabels:
9 | app: coffee
10 | template:
11 | metadata:
12 | labels:
13 | app: coffee
14 | spec:
15 | containers:
16 | - name: coffee
17 | image: nginxdemos/nginx-hello
18 | ports:
19 | - containerPort: 8080
20 | ---
21 | apiVersion: v1
22 | kind: Service
23 | metadata:
24 | name: coffee-svc
25 | spec:
26 | ports:
27 | - port: 80
28 | targetPort: 8080
29 | protocol: TCP
30 | name: http
31 | selector:
32 | app: coffee
33 | ---
34 | apiVersion: apps/v1
35 | kind: Deployment
36 | metadata:
37 | name: tea
38 | spec:
39 | replicas: 3
40 | selector:
41 | matchLabels:
42 | app: tea
43 | template:
44 | metadata:
45 | labels:
46 | app: tea
47 | spec:
48 | containers:
49 | - name: tea
50 | image: nginxdemos/nginx-hello
51 | ports:
52 | - containerPort: 8080
53 | ---
54 | apiVersion: v1
55 | kind: Service
56 | metadata:
57 | name: tea-svc
58 | labels:
59 | spec:
60 | ports:
61 | - port: 80
62 | targetPort: 8080
63 | protocol: TCP
64 | name: http
65 | selector:
66 | app: tea
67 |
68 |
--------------------------------------------------------------------------------
/06-ratelimit/rate-limit-policy.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: k8s.nginx.org/v1alpha1
2 | kind: Policy
3 | metadata:
4 | name: rate-limit-policy
5 | spec:
6 | rateLimit:
7 | rate: 1r/s
8 | key: ${http_user_id}
9 | zoneSize: 10M
10 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # nginx-openshift-workshop
2 |
3 | The repo contains folders which are all self sufficient. You may apply all the yaml in that folder in one go to demonstrate specific use case.
4 |
5 | These manifests are based on NGINX Ingress Controller 1.10
6 |
7 | Please refer to NGINX official repo for comprehensive list of examples:
8 |
9 | https://github.com/nginxinc/kubernetes-ingress
10 |
--------------------------------------------------------------------------------