Stellen Sie den k8s-Cluster mit dem Ansible-Befehl bereit

1. Ansible-Cluster bereitstellen

Verwenden Sie ein Python-Skript, um einfach einen Ansible-Cluster-CSDN-Blog zu erstellen

2. Ansible-Befehl zum Erstellen von K8s:

1. Gastgeberplanung:

Knoten IP Adresse Betriebssystem Aufbau
Server 192.168.174.150 Centos7.9 2G2-Kern
Kunde1 192.168.174.151 Centos7.9 2G2-Kern
Kunde2 192.168.174.152 Centos7.9 2G2-Kern

Der Inhalt der Ansible-Manifestdatei ist wie folgt

[clients_all]
server
client1
client2
[clients_master]
server
[clients_client]
client1
client2

2. Yum-Quelle konfigurieren:

  • Konfigurieren Sie die lokale Yum-Quelle:

    # name是设备名,path是挂载点,state=unmounted如果目标路径已经挂载了设备,将其卸载重新挂载
    ansible clients_all -m mount -a "src=/dev/cdrom path=/mnt/cdrom fstype=iso9660 opts=defaults state=mounted"
    # path是文件路径,line是要添加的行内容,insertafter=EOF是文件末尾添加,BOF是文件头部添加
    ansible clients_all -m lineinfile -a "path=/etc/fstab line='/dev/cdrom /mnt/cdrom iso9660 defaults  0  0' insertafter=EOF"
    ansible clients_all -m shell -a 'echo "" > /etc/yum.repos.d/centos-local.repo'
     path修改文件的路径,block添加的文本内容,多行用\n隔开,create如果没有文件就创建,marker=插入的前后标签,如果重新执行就是替换文本
    ansible clients_all -m blockinfile -a "path=/etc/yum.repos.d/centos-local.repo block='[centos7.9]\nname=centos7.9\nbaseurl=file:///mnt/cdrom\nenabled=1\ngpgcheck=0' create=yes marker='#{mark} centos7.9'"
    ansible clients_all -m shell -a "yum clean all && yum repolist"
  • Konfigurieren Sie die Remote-Alibaba-Quelle:

    ansible clients_all -m yum -a "name=wget"
    ansible clients_all -m get_url -a "dest=/etc/yum.repos.d/CentOS-Base.repo url=http://mirrors.aliyun.com/repo/Centos-7.repo"
    ansible clients_all -m shell -a "yum clean all && yum repolist"
  • Erweiterungsquellen konfigurieren:

    ansible clients_all -m yum -a "name=epel-release"
    ansible clients_all -m shell -a "yum clean all && yum repolist"

3. Installieren Sie die erforderlichen Tools:

ansible clients_all -m yum -a "name=bash-completion,vim,net-tools,tree,psmisc,lrzsz,dos2unix"

4. Deaktivieren Sie Firewall und Selinux:

  • Deaktivieren Sie die Verwendung von Selinux

    ansible clients_all -m selinux -a 'state=disabled'
  • Deaktivieren Sie die Dienste iptables und firewalld. Kubernetes und Docker generieren während des Betriebs eine große Anzahl von iptables-Regeln. Um zu verhindern, dass die Systemregeln mit ihnen verwechselt werden, schließen Sie die Systemregeln direkt.

    ansible clients_all -m service -a "name=firewalld state=stopped enabled=false"
    # Der iptables-Dienst ist möglicherweise nicht installiert
    
    ansible clients_all -m service -a "name=iptables state=stopped enabled=false"

