[LINUX] Erstellen einer Kubernetes-Umgebung mit ansible 2

Einführung

Ich konnte Kubernetes mit ansible initialisieren.
Schließlich werde ich einen k8s-Worker hinzufügen, um eine endgültige k8s-Umgebung zu erstellen </ p>

Umgebung

MBP OS Sierra
MAAS-Server (192.168.100.152 Netzwerk für MAAS: 192.168.200.1)
k8s-master Server (KVM: 192.168.100.191)
Ansible Server (KVM: 192.168.100.192)
k8s worker(192.168.200.151)
k8s worker(192.168.200.153)

dash-board Ver.1.8

Ziel

Fügen Sie einen Computer mit einem von MAAS als k8s-Worker bereitgestellten Betriebssystem in das von k8s
erstellte Flanell-Netzwerk ein Außerdem können Sie den Nutzungsstatus von k8s im Dashboard anzeigen.

Netzwerkeinstellungen des MAAS-Servers

Dieses Mal befinden sich k8s-master und Worker aufgrund des DHCP-Problems von MAAS in unterschiedlichen Netzwerken. Daher muss die Bridge auf dem MAAS-Server eingerichtet werden

ubuntu18 hat die Art der Netzwerkeinstellungen von bis zu 16
geändert Ich hätte einfach /etc/netplan/50-cloud-init.yaml_bk schreiben können, aber diesmal habe ich es in zwei Dateitypen geschrieben, weil die Bridge-Einstellung nicht gut lief.

$ sudo vi /etc/netplan/50-cloud-init.yaml_bk
network:
    ethernets:
        enp0s31f6:
            addresses:
            - 192.168.100.152/24
            gateway4: 192.168.100.1
            nameservers:
                addresses:
                - 8.8.8.8
                search:
                - 8.8.4.4
        enp2s0:
            addresses:
            - 192.168.200.1/24
            gateway4: 192.168.100.1
            nameservers:
                addresses:
                - 8.8.8.8
                search:
                - 8.8.4.4
    version: 2

$ sudo vi /etc/network/interfaces
auto lo
iface lo inet loopback

auto enp0s31f6
iface enp0s31f6 inet manual

auto br0
iface br0 inet static
address 192.168.100.152
netmask 255.255.255.0
gateway 192.168.100.1
dns-nameservers 8.8.8.8
bridge_ports enp0s31f6
bridge_maxwait 0
bridge_df 0
bridge_stp off


auto enp2s0
iface enp2s0 inet static
address 192.168.200.1
netmask 255.255.255.0
gateway 192.168.100.1
dns-nameservers 8.8.8.8

