Kubernetes ist ein OpenSource System zur Automatisierung der Bereitstellung, Skalierung und Verwaltung von Container-Anwendungen (siehe Docker), das ursprünglich von Google entworfen wurde. Docker hat ein integriertes Tool (Docker Swarm) zum selben Zweck, Kubernetes kann jedoch das selbe und noch viel mehr und wird ab Werk von Docker unterstützt.
Kubernetes ist deklarativ, das bedeutet man beschreibt den gewünschten Endzustand.
On all nodes
/etc/hosts
file and add all nodes./etc/fstab
and uncomment SWAP partition/etc/initramfs-tools/conf.d/resume
and uncomment swap uuidsystemctl –type swap
and mask it using systemctl mask xxx.swap
.todo: what about fw, selinux?
apt update && apt install apt-transport-https curl curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main" apt update && apt install -y kubelet kubeadm kubectl docker.io systemctl enable docker
Only on master node
kubeadm init --apiserver-advertise-address 192.168.0.100 --pod-network-cidr=172.16.0.0/16 # REMEMBER JOIN TOKEN output from last command !!!!!!!!!!!!!!!!! # when done execute as regular user mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config # enable network addon sudo kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
Only on nodes except master
kubeadm join 192.168.0.100:6443 --token zbdvek.v8fnw7hw8xcdxk03 --discovery-token-ca-cert-hash sha256:724601e4cd00fd78312f1fbf3726b688e894fc88f2c25962f478e546a59929c7
API Token vergessen/abgelaufen?
kubeadm token create --print-join-command
Test on master node
kubectl run my-httpd --image=httpd --port=80 kubectl get pods -l app=demo kubectl scale deployment [deployment] --replicas 3 kubectl exec -it my-httpd -- /bin/bash kubectl set image deployment demo nginx=1.9.1 kubectl patch pod my-httpd --patch '{}' kubectl delete pod myhttpd
Finally autostart
systemctl start kubelet systemctl enable kubelet systemctl start docker systemctl start kubelet
apiVersion: v1 kind: Pod metadata: name: demo spec: containers: - image: nginx name: nginx imagePullPolicy: Always
kubectl create -f mypod.yml kubectl delete pod demo
Update muss manuell vorgenommen werden (downtime).
apiVersion: apps/v1 kind: ReplicaSet metadata: name: demo spec: replicas: 2 selector: matchLabels: app: demo template: metadata: labels: app: demo spec: containers: - name: nginx image: nginx imagePullPolicy: Always
kubectl create -f myreplica.yml kubectl delete replicaset demo
Deployments nutzen intern replicaset und managen das rolling update von selbst.
apiVersion: apps/v1 kind: Deployment metadata: name: demo spec: replicas: 2 selector: matchLabels: app: demo template: metadata: labels: app: demo spec: containers: - name: nginx image: nginx imagePullPolicy: Always env: - name: VERSION value: "v1"
kubectl create -f mydeployment.yml kubectl delete deployment demo
apiVersion: v1 kind: PersistentVolume metadata: name: pv0003 spec: capacity: storage: 5Gi volumeMode: Filesystem accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Recycle storageClassName: slow mountOptions: - hard - nfsvers=4.1 nfs: path: /tmp server: 172.17.0.2
todo