5. Zeitsynchronisation:

  • Alle Knoten:

    ansible clients_all -m yum -a "name=chrony"
    ansible clients_all -m service -a "name=chronyd state=restarted enabled=true"
  • Ändern Sie den Masterknoten chrony.conf:

    ansible clients_master -m lineinfile -a "path=/etc/chrony.conf regexp='^#allow 192.168.0.0\/16' line='allow 192.168.174.0/24' backrefs=yes"
    ansible clients_master -m lineinfile -a "path=/etc/chrony.conf regexp='^#local stratum 10' line='local stratum 10' backrefs=yes"
  • Ändern Sie den Knoten chrony.conf

    ansible clients_client -m lineinfile -a "path=/etc/chrony.conf regexp='^server' state=absent"
    ansible clients_client -m lineinfile -a "path=/etc/chrony.conf line='server 192.168.174.150 iburst' insertbefore='^.*\bline2\b.*$'"

  • Alle Knoten:

    ansible clients_all -m service -a "name=chronyd state=restarted enabled=true"
    ansible clients_all -m shell -a "timedatectl set-ntp true"

  • Überprüfen:

    [root@server ~]# ansible clients_client -m shell -a "chronyc sources -v"
    client2 | CHANGED | rc=0 >>
    210 Number of sources = 1
      .-- Source mode  '^' = server, '=' = peer, '#' = local clock.
     / .- Source state '*' = current synced, '+' = combined , '-' = not combined,
    | /   '?' = unreachable, 'x' = time may be in error, '~' = time too variable.
    ||                                                 .- xxxx [ yyyy ] +/- zzzz
    ||      Reachability register (octal) -.           |  xxxx = adjusted offset,
    ||      Log2(Polling interval) --.      |          |  yyyy = measured offset,
    ||                                \     |          |  zzzz = estimated error.
    ||                                 |    |           \
    MS Name/IP address         Stratum Poll Reach LastRx Last sample               
    ===============================================================================
    ^* server                        3   6    17     6   +918us[+4722us] +/-  217ms
    client1 | CHANGED | rc=0 >>
    210 Number of sources = 1
      .-- Source mode  '^' = server, '=' = peer, '#' = local clock.
     / .- Source state '*' = current synced, '+' = combined , '-' = not combined,
    | /   '?' = unreachable, 'x' = time may be in error, '~' = time too variable.
    ||                                                 .- xxxx [ yyyy ] +/- zzzz
    ||      Reachability register (octal) -.           |  xxxx = adjusted offset,
    ||      Log2(Polling interval) --.      |          |  yyyy = measured offset,
    ||                                \     |          |  zzzz = estimated error.
    ||                                 |    |           \
    MS Name/IP address         Stratum Poll Reach LastRx Last sample               
    ===============================================================================
    ^* server                        3   6    17     6   +961us[+4856us] +/-  217ms

6. Swap-Partition deaktivieren:

# backrefs=yes,当没有匹配到指定行则不做任何更改
ansible clients_all -m lineinfile -a "path=/etc/fstab regexp='^\/dev\/mapper\/centos-swap' line='#/dev/mapper/centos-swap swap                    swap    defaults        0 0' backrefs=yes"

7. Ändern Sie die Linux-Kernel-Parameter:

  • Bearbeiten Sie /etc/sysctl.d/kubernetes.conf und fügen Sie Bridge-Filterung und Adressweiterleitungsfunktionen hinzu

    # path修改文件的路径,block添加的文本内容,多行用\n隔开,create如果没有文件就创建,marker=插入的前后标签,如果重新执行就是替换文本
    ansible clients_all -m blockinfile -a "path=/etc/sysctl.d/kubernetes.conf block='net.bridge.bridge-nf-call-ip6tables = 1\nnet.bridge.bridge-nf-call-iptables = 1\nnet.ipv4.ip_forward = 1' create=yes marker='#{mark} kubernetes'"
  • Konfiguration neu laden

    ansible clients_all -m shell -a "sysctl -p"
  • Laden Sie das Brückenfiltermodul

    ansible clients_all -m shell -a "modprobe br_netfilter"
  • Überprüfen Sie, ob das Brückenfiltermodul erfolgreich geladen wurde

    ansible clients_all -m shell -a "lsmod | grep br_netfilter"

8. IPvs-Funktion konfigurieren:

  • Es gibt zwei Proxy-Modelle für den Dienst in Kubernetes:

    • One basiert auf iptables

    • One basiert auf IPVs

  • Vergleicht man die beiden,die Leistung von IPvs ist offensichtlich höher, aber wenn Sie es verwenden möchten, müssen Sie die IPvs manuell laden Modul a>

  • Installieren Sie ipset und ipvsadm

    ansible clients_all -m yum -a "name=ipset,ipvsadm"
  • Fügen Sie die Module hinzu, die geladen werden müssen, und schreiben Sie sie in die Skriptdatei:

    ansible clients_all -m blockinfile -a "path=/etc/sysconfig/modules/ipvs.modules block='#! /bin/bash\nmodprobe -- ip_vs\nmodprobe -- ip_vs_rr\nmodprobe -- ip_vs_wrr\nmodprobe -- ip_vs_sh\nmodprobe -- nf_conntrack_ipv4' create=yes marker='#{mark} ipvs'"
  • Fügen Sie Ausführungsberechtigungen zu Skriptdateien hinzu

    ansible clients_all -m file -a "path=/etc/sysconfig/modules/ipvs.modules mode='0755'"   
  • Skriptdatei ausführen

    ansible clients_all -m script -a "/bin/bash /etc/sysconfig/modules/ipvs.modules"
  • Prüfen Sie, ob das entsprechende Modul erfolgreich geladen wurde

    ansible clients_all -m shell -a "lsmod | grep -e ip_vs -e nf_conntrack_ipv4"
  • Starten Sie den Linux-Dienst neu

    ansible clients_all -m reboot

