# k8s

# Установка и настройка

# Сохранение конфигурации для kubectl

После установки k8s для того чтобы получить доступ через kubectl необходимо сохранить для пользователя конфигурацию:

```bash
k8s config > ~/.kube/config
```

# Переход с Ingress на Cilium Gateway

Если установлен Ingress NGINX, то его надо сначала удалить.

Если установка делалась [отсюда](https://elma365.com/ru/help/platform/install-ingress-nginx.html), то удаляем:

```bash
helm uninstall ingress-nginx -n ingress-nginx
```

Если установка была другим способом, удалить в соответствии с инструкцией по существующему методу.

В случае, если установка k8s делалась через snap, то по умолчанию должент был установиться cilium и cilium-operator:

```bash
kubectl get pod -n kube-system
```

```shell
NAME                                  READY   STATUS    RESTARTS        AGE
cilium-hg6nz                          1/1     Running   49 (15m ago)    118d
cilium-operator-59756b9446-6brfb      1/1     Running   54 (15m ago)    55d
ck-storage-rawfile-csi-controller-0   2/2     Running   48 (15m ago)    84d
ck-storage-rawfile-csi-node-2s5qd     4/4     Running   157 (15m ago)   84d
coredns-646d668679-hqpkq              1/1     Running   29 (15m ago)    55d
coredns-646d668679-mg4tv              1/1     Running   26 (15m ago)    55d
metrics-server-55987d6764-vksr8       1/1     Running   145 (15m ago)   118d
```

Версию cilium можно посмотреть так:

```bash
kubectl get daemonset cilium -n kube-system -o json | jq -r '.spec.template.spec.containers[0].image'
```

<p class="callout info">ghcr.io/canonical/cilium:1.17.12-ck0-static</p>

Так же по умолчани будет включен gateway, а если нет, то его нужно включить:

```bash
k8s status
```

```shell
cluster status:           ready
control plane nodes:      192.168.56.83:6400 (voter)
high availability:        no
datastore:                etcd
network:                  enabled
dns:                      enabled at 10.152.183.238
ingress:                  disabled
load-balancer:            disabled
local-storage:            enabled at /var/snap/k8s/common/rawfile-storage
gateway                   enabled
```

Смотрим состояние gateway:

```bash
kubectl get gateway -A
```

По факту его нет, хоть и статус показывает что он включен:

```shell
No resources found
```

Проверяем установлены ли CRD:

```bash
kubectl get crd | grep gateway.networking.k8s.io
```

Видим что все хорошо:

```shell
gatewayclasses.gateway.networking.k8s.io     2026-01-24T11:40:28Z
gateways.gateway.networking.k8s.io           2026-01-24T11:40:28Z
grpcroutes.gateway.networking.k8s.io         2026-01-24T11:40:28Z
httproutes.gateway.networking.k8s.io         2026-01-24T11:40:28Z
referencegrants.gateway.networking.k8s.io    2026-01-24T11:40:28Z
tlsroutes.gateway.networking.k8s.io          2026-01-24T11:40:28Z
```

Проверяем на наличие GatewayClass:

```bash
kubectl get gatewayclass
```

Да видим, что есть:

```shell
NAME         CONTROLLER                     ACCEPTED   AGE
cilium       io.cilium/gateway-controller   True       189d
ck-gateway   io.cilium/gateway-controller   True       189d
```

<p class="callout warning">Если классы мы не увидили, смотрим еще раз включен ли gateway в k8s status и если что т оне так - идем в интернет и смотрим варианты решения проблемы</p>

Далее переходим к настройке ELMA365 с поддержкой Gateway API [тут](https://kb.randmgroup.ru/books/on-premises-helm/page/perexod-na-cilium-gateway "Переход на Cilium Gateway").

# Проблемы

# Сервисы k8s на worker узле

Иногда, особенно в LXC не стартуют сервисы. Потенциальное решение:

```bash
# Load ALL k8s snap profiles
apparmor_parser -r /var/lib/snapd/apparmor/profiles/snap.k8s.*

# Restart all k8s services
systemctl restart snap.k8s.kubelet
systemctl restart snap.k8s.k8sd
systemctl restart snap.k8s.containerd

# Check status again
k8s status
```

# missing profile snap.kubectl.kubectl

При вызове kubectl на мастер узлах получаем:

```shell
missing profile snap.kubectl.kubectl.
Please make sure that the snapd.apparmor service is enabled and started
```

Замечено для случае LXC.

Лечится так:

```
apparmor_parser -r /var/lib/snapd/apparmor/profiles/snap.kubectl.*
apparmor_status | grep -E "snap.kubectl" | head -20
# Долно показать что оно есть
```

После этого все должно заработать:

```bash
kubectl get nodes
```

Получаем, например:

```shell
NAME    STATUS   ROLES                  AGE    VERSION
hc1n1   Ready    control-plane,worker   189d   v1.33.11
hc1n2   Ready    control-plane,worker   188d   v1.33.11
hc1n3   Ready    control-plane,worker   136d   v1.33.11
hc1n4   Ready    worker                 186d   v1.33.11
```