Oracle Cloud Native Environment (OCNE) — интегрированный пакет для управления облачными приложениями. Это тщательно подобранный набор проектов с открытым исходным кодом, основанных на открытых стандартах и спецификациях. Актуальная версия на момент публикации — 1.8. Официальная документация: https://docs.oracle.com/en/operating-systems/olcne/index.html
OCNE состоит из нескольких компонентов. Для управления окружением используется Platform CLI (утилита olcnectl). Platform API Server взаимодействует с Platform Agent на каждом узле, а агенты отвечают за выполнение операций. И нужно это всё для управления «модулями», работающими на конечных узлах.
Модули поддерживаются самые разные и в текущей версии их 16. Но центральным компонентом, ради чего это всё и создано, является модуль Kubernetes. Далее будет рассмотрен вариант установки минимально рабочей конфигурации кластера Kubernetes из трёх узлов — одного узла управления и двух рабочих. Данная конфигурация не является отказоустойчивой, но ниже будут приведены необходимые команды для её создания, однако для этого потребуется минимум пять узлов, а лучше шесть.
Добавлено 14.09.2024. С выходом OCNE 2.0 пакет oracle-olcne-release-el9 был переименован в oracle-ocne-release-el9, репозиторий называется ol9_olcne, а утилита olcnectl заменена на ocne и не имеет обратной совместимости.
Подготовка
Предварительно были подготовлены ВМ control, worker1 и worker2 с Oracle Linux Server 9.3 в варианте «Minimal Install» под управлением BHyVe. Роли распределились следующим образом:
| ВМ | Operator¹ | Control plane² | Worker³ |
|---|---|---|---|
| control | ✔️ | ✔️ | |
| worker1 | ✔️ | ||
| worker2 | ✔️ |
olcnectl. Можно совместить с узлом Kubernetes, но рекомендуется выносить на отдельную машину.² Слой управления Kubernetes — предоставляет Kubernetes API, отвечает за основные операции кластера и обработку событий. Для отказоустойчивости необходимо минимум три узла, рекомендуется пять, но в любом случае должно быть нечётное число.
³ Рабочие узлы Kubernetes — непосредственно выполняют полезную нагрузку. Требуется два узла для обеспечения отказоустойчивости. Важно отметить, что хоть Kubernetes допускает совмещение ролей Control plane и Worker на одном узле и утилита
olcnectl корректно принимает такую конфигурацию в параметрах, но в текущей версии попытка так сделать закончится ошибкой.Подразумевается, что в сети есть работающий сервер DNS для разрешения имён ВМ в IP-адреса. В противном случае необходимо корректно заполнить файл /etc/hosts на всех узлах:
192.0.2.11 control control.example.com 192.0.2.12 worker1 worker1.example.com 192.0.2.13 worker2 worker2.example.com
Для отказоустойчивого кластера для корректной работы Kubernetes API требуется балансировщик нагрузки. Возможно использование как внешнего балансировщика, так и создание внутреннего посредством виртуального IP-адреса (VIP). В случае единственного узла для слоя управления балансировка не требуется.
Для взаимодействия между собой узлы кластера используют сертификаты X.509. Поддерживается работа с HashiCorp Vault и через центр сертификации. В статье будет рассмотрен пример с самоподписными сертификатами (Private CA).
Для работы Kubernetes необходимо, чтобы на всех узлах кластера было синхронизировано время. Сделать это можно с помощью NTP и демона chronyd:
sudo dnf install --yes chrony sudo systemctl enable --now chronyd.service
Убедись, что у вас выключен файл подкачки (поведение по умолчанию для Oracle Linux 9) — это требование Kubernetes.
С узла оператора должен быть доступ на другие узлы по SSH с аутентификацией по ключу, а пользователю должно быть разрешено использование sudo без запроса пароля, либо использоваться пользователь root. В общем случае это можно сделать выполнив следующие команды:
ssh-keygen ssh-copy-id control ssh-copy-id worker1 ssh-copy-id worker2
sudo echo -e "<username>\\tALL=(ALL)\\tNOPASSWD: ALL" >/etc/sudoers.d/olcne
Чтобы не столкнуться с ошибкой «context deadline exceeded» во время установки, настоятельно рекомендую заранее загрузить необходимые образы на все узлы:
sudo dnf install --yes podman sudo podman pull \ container-registry.oracle.com/olcne/coredns:v1.10.1-1 \ container-registry.oracle.com/olcne/etcd:3.5.10 \ container-registry.oracle.com/olcne/flannel:v0.22.3-2 \ container-registry.oracle.com/olcne/kube-apiserver:v1.28.8 \ container-registry.oracle.com/olcne/kube-controller-manager:v1.28.8 \ container-registry.oracle.com/olcne/kube-proxy:v1.28.8 \ container-registry.oracle.com/olcne/kube-scheduler:v1.28.8 \ container-registry.oracle.com/olcne/speaker:v0.13.10-1
sudo dnf install --yes podman sudo podman pull \ container-registry.oracle.com/olcne/controller:v0.13.10-1 \ container-registry.oracle.com/olcne/coredns:v1.10.1-1 \ container-registry.oracle.com/olcne/flannel:v0.22.3-2 \ container-registry.oracle.com/olcne/kube-proxy:v1.28.8 \ container-registry.oracle.com/olcne/kubernetes-dashboard:v2.7.0-2 \ container-registry.oracle.com/olcne/module-operator:v1.8.0 \ container-registry.oracle.com/olcne/speaker:v0.13.10-1
При настройке отказоустойчивого кластера с внутренним балансировщиком добавьте в список для Control plane образ container-registry.oracle.com/olcne/nginx:1.17.7-1. Актуальный список версий находится в файле /etc/olcne/modules/kubernetes/1.0.0/kubernetes.yaml, который будет доступен после установки olcne-api-server.
Установка
Установку проводим с ВМ оператора (в нашем случае это control). Установим утилиту olcnectl:
sudo dnf install --yes oracle-olcne-release-el9 sudo dnf install --enablerepo ol9_olcne18 --yes olcnectl
Подготовим конфигурационные файлы для модулей Kubernetes и MetalLB — балансировщика сетевой нагрузки для предоставления внешнего доступа к сервисам внутри кластера посредством выделения VIP:
environments:
- environment-name: myenvironment
globals:
api-server: control.example.com:8091
# api-server: operator.example.com:8091
log-level: info
ssh-login-name: <username>
modules:
- module: kubernetes
name: cluster
args:
compact: true
container-registry: container-registry.oracle.com/olcne
control-plane-nodes:
- control.example.com::8090
# - control1.example.com:8090
# - control2.example.com:8090
# - control3.example.com:8090
# load-balancer: lb.example.com:6443
restrict-service-externalip: false
# virtual-ip: 192.0.2.10
worker-nodes:
- worker1.k8s.onlyfriends.local:8090
- worker2.k8s.onlyfriends.local:8090
- module: metallb
name: cluster-lb
args:
metallb-config: metallb-config.yaml
metallb-kubernetes-module: cluster
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: default
namespace: metallb
spec:
addresses:
- 192.0.2.200-192.0.2.254
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: default
namespace: metallb
spec:
ipAddressPools:
- default
Данная конфигурация предполагает создание окружения myenvironment с распределением ролей согласно ранее обозначенного плана. IP-адреса из пула для MetalLB должны быть свободны, при этом назначать их заранее на узлы не требуется. Если необходим отказоустойчивый кластер, то в control-plane-nodes указываем минимум три узла и дополнительно задаём load-balancer в случае внешнего балансировщика или virtual-ip для создания внутреннего. При работе под root указывать ssh-login-name не обязательно. Выполним развёртывание кластера:
olcnectl provision \ --config-file config-file.yaml
В ходе выполнения команды сгенерируются необходимые сертификаты, после чего будет запрошено подтверждение на внесение изменений, а именно:
- применение ролей control-plane и api-server на узел control;
- применение роли worker на узлы worker1 и worker2.
Все вносимые изменения будут подробно отображены по каждому узлу:
? Apply control-plane, api-server configuration on control.example.com:
* Install oracle-olcne-release
* Enable olcne18 repo
* Install API Server
Add firewall port 8091/tcp
* Configure firewall rule:
Add interface cni0 to trusted zone
Add ports: 8090/tcp 10250/tcp 10255/tcp 9100/tcp 8472/udp 6443/tcp
* Disable swap
* Load br_netfilter module
* Load Bridge Tunable Parameters:
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
* Set SELinux to permissive
* Install and enable olcne-agent
Proceed? yes/no(default) yes
? Apply worker configuration on worker1.example.com:
* Install oracle-olcne-release
* Enable olcne18 repo
* Configure firewall rule:
Add interface cni0 to trusted zone
Add ports: 8090/tcp 10250/tcp 10255/tcp 9100/tcp 8472/udp
* Disable swap
* Load br_netfilter module
* Load Bridge Tunable Parameters:
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
* Set SELinux to permissive
* Install and enable olcne-agent
Proceed? yes/no(default) yes
? Apply worker configuration on worker2.example.com:
* Install oracle-olcne-release
* Enable olcne18 repo
* Configure firewall rule:
Add interface cni0 to trusted zone
Add ports: 8090/tcp 10250/tcp 10255/tcp 9100/tcp 8472/udp
* Disable swap
* Load br_netfilter module
* Load Bridge Tunable Parameters:
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
* Set SELinux to permissive
* Install and enable olcne-agent
Proceed? yes/no(default) yes
Соглашаемся, ждём несколько минут и если не было ошибок (на ошибки «Could not parse version «»: Invalid Semantic Version» внимания не обращаем), то кластер готов к работе. При необходимости изменить состав узлов внесите изменения в config-file.yaml и выполните команду повторно.
Использование
Для начала настроим Kubernetes CLI:
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config export KUBECONFIG=$HOME/.kube/config echo 'export KUBECONFIG=$HOME/.kube/config' >> $HOME/.bashrc
И убедимся, что всё работает:
kubectl get nodes --all-namespaces #NAME STATUS ROLES AGE VERSION #control.example.com Ready control-plane 5m v1.28.3+3.el9 #worker1.example.com Ready <none> 5m v1.28.3+3.el9 #worker2.example.com Ready <none> 5m v1.28.3+3.el9 kubectl get deployments.apps --all-namespaces #NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE #kube-system coredns 2/2 2 2 5m #kubernetes-dashboard kubernetes-dashboard 1/1 1 1 5m #metallb metallb-crds-controller 1/1 1 1 5m #ocne-modules verrazzano-module-operator 1/1 1 1 5m
Далее получим доступ к Kubernetes Dashboard. Наиболее простым вариантом будет назначение внешнего IP-адреса с помощью MetalLB, а для этого необходимо изменить тип сервиса с ClusterIP на LoadBalancer. Также нам потребуется токен для аутентификации.
kubectl patch service --namespace kubernetes-dashboard kubernetes-dashboard --patch='{"spec":{"type":"LoadBalancer"}}'
kubectl get services --namespace kubernetes-dashboard
#NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
#kubernetes-dashboard LoadBalancer 10.100.34.108 192.0.2.200 443:31329/TCP 5m
kubectl create token --namespace kubernetes-dashboard admin-user
Смотрим какой ExternalIP был присвоен и открываем его в браузере.
Для примера развернём nginx. Для этого в правом верхнем углу находим ➕ Create new resource, копируем туда данный набор манифестов и нажимаем Upload:
apiVersion: v1
kind: Namespace
metadata:
name: hello-world
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: hello-world
labels:
app: nginx
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: container-registry.oracle.com/olcne/nginx:1.17.7
name: nginx
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
namespace: hello-world
spec:
ports:
- name: http
port: 80
targetPort: 80
selector:
app: nginx
type: LoadBalancer
Дожидаемся завершения развёртывания, переходим в раздел Services и в колонке External Endpoints будет ссылка на наш «Hello, world!». На этом всё, плодотворного изучения.
Обновление
Раздел добавлен 18.05.2024.
Процедура обновления в рамках одной версии OCNE или при переходе с одной версии на другою одинакова, за исключением необходимости отключения и подключения репозиториев — при теоретическом выходе версии 1.9 в будущем это может быть выполнено следующим образом:
sudo dnf update --yes oracle-olcne-release-el9 sudo dnf config-manager --disable ol9_olcne18 sudo dnf config-manager --enable ol9_olcne19
В остальном процедура сводится к трём шагам:
- Обновление узла оператора.
- Обновление окружения.
- Обновление модулей.
Для обновления узла оператора достаточно выполнить следующие команды:
sudo systemctl stop olcne-api-server.service sudo dnf update --yes olcnectl olcne-api-server olcne-utils sudo systemctl start olcne-api-server.service
После обновления узла оператора выполним обновление окружения, что фактически означает обновление агентов:
olcnectl environment update olcne \ --api-server control.example.com:8091 \ --environment-name myenvironment \ --update-config
Обратите внимание на параметр --update-config — при его указании нам больше не потребуется использовать --api-server для работы с окружением. Обновим модуль Kubernetes (не забывайте про резервное копирование):
olcnectl module update \ --environment-name myenvironment \ --name cluster \ --kube-version 1.28.8 \ --log-level info
Указание --kube-version является обязательным. Актуальную версию можно узнать в Release Notes или в упомянутом выше файле /etc/olcne/modules/kubernetes/1.0.0/kubernetes.yaml. После обновления основного модуля Kubernetes можно обновить другие установленные модули, например MetalLB:
olcnectl module update \ --environment-name myenvironment \ --name cluster-lb \ --metallb-version 0.13.10 \ --log-level info