9. Docker installieren:

  • Docker-Image zu lokal hinzufügen:

    ansible clients_all -m get_url -a "dest=/etc/yum.repos.d/docker-ce.repo url=http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo"
  • Geben Sie dann den Befehl ein:

    ansible clients_all -m shell -a "yum install -y --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7" 
  • Konfigurationsdatei ändern:

    ansible clients_all -m file -a "path=/etc/docker state=directory"
    #  Docker在默认情况下使用的Cgroup Driver为cgroupfs,而kubernetes推荐使用systemd来代替cgroupfs
    mkdir -p /etc/docker
    cat <<eof > /etc/docker/daemon.json
    {
    "storage-driver": "devicemapper",
    "exec-opts": ["native.cgroupdriver=systemd"],
    "registry-mirrors": ["https://ja9e22yz.mirror.aliyuncs.com"]
    }
    eof
    ansible clients_all -m copy -a "src=/etc/docker/daemon.json dest=/etc/docker/daemon.json"
    cat << eof > /etc/sysconfig/docker
    OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false'
    eof
    ansible clients_all -m copy -a "src=/etc/sysconfig/docker dest=/etc/sysconfig/docker"
  • Starten Sie neu und stellen Sie den automatischen Start beim Booten ein:

    ansible clients_all -m service -a "name=docker state=restarted enabled=true"

10. Installieren Sie die k8s-Komponenten:

  • Konfigurieren Sie das k8syum-Warehouse:

    cat <<EOF > /etc/yum.repos.d/kubernetes.repo
    [kubernetes]
    name=Kubernetes
    baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
    enabled=1
    gpgcheck=0
    repo_gpgcheck=0
    gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
    http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
    EOF
    ansible clients_all -m copy -a "src=/etc/yum.repos.d/kubernetes.repo dest=/etc/yum.repos.d/kubernetes.repo"
  • Installieren Sie kubeadm, kubelet und kubectl

    Komponenten veranschaulichen
    kubeadm Tools zum Aufbau von Kubernetes-Clustern
    kubelet Verantwortlich für die Aufrechterhaltung des Lebenszyklus des Containers, dh für die Erstellung, Aktualisierung und Zerstörung des Containers durch Steuerung von Docker
    kubectl Befehlszeilentool zur Kommunikation mit dem Cluster.
    ansible clients_all -m shell -a "yum install --setopt=obsoletes=0 kubeadm-1.17.4-0 kubelet-1.17.4-0 kubectl-1.17.4-0 -y"
  • Bearbeiten Sie /etc/sysconfig/kubelet und konfigurieren Sie die cgroup von kubelet

    cat <<eof > /etc/sysconfig/kubelet
    KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
    KUBE_PROXY_MODE="ipvs"
    eof
    ansible clients_all -m copy -a "src=/etc/sysconfig/kubelet dest=/etc/sysconfig/kubelet"
  • Stellen Sie Kubelet so ein, dass es beim Booten automatisch startet

    ansible clients_all -m service -a "name=kubelet state=started enabled=true"

11. Bereiten Sie den Spiegelcluster vor:

  • Vor der Installation des Kubernetes-Clusters müssen Sie die vom Cluster benötigten Images vorbereiten. Die erforderlichen Images können mit dem folgenden Befehl angezeigt werden

    ansible clients_all -m shell -a "kubeadm config images list"
  • Laden Sie das Bild herunter: Dieses Bild befindet sich im Kubernetes-Warehouse und kann aus Netzwerkgründen nicht verbunden werden. Im Folgenden finden Sie eine Alternative zum Herunterladen dieser Bilder.

    cat << eof > kubernetes_images_install.yaml
    ---
    - hosts: clients_all
      gather_facts: no
      vars:  
        images:  
          - kube-apiserver:v1.17.4  
          - kube-controller-manager:v1.17.4  
          - kube-scheduler:v1.17.4  
          - kube-proxy:v1.17.4  
          - pause:3.1  
          - etcd:3.4.3-0  
          - coredns:1.6.5  
      tasks:
        - name: 拉取镜像
          shell: docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/{
         
         { item }}
          with_items: "{
         
         { images }}"
        - name: 给镜像打标签
          shell: docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/{
         
         { item }} k8s.gcr.io/{
         
         { item }}
          with_items: "{
         
         { images }}"
        - name: 删除镜像
          shell: docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/{
         
         { item }}
          with_items: "{
         
         { images }}"
    eof
    ansible-playbook kubernetes_images_install.yaml

