RKE2 v1.31.14, Hetzner Cloud. Управляется через Rancher: https://rancher.symfio.deCluster ID: c-m-bxhfzsqq, name: sy-rke2-prod. Ноды Terraform-based — IP меняются при пересоздании.
⚠️ SSH к нодам напрямую нецелесообразен — вместо этого kubectl exec или Rancher Shell.
graph TD
Internet -->|80/443| LB1["🔀 Hetzner LB\n128.140.29.186"]
Internet -->|21/2121/passive| LB2["🔀 Hetzner LB FTP\n128.140.31.223"]
LB1 --> NGINX["NGINX Ingress\ncert-manager / Let's Encrypt"]
LB2 --> FTP["spinic-ftp"]
subgraph CP["Control Plane × 3 (etcd + master)"]
CP1["10.20.0.4\n178.105.67.12"]
CP2["10.20.0.5\n178.105.76.44"]
CP3["10.20.0.7\n178.105.73.99"]
end
subgraph W["Workers × 4"]
W1["10.20.0.2\n91.98.35.154"]
W2["10.20.0.3\n178.105.110.101"]
W3["10.20.0.6\n178.105.77.197"]
W4["10.20.0.9\n178.105.68.92"]
end
NGINX --> W1 & W2 & W3 & W4
graph LR
NGINX["NGINX Ingress"] --> Spinic & Keycloak & Dealers & Symfio
subgraph Spinic["Spinic"]
API_DEV["api.dev.spinic.de\nspnc-console + 7 consumers"]
API_PROD["api.prod.spinic.de\nspnc-console ×2 + 7 consumers"]
DASH_DEV["dashboard.dev.spinic.de"]
DASH_PROD["dashboard.spinic.de"]
SVC_PROD["services.spinic.de"]
MS["Microservices\nitem-storage · media-processor\npremium-spin · short-linker"]
end
subgraph Keycloak["Keycloak (SSO)"]
KC_PROD["oauth.spinic.net\nStatefulSet 3/3"]
KC_DEV["oauth.dev.spinic.net\nStatefulSet 2/2"]
end
subgraph Dealers["sy-dealer-frontend"]
D["7 dealer-сайтов\n× 3 реплики каждый\nNFS: cache 5Gi + isr 2Gi"]
end
subgraph Symfio["Symfio Services"]
VI["symfio-de-dev-vehicleident\nsy-vehicle-ident"]
end
graph LR
Apps["Все app-namespace"] -->|ExternalName| MEM["memcached\n(1/1)"]
Apps -->|ExternalName| BF["blackfire-agent\n(1/1)"]
Apps -->|ExternalName| CACHE["valkey-cache-primary\n(1/1)"]
Apps -->|ExternalName| SESSION["valkey-session\nStatefulSet 3/3\nhcloud-volumes 10Gi×3"]
OBS["Grafana Alloy\nDaemonSet 7/7 нод"] -->|metrics/logs| Remote["Monitoring"]
| Class | Provisioner | Использование |
|---|---|---|
hcloud-volumes (default) |
csi.hetzner.cloud | Valkey session (10Gi × 3) |
nfs-sy-cache |
nfs-subdir-external-provisioner | dealer: cache 5Gi + isr 2Gi на сайт |
nfs-symfio-mnt |
nfs-subdir-external-provisioner | общий NFS mount |
apiVersion: v1
kind: Config
clusters:
- name: sy-rke2-prod
cluster:
server: https://rancher.symfio.de/k8s/clusters/c-m-bxhfzsqq
insecure-skip-tls-verify: true
contexts:
- name: sy-rke2-prod
context:
cluster: sy-rke2-prod
user: sy-rke2-prod
current-context: sy-rke2-prod
users:
- name: sy-rke2-prod
user:
token: <TOKEN> # Rancher UI → User Settings → API Keys
⚠️ В GitLab CI используется instance variable SY_KUBECONFIG_B64 (base64-encoded полный kubeconfig).
# Быстрый доступ
echo "$SY_KUBECONFIG_B64" | base64 -d > ~/.kube/sy-rke2-prod.yaml
export KUBECONFIG=~/.kube/sy-rke2-prod.yaml
kubectl get nodes
⚠️ Ноды Terraform-based — IP меняются при пересоздании. Прямой SSH нецелесообразен.
kubectl debug (без SSH)
# Privileged shell прямо на ноде
kubectl debug node/<node-name> -it --image=ubuntu -- bash
# Все поды на конкретной ноде
kubectl get pods -A --field-selector spec.nodeName=<node-name>
Rancher Shell
Rancher UI → Cluster → Nodes → нода → ⋮ → Open ShellДаёт root-доступ без SSH, работает всегда.
kubectl node-shell (плагин)
kubectl krew install node-shell
kubectl node-shell <node-name>
# Детали ноды: условия, события, ресурсы
kubectl describe node <node-name>
# Нагрузка (требует metrics-server)
kubectl top nodes
kubectl top pods -A --sort-by=cpu
# События кластера
kubectl get events -A --sort-by='.lastTimestamp' | tail -30
# Запретить новые поды на ноду
kubectl cordon <node-name>
# Выселить все поды с ноды (drain)
kubectl drain <node-name> --ignore-daemonsets --delete-emptydir-data
# Вернуть ноду в ротацию
kubectl uncordon <node-name>
kubectl get ingress -A
kubectl get pods -A | grep -v Running | grep -v Completed
kubectl logs -n <namespace> <pod> --previous
kubectl logs -n <namespace> <pod> --previous --all-containers
kubectl exec -it -n <namespace> <pod> -- sh
kubectl rollout restart deployment/<name> -n <namespace>
kubectl rollout undo deployment/<name> -n <namespace>
kubectl delete pod <pod> -n <namespace> --grace-period=0 --force
helm list -A