Helm chart (один чарт создаёт Service + Endpoints + Ingress на каждый прокси):
- _helpers.tpl: хелперы ext-proxy.resourceName, ext-proxy.labels
- service.yaml: ClusterIP без selector — имя совпадает с Endpoints
- endpoints.yaml: внешние IP(s) + порт; несколько IP → round-robin через kube-proxy
- ingress.yaml: слияние аннотаций (defaults → сгенерированные → уровень прокси);
поддержка TLS, basic auth, WebSocket, несколько хостов, маршрутизация по пути
- secret-auth.yaml: htpasswd Secret создаётся только при auth.enabled=true + credentials
- NOTES.txt: список прокси + команды проверки после установки
Ansible роль:
- defaults/main.yml: ext_proxy_namespace, ext_proxy_defaults, ext_proxy_proxies
- tasks/main.yml: валидация → namespace → копировать chart → lint → helm upgrade --install --atomic
- templates/values.yaml.j2: преобразование Ansible-переменных в Helm values через to_yaml
Интеграция: Makefile addon-ext-proxy, флаг addons.yml, playbooks/addons.yml,
docs/addons.md, README.md (счётчик 37 аддонов)
README.md на русском языке с полной документацией:
архитектура, настройка, функции, DNS, проверка, примеры манифестов, устранение неисправностей
Дополнительно: splitgw_deploy_mode изменён на k8s
129 lines
5.0 KiB
YAML
129 lines
5.0 KiB
YAML
---
|
|
# ── Validate inputs ───────────────────────────────────────────────────────────
|
|
|
|
- name: Validate ext_proxy_proxies is defined and non-empty
|
|
ansible.builtin.assert:
|
|
that:
|
|
- ext_proxy_proxies is defined
|
|
- ext_proxy_proxies | length > 0
|
|
fail_msg: >
|
|
ext_proxy_proxies is empty. Define at least one proxy in
|
|
group_vars/all/addons.yml → ext_proxy_proxies.
|
|
success_msg: "ext_proxy_proxies: {{ ext_proxy_proxies | length }} service(s) defined"
|
|
|
|
# ── Create namespace ──────────────────────────────────────────────────────────
|
|
|
|
- name: Create ext-proxy namespace
|
|
ansible.builtin.command: >
|
|
k3s kubectl create namespace {{ ext_proxy_namespace }}
|
|
--dry-run=client -o yaml | k3s kubectl apply -f -
|
|
become: true
|
|
changed_when: false
|
|
|
|
# ── Copy Helm chart to master node ───────────────────────────────────────────
|
|
|
|
- name: Ensure chart temp directory is clean
|
|
ansible.builtin.file:
|
|
path: /tmp/ext-proxy-chart
|
|
state: absent
|
|
become: true
|
|
|
|
- name: Create chart temp directory
|
|
ansible.builtin.file:
|
|
path: /tmp/ext-proxy-chart
|
|
state: directory
|
|
mode: "0755"
|
|
become: true
|
|
|
|
- name: Copy Helm chart to master
|
|
ansible.builtin.copy:
|
|
src: "{{ role_path }}/chart/"
|
|
dest: /tmp/ext-proxy-chart/
|
|
mode: preserve
|
|
become: true
|
|
|
|
# ── Template Helm values ──────────────────────────────────────────────────────
|
|
|
|
- name: Template Helm values
|
|
ansible.builtin.template:
|
|
src: values.yaml.j2
|
|
dest: /tmp/ext-proxy-values.yaml
|
|
mode: "0640"
|
|
become: true
|
|
|
|
- name: Show generated Helm values
|
|
ansible.builtin.command: cat /tmp/ext-proxy-values.yaml
|
|
become: true
|
|
changed_when: false
|
|
register: _ext_proxy_values
|
|
|
|
- name: Debug generated values
|
|
ansible.builtin.debug:
|
|
var: _ext_proxy_values.stdout_lines
|
|
|
|
# ── Lint chart before deploying ───────────────────────────────────────────────
|
|
|
|
- name: Lint Helm chart
|
|
ansible.builtin.command: >
|
|
helm lint /tmp/ext-proxy-chart
|
|
--values /tmp/ext-proxy-values.yaml
|
|
become: true
|
|
changed_when: false
|
|
register: _helm_lint
|
|
failed_when: _helm_lint.rc != 0
|
|
|
|
# ── Deploy chart ──────────────────────────────────────────────────────────────
|
|
|
|
- name: Deploy ext-proxy via Helm
|
|
ansible.builtin.command: >
|
|
helm upgrade --install {{ ext_proxy_release_name }}
|
|
/tmp/ext-proxy-chart
|
|
--namespace {{ ext_proxy_namespace }}
|
|
--values /tmp/ext-proxy-values.yaml
|
|
--atomic
|
|
--wait
|
|
--timeout 60s
|
|
become: true
|
|
register: _helm_result
|
|
changed_when: true
|
|
|
|
# ── Verify deployment ─────────────────────────────────────────────────────────
|
|
|
|
- name: Get Ingress list
|
|
ansible.builtin.command: >
|
|
k3s kubectl -n {{ ext_proxy_namespace }} get ingress -o wide
|
|
become: true
|
|
changed_when: false
|
|
register: _ingress_list
|
|
|
|
- name: Get Endpoints list
|
|
ansible.builtin.command: >
|
|
k3s kubectl -n {{ ext_proxy_namespace }} get endpoints
|
|
become: true
|
|
changed_when: false
|
|
register: _endpoints_list
|
|
|
|
# ── Summary ───────────────────────────────────────────────────────────────────
|
|
|
|
- name: "=== External Services Ingress Proxy Ready ==="
|
|
ansible.builtin.debug:
|
|
msg:
|
|
- "╔══════════════════════════════════════════════════════════════╗"
|
|
- "║ External Services Ingress Proxy — Deployed ║"
|
|
- "╚══════════════════════════════════════════════════════════════╝"
|
|
- ""
|
|
- " Namespace : {{ ext_proxy_namespace }}"
|
|
- " Release : {{ ext_proxy_release_name }}"
|
|
- " Services : {{ ext_proxy_proxies | length }}"
|
|
- ""
|
|
- " Ingress resources:"
|
|
- "{{ _ingress_list.stdout_lines | to_yaml }}"
|
|
- ""
|
|
- " Endpoints:"
|
|
- "{{ _endpoints_list.stdout_lines | to_yaml }}"
|
|
- ""
|
|
- " kube-vip VIP: {{ ext_proxy_vip | default('<check kube-vip>') }}"
|
|
- " → Point all proxy hostnames to the VIP in DNS/hosts file"
|
|
- ""
|
|
- " Verify: kubectl -n {{ ext_proxy_namespace }} describe ingress"
|