$ ifconfig
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.100.152  netmask 255.255.255.0  broadcast 192.168.100.255
        inet6 fe80::329c:23ff:feac:5570  prefixlen 64  scopeid 0x20<link>
        ether 30:9c:23:ac:55:70  txqueuelen 1000  (Ethernet)
        RX packets 9579059  bytes 16579553543 (16.5 GB)
        RX errors 0  dropped 657286  overruns 0  frame 0
        TX packets 6047022  bytes 936298283 (936.2 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

enp0s31f6: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::329c:23ff:feac:5570  prefixlen 64  scopeid 0x20<link>
        ether 30:9c:23:ac:55:70  txqueuelen 1000  (Ethernet)
        RX packets 21689196  bytes 26237413396 (26.2 GB)
        RX errors 0  dropped 475  overruns 0  frame 0
        TX packets 6555651  bytes 4057603928 (4.0 GB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 16  memory 0xdf100000-df120000

enp2s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.200.1  netmask 255.255.255.0  broadcast 192.168.200.255
        inet6 fe80::6a05:caff:fe66:a834  prefixlen 64  scopeid 0x20<link>
        ether 68:05:ca:66:a8:34  txqueuelen 1000  (Ethernet)
        RX packets 6867754  bytes 970026556 (970.0 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 13304857  bytes 15246678579 (15.2 GB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 17  memory 0xdf0c0000-df0e0000

Stellen Sie außerdem NAT so ein, dass Sie mit zwei Netzwerken kommunizieren können

sudo iptables -t nat -A POSTROUTING -s 192.168.200.0/24 -j SNAT --to 192.168.100.152

Arbeiter hinzufügen

Das Hinzufügen eines k8s-Workers entspricht fast dem des Masters, Sie benötigen jedoch einen Befehl, um ihn am Ende zu starten und dem Flanell-Netzwerk beizutreten

Der Befehl wird im Ausgabeinhalt angezeigt, wenn kubeadm init ausgeführt wird. Sie können ihn jedoch auch mit dem folgenden Befehl überprüfen

(k8s-master)$ kubeadm token create --print-join-command

Erstellen Sie mit den angezeigten Befehlen ein Playbook für die Teilnahme der Mitarbeiter

(ansible)$ sudo vi mlp.yml

  • hosts: mlp01 remote_user: ubuntu become: yes tasks:
    • name: Install prerequisites and Docker.io , nfs-common apt: name={{item}} update_cache=yes with_items:
      • nfs-common
      • apt-transport-https
      • ca-certificates
      • curl
      • software-properties-common
      • docker.io
    • name: user add to docker group user: name=ubuntu group=docker append=yes
    • name: Add K8S GPG key apt_key: url: https://packages.cloud.google.com/apt/doc/apt-key.gpg
    • name: Add K8S APT repository apt_repository: repo: deb http://apt.kubernetes.io/ kubernetes-xenial main
    • name: Install K8S apt: name={{item}} update_cache=yes with_items:
      • kubelet
      • kubeadm
      • kubectl
    • name: Remove swapfile from /etc/fstab mount: name: swap fstype: swap state: absent
    • name: Disable swap command: swapoff -a when: ansible_swaptotal_mb > 0
    • name: Set docker service to start on boot. service: name=docker enabled=yes
    • name: Set kubelet service to start on boot. service: name=kubelet enabled=yes
    • name: Join k8s-master become: yes shell: kubeadm join 192.168.100.191:6443 ~~ # Beschreiben Sie, was mit dem obigen Befehl </ code> </ pre> ausgegeben wurde

Bearbeiten Sie Hosts wie beim Mastering

$ sudo vi /etc/ansible/hosts
[master]
k8s-master

[mlp]
mlp01 

$ sudo vi /etc/hosts 
192.168.100.191 k8s-master 192.168.200.151 mlp01 

Ansible Playbook-Ausführung
Wenn Sie python3 verwenden möchten, benötigen Sie die Option nach "-e"

~/ansible$ sudo ansible-playbook --private-key=id_rsa_common mlp.yml -e 'ansible_python_interpreter=/usr/bin/python3'

Wenn das Playbook erfolgreich ist, befindet es sich im folgenden Status

(k8s-master)$ kubectl get node
NAME         STATUS    ROLES     AGE       VERSION
k8s-master   Ready     master    3d        v1.10.3
mlp01        Ready     <none>    3d        v1.10.2

Starten Sie das Nginx-Image

Führen Sie nach dem Hinzufügen des Knotens vorerst das Nginx-Docker-Image aus.
Der Grund wird später beschrieben

$ sudo vi nginx-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
spec:
  containers:
    - name: nginx-container
      image: nginx
      ports:
      - containerPort: 80

$ kubectl apply -f nginx-pod.yaml
create
$ kubectl get pod
NAME           READY     STATUS    RESTARTS   AGE
nginx-pod      1/1       Running   0          3d

Kein Problem, wenn nginx ausgeführt wird

Dashboard-Installation

Auch wenn Sie kein Dashboard haben, können Sie Kubernetes verwenden, aber ich möchte es verwenden.
Deshalb werde ich es installieren

$ kubectl create -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml

Wenn kein Fehler vorliegt und "erstellt" angezeigt wird, ist dies in Ordnung.
Überprüfen Sie, ob es funktioniert

kubectl get pods --all-namespaces
NAMESPACE     NAME                                    READY     STATUS    RESTARTS   AGE
default       nginx-pod                               1/1       Running   0          3d
kube-system   kubernetes-dashboard-7d5dcdb6d9-7hptz   1/1       Running   0          3d

Starten Sie den Kube-Proxy

$ kubectl proxy --address 0.0.0.0 --accept-hosts '.*'
Starting to serve on [::]:8001

In diesem Fall greifen Sie mit einem Browser darauf zu, um es anzuzeigen.
Der Anmeldebildschirm wird angezeigt

http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/#!/login
Screenshot 2018-05-29 14.24.06.png

Stellen Sie ein Token aus, um sich anzumelden

$ kubectl -n kube-system get secret

Geben Sie mit dem ausgegebenen Token ein

Die folgenden Einstellungen gelten für Personen, bei denen es schwierig ist, jedes Mal Token auszugeben.
Danach können Sie mit SKIP auf dem Anmeldebildschirm
eingeben Da es jedoch in Bezug auf die Sicherheit locker ist, wird empfohlen, es unter Bedingungen zu verwenden, unter denen keine Außenstehenden vorhanden sind, z. B. in einer internen Umgebung.

$ cat <<EOF | kubectl create -f -
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: kubernetes-dashboard
  labels:
    k8s-app: kubernetes-dashboard
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: kubernetes-dashboard
  namespace: kube-system
EOF

Damit ist die Umgebungskonstruktion von Kubernetes abgeschlossen

Schlussfolgerung

Nachdem Sie diese Umgebung erstellt haben, können Sie sie automatisch auf den Knoten verteilen, indem Sie das Docker-Image von k8s-master aus starten.
Dies ist sehr praktisch, da Sie einen neuen Knoten hinzufügen können, sobald Sie einen Befehl zum Hinzufügen zum Flanell-Netzwerk haben.

Ich bin gestolpert

Netzwerkkommunikation

Ich habe die Netzwerkeinstellungen am Anfang dieses Artikels erwähnt, aber bis dies entschieden wurde, wurde weiterhin ein Fehler angezeigt, dass die Kommunikation nicht erfolgreich war.
Eindruck, dass ich durch die Änderung der Einstellungsmethode aufgrund der Versionsänderung von ubuntu18 beeinflusst wurde

kubeadm init schlägt fehl

Die Ursache ist, dass ich gerade vergessen habe, Swap zu löschen, aber ich neige dazu, seine Existenz zu vergessen

Dashboard wird nicht angezeigt

Dem Master wurde ein Knoten hinzugefügt. Durch einfaches Installieren des Dashboards → Starten des Proxys wurde das Dashboard nicht im Browser angezeigt, und nur der Verzeichnisbaum der Datei wurde auf der Browserseite angezeigt.
Ich habe versucht, den Proxy-Pod wie in der Mitte der Seite gezeigt zu starten, und danach wurde das Dashboard angezeigt, wenn ich gemäß dem Verfahren vorging Es scheint, dass es auf anderen Seiten, auf die verwiesen wird, kein ähnliches Symptom gab, und es ist nicht bekannt, ob es sich um die Spezifikation der Dashboard-Version handelt oder ob es eine Einstellung gibt, die ich nicht alleine vorgenommen habe.

Referenzseite

Ich habe versucht, eine NAT-Umgebung mit iptables zu erstellen
offizielle Seite von kubernetes
access control
Hinzufügen von Kubernetes / Web UI (Dashboard)
Dashboard auf Kubernetes installieren und ohne Authentifizierung zugreifen

Recommended Posts