githubixx.kubernetes_worker
ansible-role-kubernetes-worker
这个 Ansible 角色用于 Kubernetes the not so hard way with Ansible - Worker。这个 Ansible 角色用于设置 Kubernetes 工作节点。更多信息请参见 Kubernetes the not so hard way with Ansible - Worker。
版本
我会对每个发布版本进行标记,并尽量遵循 语义版本控制。如果你想使用这个角色,建议查看最新的标记。主分支基本上是开发分支,标签则标记稳定的发布版本。但一般来说,我也会保证主分支的质量。标签 24.0.0+1.27.8
意味着这是该角色的 24.0.0
版本,适用于 Kubernetes 版本 1.27.8
(当然也应该适用于任何 K8s 1.27.x 的发布版本)。如果角色本身有变更,X.Y.Z
在 +
前会增加。如果 Kubernetes 版本变更,X.Y.Z
在 +
后也会增加。这使得在针对特定 Kubernetes 版本开发时能够标记错误修复和新的主要版本。这对于具有破坏性变更的 Kubernetes 主要版本特别有用。
要求
该剧本期望你已经部署了 Kubernetes 控制器组件(请参见 kubernetes-controller 和 Kubernetes the not so hard way with Ansible - Control plane)。
你还需要安装 containerd、CNI 插件 和 runc。为了让 Kubernetes 的 Pods
能够在不同主机间通信,建议在工作节点运行后安装 Cilium。当然,Calico
、WeaveNet
、kube-router
或 flannel 以及其他 Kubernetes 网络解决方案也是有效的选择。
支持的操作系统
- Ubuntu 20.04 (Focal Fossa)
- Ubuntu 22.04 (Jammy Jellyfish)
更新日志
更改历史:
请查看完整的 CHANGELOG.md
重要 版本 24.0.0+1.27.8
有很多潜在的破坏性变更。因此如果你从版本 < 24.0.0+1.27.8
升级,请务必阅读该版本的 CHANGELOG!
最近更改:
26.0.0+1.29.4
更新
- 更新
k8s_release
为1.29.4
- 更新
Molecule
- 使用
alvistack
代替generic
Vagrant 镜像
- 使用
25.0.1+1.28.8
- 更新
- 更新
k8s_release
为1.28.8
- 更新
25.0.0+1.28.5
更新
- 更新
k8s_release
为1.28.5
- 更新
其他更改
- 调整 Github action 以适应 Ansible Galaxy 的更改
.yamllint
:将最大行长度从 200 扩展到 300
Molecule
- 测试资产的虚拟机更改为 Ubuntu 22.04
- 更改 IP 地址
- 调整证书的通用名称 / 将算法更改为 ecdsa 和算法大小
- 移除
collections.yml
安装
从 Github 直接下载(在克隆之前切换到 Ansible roles 目录。您可以通过运行
ansible-config dump | grep DEFAULT_ROLES_PATH
命令来确定角色路径):git clone https://github.com/githubixx/ansible-role-kubernetes-worker.git githubixx.kubernetes_worker
通过
ansible-galaxy
命令直接从 Ansible Galaxy 下载:ansible-galaxy install role githubixx.kubernetes_worker
创建一个
requirements.yml
文件,内容如下(这将从 Github 下载该角色),并使用ansible-galaxy role install -r requirements.yml
进行安装(如有需要请更改version
):
---
roles:
- name: githubixx.kubernetes_worker
src: https://github.com/githubixx/ansible-role-kubernetes-worker.git
version: 26.0.0+1.29.4
角色变量
# Kubernetes 配置和证书文件的基本目录
# 与所有工作节点相关。剧本完成后,该目录
# 包含各种子文件夹。
k8s_worker_conf_dir: "/etc/kubernetes/worker"
# 所有证书文件(与私钥基础设施相关)在
# "k8s_worker_certificates" 中指定(参见 "vars/main.yml")将存储在此处。
# 该新目录的所有者和组将是 "root"。文件权限
# 将是 "0640"。
k8s_worker_pki_dir: "{{ k8s_worker_conf_dir }}/pki"
# 存储 Kubernetes 可执行文件的目录(参见 "vars/main.yml" 中的 "k8s_worker_binaries" 变量)。
# 该新目录的所有者和组在两种情况下都是 "root"。该目录的权限将是 "0755"。
#
# 注意:默认目录 "/usr/local/bin" 在每个
# Linux 安装中通常已经存在,其所有者、组和权限如上所述。
# 如果您的当前设置不同,请考虑其他目录。但请确保
# 新目录包含在您的 "$PATH" 变量值中。
k8s_worker_bin_dir: "/usr/local/bin"
# K8s 发布
k8s_worker_release: "1.29.4"
# Kubernetes 服务应监听的接口。由于所有集群
# 通信都应使用 VPN 接口,接口名称通常是
# "wg0"(WireGuard)、"peervpn0"(PeerVPN)或 "tap0"。
#
# Kubernetes 工作服务应监听的网络接口。即:
#
# - kube-proxy
# - kubelet
#
k8s_interface: "eth0"
# 从哪里复制 K8s 证书的目录。默认情况下,这
# 将扩展到用户本地的 $HOME(即运行 "ansible-playbook ..."
# 的用户)及 "/k8s/certs"。这意味着如果用户的 $HOME 目录例如
# 是 "/home/da_user",则 "k8s_ca_conf_directory" 的值将为
# "/home/da_user/k8s/certs"。
k8s_ca_conf_directory: "{{ '~/k8s/certs' | expanduser }}"
# Kubernetes API 端点的 IP 地址或主机名。此变量
# 被 "kube-proxy" 和 "kubelet" 用于连接 "kube-apiserver"
# (Kubernetes API 服务器)。
#
# 默认情况下,第一个主机在 Ansible 组 "k8s_controller" 中
# 在这里指定。注意:此设置不具备容错能力!这意味着
# 如果 Ansible 组 "k8s_controller" 中的第一个主机宕机,
# 工作节点及其负载将继续工作,但工作
# 节点不会从 Kubernetes API 服务器接收任何更新。
#
# 如果你有一个负载均衡器在所有
# Kubernetes API 服务器之间分配流量,它应该在这里指定(可以是其 IP
# 地址或 DNS 名称)。但你需要确保你要在此处使用的 IP
# 地址或 DNS 名称包含在
# Kubernetes API 服务器的 TLS 证书中(请参见 https://github.com/githubixx/ansible-role-kubernetes-ca
# 角色的 "k8s_apiserver_cert_hosts" 变量)。如果未指定,你将在上述提到的服务的日志中看到证书错误。
k8s_worker_api_endpoint_host: "{% set controller_host = groups['k8s_controller'][0] %}{{ hostvars[controller_host]['ansible_' + hostvars[controller_host]['k8s_interface']].ipv4.address }}"
# 与上述类似,但针对端口。它指定Kubernetes API 服务器监听的端口。
# 同样,如果负载均衡器在位并将请求分发到 Kubernetes API 服务器
#,请将负载均衡器的端口放在这里。
k8s_worker_api_endpoint_port: "6443"
# Kubernetes 工作节点所需的操作系统包。你可以随时添加更多
# 包。但请注意,如果从默认列表中删除一个或多个,工作节点可能
# 不会按预期工作或根本无法工作。
k8s_worker_os_packages:
- ebtables
- ethtool
- ipset
- conntrack
- iptables
- iptstate
- netstat-nat
- socat
- netbase
# 存储 kubelet 配置的目录
k8s_worker_kubelet_conf_dir: "{{ k8s_worker_conf_dir }}/kubelet"
# kubelet 设置
#
# 如果你想启用 "RuntimeDefault" 作为所有工作负载的默认 seccomp
# 配置文件,请将这些设置添加到 "k8s_worker_kubelet_settings" 中:
#
# "seccomp-default": ""
#
# 另请参见:
# https://kubernetes.io/docs/tutorials/security/seccomp/#enable-the-use-of-runtimedefault-as-the-default-seccomp-profile-for-all-workloads
k8s_worker_kubelet_settings:
"config": "{{ k8s_worker_kubelet_conf_dir }}/kubelet-config.yaml"
"node-ip": "{{ hostvars[inventory_hostname]['ansible_' + k8s_interface].ipv4.address }}"
"kubeconfig": "{{ k8s_worker_kubelet_conf_dir }}/kubeconfig"
# kubelet kubeconfig
k8s_worker_kubelet_conf_yaml: |
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
address: {{ hostvars[inventory_hostname]['ansible_' + k8s_interface].ipv4.address }}
authentication:
anonymous:
enabled: false
webhook:
enabled: true
x509:
clientCAFile: "{{ k8s_worker_pki_dir }}/ca-k8s-apiserver.pem"
authorization:
mode: Webhook
clusterDomain: "cluster.local"
clusterDNS:
- "10.32.0.254"
failSwapOn: true
healthzBindAddress: "{{ hostvars[inventory_hostname]['ansible_' + k8s_interface].ipv4.address }}"
healthzPort: 10248
runtimeRequestTimeout: "15m"
serializeImagePulls: false
tlsCertFile: "{{ k8s_worker_pki_dir }}/cert-{{ inventory_hostname }}.pem"
tlsPrivateKeyFile: "{{ k8s_worker_pki_dir }}/cert-{{ inventory_hostname }}-key.pem"
cgroupDriver: "systemd"
registerNode: true
containerRuntimeEndpoint: "unix:///run/containerd/containerd.sock"
# 存储 kube-proxy 配置的目录
k8s_worker_kubeproxy_conf_dir: "{{ k8s_worker_conf_dir }}/kube-proxy"
# kube-proxy 设置
k8s_worker_kubeproxy_settings:
"config": "{{ k8s_worker_kubeproxy_conf_dir }}/kubeproxy-config.yaml"
k8s_worker_kubeproxy_conf_yaml: |
kind: KubeProxyConfiguration
apiVersion: kubeproxy.config.k8s.io/v1alpha1
bindAddress: {{ hostvars[inventory_hostname]['ansible_' + k8s_interface].ipv4.address }}
clientConnection:
kubeconfig: "{{ k8s_worker_kubeproxy_conf_dir }}/kubeconfig"
healthzBindAddress: {{ hostvars[inventory_hostname]['ansible_' + k8s_interface].ipv4.address }}:10256
mode: "ipvs"
ipvs:
minSyncPeriod: 0s
scheduler: ""
syncPeriod: 2s
iptables:
masqueradeAll: true
clusterCIDR: "10.200.0.0/16"
依赖关系
示例剧本
- hosts: k8s_worker
roles:
- githubixx.kubernetes_worker
测试
这个角色有一个小的测试设置,使用 Molecule、libvirt(vagrant-libvirt)和 QEMU/KVM 创建。请查看我博客中的文章 Testing Ansible roles with Molecule, libvirt (vagrant-libvirt) and QEMU/KVM 了解如何设置。测试配置在 这里。
之后可以执行 Molecule。这将设置一些支持的 Ubuntu 操作系统的虚拟机(VM)并安装一个 Kubernetes 集群:
molecule converge
此时集群并不完全功能齐全,因为缺少网络插件。例如,两个不同节点间的 Pod 通信尚不可用。为了解决这个问题,可以使用以下命令为所有 Kubernetes 网络需求安装 Cilium 和 CoreDNS 以满足 Kubernetes DNS 需求:
molecule converge -- --extra-vars k8s_worker_setup_networking=install
在此之后,你基本上就拥有了一个完全功能的 Kubernetes 集群。
也包括一个小的验证步骤:
molecule verify
要清理运行:
molecule destroy
许可
GNU 通用公共许可第 3 版
作者信息
ansible-galaxy install githubixx.kubernetes_worker