# Kubernetes Services classroom demo
# Apply:   kubectl apply -f k8s-services-demo.yaml
# Inspect: kubectl -n svc-demo get deployments,pods,services -o wide
# Remove:  kubectl delete namespace svc-demo

apiVersion: v1
kind: Namespace
metadata:
  name: svc-demo
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: whoami
  namespace: svc-demo
spec:
  replicas: 3
  selector:
    matchLabels:
      app: whoami
  template:
    metadata:
      labels:
        app: whoami
    spec:
      containers:
        - name: whoami
          image: traefik/whoami:v1.11.0
          ports:
            - name: http
              containerPort: 80
          readinessProbe:
            httpGet:
              path: /
              port: http
            initialDelaySeconds: 1
            periodSeconds: 3
---
# Stable virtual IP and DNS name inside the cluster.
apiVersion: v1
kind: Service
metadata:
  name: clusterip
  namespace: svc-demo
spec:
  type: ClusterIP
  selector:
    app: whoami
  ports:
    - name: http
      port: 80
      targetPort: http
---
# Reachable on any node's IP, if network and firewall permit it.
apiVersion: v1
kind: Service
metadata:
  name: nodeport
  namespace: svc-demo
spec:
  type: NodePort
  selector:
    app: whoami
  ports:
    - name: http
      port: 80
      targetPort: http
---
# Gets an EXTERNAL-IP only with a cloud or local load balancer implementation.
apiVersion: v1
kind: Service
metadata:
  name: loadbalancer
  namespace: svc-demo
spec:
  type: LoadBalancer
  selector:
    app: whoami
  ports:
    - name: http
      port: 80
      targetPort: http
---
# Returns Pod IP addresses through DNS, instead of a Service virtual IP.
apiVersion: v1
kind: Service
metadata:
  name: headless
  namespace: svc-demo
spec:
  clusterIP: None
  selector:
    app: whoami
  ports:
    - name: http
      port: 80
      targetPort: http
---
# DNS alias to an external hostname, NOT a proxy to the whoami Pods.
apiVersion: v1
kind: Service
metadata:
  name: externalname
  namespace: svc-demo
spec:
  type: ExternalName
  externalName: example.com
  ports:
    - name: http
      port: 80
