Kubernetes ohne Cloud - Installation und erster Service

Kubernetes ist ein Open-Source-System zur Automatisierung von Deployments, Skalierung und Verwaltung von containerisierten Anwendungen. In diesem Beitrag wird eine beispielhafte Installation im Single-Node-Modus auf Fedora beschrieben sowie eine erste Bereitstellung eines Services. Der hier konfigurierte Cluster ist nicht für den Live-Betrieb vorbereitet. Für den Live-Betrieb muss die Konfiguration erweitert werden.

Vorbereitungen

Benötigt werden mindestens zwei Maschinen mit installiertem Fedora-Linux. Ein Server wird zum Kubernetes-Master und der andere zum Kubernetes-Node. Auf Master werden gestartet: Kube-Apiserver, Kube-Controller-Manager, Kube-Scheduler und Etcd. Auf dem Node werden Kubelet, Proxy und Docker laufen.

Master und Node

  • Swap deaktivieren
swapoff -a

In /etc/fstab den Eintrag mit swap löschen.

  • Services installieren
dnf -y install kubernetes etcd
  • /etc/hosts aktualisieren
IPDESMASTER fed-master
IPDESNODE fed-node
  • Die Adresse des Master in der Kubernetes-Config (/etc/kubernetes/config) eintragen
KUBE_MASTER="--master=http://fed-master:8080"
  • Firewall fürs Erste deaktivieren
systemctl mask firewalld.service
systemctl stop firewalld.service

Master

  • API-Server konfigurieren (/etc/kubernetes/apiserver)
# The address on the local server to listen to.
KUBE_API_ADDRESS="--address=0.0.0.0"

# Comma separated list of nodes in the etcd cluster
KUBE_ETCD_SERVERS="--etcd-servers=http://127.0.0.1:2379"

# Address range to use for services
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
  • In /etc/kubernetes/apiserver muss noch ein kleiner Workaround eingebaut werden. Unter "KUBE_ADMISSION_CONTROL" muss der Eintrag "ServiceAccount" entfernt werden. Ansonsten werden Pods nicht korrekt erstellt (Siehe https://github.com/kubernetes/kubernetes/issues/49804). Der neue Eintrag sieht wie folgt aus:
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,LimitRanger,SecurityContextDeny,ResourceQuota"
  • etcd für alle IP-Adressen öffnen
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
  • Dienste starten
for SERVICES in etcd kube-apiserver kube-controller-manager kube-scheduler; do
    systemctl restart $SERVICES
    systemctl enable $SERVICES
    systemctl status $SERVICES
done

Node

  • Kubelet konfigurieren (/etc/kubernetes/kubelet)
###
# Kubernetes kubelet (node) config

# The address for the info server to serve on (set to 0.0.0.0 or "" for all interfaces)
KUBELET_ADDRESS="--address=0.0.0.0"

# You may leave this blank to use the actual hostname
KUBELET_HOSTNAME="--hostname-override=fed-node"

# location of the api-server
KUBELET_ARGS="--cgroup-driver=systemd --kubeconfig=/etc/kubernetes/master-kubeconfig.yaml"
  • Die Kube-Konfiguration anlegen (/etc/kubernetes/master-kubeconfig.yaml)
kind: Config
clusters:
- name: local
  cluster:
    server: http://fed-master:8080
users:
- name: kubelet
contexts:
- context:
    cluster: local
    user: kubelet
  name: kubelet-context
current-context: kubelet-context
  • Dienste starten
for SERVICES in kube-proxy kubelet docker; do 
    systemctl restart $SERVICES
    systemctl enable $SERVICES
    systemctl status $SERVICES 
done

Der Mini-Cluster sollte jetzt funktionsfähig sein. Auf Master kann es jetzt geprüft werden:

kubectl get nodes
NAME            STATUS      AGE      VERSION
fed-node        Ready       4h

Service starten

Am Beispiel eines Nginx-Containers starten wir unseren ersten Service in unserem Cluster.

  • Zuerst starten wir ein Deployment:
kubectl create deployment nginx --image=nginx
  • Verifizieren des Deployment
kubectl describe deployment nginx
  • Jetzt starten wir einen aus dem Internet erreichbaren Service:
kubectl create service nodeport nginx --tcp=80:80

Weil unser Nginx über ein Nodeport-Deployment veröffentlicht wurde, öffnet Kubernetes einen Port mit einer Nummer größer als 30000

  • Verifizieren, ob der Service aktiv ist:
kubectl get svc
  • Im Browser sollte nun die Nginx-Willkommensseite erscheinen:
http://IPDESNODE:31933/
  • Deployment löschen
kubectl delete deployment nginx
  • Service löschen
kubectl delete svc nginx

Ausblick

Zweite Node, TLS, Loadbalancing, Monitoring, ...

Quellen:
https://kubernetes.io/docs/getting-started-guides/fedora/fedora_manual_config/
https://www.linode.com/docs/applications/containers/how-to-deploy-nginx-on-a-kubernetes-cluster/