Compare commits
6
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
89e011fd2e | ||
|
|
593fb6b7d9 | ||
|
|
d4a683a0ad | ||
|
|
1551523764 | ||
|
|
40362925fa | ||
|
|
0fa4b8d361 |
@@ -119,9 +119,11 @@ against do not exist, and the node ends up with no address on any interface.
|
|||||||
Beyond that it carries:
|
Beyond that it carries:
|
||||||
|
|
||||||
- `siderolabs/intel-ucode` — no hypervisor supplies microcode here
|
- `siderolabs/intel-ucode` — no hypervisor supplies microcode here
|
||||||
- `siderolabs/i915` — the Alder Lake-P Iris Xe. Nothing requests `/dev/dri`
|
- `siderolabs/i915` — the Alder Lake-P Iris Xe. The Intel GPU device plugin
|
||||||
today; present so wanting hardware transcoding later is a config change
|
(`infrastructure/intel-gpu-plugin`) turns this into the schedulable resource
|
||||||
rather than another rolling reinstall
|
`gpu.intel.com/i915`, which `apps/llama-server` requests for LLM inference
|
||||||
|
and which any hardware-transcoding workload would use too. Without the
|
||||||
|
extension the plugin finds no `/dev/dri` and advertises nothing
|
||||||
- `siderolabs/thunderbolt` — inert until `machine.kernel.modules` requests
|
- `siderolabs/thunderbolt` — inert until `machine.kernel.modules` requests
|
||||||
`thunderbolt`/`thunderbolt_net`, present for the same reason. Note its udev
|
`thunderbolt`/`thunderbolt_net`, present for the same reason. Note its udev
|
||||||
rule auto-authorises any Thunderbolt device attached once those modules load
|
rule auto-authorises any Thunderbolt device attached once those modules load
|
||||||
|
|||||||
@@ -0,0 +1,164 @@
|
|||||||
|
---
|
||||||
|
# The chat endpoint, and the only one behind the ingress.
|
||||||
|
#
|
||||||
|
# Single-model rather than router mode. Router mode served chat and embeddings
|
||||||
|
# from one port, but two things made that wrong here:
|
||||||
|
#
|
||||||
|
# 1. Its /health answers 200 as soon as the router process listens, while the
|
||||||
|
# models are still downloading behind it. Kubernetes marked the pod Ready
|
||||||
|
# within seconds of start, so traffic arrived at a server that could not
|
||||||
|
# answer. In single-model mode /health returns 503 until the model is
|
||||||
|
# resident, which is what the probes below actually need.
|
||||||
|
# 2. Every model on the port is selectable in the built-in WebUI, including
|
||||||
|
# the embedding model. Asking an embedding model to chat returns fluent
|
||||||
|
# nonsense ("capital capital capital ...") rather than an error, and
|
||||||
|
# `--embeddings` does not prevent it. There is no flag to hide a model
|
||||||
|
# from the list — `--tags` is informational and `--ui-config` only sets UI
|
||||||
|
# preferences — so the only way to keep it out of the picker is to keep it
|
||||||
|
# off this endpoint. It runs in embed.yaml instead.
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: llama-server
|
||||||
|
namespace: ai
|
||||||
|
labels:
|
||||||
|
app.kubernetes.io/name: llama-server
|
||||||
|
spec:
|
||||||
|
replicas: 1
|
||||||
|
# A rolling update would load a second copy of the weights onto the same
|
||||||
|
# iGPU and into the same node's RAM before releasing the first.
|
||||||
|
strategy:
|
||||||
|
type: Recreate
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app.kubernetes.io/name: llama-server
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app.kubernetes.io/name: llama-server
|
||||||
|
spec:
|
||||||
|
securityContext:
|
||||||
|
runAsNonRoot: true
|
||||||
|
runAsUser: 1000
|
||||||
|
runAsGroup: 1000
|
||||||
|
# Makes the CephFS volume group-writable so the weights can be cached.
|
||||||
|
fsGroup: 1000
|
||||||
|
seccompProfile:
|
||||||
|
type: RuntimeDefault
|
||||||
|
containers:
|
||||||
|
- name: llama-server
|
||||||
|
image: ghcr.io/ggml-org/llama.cpp:server-vulkan-b10731
|
||||||
|
args:
|
||||||
|
# The one place this model is named; llama-server resolves the repo
|
||||||
|
# and downloads it itself, so there is nothing to keep in sync.
|
||||||
|
#
|
||||||
|
# A 35B mixture-of-experts with only ~3B parameters active per
|
||||||
|
# token. Decode on this hardware is bound by how many bytes are read
|
||||||
|
# per token rather than by parameter count, and this model reads
|
||||||
|
# ~1.85 GB/token where a dense 27B reads ~16.5 GB — so it is both
|
||||||
|
# far larger and faster than any dense model that would fit.
|
||||||
|
#
|
||||||
|
# Measured here (llama-bench, k8s-1, this image): tg128 11.59 tok/s,
|
||||||
|
# against 10.78 for a dense 8B. Prefill 120.9 t/s at 512 tokens and
|
||||||
|
# 69.8 at 16384 — a sublinear falloff, so the Gated Delta Net
|
||||||
|
# prefill collapse of llama.cpp#27638 does not occur on this stack.
|
||||||
|
- --hf-repo
|
||||||
|
- ggml-org/Qwen3.6-35B-A3B-GGUF:Q4_K_M
|
||||||
|
# Every layer on the Intel iGPU. Full offload matches CPU throughput
|
||||||
|
# while leaving the node's 14 cores free for the rest of the
|
||||||
|
# cluster; the iGPU is here for that isolation, not for a speed-up.
|
||||||
|
- --n-gpu-layers
|
||||||
|
- "99"
|
||||||
|
# Decode runs on the GPU, so extra threads buy nothing. At 11.59
|
||||||
|
# tok/s this model moves 21.4 GB/s against the 53.9 GB/s a dense
|
||||||
|
# model sustains here, so it is the iGPU's 96 EUs working through
|
||||||
|
# many small per-expert matmuls that sets the pace, not bandwidth.
|
||||||
|
- --threads
|
||||||
|
- "4"
|
||||||
|
# 16k rather than 8k because the measured prefill falloff is mild
|
||||||
|
# and this model's KV cache is unusually cheap — only 10 of its 40
|
||||||
|
# layers use full attention.
|
||||||
|
- --ctx-size
|
||||||
|
- "16384"
|
||||||
|
# A micro-batch of 2048 or more makes this Vulkan/Mesa stack fail
|
||||||
|
# with ErrorDeviceLost.
|
||||||
|
- --ubatch-size
|
||||||
|
- "1024"
|
||||||
|
# The server otherwise allows every CORS origin and warns about it
|
||||||
|
# at startup. Without this, any page a LAN browser visits could call
|
||||||
|
# this unauthenticated API from the user's machine. Consumers talk
|
||||||
|
# to it server-side; the WebUI is same-origin and unaffected.
|
||||||
|
- --cors-origins
|
||||||
|
- localhost
|
||||||
|
env:
|
||||||
|
# Where --hf-repo caches the weights. Pointing it at the PVC makes
|
||||||
|
# the download a one-time cost, shared with llama-embed, and keeps
|
||||||
|
# the server off a home directory it cannot write as UID 1000.
|
||||||
|
- name: LLAMA_CACHE
|
||||||
|
value: /models
|
||||||
|
ports:
|
||||||
|
- name: http
|
||||||
|
containerPort: 8080
|
||||||
|
securityContext:
|
||||||
|
allowPrivilegeEscalation: false
|
||||||
|
capabilities:
|
||||||
|
drop:
|
||||||
|
- ALL
|
||||||
|
# Vulkan allocates the iGPU's working set from system RAM, and that
|
||||||
|
# counts against the pod's cgroup: a 5.2 GiB model measured 7.54 GiB
|
||||||
|
# RSS. Sized as the 19 GiB of weights plus that overhead, plus the KV
|
||||||
|
# cache — which is unusually cheap here, since only 10 of the 40
|
||||||
|
# layers use full attention.
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
cpu: 500m
|
||||||
|
memory: 24Gi
|
||||||
|
gpu.intel.com/i915: "1"
|
||||||
|
limits:
|
||||||
|
cpu: "6"
|
||||||
|
memory: 32Gi
|
||||||
|
gpu.intel.com/i915: "1"
|
||||||
|
# /health is 503 while the model loads and 200 once it is resident, so
|
||||||
|
# the pod only goes Ready when it can actually answer. On a cold PVC
|
||||||
|
# that includes pulling ~19 GiB from Hugging Face, hence the long
|
||||||
|
# startup budget (40 min); liveness takes over only after that.
|
||||||
|
startupProbe:
|
||||||
|
httpGet:
|
||||||
|
path: /health
|
||||||
|
port: http
|
||||||
|
periodSeconds: 10
|
||||||
|
failureThreshold: 240
|
||||||
|
readinessProbe:
|
||||||
|
httpGet:
|
||||||
|
path: /health
|
||||||
|
port: http
|
||||||
|
periodSeconds: 10
|
||||||
|
livenessProbe:
|
||||||
|
httpGet:
|
||||||
|
path: /health
|
||||||
|
port: http
|
||||||
|
periodSeconds: 30
|
||||||
|
timeoutSeconds: 10
|
||||||
|
failureThreshold: 6
|
||||||
|
volumeMounts:
|
||||||
|
- name: models
|
||||||
|
mountPath: /models
|
||||||
|
volumes:
|
||||||
|
- name: models
|
||||||
|
persistentVolumeClaim:
|
||||||
|
claimName: llama-server-models
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: llama-server
|
||||||
|
namespace: ai
|
||||||
|
labels:
|
||||||
|
app.kubernetes.io/name: llama-server
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
app.kubernetes.io/name: llama-server
|
||||||
|
ports:
|
||||||
|
- name: http
|
||||||
|
port: 8080
|
||||||
|
targetPort: http
|
||||||
@@ -0,0 +1,119 @@
|
|||||||
|
---
|
||||||
|
# The embedding endpoint, for RAG and semantic search.
|
||||||
|
#
|
||||||
|
# Deliberately separate from llama-server and deliberately not behind the
|
||||||
|
# ingress: an embedding model has no generative training, and when it shares a
|
||||||
|
# port with the chat model the built-in WebUI lists it as a choice. Selecting it
|
||||||
|
# returns fluent nonsense rather than an error, because `--embeddings` does not
|
||||||
|
# actually refuse chat completions. Keeping it on its own ClusterIP-only Service
|
||||||
|
# is what makes it unselectable, since llama.cpp has no way to hide a model from
|
||||||
|
# the picker.
|
||||||
|
#
|
||||||
|
# Reachable in-cluster at http://llama-embed.ai.svc.cluster.local:8080/v1/embeddings.
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: llama-embed
|
||||||
|
namespace: ai
|
||||||
|
labels:
|
||||||
|
app.kubernetes.io/name: llama-embed
|
||||||
|
spec:
|
||||||
|
replicas: 1
|
||||||
|
strategy:
|
||||||
|
type: Recreate
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app.kubernetes.io/name: llama-embed
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app.kubernetes.io/name: llama-embed
|
||||||
|
spec:
|
||||||
|
securityContext:
|
||||||
|
runAsNonRoot: true
|
||||||
|
runAsUser: 1000
|
||||||
|
runAsGroup: 1000
|
||||||
|
fsGroup: 1000
|
||||||
|
seccompProfile:
|
||||||
|
type: RuntimeDefault
|
||||||
|
containers:
|
||||||
|
- name: llama-embed
|
||||||
|
image: ghcr.io/ggml-org/llama.cpp:server-vulkan-b10731
|
||||||
|
args:
|
||||||
|
- --hf-repo
|
||||||
|
- Qwen/Qwen3-Embedding-0.6B-GGUF:Q8_0
|
||||||
|
# Serves POST /v1/embeddings.
|
||||||
|
- --embeddings
|
||||||
|
- --n-gpu-layers
|
||||||
|
- "99"
|
||||||
|
- --threads
|
||||||
|
- "2"
|
||||||
|
- --ctx-size
|
||||||
|
- "2048"
|
||||||
|
# No browser ever talks to this Service, so the WebUI is dead weight
|
||||||
|
# and one more unauthenticated surface.
|
||||||
|
- --no-webui
|
||||||
|
env:
|
||||||
|
# Same cache as llama-server, so the two share one copy of anything
|
||||||
|
# they have in common and neither re-downloads the other's weights.
|
||||||
|
- name: LLAMA_CACHE
|
||||||
|
value: /models
|
||||||
|
ports:
|
||||||
|
- name: http
|
||||||
|
containerPort: 8080
|
||||||
|
securityContext:
|
||||||
|
allowPrivilegeEscalation: false
|
||||||
|
capabilities:
|
||||||
|
drop:
|
||||||
|
- ALL
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
cpu: 250m
|
||||||
|
memory: 2Gi
|
||||||
|
gpu.intel.com/i915: "1"
|
||||||
|
limits:
|
||||||
|
cpu: "2"
|
||||||
|
memory: 4Gi
|
||||||
|
gpu.intel.com/i915: "1"
|
||||||
|
# ~600 MiB rather than ~5 GiB, so a much shorter budget than the chat
|
||||||
|
# model needs, but still sized for a cold download.
|
||||||
|
startupProbe:
|
||||||
|
httpGet:
|
||||||
|
path: /health
|
||||||
|
port: http
|
||||||
|
periodSeconds: 10
|
||||||
|
failureThreshold: 60
|
||||||
|
readinessProbe:
|
||||||
|
httpGet:
|
||||||
|
path: /health
|
||||||
|
port: http
|
||||||
|
periodSeconds: 10
|
||||||
|
livenessProbe:
|
||||||
|
httpGet:
|
||||||
|
path: /health
|
||||||
|
port: http
|
||||||
|
periodSeconds: 30
|
||||||
|
timeoutSeconds: 10
|
||||||
|
failureThreshold: 6
|
||||||
|
volumeMounts:
|
||||||
|
- name: models
|
||||||
|
mountPath: /models
|
||||||
|
volumes:
|
||||||
|
- name: models
|
||||||
|
persistentVolumeClaim:
|
||||||
|
claimName: llama-server-models
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: llama-embed
|
||||||
|
namespace: ai
|
||||||
|
labels:
|
||||||
|
app.kubernetes.io/name: llama-embed
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
app.kubernetes.io/name: llama-embed
|
||||||
|
ports:
|
||||||
|
- name: http
|
||||||
|
port: 8080
|
||||||
|
targetPort: http
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
---
|
||||||
|
# LAN-only: no `dns.renner.uno/public` label, so the Cloudflare external-dns
|
||||||
|
# instance skips it and only the UDM instance publishes the record. The API is
|
||||||
|
# unauthenticated, so it must not be reachable from the internet.
|
||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
name: llama-server
|
||||||
|
namespace: ai
|
||||||
|
annotations:
|
||||||
|
cert-manager.io/cluster-issuer: letsencrypt-cluster
|
||||||
|
spec:
|
||||||
|
ingressClassName: traefik
|
||||||
|
tls:
|
||||||
|
- hosts:
|
||||||
|
- llm.renner.uno
|
||||||
|
secretName: llama-server-tls
|
||||||
|
rules:
|
||||||
|
- host: llm.renner.uno
|
||||||
|
http:
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: Prefix
|
||||||
|
backend:
|
||||||
|
service:
|
||||||
|
name: llama-server
|
||||||
|
port:
|
||||||
|
number: 8080
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||||
|
kind: Kustomization
|
||||||
|
resources:
|
||||||
|
- pvc.yaml
|
||||||
|
- deployment.yaml
|
||||||
|
- embed.yaml
|
||||||
|
- ingress.yaml
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
---
|
||||||
|
# Holds the GGUF weights, downloaded once by the Deployment's initContainer.
|
||||||
|
# Prune-disabled so retiring this Kustomization does not throw away several
|
||||||
|
# GiB of model files that would have to be pulled from Hugging Face again.
|
||||||
|
#
|
||||||
|
# ReadWriteMany so a second replica or a one-off benchmark Job can mount the
|
||||||
|
# same weights; the models are read-only at inference time.
|
||||||
|
apiVersion: v1
|
||||||
|
kind: PersistentVolumeClaim
|
||||||
|
metadata:
|
||||||
|
name: llama-server-models
|
||||||
|
namespace: ai
|
||||||
|
annotations:
|
||||||
|
kustomize.toolkit.fluxcd.io/prune: disabled
|
||||||
|
spec:
|
||||||
|
accessModes:
|
||||||
|
- ReadWriteMany
|
||||||
|
storageClassName: ceph-filesystem
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
storage: 40Gi
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
apiVersion: kustomize.toolkit.fluxcd.io/v1
|
||||||
|
kind: Kustomization
|
||||||
|
metadata:
|
||||||
|
name: llama-server
|
||||||
|
namespace: flux-system
|
||||||
|
spec:
|
||||||
|
interval: 10m
|
||||||
|
retryInterval: 1m
|
||||||
|
# On a cold PVC the chat model pulls ~19 GiB of GGUF weights from Hugging
|
||||||
|
# Face and then loads onto the iGPU before /health goes green, so a first
|
||||||
|
# start is far slower than a normal app's.
|
||||||
|
timeout: 60m
|
||||||
|
sourceRef:
|
||||||
|
kind: GitRepository
|
||||||
|
name: flux-system
|
||||||
|
path: ./kubernetes/apps/llama-server
|
||||||
|
prune: true
|
||||||
|
wait: true
|
||||||
|
dependsOn:
|
||||||
|
- name: infrastructure
|
||||||
|
- name: infrastructure-crds
|
||||||
|
- name: infrastructure-ceph-cluster
|
||||||
@@ -183,3 +183,15 @@ apiVersion: v1
|
|||||||
kind: Namespace
|
kind: Namespace
|
||||||
metadata:
|
metadata:
|
||||||
name: woodpecker
|
name: woodpecker
|
||||||
|
---
|
||||||
|
# Local LLM inference (kubernetes/apps/llama-server). Declared here, like
|
||||||
|
# `woodpecker` above, so the `infrastructure` KS creates it before
|
||||||
|
# `infrastructure-crds` applies the namespace's CiliumNetworkPolicies.
|
||||||
|
#
|
||||||
|
# No pod-security labels: the workload needs no hostPath or privilege — the
|
||||||
|
# Intel GPU device plugin passes the iGPU in through the device-plugin API —
|
||||||
|
# so the cluster's default `baseline` enforcement is enough.
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Namespace
|
||||||
|
metadata:
|
||||||
|
name: ai
|
||||||
|
|||||||
@@ -0,0 +1,96 @@
|
|||||||
|
apiVersion: cilium.io/v2
|
||||||
|
kind: CiliumNetworkPolicy
|
||||||
|
metadata:
|
||||||
|
name: default-deny-ingress
|
||||||
|
namespace: ai
|
||||||
|
spec:
|
||||||
|
endpointSelector: {}
|
||||||
|
ingress:
|
||||||
|
- fromEndpoints:
|
||||||
|
- matchLabels:
|
||||||
|
"k8s:io.kubernetes.pod.namespace": ai
|
||||||
|
- fromEndpoints:
|
||||||
|
- matchLabels:
|
||||||
|
"k8s:io.kubernetes.pod.namespace": ingress
|
||||||
|
app.kubernetes.io/name: traefik
|
||||||
|
- fromEndpoints:
|
||||||
|
- matchLabels:
|
||||||
|
"k8s:io.kubernetes.pod.namespace": monitoring
|
||||||
|
- fromEntities:
|
||||||
|
- host
|
||||||
|
- remote-node
|
||||||
|
# ICMP — all standard ICMPv4 + ICMPv6 from any cluster pod. See
|
||||||
|
# home-assistant-ns.yaml for the rationale (CT-RELATED path not
|
||||||
|
# passing related ICMP empirically; per-namespace shape, mirroring
|
||||||
|
# commit 3c517a0's verified-safe pattern with the 66dbe9f type set).
|
||||||
|
- fromEndpoints:
|
||||||
|
- matchExpressions:
|
||||||
|
- key: io.kubernetes.pod.namespace
|
||||||
|
operator: Exists
|
||||||
|
icmps:
|
||||||
|
- fields:
|
||||||
|
- { type: 0, family: IPv4 }
|
||||||
|
- { type: 3, family: IPv4 }
|
||||||
|
- { type: 8, family: IPv4 }
|
||||||
|
- { type: 11, family: IPv4 }
|
||||||
|
- { type: 12, family: IPv4 }
|
||||||
|
- { type: 1, family: IPv6 }
|
||||||
|
- { type: 2, family: IPv6 }
|
||||||
|
- { type: 3, family: IPv6 }
|
||||||
|
- { type: 4, family: IPv6 }
|
||||||
|
- { type: 128, family: IPv6 }
|
||||||
|
- { type: 129, family: IPv6 }
|
||||||
|
- { type: 133, family: IPv6 }
|
||||||
|
- { type: 134, family: IPv6 }
|
||||||
|
- { type: 135, family: IPv6 }
|
||||||
|
- { type: 136, family: IPv6 }
|
||||||
|
- { type: 143, family: IPv6 }
|
||||||
|
egress:
|
||||||
|
- toEndpoints:
|
||||||
|
- matchLabels:
|
||||||
|
"k8s:io.kubernetes.pod.namespace": ai
|
||||||
|
- toEndpoints:
|
||||||
|
- matchLabels:
|
||||||
|
"k8s:io.kubernetes.pod.namespace": ingress
|
||||||
|
app.kubernetes.io/name: traefik
|
||||||
|
# rook-ceph: the model weights live on a CephFS RWX volume
|
||||||
|
- toEndpoints:
|
||||||
|
- matchLabels:
|
||||||
|
"k8s:io.kubernetes.pod.namespace": rook-ceph
|
||||||
|
- toEndpoints:
|
||||||
|
- matchLabels:
|
||||||
|
"k8s:io.kubernetes.pod.namespace": kube-system
|
||||||
|
k8s-app: kube-dns
|
||||||
|
toPorts:
|
||||||
|
- ports:
|
||||||
|
- port: "53"
|
||||||
|
protocol: UDP
|
||||||
|
# host/remote-node: kubelet probes + node-local reach (Ceph mons on host net)
|
||||||
|
# world: image pulls and llama-server's Hugging Face model download
|
||||||
|
- toEntities:
|
||||||
|
- host
|
||||||
|
- remote-node
|
||||||
|
- world
|
||||||
|
# ICMP — egress mirror; see ingress block above.
|
||||||
|
- toEndpoints:
|
||||||
|
- matchExpressions:
|
||||||
|
- key: io.kubernetes.pod.namespace
|
||||||
|
operator: Exists
|
||||||
|
icmps:
|
||||||
|
- fields:
|
||||||
|
- { type: 0, family: IPv4 }
|
||||||
|
- { type: 3, family: IPv4 }
|
||||||
|
- { type: 8, family: IPv4 }
|
||||||
|
- { type: 11, family: IPv4 }
|
||||||
|
- { type: 12, family: IPv4 }
|
||||||
|
- { type: 1, family: IPv6 }
|
||||||
|
- { type: 2, family: IPv6 }
|
||||||
|
- { type: 3, family: IPv6 }
|
||||||
|
- { type: 4, family: IPv6 }
|
||||||
|
- { type: 128, family: IPv6 }
|
||||||
|
- { type: 129, family: IPv6 }
|
||||||
|
- { type: 133, family: IPv6 }
|
||||||
|
- { type: 134, family: IPv6 }
|
||||||
|
- { type: 135, family: IPv6 }
|
||||||
|
- { type: 136, family: IPv6 }
|
||||||
|
- { type: 143, family: IPv6 }
|
||||||
@@ -24,4 +24,5 @@ resources:
|
|||||||
- woodpecker-ns.yaml
|
- woodpecker-ns.yaml
|
||||||
- trmnl-ns.yaml
|
- trmnl-ns.yaml
|
||||||
- wordpress-ns.yaml
|
- wordpress-ns.yaml
|
||||||
|
- ai-ns.yaml
|
||||||
- allow-cilium-health.yaml
|
- allow-cilium-health.yaml
|
||||||
|
|||||||
Reference in New Issue
Block a user