githubixx.etcd
ansible-role-etcd
这个 Ansible 角色用于 Kubernetes 轻松上手使用 Ansible - etcd 集群。当然,它也可以在没有 Kubernetes 集群的情况下使用。
安装一个 etcd 集群。提示:这个剧本在 systemd 服务文件更改后不会重新加载或重启 etcd 集群进程!这是故意的!同时重启所有 etcd 进程是一个非常糟糕的主意。因此,如果 etcd.service
文件已更改,请逐个节点手动重启/重新加载 etcd,并检查日志输出以确认该节点是否重新加入集群!当然,这个过程也可以自动化,但目前不在这个角色的范围内。附注:在 etcd 服务文件更改后,脚本将执行 systemctl daemon-reload
,以便 systemd 至少能意识到文件的更改,您无需处理。因此,重启 etcd 节点也会激活新配置。
通过此角色安装的 etcd 集群的升级过程在 这里 描述。
版本
我会给每个发布版本打标签,并尽量遵循 语义化版本控制。如果您想使用这个角色,我建议查看最新标签。主分支基本上是开发,标签则标记了稳定版本。但我通常也会保持主分支的良好状态。一个标签 13.1.1+3.5.13
表示这是该角色的版本 13.1.1
,并且是与 etcd 版本 3.5.13
一起使用的(但也应该能与更新的版本兼容)。如果角色本身的版本在 +
前有所更改,则 X.Y.Z
将增加;如果 etcd 版本在 +
后有所更改,则 X.Y.Z
将增加。这使得可以在角色仍为特定 etcd 版本开发时标记缺陷修复和新的主要版本。
更新日志
请参阅 CHANGELOG.md
要求
此角色要求您已为 etcd
创建了一些证书(请参阅 Kubernetes 轻松上手使用 Ansible - 证书授权 (CA) 和 Ansible 角色 kubernetes_ca。剧本会在运行该剧本的主机上搜索 etcd_ca_conf_directory
目录中的证书。当然,您可以自行创建证书(见 生成自签名证书 - 此 Git 仓库已存档,但信息仍然有效)。
角色变量
# 复制 etcd 证书的目录。默认情况下,这将扩展到用户的 LOCAL $HOME(运行 "ansible-playbook ..." 的用户)
# 加上 "/etcd-certificates"。这意味着如果用户的 $HOME 目录是 e.g.
# "/home/da_user",那么 "etcd_ca_conf_directory" 的值将是
# "/home/da_user/etcd-certificates"。
etcd_ca_conf_directory: "{{ '~/etcd-certificates' | expanduser }}"
# etcd Ansible 组
etcd_ansible_group: "k8s_etcd"
# etcd 版本
etcd_version: "3.5.13"
# etcd 监听客户端的端口
etcd_client_port: "2379"
# etcd 监听其对等体的端口
etcd_peer_port: "2380"
# 绑定 etcd 端口的接口
etcd_interface: "tap0"
# 以此用户身份运行 etcd 守护进程。
#
# 注意 1:如果您想使用 "etcd_peer_port" < 1024,您必须
# 以 "root" 用户身份运行 "etcd"。
# 注意 2:如果在 "etcd_user" 中指定的用户不存在,则角色
# 将创建它。只有当用户已存在时,角色才不会创建它,
# 但会根据需要调整其 UID/GID 和 shell(见下面的设置)。
# 此外,如果 "etcd_user" 是 "root",则此角色不会处理该用户。
etcd_user: "etcd"
# 在 "etcd_user" 中指定用户的 UID。如果未指定,将使用来自
# "/etc/login.defs" 的下一个可用 UID(见 "SYS_UID_MAX" 设置)。
# etcd_user_uid: "999"
# 在 "etcd_user" 中指定用户的 shell。为了提高安全性,保持
# 默认设置。
etcd_user_shell: "/bin/false"
# 指定 "etcd_user" 中的用户是否为系统用户(默认)
# 或者不是。如果为 "true",则将忽略 "etcd_user_home" 设置。一般来说
# 保持默认设置是有意义的,因为运行 "etcd" 的用户不应登录。
etcd_user_system: true
# 在 "etcd_user" 中指定用户的主目录。如果
# "etcd_user_system" 设置为 "true",则将被忽略。在这种情况下,不会创建主目录。通常不需要。
# etcd_user_home: "/home/etcd"
# 以此组身份运行 etcd 守护进程
#
# 注意:如果在 "etcd_group" 中指定的组不存在,则角色
# 将创建它。只有当组已存在时,角色才不会创建它,
# 但会根据需要调整 GID(见下面的 "etcd_group_gid" 设置)。
etcd_group: "etcd"
# 在 "etcd_group" 中指定组的 GID。如果未指定,将使用来自
# "/etc/login.defs" 的下一个可用 GID(见 "SYS_GID_MAX" 设置)。
# etcd_group_gid: "999"
# 指定 "etcd_group" 中的组是否为系统组(默认)
# 或者不是。
etcd_group_system: true
# etcd 配置的目录
etcd_conf_dir: "/etc/etcd"
# etcd 配置目录的权限
etcd_conf_dir_mode: "0750"
# 指定的 etcd 配置目录的所有者用户
etcd_conf_dir_user: "root"
# 指定的 etcd 配置目录的组所有者
etcd_conf_dir_group: "{{ etcd_group }}"
# 存储下载的 etcd 压缩包的目录
# 应该不要删除,以避免重复下载
etcd_download_dir: "/opt/etcd"
# 存储下载的 etcd 压缩包的目录权限
etcd_download_dir_mode: "0755"
# 指定的 etcd 下载目录的所有者用户
etcd_download_dir_user: "{{ etcd_user }}"
# 指定的 etcd 下载目录的组所有者
etcd_download_dir_group: "{{ etcd_group }}"
# 存储 etcd 可执行文件的目录
#
# 重要提示:如果您使用 "etcd_bin_dir" 的默认值
# "/usr/local/bin",则在 "etcd_bin_dir_mode"、"etcd_bin_dir_user"
# 和 "etcd_bin_dir_group" 中指定的设置将被忽略。这是
# 为了防止更改 "/usr/local/bin" 的权限。
# 该目录通常在每个 Linux 安装中都是存在的
# 并且不应更改。
# 因此,如果您将目录指定为 "/usr/bin" 或
# "/bin",请谨慎使用 "etcd_bin_dir",因为这将更改这些目录的权限,
# 这通常不是您想要的。
etcd_bin_dir: "/usr/local/bin"
# 存储 etcd 可执行文件的目录权限
etcd_bin_dir_mode: "0755"
# 指定的 etcd 可执行文件目录的所有者用户
etcd_bin_dir_user: "{{ etcd_user }}"
# 指定的 etcd 可执行文件目录的组所有者
etcd_bin_dir_group: "{{ etcd_group }}"
# etcd 数据目录(也就是 etcd 数据库文件)
etcd_data_dir: "/var/lib/etcd"
# 存储 etcd 数据的目录权限
etcd_data_dir_mode: "0700"
# 指定的 etcd 数据目录的所有者用户
etcd_data_dir_user: "{{ etcd_user }}"
# 指定的 etcd 数据目录的组所有者
etcd_data_dir_group: "{{ etcd_group }}"
# 要下载和安装的架构
etcd_architecture: "amd64"
# 只有在您使用的架构不受支持时才更改此项
# 有关更多信息,请参见:
# https://github.com/etcd-io/website/blob/main/content/en/docs/v3.5/op-guide/supported-platform.md
etcd_allow_unsupported_archs: false
# 默认情况下,etcd tar 包从官方
# etcd 仓库下载。如果需要,可以将其更改为一些自定义的
# URL。有关可以使用的协议的更多信息,请参见:
# https://docs.ansible.com/ansible/latest/collections/ansible/builtin/get_url_module.html
# 只需确保保留文件名命名方案:
# "etcd-v{{ etcd_version }}-linux-{{ etcd_architecture }}.tar.gz"
etcd_download_url: "https://github.com/etcd-io/etcd/releases/download/v{{ etcd_version }}/etcd-v{{ etcd_version }}-linux-{{ etcd_architecture }}.tar.gz"
# 默认使用 SHA256SUMS 文件来验证
# 压缩包的校验和。这也可以根据需要调整。
etcd_download_url_checksum: "sha256:https://github.com/coreos/etcd/releases/download/v{{ etcd_version }}/SHA256SUMS"
# [服务] 部分的选项。有关更多信息,请参见:
# https://www.freedesktop.org/software/systemd/man/systemd.service.html#Options
# 在 "Type=notify" 下的选项主要是与安全/沙盒相关的设置
# 限制系统对单元进程的接触。
# https://www.freedesktop.org/software/systemd/man/systemd.exec.html
etcd_service_options:
- User={{ etcd_user }}
- Group={{ etcd_group }}
- Restart=on-failure
- RestartSec=5
- Type=notify
- ProtectHome=true
- PrivateTmp=true
- ProtectSystem=full
- ProtectKernelModules=true
- ProtectKernelTunables=true
- ProtectControlGroups=true
- CapabilityBoundingSet=~CAP_SYS_PTRACE
etcd_settings:
"name": "{{ ansible_hostname }}"
"cert-file": "{{ etcd_conf_dir }}/cert-etcd-server.pem"
"key-file": "{{ etcd_conf_dir }}/cert-etcd-server-key.pem"
"trusted-ca-file": "{{ etcd_conf_dir }}/ca-etcd.pem"
"peer-cert-file": "{{ etcd_conf_dir }}/cert-etcd-peer.pem"
"peer-key-file": "{{ etcd_conf_dir }}/cert-etcd-peer-key.pem"
"peer-trusted-ca-file": "{{ etcd_conf_dir }}/ca-etcd.pem"
"advertise-client-urls": "{{ 'https://' + hostvars[inventory_hostname]['ansible_' + etcd_interface].ipv4.address + ':' + etcd_client_port }}"
"initial-advertise-peer-urls": "{{ 'https://' + hostvars[inventory_hostname]['ansible_' + etcd_interface].ipv4.address + ':' + etcd_peer_port }}"
"listen-peer-urls": "{{ 'https://' + hostvars[inventory_hostname]['ansible_' + etcd_interface].ipv4.address + ':' + etcd_peer_port }}"
"listen-client-urls": "{{ 'https://' + hostvars[inventory_hostname]['ansible_' + etcd_interface].ipv4.address + ':' + etcd_client_port + ',https://127.0.0.1:' + etcd_client_port }}"
"peer-client-cert-auth": "true" # 启用对等体客户端证书认证
"client-cert-auth": "true" # 启用客户端证书认证
"initial-cluster-token": "etcd-cluster-0" # etcd 集群引导时的初始集群令牌。
"initial-cluster-state": "new" # 初始集群状态('new' 或 'existing')
"data-dir": "{{ etcd_data_dir }}" # etcd 数据目录(也就是 etcd 数据库文件)
"wal-dir": "" # 专用 wal 目录("" 意味着不使用单独的 WAL 目录)
"auto-compaction-retention": "0" # 自动压缩保留时间(小时)。0 表示禁用自动压缩。
"snapshot-count": "100000" # 触发快照到磁盘的已提交事务数量
"heartbeat-interval": "100" # 心跳间隔时间(以毫秒为单位)
"election-timeout": "1000" # 选举超时时间(以毫秒为单位)。有关调优文档的详细信息请查看
"max-snapshots": "5" # 保留的快照文件最大数量(0 表示无限制)
"max-wals": "5" # 保留的 wal 文件最大数量(0 表示无限制)
"quota-backend-bytes": "0" # 当后端大小超过给定配额时发出警报(0 表示默认的低空间配额)
"logger": "zap" # 指定 'zap' 用于结构化日志记录或者 'capnslog'。
"log-outputs": "systemd/journal" # 指定 'stdout' 或 'stderr' 即使在 systemd 下运行也跳过 journald 记录
"enable-v2": "true" # 启用 v2 API 以保持与先前 etcd 3.3.x 的兼容性(例如,flannel 需要)
"discovery-srv": "" # 启用 DNS SRV 发现的发现域名,留空以禁用。如果设置,它将覆盖 initial-cluster。
# etcd 的证书授权和证书文件
etcd_certificates:
- ca-etcd.pem # 证书授权文件
- ca-etcd-key.pem # 证书授权密钥文件
- cert-etcd-peer.pem # 对等体 TLS 证书文件
- cert-etcd-peer-key.pem # 对等体 TLS 密钥文件
- cert-etcd-server.pem # 服务器 TLS 证书文件
- cert-etcd-server-key.pem # 服务器 TLS 密钥文件
etcd
的默认设置在 etcd_settings
中定义,可以通过定义一个名为 etcd_settings_user
的变量来覆盖。您也可以使用此变量添加其他设置。例如,要覆盖 log-output
设置的默认值并添加一个新设置 grpc-keepalive-min-time
,请将以下设置添加到 group_vars/k8s.yml
:
etcd_settings_user:
"log-output": "stdout"
"grpc-keepalive-min-time": "10s"
示例剧本
- hosts: k8s_etcd
roles:
- githubixx.etcd
测试
此角色有一个简小的测试设置,使用 Molecule、libvirt (vagrant-libvirt) 和 QEMU/KVM 创建。有关如何设置的详细信息,请参阅我的博客文章 使用 Molecule、libvirt (vagrant-libvirt) 和 QEMU/KVM 测试 Ansible 角色。测试配置在 这里。
之后可以执行 Molecule:
molecule converge
这将设置三台具有 Ubuntu 20.04/22.04 的虚拟机(VM),并安装一个 etcd
集群。还包含一个小的验证步骤:
molecule verify
要清理,请运行
molecule destroy
许可证
GNU 通用公共许可证 第 3 版