deimosfr.coreos-container-linux
Ansible CoreOS Container Linux Rolle
Diese Rolle bootet ein komplettes CoreOS-Cluster mit Cloudinit und/oder Ignition. Sie unterstützt auch das Upgrade der Cloudinit-Konfiguration.
Anforderungen
Diese Rolle benötigt Python, da es standardmäßig nicht in CoreOS vorhanden ist. Du kannst deimosfr.coreos-ansible verwenden, um es zu installieren.
Rollenvariablen
## CoreOS
# Wähle den CoreOS-Kanal zwischen stabil, beta oder alpha
coreos_channel: "stable"
# Generiere ein Token: https://discovery.etcd.io/new?size=3
coreos_token: "füge hier dein Token ein"
# Wähle die Neustartstrategie: etcd-lock, reboot und off
coreos_reboot_strategy: "off"
# Nur Konfigurationsdateien lokal generieren, nicht bereitstellen (nützlich, wenn du keine Verbindung herstellen kannst)
coreos_generate_only: false
# Lade das Bild lokal herunter, um es nicht für jeden Knoten herunterzuladen
coreos_image_offline: false
# Setze die offline Version von CoreOS (nicht "current" im Offline-Modus verwenden)
coreos_image_version: '1409.7.0'
# Setze den zu ladenden Bildnamen
coreos_image_name: 'coreos_production_ami_image.bin.bz2'
# Definiere die URL der Quelle für den lokalen Download des Bildes
coreos_image_src_url: "https://{{coreos_channel}}.release.core-os.net/amd64-usr/{{coreos_image_version}}"
# Verwende diese URL, um CoreOS zu installieren
coreos_image_base_url: "https://{{coreos_channel}}.release.core-os.net/amd64-usr"
# Setze den Rollenpfad für den lokalen Speicher
coreos_role_path: "{{playbook_dir}}/../../deimosfr.coreos-ansible"
# Definiere dein öffentliches Interface und IP
coreos_public_ip: "{{ansible_default_ipv4.address}}"
coreos_public_if: "{{ansible_default_ipv4.interface}}"
# Definiere dein privates Interface und IP
coreos_private_ip: "{{priv_ip}}"
coreos_private_if: "{{priv_if}}"
# Definiere ein dediziertes Subnetz für die Kommunikation von Containern
coreos_flanneld_subnet: "10.1.0.0/16"
# Füge Metadaten für den Dienstet hinzu
coreos_fleet_metadata: "cluster=dev"
# Wenn wahr, wird der Server gestartet (Daten können verloren gehen),
# andernfalls werden Konfigurationsdateien generiert
coreos_launch_bootstrap: true
coreos_cloudinit_check_syntax: true
coreos_device_install: "/dev/sda"
coreos_install_additional_options: ""
coreos_eject_cd_before_reboot: true
coreos_reboot_after_bootstrap: true
# Generierte Ignition- und Cloudinit-Konfigurationen ausgeben
coreos_dump_ignition_cloudinit_config: true
coreos_dump_ignition_cloudinit_dest: "{{coreos_role_path}}/files/generated_configs"
# Wähle die Zeitzone
coreos_timezone: "UTC"
# CoreOS Toolbox-Image-Typ
coreos_toolbox_docker_image: "debian"
coreos_toolbox_docker_tag: "stable"
# Ignition
coreos_bootstrap_ignition: false
coreos_ignition:
ignition:
version: "2.0.0"
storage:
disks:
- device: "/dev/sdb"
wipeTable: true
partitions:
- label: "data.0"
number: 1
size: 0
start: 0
- device: "/dev/sdc"
wipeTable: true
partitions:
- label: "data.1"
number: 1
size: 0
start: 0
# Cloudinit
coreos_bootstrap_cloudinit: true
coreos_cloudinit:
hostname: "{{inventory_hostname}}"
coreos:
update:
group: "{{coreos_channel}}"
reboot-strategy: "{{coreos_reboot_strategy}}"
flannel:
interface: "{{coreos_public_ip}}"
units:
- name: [email protected]
command: start
enable: true
- name: etcd-member.service
command: start
enable: true
drop-ins:
- name: 40-etcd-cluster.conf
content: |
[Service]
Environment="ETCD_IMAGE_TAG=v3.2.4"
Environment="ETCD_ADVERTISE_CLIENT_URLS=http://{{priv_ip}}:2379"
Environment="ETCD_DISCOVERY=https://discovery.etcd.io/{{coreos_token}}"
Environment="ETCD_INITIAL_ADVERTISE_PEER_URLS=http://{{priv_ip}}:2380"
Environment="ETCD_LISTEN_CLIENT_URLS=http://127.0.0.1:2379,http://{{priv_ip}}:2379"
Environment="ETCD_LISTEN_PEER_URLS=http://{{priv_ip}}:2380"
- name: flanneld.service
enable: true
command: start
drop-ins:
- name: 50-network-config.conf
content: |
[Service]
ExecStartPre=/usr/bin/etcdctl set /coreos.com/network/config '{ "Network": "{{coreos_flanneld_subnet}}" }'
- name: prepare-data-drive.service
command: start
enable: true
content: |
[Unit]
Description=Vorbereiten des Datenträgers
After=dev-sdb.device
After=dev-sdc.device
Requires=dev-sdb.device
Requires=dev-sdc.device
ConditionPathExists=!/dev/md0
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/sbin/wipefs -f /dev/sdb
ExecStart=/usr/sbin/parted -s -a opt /dev/sdb mklabel gpt -- mkpart primary ext4 2048s -1
ExecStart=/usr/sbin/parted -s /dev/sdb align-check optimal 1
ExecStart=/usr/sbin/parted -s /dev/sdb set 1 raid on
ExecStart=/usr/sbin/wipefs -f /dev/sdc
ExecStart=/usr/sbin/parted -s -a opt /dev/sdc mklabel gpt -- mkpart primary ext4 2048s -1
ExecStart=/usr/sbin/parted -s /dev/sdc align-check optimal 1
ExecStart=/usr/sbin/parted -s /dev/sdc set 1 raid on
ExecStart=/usr/sbin/mdadm --create --assume-clean --metadata=1.2 --verbose /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1
ExecStart=/usr/sbin/pvcreate -y /dev/md0
ExecStart=/usr/sbin/vgcreate raid-vg /dev/md0
ExecStart=/usr/sbin/lvcreate -l 100%FREE -n data raid-vg
ExecStart=/usr/sbin/mkfs.ext4 -m 1 -F /dev/raid-vg/data
- name: mnt-data.mount
command: start
enable: true
content: |
[Unit]
After=prepare-data-drive.service
Requires=prepare-data-drive.service
[Mount]
What=/dev/raid-vg/data
Where=/mnt/data
Type=ext4
Options=rw,noatime,nodiratime,discard,data=ordered
- name: "00-{{coreos_public_if}}.network"
runtime: true
content: |
[Match]
Name={{coreos_public_if}}
[Network]
DHCP=true
- name: "00-{{coreos_private_if}}.network"
runtime: true
content: |
[Match]
Name={{coreos_private_if}}
[Network]
Address={{coreos_private_ip}}/24
- name: iptables-restore.service
command: start
enable: true
- name: settimezone.service
command: start
enable: true
content: |
[Unit]
Description=Zeitzone setzen
[Service]
ExecStart=/usr/bin/timedatectl set-timezone {{coreos_timezone}}
RemainAfterExit=yes
Type=oneshot
- name: systemd-modules-load.service
command: restart
- name: systemd-sysctl.service
command: restart
- name: systemd-timesyncd.service
command: start
enable: true
- name: mdmonitor.service
command: stop
enable: false
- name: docker.service
command: start
drop-ins:
- name: 40-flannel.conf
content: |
[Unit]
Requires=flanneld.service
After=flanneld.service
[Service]
EnvironmentFile=/etc/kubernetes/cni/docker_opts_cni.env
- name: docker-tcp.socket
command: start
enable: true
content: |
[Unit]
Description=Docker Socket für die API
After=mnt-data.mount
Requires=mnt-data.mount
[Socket]
ListenStream=2375
Service=docker.service
BindIPv6Only=both
[Install]
WantedBy=sockets.target
write_files:
- path: "/home/core/.toolboxrc"
owner: core
content: |
TOOLBOX_DOCKER_IMAGE={{coreos_toolbox_docker_image}}
TOOLBOX_DOCKER_TAG={{coreos_toolbox_docker_tag}}
- path: /etc/kubernetes/cni/docker_opts_cni.env
content: |
DOCKER_OPT_BIP=""
DOCKER_OPT_IPMASQ=""
- path: /etc/modules-load.d/nf.conf
content: nf_conntrack
- path: /etc/sysctl.d/ipv4_forward.conf
content: net.ipv4.ip_forward=1
- path: /etc/sysctl.d/swapiness.conf
content: vm.swappiness=1
- path: /etc/sysctl.d/overcommit_memory.conf
content: vm.overcommit_memory=1
- path: /etc/sysctl.d/max_map_count.conf
content: vm.max_map_count=65535
- path: /var/lib/iptables/rules-save
permissions: 0644
owner: root:root
content: |
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -i {{coreos_private_if}} -j ACCEPT
-A INPUT -i tap0 -p all -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 0 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 3 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT
-A INPUT -j DROP
COMMIT
users:
- name: 'core'
ssh-authorized-keys:
- "dein rsa Schlüssel"
Beispiel-Playbook
Zuerst musst du ein Inventar ausfüllen. Um es einfach zu halten, benutze eine Hosts-Datei wie diese:
[local]
localhost
[coreos-masters]
core01.myfqdn.com pub_ip=222.2.1.199 priv_ip=172.17.8.101
core02.myfqdn.com pub_ip=222.2.1.198 priv_ip=172.17.8.102
core03.myfqdn.com pub_ip=222.2.1.197 priv_ip=172.17.8.103
[coreos-workers]
core04.myfqdn.com pub_ip=222.2.1.196 priv_ip=172.17.8.104
core05.myfqdn.com pub_ip=222.2.1.195 priv_ip=172.17.8.105
core06.myfqdn.com pub_ip=222.2.1.194 priv_ip=172.17.8.106
[coreos-nodes:children]
coreos-masters
coreos-workers
[coreos-nodes:vars]
ansible_ssh_user=core
ansible_python_interpreter="/opt/python/bin/python"
priv_if=enp0s8
Benutze dann ein Playbook wie dieses (vergiss nicht, die Variablen mit deinen aus dem Standardordner zu bearbeiten):
---
- name: coreos-ansible pypy
hosts: localhost
gather_facts: False
tasks:
- include: ../../deimosfr.coreos-ansible/tasks/ansible_prerequisites.yml
vars:
ansible_python_interpreter: "/usr/bin/python"
coreos_role_path: "{{playbook_dir}}/../../deimosfr.coreos-ansible"
- name: CoreOS-Image im Offline-Modus
hosts: localhost
gather_facts: False
tasks:
- include: ../tasks/coreos_offline_image.yml
when: coreos_image_offline
vars:
ansible_python_interpreter: "/usr/bin/python"
coreos_role_path: "{{playbook_dir}}/.."
coreos_image_offline: true
coreos_image_version: '1185.5.0'
coreos_image_name: 'coreos_production_image.bin.bz2'
coreos_image_src_url: "https://stable.release.core-os.net/amd64-usr/{{coreos_image_version}}"
- name: coreos-ansible
hosts: coreos-nodes
user: core
become: yes
gather_facts: False
roles:
- deimosfr.coreos-ansible
# Zuerst die Master bereitstellen, um sicherzustellen, dass der Cluster bereit ist, bevor die Worker bereitgestellt werden
- name: coreos-bootstrap
hosts: coreos-masters
user: core
become: yes
roles:
- deimosfr.coreos-container-linux
vars:
coreos_image_base_url: "http://222.2.1.152:8000/coreos_images"
- name: coreos-bootstrap
hosts: coreos-workers
user: core
become: yes
roles:
- deimosfr.coreos-container-linux
vars:
coreos_image_base_url: "http://222.2.1.152:8000/coreos_images"
Bekannte Probleme
Wenn du die folgende Meldung erhältst: "Eine Startaufgabe läuft für Ignition (Festplatten)", liegt das daran, dass der aktuelle Server, auf dem du versuchst, Ignition auszuführen, bereits einen aktiven RAID enthält. Du musst es zuerst löschen, bevor du Ignition startest. Beispiel:
mdadm --stop /dev/md/<raidname>
mdadm --zero-superblock /dev/<deviceX>
mdadm --zero-superblock /dev/<deviceY>
Lizenz
GPLv3
Autor Informationen
Pierre Mavro / deimosfr
ansible-galaxy install deimosfr.coreos-container-linux