12. Cluster-Initialisierung:

  • Auf dem Masterknoten:

    • Erstellen Sie einen Cluster

      ansible clients_master -m shell -a "kubeadm init \
      --kubernetes-version=v1.17.4 \
      --pod-network-cidr=10.244.0.0/16 \
      --service-cidr=10.96.0.0/12 \
      --apiserver-advertise-address=192.168.174.150" | grep 'kubeadm join'    # 集群入口指向master
      # 成功执行后将给出将node节点加入集群的命令
      kubeadm join 192.168.174.150:6443 --token 2pmmsi.xv4534qap5pf3bjv \
      --discovery-token-ca-cert-hash sha256:69715f25a2e7795f4642afeb8f88c800e601cb1624b819180e820702885b5eef
    • Erstellen Sie die erforderlichen Dateien

      ansible clients_master -m file -a "path=$HOME/.kube state=directory"
      ansible clients_master -m shell -a "cp -i /etc/kubernetes/admin.conf $HOME/.kube/config"
      ansible clients_master -m file -a "path=$HOME/.kube/config state=touch owner=$(id -u) group=$(id -g)"
  • Auf dem Knoten Knoten fügen Sie den Knoten Knoten zum Cluster hinzu (die Befehle variieren, Sie müssen den Befehl nach dem Erstellen des Clusters erhalten auf dem Masterknoten)

    ansible clients_client -m shell -a "kubeadm join 192.168.174.150:6443 --token 2pmmsi.xv4534qap5pf3bjv \
    --discovery-token-ca-cert-hash sha256:69715f25a2e7795f4642afeb8f88c800e601cb1624b819180e820702885b5eef"
  • Auf dem Masterknoten lautet der Clusterstatus bei der Überprüfung des Clusterstatus zu diesem Zeitpunkt „NotReady“. Dies liegt daran, dass das Netzwerk-Plug-in noch nicht konfiguriert wurde

    [root@server ~]# ansible clients_master -m shell -a "kubectl get nodes"
    server | CHANGED | rc=0 >>
    NAME      STATUS     ROLES    AGE   VERSION
    client1   NotReady   <none>   14m   v1.17.4
    client2   NotReady   <none>   14m   v1.17.4
    server    NotReady   master   23m   v1.17.4

13. Netzwerk-Plugin installieren:

  • Kubernetes unterstützt eine Vielzahl von Netzwerk-Plug-Ins wie Flannel, Calico, Canal usw. Sie können jedes beliebige verwenden

  • Diesmal habe ich mich für Flanell entschieden

  • Die folgenden Vorgänge müssen nur auf dem Masterknoten ausgeführt werden. Das Plug-in verwendet den DaemonSet-Controller, der auf ausgeführt wird jeden Knoten. Führen Sie beide aus

  • Holen Sie sich die Fannel-Konfigurationsdatei

    ansible clients_master -m get_url -a "dest=./ url=https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml"
  • Flanellnetzwerk bereitstellen:

    ansible clients_master -m shell -a "kubectl apply -f kube-flannel.yml"
  • Überprüfen Sie nach etwa einer Minute den Status jedes Knotens. Wenn er sich in „Bereit“ ändert, bedeutet dies, dass das Netzwerk geöffnet ist:

    [root@server ~]# ansible clients_master -m shell -a "kubectl get nodes"
    server | CHANGED | rc=0 >>
    NAME      STATUS   ROLES    AGE   VERSION
    client1   Ready    <none>   20m   v1.17.4
    client2   Ready    <none>   20m   v1.17.4
    server    Ready    master   29m   v1.17.4
  • Überprüfen Sie, ob alle Pods ausgeführt werden

    [root@server ~]# ansible clients_master -m shell -a "kubectl get pod --all-namespaces"
    server | CHANGED | rc=0 >>
    NAMESPACE      NAME                             READY   STATUS    RESTARTS   AGE
    kube-flannel   kube-flannel-ds-h7d2z            1/1     Running   0          3m3s
    kube-flannel   kube-flannel-ds-hht48            1/1     Running   0          3m3s
    kube-flannel   kube-flannel-ds-lk7qd            1/1     Running   0          3m3s
    kube-system    coredns-6955765f44-4vg95         1/1     Running   0          29m
    kube-system    coredns-6955765f44-kkndx         1/1     Running   0          29m
    kube-system    etcd-server                      1/1     Running   0          29m
    kube-system    kube-apiserver-server            1/1     Running   0          29m
    kube-system    kube-controller-manager-server   1/1     Running   0          29m
    kube-system    kube-proxy-7x47c                 1/1     Running   0          29m
    kube-system    kube-proxy-pxx4l                 1/1     Running   0          21m
    kube-system    kube-proxy-v54j6                 1/1     Running   0          21m
    kube-system    kube-scheduler-server            1/1     Running   0          29m

Guess you like

Origin blog.csdn.net/qq_56776641/article/details/134956567