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