Course Objectives
Scheduling
Manual Scheduling Labels & Selectors Resource Limits
daemon Sets Multiple Schedulers Scheduler Events
Configure Kubernetes Scheduler
Logging Monitoring
Application Lifecycle Management
Cluster Maintenance
Security
Storage
Troubleshooting
3
MANUAL
SCHEDULING
How scheduling works pod-definition.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
name: nginx
spec:
What to Schedule? containers:
- name: nginx
image: nginx
nodeName: nodeName: nodeName: nodeName:
node01 node01 ???? node02 ports:
- containerPort: 8080
nodeName: node02
Which node to schedule?
nodeName:
(Schedule)Bind Pod to Node node02
No Scheduler! pod-definition.yaml
apiVersion: v1
kubectl get pods kind: Pod
NAME READY STATUS RESTARTS AGE metadata:
nginx 0/1 Pending 0 3s name: nginx
labels:
name: nginx
kubectl get pods
spec:
containers:
NAME READY STATUS RESTARTS AGE IP NODE - name: nginx
nginx 1/1 Running 0 9s 10.40.0.4 node02
image: nginx
ports:
- containerPort: 8080
nodeName: node02
No Scheduler! pod-definition.yaml
apiVersion: v1
Pod-bind-definition.yaml kind: Pod
apiVersion: v1 metadata:
kind: Binding name: nginx
metadata: labels:
name: nginx name: nginx
target: spec:
apiVersion: v1 containers:
kind: Node - name: nginx
name:
'{"apiVersion":"v1", "kind": "Binding“ …. } image: nginx
ports:
- containerPort: 8080
nodeName: node02
curl --header "Content-Type:application/json" --request POST --data
http://$SERVER/api/v1/namespaces/default/pods/$PODNAME/binding/
Course Objectives
Scheduling
Manual Scheduling Labels & Selectors Resource Limits
daemon Sets Multiple Schedulers Scheduler Events
Configure Kubernetes Scheduler
Logging Monitoring
Application Lifecycle Management
Cluster Maintenance
Security
Storage
Troubleshooting
9
Daemon
Sets
Daemon Sets
Daemon Sets
ReplicaSet
Deployments
Daemon Sets – UseCase
Monitoring Solution Logs Viewer
Daemon Sets
Daemon Sets – UseCase – kube-proxy
Kube-proxy Kube-proxy Kube-proxy Kube-proxy Kube-proxy Kube-proxy
Daemon Sets
Daemon Sets – UseCase – Networking
Weave-net weave-net weave-net weave-net weave-net weave-net
Daemon Sets
DaemonSet Definition
daemon-set-definition.yaml replicaset-definition.yaml
apiVersion: apps/v1 apiVersion: apps/v1
kind: DaemonSet kind: ReplicaSet
metadata: metadata:
name: monitoring-daemon name: monitoring-daemon
spec: spec:
selector: selector:
matchLabels: matchLabels:
app: monitoring-agent app: monitoring-agent
template: template:
metadata: metadata:
labels: labels:
app: monitoring-agent app: monitoring-agent
spec: spec:
containers: containers:
- name: monitoring-agent - name: monitoring-agent
image: monitoring-agent image: monitoring-agent
kubectl create –f daemon-set-definition.yaml
daemon-set Created
View DaemonSets
kubectl get daemonsets
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE AGE
monitoring-daemon 1 1 1 1 1 41
kubectl describe daemonsets monitoring-daemon
Name: monitoring-daemon
Selector: name=monitoring-daemon
Node-Selector: <none>
Labels: name=monitoring-daemon
Desired Number of Nodes Scheduled: 2
Current Number of Nodes Scheduled: 2
Number of Nodes Scheduled with Up-to-date Pods: 2
Number of Nodes Scheduled with Available Pods: 1
Number of Nodes Misscheduled: 0
Pods Status: 2 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
Labels: app=monitoring-agent
Containers:
How does it work?
Default Behavior till v1.12
From v1.12 - uses NodeAffinity and default
scheduler
nodeName: nodeName: nodeName: nodeName: nodeName: nodeName:
node01 node02 node03 node04 node05 node06
Course Objectives
Scheduling
Manual Scheduling Labels & Selectors Resource Limits
daemon Sets Multiple Schedulers Scheduler Events
Configure Kubernetes Scheduler
Logging Monitoring
Application Lifecycle Management
Cluster Maintenance
Security
Storage
Troubleshooting
19
MULTIPLE
SCHEDULERS
Master Worker Nodes
Manage, Plan, Schedule, Monitor Host Application as Containers
Nodes
Scheduler-3
Scheduler-2
Scheduler-2 Scheduler-3
Kube-Scheduler
Deploy Additional Scheduler
wget https://storage.googleapis.com/kubernetes-release/release/v1.12.0/bin/linux/amd64/kube-scheduler
kube-scheduler.service
ExecStart=/usr/local/bin/kube-scheduler \\
--config=/etc/kubernetes/config/kube-scheduler.yaml \\
--scheduler-name= default-scheduler
my-custom-scheduler.service
ExecStart=/usr/local/bin/kube-scheduler \\
--config=/etc/kubernetes/config/kube-scheduler.yaml \\
--scheduler-name= my-custom-scheduler
Deploy Additional Scheduler - kubeadm
/etc/kubernetes/manifests/kube-scheduler.yaml my-custom-scheduler.yaml
apiVersion: v1 apiVersion: v1
kind: Pod kind: Pod
metadata: metadata:
name: kube-scheduler name: my-custom-scheduler
namespace: kube-system namespace: kube-system
spec: spec:
containers: containers:
- command: - command:
- kube-scheduler - kube-scheduler
- --address=127.0.0.1 - --address=127.0.0.1
- --kubeconfig=/etc/kubernetes/scheduler.conf - --kubeconfig=/etc/kubernetes/scheduler.conf
- --leader-elect=true - --leader-elect=true
image: k8s.gcr.io/kube-scheduler-amd64:v1.11.3 image: k8s.gcr.io/kube-scheduler-amd64:v1.11.3
- --scheduler-name=my-custom-scheduler
name: kube-scheduler name: kube-scheduler
- --lock-object-name=my-custom-scheduler
View Schedulers
kubectl get pods --namespace=kube-system
NAME READY STATUS RESTARTS AGE
coredns-78fcdf6894-bk4ml 1/1 Running 0 1h
coredns-78fcdf6894-ppr6m 1/1 Running 0 1h
etcd-master 1/1 Running 0 1h
kube-apiserver-master 1/1 Running 0 1h
kube-controller-manager-master 1/1 Running 0 1h
kube-proxy-dgbgv 1/1 Running 0 1h
kube-proxy-fptbr 1/1 Running 0 1h
kube-scheduler-master 1/1 Running 0 1h
my-custom-scheduler 1/1 Running 0 9s
weave-net-4tfpt 2/2 Running 1 1h
weave-net-6j6zs 2/2 Running 1 1h
Use Custom Scheduler
kubectl get pods --namespace=kube-system pod-definition.yaml
NAME READY STATUS RESTARTS AGE
coredns-78fcdf6894-bk4ml 1/1 Running 0 1h apiVersion: v1
coredns-78fcdf6894-ppr6m 1/1 Running 0 1h kind: Pod
etcd-master 1/1 Running 0 1h metadata:
kube-apiserver-master 1/1 Running 0 1h name: nginx
kube-controller-manager-master 1/1 Running 0 1h spec:
kube-proxy-dgbgv 1/1 Running 0 1h
kube-proxy-fptbr 1/1 Running 0 1h containers:
kube-scheduler-master 1/1 Running 0 1h - image: nginx
my-custom-scheduler
my-custom-scheduler 1/1 Running 0 9s name: nginx
weave-net-4tfpt 2/2 Running 1 1h
weave-net-6j6zs 2/2 Running 1 1h schedulerName:
kubectl create –f pod-definition.yaml
kubectl get pods kubectl get pods
NAME READY STATUS RESTARTS AGE NAME READY STATUS RESTARTS AGE
nginx 0/1 Pending 0 6s nginx 1/1 Running 0 6s
View Events
kubectl get events
LAST SEEN COUNT NAME KIND TYPE REASON SOURCE MESSAGE
9s 1 nginx.15 Pod Normal Scheduled my-custom-scheduler Successfully assigned default/nginx to node01
8s 1 nginx.15 Pod Normal Pulling kubelet, node01 pulling image "nginx"
2s 1 nginx.15 Pod Normal Pulled kubelet, node01 Successfully pulled image "nginx"
2s 1 nginx.15 Pod Normal Created kubelet, node01 Created container
2s 1 nginx.15 Pod Normal Started kubelet, node01 Started container
View Scheduler Logs
kubectl logs my-custom-scheduler --name-space=kube-system
I0204 09:42:25.819338 1 server.go:126] Version: v1.11.3
W0204 09:42:25.822720 1 authorization.go:47] Authorization is disabled
W0204 09:42:25.822745 1 authentication.go:55] Authentication is disabled
I0204 09:42:25.822801 1 insecure_serving.go:47] Serving healthz insecurely on 127.0.0.1:10251
I0204 09:45:14.725407 1 controller_utils.go:1025] Waiting for caches to sync for scheduler controller
I0204 09:45:14.825634 1 controller_utils.go:1032] Caches are synced for scheduler controller
I0204 09:45:14.825814 1 leaderelection.go:185] attempting to acquire leader lease kube-system/my-custom-scheduler...
I0204 09:45:14.834953 1 leaderelection.go:194] successfully acquired lease kube-system/my-custom-scheduler
Course Objectives
Scheduling
Labels & Selectors Resource Limits Manual Scheduling
daemon Sets Multiple Schedulers Scheduler Events
Configure Kubernetes Scheduler
Logging Monitoring
Application Lifecycle Management
Cluster Maintenance
Security
Storage
Troubleshooting
29
CONFIGURING
SCHEDULER
Deploy Additional Scheduler
wget https://storage.googleapis.com/kubernetes-release/release/v1.12.0/bin/linux/amd64/kube-scheduler
kube-scheduler.service
ExecStart=/usr/local/bin/kube-scheduler \\
--config=/etc/kubernetes/config/kube-scheduler.yaml \\
--scheduler-name= default-scheduler
my-custom-scheduler.service
ExecStart=/usr/local/bin/kube-scheduler \\
--config=/etc/kubernetes/config/kube-scheduler.yaml \\
--scheduler-name= my-custom-scheduler
Deploy Additional Scheduler - kubeadm
/etc/kubernetes/manifests/kube-scheduler.yaml my-custom-scheduler.yaml
apiVersion: v1 apiVersion: v1
kind: Pod kind: Pod
metadata: metadata:
name: kube-scheduler name: my-custom-scheduler
namespace: kube-system namespace: kube-system
spec: spec:
containers: containers:
- command: - command:
- kube-scheduler - kube-scheduler
- --address=127.0.0.1 - --address=127.0.0.1
- --kubeconfig=/etc/kubernetes/scheduler.conf - --kubeconfig=/etc/kubernetes/scheduler.conf
- --leader-elect=true - --leader-elect=true
image: k8s.gcr.io/kube-scheduler-amd64:v1.11.3 image: k8s.gcr.io/kube-scheduler-amd64:v1.11.3
- --scheduler-name=my-custom-scheduler
name: kube-scheduler name: kube-scheduler
- --lock-object-name=my-custom-scheduler
Course Objectives
Scheduling
Logging Monitoring
Secrets
Application Lifecycle Management
Cluster Maintenance
Security
Authentication & Authorization TLS Certificates for Cluster Components
Kubernetes Security Images Securely
Network Policies Security Contexts Secure Persistent Key Value Store
Storage
Troubleshooting
34
AUTHENTICATION