├── chapter-01 ├── custom-nginx │ ├── index.html │ └── Dockerfile └── hello-server │ ├── go.mod │ ├── Dockerfile │ └── main.go ├── chapter-11 ├── namespace.yaml ├── hello-server.yaml └── hello-server-destruction.yaml ├── README.md ├── kind ├── multinode-config.yaml ├── export-mapping.yaml └── multinode-nodeport.yaml ├── chapter-10 ├── kustomize │ └── hello-server │ │ ├── base │ │ ├── kustomization.yaml │ │ └── deployment.yaml │ │ └── overlays │ │ ├── staging │ │ └── kustomization.yaml │ │ └── production │ │ ├── kustomization.yaml │ │ ├── pdb.yaml │ │ └── deployment.yaml └── hello-server.yaml ├── chapter-04 ├── nginx.yaml └── myapp.yaml ├── chapter-07 ├── pdb.yaml ├── pod-nodeselector.yaml ├── probe-sample.txt ├── pod-tolerations.yaml ├── pod-liveness.yaml ├── pod-topology.yaml ├── pod-readiness.yaml ├── pod-resource-handson.yaml ├── pdb-hello-server.yaml ├── pod-node-affinity.yaml ├── pod-nodeaffinity.yaml ├── pod-antiaffinity.yaml ├── deployment-memory-leak.yaml ├── deployment-schedule-handson.yaml ├── deployment-destruction.yaml ├── deployment-resource-handson.yaml ├── hello-server-node-handson.yaml └── hpa-hello-server.yaml ├── hello-server ├── Dockerfile ├── go.mod ├── main.go └── go.sum ├── chapter-05 ├── pod-destruction.yaml ├── myapp.yaml ├── myapp-label.yaml └── deployment.yaml ├── chapter-06 ├── service.yaml ├── service-nodeport.yaml ├── service-destruction.yaml ├── job.yaml ├── cronjob.yaml ├── replicaset.yaml ├── deployment.yaml ├── deployment-hello-server.yaml ├── deployment-hello-server-rollingupdate.yaml ├── secret │ ├── nginx-volume.yaml │ └── nginx-sample.yaml ├── deployment-recreate.yaml ├── deployment-rollingupdate.yaml ├── configmap │ ├── hello-server-env.yaml │ ├── hello-server-volume.yaml │ └── hello-server-destruction.yaml └── cronjob-hello-server.yaml ├── kube-prometheus-stack └── values.yaml ├── .github └── workflows │ └── build.yaml ├── chapter-09 └── hello-server.yaml └── chapter-08 ├── hello-server.yaml ├── handson-answer.yaml └── hello-server-update.yaml /chapter-01/custom-nginx/index.html: -------------------------------------------------------------------------------- 1 |

Hello World!

2 | -------------------------------------------------------------------------------- /chapter-01/hello-server/go.mod: -------------------------------------------------------------------------------- 1 | module github.com/bbf-kubernetes 2 | 3 | go 1.21 4 | -------------------------------------------------------------------------------- /chapter-01/custom-nginx/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM nginx:1.25.3 2 | COPY index.html /usr/share/nginx/html 3 | -------------------------------------------------------------------------------- /chapter-11/namespace.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Namespace 3 | metadata: 4 | name: develop 5 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # bbf-kubernetes 2 | Repository for the book "Build, Breaking, Fixing: A Playful Way to Learn Kubernetes” 3 | -------------------------------------------------------------------------------- /kind/multinode-config.yaml: -------------------------------------------------------------------------------- 1 | kind: Cluster 2 | apiVersion: kind.x-k8s.io/v1alpha4 3 | nodes: 4 | - role: control-plane 5 | - role: worker 6 | - role: worker 7 | -------------------------------------------------------------------------------- /chapter-10/kustomize/hello-server/base/kustomization.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kustomize.config.k8s.io/v1beta1 2 | kind: Kustomization 3 | resources: 4 | - deployment.yaml 5 | -------------------------------------------------------------------------------- /chapter-10/kustomize/hello-server/overlays/staging/kustomization.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kustomize.config.k8s.io/v1beta1 2 | kind: Kustomization 3 | resources: 4 | - ../../base 5 | -------------------------------------------------------------------------------- /chapter-04/nginx.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Pod 3 | metadata: 4 | name: nginx 5 | spec: 6 | containers: 7 | - name: nginx 8 | image: nginx:1.25.3 9 | ports: 10 | - containerPort: 80 11 | -------------------------------------------------------------------------------- /chapter-07/pdb.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: policy/v1 2 | kind: PodDisruptionBudget 3 | metadata: 4 | name: hello-server-pdb 5 | spec: 6 | minAvailable: 2 7 | selector: 8 | matchLabels: 9 | app: hello-server 10 | -------------------------------------------------------------------------------- /chapter-07/pod-nodeselector.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Pod 3 | metadata: 4 | name: nginx 5 | spec: 6 | containers: 7 | - name: nginx 8 | image: nginx:1.25.3 9 | nodeSelector: 10 | disktype: ssd 11 | -------------------------------------------------------------------------------- /hello-server/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM golang:1.21 AS builder 2 | WORKDIR /app 3 | COPY . . 4 | ENV CGO_ENABLED=0 5 | RUN go build -o hello . 6 | 7 | FROM scratch 8 | COPY --from=builder /app/hello /hello 9 | CMD ["/hello"] 10 | -------------------------------------------------------------------------------- /chapter-10/kustomize/hello-server/overlays/production/kustomization.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kustomize.config.k8s.io/v1beta1 2 | kind: Kustomization 3 | resources: 4 | - ../../base 5 | - pdb.yaml 6 | patches: 7 | - path: deployment.yaml 8 | -------------------------------------------------------------------------------- /chapter-01/hello-server/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM golang:1.21 AS builder 2 | WORKDIR /app 3 | COPY . . 4 | ENV CGO_ENABLED=0 5 | RUN go build -o hello . 6 | 7 | FROM scratch 8 | COPY --from=builder /app/hello /hello 9 | CMD ["/hello"] 10 | -------------------------------------------------------------------------------- /chapter-05/pod-destruction.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Pod 3 | metadata: 4 | name: myapp 5 | spec: 6 | containers: 7 | - name: hello-server 8 | image: blux2/hello-server:1.1 9 | ports: 10 | - containerPort: 8080 11 | -------------------------------------------------------------------------------- /chapter-06/service.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: hello-server-service 5 | spec: 6 | selector: 7 | app: hello-server 8 | ports: 9 | - protocol: TCP 10 | port: 8080 11 | targetPort: 8080 12 | 13 | -------------------------------------------------------------------------------- /kind/export-mapping.yaml: -------------------------------------------------------------------------------- 1 | kind: Cluster 2 | apiVersion: kind.x-k8s.io/v1alpha4 3 | nodes: 4 | - role: control-plane 5 | extraPortMappings: 6 | - containerPort: 30599 7 | hostPort: 30599 8 | listenAddress: "127.0.0.1" 9 | protocol: TCP 10 | -------------------------------------------------------------------------------- /chapter-04/myapp.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Pod 3 | metadata: 4 | name: myapp 5 | labels: 6 | app: myapp 7 | spec: 8 | containers: 9 | - name: hello-server 10 | image: blux2/hello-server:1.0 11 | ports: 12 | - containerPort: 8080 13 | -------------------------------------------------------------------------------- /chapter-05/myapp.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Pod 3 | metadata: 4 | name: myapp 5 | labels: 6 | app: myapp 7 | spec: 8 | containers: 9 | - name: hello-server 10 | image: blux2/hello-server:1.0 11 | ports: 12 | - containerPort: 8080 13 | -------------------------------------------------------------------------------- /chapter-10/kustomize/hello-server/overlays/production/pdb.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: policy/v1 2 | kind: PodDisruptionBudget 3 | metadata: 4 | name: hello-server-pdb 5 | spec: 6 | maxUnavailable: 10% 7 | selector: 8 | matchLabels: 9 | app: hello-server 10 | -------------------------------------------------------------------------------- /kube-prometheus-stack/values.yaml: -------------------------------------------------------------------------------- 1 | prometheus: 2 | prometheusSpec: 3 | additionalScrapeConfigs: 4 | - job_name: hello-server 5 | scrape_interval: 10s 6 | static_configs: 7 | - targets: 8 | - hello-server.develop.svc.cluster.local:8080 9 | -------------------------------------------------------------------------------- /chapter-06/service-nodeport.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: hello-server-external 5 | spec: 6 | type: NodePort 7 | selector: 8 | app: hello-server 9 | ports: 10 | - port: 8080 11 | targetPort: 8080 12 | nodePort: 30599 13 | -------------------------------------------------------------------------------- /chapter-05/myapp-label.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Pod 3 | metadata: 4 | name: myapp3 5 | namespace: default 6 | labels: 7 | app: myapp 8 | spec: 9 | containers: 10 | - name: hello-server 11 | image: blux2/hello-server:1.0 12 | ports: 13 | - containerPort: 8080 14 | -------------------------------------------------------------------------------- /chapter-06/service-destruction.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | apiVersion: v1 3 | kind: Service 4 | metadata: 5 | name: hello-server-external 6 | spec: 7 | type: NodePort 8 | selector: 9 | app: hello-serve 10 | ports: 11 | - port: 8080 12 | targetPort: 8080 13 | nodePort: 30599 14 | -------------------------------------------------------------------------------- /kind/multinode-nodeport.yaml: -------------------------------------------------------------------------------- 1 | kind: Cluster 2 | apiVersion: kind.x-k8s.io/v1alpha4 3 | nodes: 4 | - role: control-plane 5 | - role: worker 6 | extraPortMappings: 7 | - containerPort: 30599 8 | hostPort: 30599 9 | listenAddress: "127.0.0.1" 10 | protocol: TCP 11 | - role: worker 12 | -------------------------------------------------------------------------------- /chapter-06/job.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: batch/v1 2 | kind: Job 3 | metadata: 4 | name: date-checker 5 | spec: 6 | template: 7 | spec: 8 | containers: 9 | - name: date 10 | image: ubuntu:22.04 11 | command: ["date"] 12 | restartPolicy: Never 13 | backoffLimit: 4 14 | 15 | -------------------------------------------------------------------------------- /chapter-07/probe-sample.txt: -------------------------------------------------------------------------------- 1 | ## このマニフェストは単体で動きません 2 | readinessProbe: 3 | httpGet: 4 | path: /health 5 | port: 8080 6 | initialDelaySeconds: 10 7 | periodSeconds: 5 8 | livenessProbe: 9 | httpGet: 10 | path: /health 11 | port: 8080 12 | initialDelaySeconds: 30 13 | periodSeconds: 5 14 | -------------------------------------------------------------------------------- /chapter-07/pod-tolerations.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Pod 3 | metadata: 4 | name: nginx 5 | spec: 6 | containers: 7 | - name: nginx 8 | image: nginx:1.25.3 9 | imagePullPolicy: IfNotPresent 10 | tolerations: 11 | - key: "disktype" 12 | value: "ssd" 13 | operator: "Equal" 14 | effect: "NoSchedule" 15 | -------------------------------------------------------------------------------- /chapter-06/cronjob.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: batch/v1 2 | kind: CronJob 3 | metadata: 4 | name: date 5 | spec: 6 | schedule: "*/2 * * * *" 7 | jobTemplate: 8 | spec: 9 | template: 10 | spec: 11 | containers: 12 | - name: date 13 | image: ubuntu:22.04 14 | command: ["date"] 15 | restartPolicy: Never 16 | -------------------------------------------------------------------------------- /chapter-07/pod-liveness.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Pod 3 | metadata: 4 | labels: 5 | app: httpserver 6 | name: httpserver-liveness 7 | spec: 8 | containers: 9 | - name: httpserver 10 | image: blux2/delayfailserver:1.1 11 | livenessProbe: 12 | httpGet: 13 | path: /healthz 14 | port: 8080 15 | initialDelaySeconds: 5 16 | periodSeconds: 5 17 | -------------------------------------------------------------------------------- /chapter-07/pod-topology.yaml: -------------------------------------------------------------------------------- 1 | kind: Pod 2 | apiVersion: v1 3 | metadata: 4 | name: mypod 5 | labels: 6 | app: nginx 7 | spec: 8 | topologySpreadConstraints: 9 | - maxSkew: 1 10 | topologyKey: zone 11 | whenUnsatisfiable: DoNotSchedule 12 | labelSelector: 13 | matchLabels: 14 | app: nginx 15 | containers: 16 | - name: nginx 17 | image: nginx:1.25.3 18 | -------------------------------------------------------------------------------- /chapter-07/pod-readiness.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Pod 3 | metadata: 4 | labels: 5 | app: httpserver 6 | name: httpserver-readiness 7 | spec: 8 | containers: 9 | - name: httpserver 10 | image: blux2/delayfailserver:1.1 11 | readinessProbe: 12 | httpGet: 13 | path: /healthz 14 | port: 8080 15 | initialDelaySeconds: 5 16 | periodSeconds: 5 17 | -------------------------------------------------------------------------------- /chapter-10/kustomize/hello-server/overlays/production/deployment.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: hello-server 5 | spec: 6 | replicas: 10 7 | template: 8 | spec: 9 | containers: 10 | - name: hello-server 11 | resources: 12 | requests: 13 | memory: "1Gi" 14 | limits: 15 | memory: "1Gi" 16 | -------------------------------------------------------------------------------- /chapter-07/pod-resource-handson.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Pod 3 | metadata: 4 | labels: 5 | app: hello-server 6 | name: hello-server 7 | spec: 8 | containers: 9 | - name: hello-server 10 | image: blux2/hello-server:1.6 11 | resources: 12 | requests: 13 | memory: "64Mi" 14 | cpu: "10m" 15 | limits: 16 | memory: "64Mi" 17 | cpu: "10m" 18 | -------------------------------------------------------------------------------- /chapter-01/hello-server/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "log" 6 | "net/http" 7 | ) 8 | 9 | func main() { 10 | http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { 11 | fmt.Fprintf(w, "Hello, world!") 12 | }) 13 | 14 | log.Println("Starting server on port 8080") 15 | err := http.ListenAndServe(":8080", nil) 16 | if err != nil { 17 | log.Fatal(err) 18 | } 19 | } 20 | 21 | -------------------------------------------------------------------------------- /chapter-06/replicaset.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: ReplicaSet 3 | metadata: 4 | name: httpserver 5 | labels: 6 | app: httpserver 7 | spec: 8 | replicas: 3 9 | selector: 10 | matchLabels: 11 | app: httpserver 12 | template: 13 | metadata: 14 | labels: 15 | app: httpserver 16 | spec: 17 | containers: 18 | - name: nginx 19 | image: nginx:1.25.3 20 | -------------------------------------------------------------------------------- /chapter-07/pdb-hello-server.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: hello-server 5 | labels: 6 | app: hello-server 7 | spec: 8 | replicas: 3 9 | selector: 10 | matchLabels: 11 | app: hello-server 12 | template: 13 | metadata: 14 | labels: 15 | app: hello-server 16 | spec: 17 | containers: 18 | - name: hello-server 19 | image: blux2/hello-server:1.8 20 | -------------------------------------------------------------------------------- /chapter-06/deployment.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: nginx-deployment 5 | labels: 6 | app: nginx 7 | spec: 8 | replicas: 3 9 | selector: 10 | matchLabels: 11 | app: nginx 12 | template: 13 | metadata: 14 | labels: 15 | app: nginx 16 | spec: 17 | containers: 18 | - name: nginx 19 | image: nginx:1.24.0 20 | ports: 21 | - containerPort: 80 22 | 23 | -------------------------------------------------------------------------------- /chapter-07/pod-node-affinity.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Pod 3 | metadata: 4 | name: node-affinity-pod 5 | spec: 6 | affinity: 7 | nodeAffinity: 8 | preferredDuringSchedulingIgnoredDuringExecution: 9 | - weight: 1 10 | preference: 11 | matchExpressions: 12 | - key: disktype 13 | operator: In 14 | values: 15 | - ssd 16 | containers: 17 | - name: node-affinity-pod 18 | image: nginx:1.25.3 19 | -------------------------------------------------------------------------------- /chapter-07/pod-nodeaffinity.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Pod 3 | metadata: 4 | name: node-affinity-pod 5 | spec: 6 | affinity: 7 | nodeAffinity: 8 | preferredDuringSchedulingIgnoredDuringExecution: 9 | - weight: 1 10 | preference: 11 | matchExpressions: 12 | - key: disktype 13 | operator: In 14 | values: 15 | - ssd 16 | containers: 17 | - name: node-affinity-pod 18 | image: nginx:1.25.3 19 | -------------------------------------------------------------------------------- /chapter-05/deployment.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: my-deployment 5 | labels: 6 | app: hello-server 7 | spec: 8 | replicas: 3 9 | selector: 10 | matchLabels: 11 | app: hello-server 12 | template: 13 | metadata: 14 | labels: 15 | app: hello-server 16 | spec: 17 | containers: 18 | - name: hello-server 19 | image: blux2/hello-server:1.0 20 | ports: 21 | - containerPort: 8080 22 | 23 | -------------------------------------------------------------------------------- /chapter-06/deployment-hello-server.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: hello-server 5 | labels: 6 | app: hello-server 7 | spec: 8 | replicas: 3 9 | selector: 10 | matchLabels: 11 | app: hello-server 12 | template: 13 | metadata: 14 | labels: 15 | app: hello-server 16 | spec: 17 | containers: 18 | - name: hello-server 19 | image: blux2/hello-server:1.0 20 | ports: 21 | - containerPort: 8080 22 | -------------------------------------------------------------------------------- /chapter-06/deployment-hello-server-rollingupdate.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: hello-server 5 | labels: 6 | app: hello-server 7 | spec: 8 | replicas: 3 9 | selector: 10 | matchLabels: 11 | app: hello-server 12 | template: 13 | metadata: 14 | labels: 15 | app: hello-server 16 | spec: 17 | containers: 18 | - name: hello-server 19 | image: blux2/hello-server:1.3 20 | ports: 21 | - containerPort: 8080 22 | 23 | -------------------------------------------------------------------------------- /chapter-06/secret/nginx-volume.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Pod 3 | metadata: 4 | name: nginx-sample 5 | spec: 6 | containers: 7 | - name: nginx-container 8 | image: nginx:1.25.3 9 | volumeMounts: 10 | - name: nginx-secret 11 | mountPath: /etc/config 12 | volumes: 13 | - name: nginx-secret 14 | secret: 15 | secretName: nginx-secret 16 | --- 17 | apiVersion: v1 18 | kind: Secret 19 | metadata: 20 | name: nginx-secret 21 | data: 22 | server.key: ZU05a3UzZWNDcFVMOXpQb0lJdUcycHRaWkM1Q3U0WkNRWFJ5bWxIYWpZdlp5ZmZwTTYK 23 | -------------------------------------------------------------------------------- /chapter-07/pod-antiaffinity.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Pod 3 | metadata: 4 | name: pod-anti-affinity 5 | labels: 6 | app: nginx 7 | spec: 8 | affinity: 9 | podAntiAffinity: 10 | preferredDuringSchedulingIgnoredDuringExecution: 11 | - weight: 100 12 | podAffinityTerm: 13 | labelSelector: 14 | matchExpressions: 15 | - key: app 16 | operator: In 17 | values: 18 | - nginx 19 | topologyKey: kubernetes.io/hostname 20 | containers: 21 | - name: nginx 22 | image: nginx:1.25.3 23 | -------------------------------------------------------------------------------- /chapter-06/deployment-recreate.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: nginx-deployment 5 | labels: 6 | app: nginx 7 | spec: 8 | replicas: 10 9 | strategy: 10 | type: Recreate 11 | selector: 12 | matchLabels: 13 | app: nginx 14 | template: 15 | metadata: 16 | labels: 17 | app: nginx 18 | spec: 19 | containers: 20 | - name: nginx 21 | image: nginx:1.24.0 22 | ports: 23 | - containerPort: 80 24 | lifecycle: 25 | preStop: 26 | exec: 27 | command: ["/bin/sh", "-c", "sleep 10"] 28 | -------------------------------------------------------------------------------- /hello-server/go.mod: -------------------------------------------------------------------------------- 1 | module github.com/bbf-kubernetes 2 | 3 | go 1.21 4 | 5 | require github.com/prometheus/client_golang v1.17.0 6 | 7 | require ( 8 | github.com/beorn7/perks v1.0.1 // indirect 9 | github.com/cespare/xxhash/v2 v2.2.0 // indirect 10 | github.com/golang/protobuf v1.5.3 // indirect 11 | github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect 12 | github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16 // indirect 13 | github.com/prometheus/common v0.44.0 // indirect 14 | github.com/prometheus/procfs v0.11.1 // indirect 15 | golang.org/x/sys v0.11.0 // indirect 16 | google.golang.org/protobuf v1.31.0 // indirect 17 | ) 18 | -------------------------------------------------------------------------------- /chapter-07/deployment-memory-leak.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: hello-server 5 | labels: 6 | app: hello-server 7 | spec: 8 | replicas: 3 9 | selector: 10 | matchLabels: 11 | app: hello-server 12 | template: 13 | metadata: 14 | labels: 15 | app: hello-server 16 | spec: 17 | containers: 18 | - name: hello-server 19 | image: blux2/hello-server:1.7 20 | ports: 21 | - containerPort: 8080 22 | resources: 23 | requests: 24 | memory: "100Mi" 25 | cpu: "10m" 26 | limits: 27 | memory: "100Mi" 28 | cpu: "10m" 29 | -------------------------------------------------------------------------------- /chapter-06/secret/nginx-sample.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | apiVersion: v1 3 | kind: Pod 4 | metadata: 5 | name: nginx-sample 6 | spec: 7 | containers: 8 | - name: nginx-container 9 | image: nginx:1.25.3 10 | env: 11 | - name: USERNAME 12 | valueFrom: 13 | secretKeyRef: 14 | name: nginx-secret 15 | key: username 16 | - name: PASSWORD 17 | valueFrom: 18 | secretKeyRef: 19 | name: nginx-secret 20 | key: password 21 | --- 22 | apiVersion: v1 23 | kind: Secret 24 | metadata: 25 | name: nginx-secret 26 | type: Opaque 27 | data: 28 | username: YWRtaW4= 29 | password: YWRtaW4xMjM= 30 | -------------------------------------------------------------------------------- /chapter-06/deployment-rollingupdate.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: nginx-deployment 5 | labels: 6 | app: nginx 7 | spec: 8 | strategy: 9 | type: RollingUpdate 10 | rollingUpdate: 11 | maxUnavailable: 25% 12 | maxSurge: 100% 13 | replicas: 10 14 | selector: 15 | matchLabels: 16 | app: nginx 17 | template: 18 | metadata: 19 | labels: 20 | app: nginx 21 | spec: 22 | containers: 23 | - name: nginx 24 | image: nginx:1.24.0 25 | ports: 26 | - containerPort: 80 27 | lifecycle: 28 | preStop: 29 | exec: 30 | command: ["/bin/sh", "-c", "sleep 10"] 31 | -------------------------------------------------------------------------------- /chapter-06/configmap/hello-server-env.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | apiVersion: apps/v1 3 | kind: Deployment 4 | metadata: 5 | name: hello-server 6 | labels: 7 | app: hello-server 8 | spec: 9 | replicas: 1 10 | selector: 11 | matchLabels: 12 | app: hello-server 13 | template: 14 | metadata: 15 | labels: 16 | app: hello-server 17 | spec: 18 | containers: 19 | - name: hello-server 20 | image: blux2/hello-server:1.4 21 | env: 22 | - name: PORT 23 | valueFrom: 24 | configMapKeyRef: 25 | name: hello-server-configmap 26 | key: PORT 27 | --- 28 | apiVersion: v1 29 | kind: ConfigMap 30 | metadata: 31 | name: hello-server-configmap 32 | data: 33 | PORT: "8081" 34 | -------------------------------------------------------------------------------- /chapter-06/configmap/hello-server-volume.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | apiVersion: apps/v1 3 | kind: Deployment 4 | metadata: 5 | name: hello-server 6 | labels: 7 | app: hello-server 8 | spec: 9 | replicas: 3 10 | selector: 11 | matchLabels: 12 | app: hello-server 13 | template: 14 | metadata: 15 | labels: 16 | app: hello-server 17 | spec: 18 | containers: 19 | - name: hello-server 20 | image: blux2/hello-server:1.5 21 | volumeMounts: 22 | - name: hello-server-config 23 | mountPath: /etc/config 24 | volumes: 25 | - name: hello-server-config 26 | configMap: 27 | name: hello-server-configmap 28 | --- 29 | apiVersion: v1 30 | kind: ConfigMap 31 | metadata: 32 | name: hello-server-configmap 33 | data: 34 | myconfig.txt: |- 35 | I am hungry. 36 | -------------------------------------------------------------------------------- /chapter-07/deployment-schedule-handson.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: hello-server 5 | labels: 6 | app: hello-server 7 | spec: 8 | replicas: 3 9 | selector: 10 | matchLabels: 11 | app: hello-server 12 | template: 13 | metadata: 14 | labels: 15 | app: hello-server 16 | spec: 17 | affinity: 18 | podAntiAffinity: 19 | requiredDuringSchedulingIgnoredDuringExecution: 20 | - labelSelector: 21 | matchExpressions: 22 | - key: app 23 | values: 24 | - hello-server 25 | operator: In 26 | topologyKey: kubernetes.io/hostname 27 | containers: 28 | - name: hello-server 29 | image: blux2/hello-server:1.8 30 | ports: 31 | - containerPort: 8080 32 | -------------------------------------------------------------------------------- /chapter-10/kustomize/hello-server/base/deployment.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: hello-server 5 | labels: 6 | app: hello-server 7 | spec: 8 | replicas: 3 9 | selector: 10 | matchLabels: 11 | app: hello-server 12 | template: 13 | metadata: 14 | labels: 15 | app: hello-server 16 | spec: 17 | containers: 18 | - name: hello-server 19 | image: blux2/hello-server:1.8 20 | resources: 21 | requests: 22 | memory: "256Mi" 23 | cpu: "10m" 24 | limits: 25 | memory: "256Mi" 26 | readinessProbe: 27 | httpGet: 28 | path: /health 29 | port: 8080 30 | initialDelaySeconds: 5 31 | periodSeconds: 5 32 | livenessProbe: 33 | httpGet: 34 | path: /health 35 | port: 8080 36 | initialDelaySeconds: 10 37 | periodSeconds: 5 38 | -------------------------------------------------------------------------------- /chapter-07/deployment-destruction.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: hello-server 5 | labels: 6 | app: hello-server 7 | spec: 8 | replicas: 3 9 | selector: 10 | matchLabels: 11 | app: hello-server 12 | template: 13 | metadata: 14 | labels: 15 | app: hello-server 16 | spec: 17 | containers: 18 | - name: hello-server 19 | image: blux2/hello-server:1.6 20 | ports: 21 | - containerPort: 8080 22 | readinessProbe: 23 | httpGet: 24 | path: /health 25 | port: 8081 26 | initialDelaySeconds: 5 27 | periodSeconds: 5 28 | livenessProbe: 29 | httpGet: 30 | path: /health 31 | port: 8080 32 | initialDelaySeconds: 10 33 | periodSeconds: 5 34 | - name: busybox 35 | image: busybox:1.36.1 36 | command: 37 | - sleep 38 | - "9999" 39 | 40 | -------------------------------------------------------------------------------- /hello-server/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "github.com/prometheus/client_golang/prometheus/promhttp" 6 | "log" 7 | "net/http" 8 | "os" 9 | ) 10 | 11 | func main() { 12 | port := os.Getenv("PORT") 13 | if port == "" { 14 | port = "8080" 15 | } 16 | 17 | http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { 18 | if r.URL.Path != "/" { 19 | http.NotFound(w, r) 20 | return 21 | } 22 | fmt.Fprintf(w, "Hello, world! Let's learn Kubernetes!") 23 | }) 24 | 25 | http.HandleFunc("/healthz", func(w http.ResponseWriter, r *http.Request) { 26 | if r.URL.Path != "/healthz" { 27 | http.NotFound(w, r) 28 | return 29 | } 30 | w.WriteHeader(http.StatusOK) 31 | fmt.Fprintf(w, "OK") 32 | log.Printf("Health Status OK") 33 | }) 34 | 35 | http.Handle("/metrics", promhttp.Handler()) 36 | 37 | log.Printf("Starting server on port %s\n", port) 38 | err := http.ListenAndServe(":"+port, nil) 39 | if err != nil { 40 | log.Fatal(err) 41 | } 42 | 43 | } 44 | -------------------------------------------------------------------------------- /chapter-06/configmap/hello-server-destruction.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | apiVersion: apps/v1 3 | kind: Deployment 4 | metadata: 5 | name: hello-server 6 | labels: 7 | app: hello-server 8 | spec: 9 | strategy: 10 | type: RollingUpdate 11 | rollingUpdate: 12 | maxSurge: 0 13 | replicas: 1 14 | selector: 15 | matchLabels: 16 | app: hello-server 17 | template: 18 | metadata: 19 | labels: 20 | app: hello-server 21 | spec: 22 | containers: 23 | - name: hello-server 24 | image: blux2/hello-server:1.4 25 | env: 26 | - name: PORT 27 | valueFrom: 28 | configMapKeyRef: 29 | name: hello-server-configmap 30 | key: PORT 31 | - name: HOST 32 | valueFrom: 33 | configMapKeyRef: 34 | name: hello-server-configmap 35 | key: HOST 36 | --- 37 | apiVersion: v1 38 | kind: ConfigMap 39 | metadata: 40 | name: hello-server-configmap 41 | data: 42 | PORT: "8081" 43 | -------------------------------------------------------------------------------- /chapter-07/deployment-resource-handson.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: hello-server 5 | labels: 6 | app: hello-server 7 | spec: 8 | replicas: 3 9 | selector: 10 | matchLabels: 11 | app: hello-server 12 | template: 13 | metadata: 14 | labels: 15 | app: hello-server 16 | spec: 17 | containers: 18 | - name: hello-server 19 | image: blux2/hello-server:1.6 20 | ports: 21 | - containerPort: 8080 22 | resources: 23 | requests: 24 | memory: "5Gi" 25 | cpu: "10m" 26 | limits: 27 | memory: "5Gi" 28 | cpu: "10m" 29 | readinessProbe: 30 | httpGet: 31 | path: /health 32 | port: 8080 33 | initialDelaySeconds: 5 34 | periodSeconds: 5 35 | livenessProbe: 36 | httpGet: 37 | path: /health 38 | port: 8080 39 | initialDelaySeconds: 10 40 | periodSeconds: 5 41 | -------------------------------------------------------------------------------- /chapter-07/hello-server-node-handson.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: hello-server 5 | labels: 6 | app: hello-server 7 | spec: 8 | replicas: 3 9 | selector: 10 | matchLabels: 11 | app: hello-server 12 | template: 13 | metadata: 14 | labels: 15 | app: hello-server 16 | spec: 17 | affinity: 18 | podAntiAffinity: 19 | requiredDuringSchedulingIgnoredDuringExecution: 20 | - labelSelector: 21 | matchExpressions: 22 | - key: app 23 | values: 24 | - hello-server 25 | operator: In 26 | topologyKey: kubernetes.io/hostname 27 | containers: 28 | - name: hello-server 29 | image: blux2/hello-server:1.8 30 | ports: 31 | - containerPort: 8080 32 | --- 33 | apiVersion: policy/v1 34 | kind: PodDisruptionBudget 35 | metadata: 36 | name: hello-server-pdb 37 | spec: 38 | maxUnavailable: 10% 39 | selector: 40 | matchLabels: 41 | app: hello-server 42 | -------------------------------------------------------------------------------- /.github/workflows/build.yaml: -------------------------------------------------------------------------------- 1 | name: build 2 | 3 | on: 4 | push: 5 | tags: 6 | - "*" 7 | 8 | jobs: 9 | build: 10 | runs-on: ubuntu-latest 11 | 12 | steps: 13 | - name: Checkout repository 14 | uses: actions/checkout@v3 15 | 16 | # Add support for more platforms with QEMU (optional) 17 | # https://github.com/docker/setup-qemu-action 18 | - name: Set up QEMU 19 | uses: docker/setup-qemu-action@v2 20 | 21 | - name: Set up Docker Buildx 22 | uses: docker/setup-buildx-action@v2 23 | 24 | - name: Login to DockerHub 25 | uses: docker/login-action@v2 26 | with: 27 | username: ${{ secrets.DOCKERHUB_USERNAME }} 28 | password: ${{ secrets.DOCKERHUB_TOKEN }} 29 | 30 | - name: Build and push multi-arch images 31 | uses: docker/build-push-action@v3 32 | with: 33 | push: true 34 | platforms: linux/amd64,linux/arm64 35 | tags: blux2/hello-server:${{ github.ref_name }} 36 | context: ./hello-server 37 | file: ./hello-server/Dockerfile 38 | no-cache: true 39 | -------------------------------------------------------------------------------- /chapter-10/hello-server.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | apiVersion: apps/v1 3 | kind: Deployment 4 | metadata: 5 | name: hello-server 6 | labels: 7 | app: hello-server 8 | spec: 9 | replicas: 3 10 | selector: 11 | matchLabels: 12 | app: hello-server 13 | template: 14 | metadata: 15 | labels: 16 | app: hello-server 17 | spec: 18 | containers: 19 | - name: hello-server 20 | image: blux2/hello-server:1.8 21 | resources: 22 | requests: 23 | memory: "256Mi" 24 | cpu: "10m" 25 | limits: 26 | memory: "256Mi" 27 | readinessProbe: 28 | httpGet: 29 | path: /health 30 | port: 8080 31 | initialDelaySeconds: 5 32 | periodSeconds: 5 33 | livenessProbe: 34 | httpGet: 35 | path: /health 36 | port: 8080 37 | initialDelaySeconds: 10 38 | periodSeconds: 5 39 | --- 40 | apiVersion: policy/v1 41 | kind: PodDisruptionBudget 42 | metadata: 43 | name: hello-server-pdb 44 | spec: 45 | maxUnavailable: 10% 46 | selector: 47 | matchLabels: 48 | app: hello-server 49 | -------------------------------------------------------------------------------- /chapter-06/cronjob-hello-server.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | apiVersion: apps/v1 3 | kind: Deployment 4 | metadata: 5 | name: hello-server 6 | labels: 7 | app: hello-server 8 | spec: 9 | replicas: 3 10 | selector: 11 | matchLabels: 12 | app: hello-server 13 | template: 14 | metadata: 15 | labels: 16 | app: hello-server 17 | spec: 18 | containers: 19 | - name: hello-server 20 | image: blux2/hello-server:1.0 21 | ports: 22 | - containerPort: 8080 23 | --- 24 | apiVersion: v1 25 | kind: Service 26 | metadata: 27 | name: hello-server-service 28 | spec: 29 | selector: 30 | app: hello-server 31 | ports: 32 | - protocol: TCP 33 | port: 8080 34 | targetPort: 8080 35 | --- 36 | apiVersion: batch/v1 37 | kind: CronJob 38 | metadata: 39 | name: ping 40 | spec: 41 | schedule: "*/1 * * * *" 42 | jobTemplate: 43 | spec: 44 | template: 45 | spec: 46 | containers: 47 | - name: ping 48 | image: curlimages/curl 49 | command: 50 | - sh 51 | - -c 52 | args: 53 | - curl -s -v hello-server-service.default.svc.cluster.local:8081 54 | restartPolicy: OnFailure 55 | -------------------------------------------------------------------------------- /chapter-11/hello-server.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | apiVersion: apps/v1 3 | kind: Deployment 4 | metadata: 5 | namespace: develop 6 | name: hello-server 7 | labels: 8 | app: hello-server 9 | spec: 10 | replicas: 3 11 | selector: 12 | matchLabels: 13 | app: hello-server 14 | template: 15 | metadata: 16 | labels: 17 | app: hello-server 18 | spec: 19 | containers: 20 | - name: hello-server 21 | image: blux2/hello-server:2.3 22 | resources: 23 | requests: 24 | memory: "256Mi" 25 | cpu: "10m" 26 | limits: 27 | memory: "256Mi" 28 | cpu: "10m" 29 | readinessProbe: 30 | httpGet: 31 | path: /healthz 32 | port: 8080 33 | initialDelaySeconds: 5 34 | periodSeconds: 5 35 | livenessProbe: 36 | httpGet: 37 | path: /healthz 38 | port: 8080 39 | initialDelaySeconds: 10 40 | periodSeconds: 5 41 | --- 42 | apiVersion: v1 43 | kind: Service 44 | metadata: 45 | namespace: develop 46 | name: hello-server 47 | spec: 48 | type: NodePort 49 | selector: 50 | app: hello-server 51 | ports: 52 | - port: 8080 53 | targetPort: 8080 54 | -------------------------------------------------------------------------------- /chapter-11/hello-server-destruction.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | apiVersion: apps/v1 3 | kind: Deployment 4 | metadata: 5 | namespace: develop 6 | name: hello-server 7 | labels: 8 | app: hello-server 9 | spec: 10 | replicas: 3 11 | selector: 12 | matchLabels: 13 | app: hello-server 14 | template: 15 | metadata: 16 | labels: 17 | app: hello-server 18 | spec: 19 | containers: 20 | - name: hello-server 21 | image: blux2/hello-server:2.4.1 22 | resources: 23 | requests: 24 | memory: "256Mi" 25 | cpu: "10m" 26 | limits: 27 | memory: "256Mi" 28 | cpu: "10m" 29 | readinessProbe: 30 | httpGet: 31 | path: /healthz 32 | port: 8080 33 | initialDelaySeconds: 5 34 | periodSeconds: 5 35 | livenessProbe: 36 | httpGet: 37 | path: /healthz 38 | port: 8080 39 | initialDelaySeconds: 10 40 | periodSeconds: 5 41 | --- 42 | apiVersion: v1 43 | kind: Service 44 | metadata: 45 | namespace: develop 46 | name: hello-server 47 | spec: 48 | type: NodePort 49 | selector: 50 | app: hello-server 51 | ports: 52 | - port: 8080 53 | targetPort: 8080 54 | -------------------------------------------------------------------------------- /chapter-07/hpa-hello-server.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: hpa-handson 5 | labels: 6 | app: hello-server 7 | spec: 8 | selector: 9 | matchLabels: 10 | app: hello-server 11 | template: 12 | metadata: 13 | labels: 14 | app: hello-server 15 | spec: 16 | containers: 17 | - name: hello-server 18 | image: blux2/hello-server:1.8 19 | ports: 20 | - containerPort: 8080 21 | resources: 22 | requests: 23 | memory: "10Mi" 24 | cpu: "5m" 25 | limits: 26 | memory: "10Mi" 27 | cpu: "5m" 28 | --- 29 | apiVersion: autoscaling/v2 30 | kind: HorizontalPodAutoscaler 31 | metadata: 32 | name: hello-server-hpa 33 | spec: 34 | minReplicas: 1 35 | maxReplicas: 10 36 | metrics: 37 | - resource: 38 | name: cpu 39 | target: 40 | averageUtilization: 50 41 | type: Utilization 42 | type: Resource 43 | scaleTargetRef: 44 | apiVersion: apps/v1 45 | kind: Deployment 46 | name: hpa-handson 47 | --- 48 | apiVersion: v1 49 | kind: Service 50 | metadata: 51 | name: hello-server-service 52 | spec: 53 | selector: 54 | app: hello-server 55 | ports: 56 | - protocol: TCP 57 | port: 8080 58 | targetPort: 8080 59 | -------------------------------------------------------------------------------- /chapter-09/hello-server.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | apiVersion: apps/v1 3 | kind: Deployment 4 | metadata: 5 | name: hello-server 6 | labels: 7 | app: hello-server 8 | spec: 9 | replicas: 3 10 | selector: 11 | matchLabels: 12 | app: hello-server 13 | template: 14 | metadata: 15 | labels: 16 | app: hello-server 17 | spec: 18 | containers: 19 | - name: hello-server 20 | image: blux2/hello-server:1.8 21 | resources: 22 | requests: 23 | memory: "256Mi" 24 | cpu: "10m" 25 | limits: 26 | memory: "256Mi" 27 | cpu: "10m" 28 | readinessProbe: 29 | httpGet: 30 | path: /health 31 | port: 8080 32 | initialDelaySeconds: 5 33 | periodSeconds: 5 34 | livenessProbe: 35 | httpGet: 36 | path: /health 37 | port: 8080 38 | initialDelaySeconds: 10 39 | periodSeconds: 5 40 | --- 41 | apiVersion: policy/v1 42 | kind: PodDisruptionBudget 43 | metadata: 44 | name: hello-server-pdb 45 | spec: 46 | maxUnavailable: 10% 47 | selector: 48 | matchLabels: 49 | app: hello-server 50 | --- 51 | apiVersion: v1 52 | kind: Service 53 | metadata: 54 | name: hello-server-external 55 | spec: 56 | type: NodePort 57 | selector: 58 | app: hello-server 59 | ports: 60 | - port: 8080 61 | targetPort: 8080 62 | nodePort: 30599 63 | -------------------------------------------------------------------------------- /chapter-08/hello-server.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | apiVersion: apps/v1 3 | kind: Deployment 4 | metadata: 5 | name: hello-server 6 | labels: 7 | app: hello-server 8 | spec: 9 | replicas: 3 10 | selector: 11 | matchLabels: 12 | app: hello-server 13 | template: 14 | metadata: 15 | labels: 16 | app: hello-server 17 | spec: 18 | affinity: 19 | podAntiAffinity: 20 | preferredDuringSchedulingIgnoredDuringExecution: 21 | - weight: 1 22 | podAffinityTerm: 23 | labelSelector: 24 | matchExpressions: 25 | - key: app 26 | values: 27 | - hello-server 28 | operator: In 29 | topologyKey: kubernetes.io/hostname 30 | containers: 31 | - name: hello-server 32 | image: blux2/hello-server:1.8 33 | env: 34 | - name: PORT 35 | valueFrom: 36 | configMapKeyRef: 37 | name: hello-server-configmap 38 | key: PORT 39 | resources: 40 | requests: 41 | memory: "256Mi" 42 | cpu: "10m" 43 | limits: 44 | memory: "256Mi" 45 | cpu: "10m" 46 | readinessProbe: 47 | httpGet: 48 | path: /health 49 | port: 8081 50 | initialDelaySeconds: 5 51 | periodSeconds: 5 52 | livenessProbe: 53 | httpGet: 54 | path: /health 55 | port: 8081 56 | initialDelaySeconds: 10 57 | periodSeconds: 5 58 | --- 59 | apiVersion: v1 60 | kind: ConfigMap 61 | metadata: 62 | name: hello-server-configmap 63 | data: 64 | PORT: "8081" 65 | HOST: "localhost" 66 | --- 67 | apiVersion: v1 68 | kind: Service 69 | metadata: 70 | name: hello-server-external 71 | spec: 72 | type: NodePort 73 | selector: 74 | app: hello-server 75 | ports: 76 | - port: 8081 77 | targetPort: 8081 78 | nodePort: 30599 79 | --- 80 | apiVersion: policy/v1 81 | kind: PodDisruptionBudget 82 | metadata: 83 | name: hello-server-pdb 84 | spec: 85 | maxUnavailable: 10% 86 | selector: 87 | matchLabels: 88 | app: hello-server 89 | -------------------------------------------------------------------------------- /chapter-08/handson-answer.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | apiVersion: apps/v1 3 | kind: Deployment 4 | metadata: 5 | name: hello-server 6 | labels: 7 | app: hello-server 8 | spec: 9 | replicas: 3 10 | selector: 11 | matchLabels: 12 | app: hello-server 13 | template: 14 | metadata: 15 | labels: 16 | app: hello-server 17 | spec: 18 | affinity: 19 | podAntiAffinity: 20 | preferredDuringSchedulingIgnoredDuringExecution: 21 | - weight: 1 22 | podAffinityTerm: 23 | labelSelector: 24 | matchExpressions: 25 | - key: app 26 | values: 27 | - hello-server 28 | operator: In 29 | topologyKey: kubernetes.io/hostname 30 | containers: 31 | - name: hello-server 32 | image: blux2/hello-server:2.0.1 33 | env: 34 | - name: PORT 35 | valueFrom: 36 | configMapKeyRef: 37 | name: hello-server-configmap 38 | key: PORT 39 | resources: 40 | requests: 41 | memory: "256Mi" 42 | cpu: "10m" 43 | limits: 44 | memory: "256Mi" 45 | cpu: "10m" 46 | readinessProbe: 47 | httpGet: 48 | path: /healthz 49 | port: 8082 50 | initialDelaySeconds: 5 51 | periodSeconds: 5 52 | livenessProbe: 53 | httpGet: 54 | path: /healthz 55 | port: 8082 56 | initialDelaySeconds: 10 57 | periodSeconds: 5 58 | --- 59 | apiVersion: v1 60 | kind: ConfigMap 61 | metadata: 62 | name: hello-server-configmap 63 | data: 64 | PORT: "8082" 65 | HOST: "localhost" 66 | --- 67 | apiVersion: v1 68 | kind: Service 69 | metadata: 70 | name: hello-server-external 71 | spec: 72 | type: NodePort 73 | selector: 74 | app: hello-server 75 | ports: 76 | - port: 8082 77 | targetPort: 8082 78 | nodePort: 30599 79 | --- 80 | apiVersion: policy/v1 81 | kind: PodDisruptionBudget 82 | metadata: 83 | name: hello-server-pdb 84 | spec: 85 | maxUnavailable: 10% 86 | selector: 87 | matchLabels: 88 | app: hello-server 89 | -------------------------------------------------------------------------------- /chapter-08/hello-server-update.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | apiVersion: apps/v1 3 | kind: Deployment 4 | metadata: 5 | name: hello-server 6 | labels: 7 | app: hello-server 8 | spec: 9 | replicas: 3 10 | selector: 11 | matchLabels: 12 | app: hello-server 13 | template: 14 | metadata: 15 | labels: 16 | app: hello-server 17 | spec: 18 | affinity: 19 | podAntiAffinity: 20 | preferredDuringSchedulingIgnoredDuringExecution: 21 | - weight: 1 22 | podAffinityTerm: 23 | labelSelector: 24 | matchExpressions: 25 | - key: app 26 | values: 27 | - hello-server 28 | operator: In 29 | topologyKey: kubernetes.io/hostname 30 | containers: 31 | - name: hello-server 32 | image: blux2/hello-server:2.0.1 33 | env: 34 | - name: PORT 35 | valueFrom: 36 | configMapKeyRef: 37 | name: hello-server-configmap 38 | key: PORT 39 | resources: 40 | requests: 41 | memory: "256Mi" 42 | cpu: "10m" 43 | limits: 44 | memory: "256Mi" 45 | cpu: "10m" 46 | readinessProbe: 47 | httpGet: 48 | path: /health 49 | port: 8081 50 | initialDelaySeconds: 5 51 | periodSeconds: 5 52 | livenessProbe: 53 | httpGet: 54 | path: /health 55 | port: 8081 56 | initialDelaySeconds: 10 57 | periodSeconds: 5 58 | --- 59 | apiVersion: v1 60 | kind: ConfigMap 61 | metadata: 62 | name: hello-server-configmap 63 | data: 64 | PORT: "8082" 65 | HOST: "localhost" 66 | --- 67 | apiVersion: v1 68 | kind: Service 69 | metadata: 70 | name: hello-server-external 71 | spec: 72 | type: NodePort 73 | selector: 74 | app: hello-server 75 | ports: 76 | - port: 8081 77 | targetPort: 8081 78 | nodePort: 30599 79 | --- 80 | apiVersion: policy/v1 81 | kind: PodDisruptionBudget 82 | metadata: 83 | name: hello-server-pdb 84 | spec: 85 | maxUnavailable: 10% 86 | selector: 87 | matchLabels: 88 | app: hello-server 89 | -------------------------------------------------------------------------------- /hello-server/go.sum: -------------------------------------------------------------------------------- 1 | github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= 2 | github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= 3 | github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= 4 | github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= 5 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 6 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 7 | github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 8 | github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= 9 | github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= 10 | github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= 11 | github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 12 | github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= 13 | github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= 14 | github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= 15 | github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= 16 | github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q= 17 | github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY= 18 | github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16 h1:v7DLqVdK4VrYkVD5diGdl4sxJurKJEMnODWRJlxV9oM= 19 | github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= 20 | github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= 21 | github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= 22 | github.com/prometheus/procfs v0.11.1 h1:xRC8Iq1yyca5ypa9n1EZnWZkt7dwcoRPQwX/5gwaUuI= 23 | github.com/prometheus/procfs v0.11.1/go.mod h1:eesXgaPo1q7lBpVMoMy0ZOFTth9hBn4W/y0/p/ScXhY= 24 | golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 25 | golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= 26 | golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 27 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 28 | google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= 29 | google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= 30 | google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= 31 | google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= 32 | --------------------------------------------------------------------------------