Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая

После создания системы необходимо немедленно следить за ее эксплуатацией и техническим обслуживанием, поэтому необходима система мониторинга.

Сейчас в Kubernetes одна за другой появляются измониторсистемы.,Например, сейчас очень популярноизPrometheusGrafanaElastic Stack (ELK) Kubernetes Metrics Serverи т. д.,Они предназначены не только для мониторсистемы,Также используется для отслеживания работоспособности кластера, производительности и использования ресурсов.

Не будем сегодня говорить о вышеперечисленных системах мониторинга. Я хочу поговорить о нативной системе мониторинга в проекте kubernetes — kubernetes. Панель мониторинга, которая предоставляет Web пользовательский интерфейс, который позволяет пользователям графически управлять и контролировать Kubernetes Контейнеризованные приложения в кластерах. Хотя большинство Kubernetes Задачи можно выполнять с помощью инструментов командной строки.kubectlЗаканчивать,но Dashboard Предлагает несколько ключевых преимуществ:

1. Визуальный менеджмент

  • Интуитивное управление:Dashboard Обеспечивает удобный интерфейс, который позволяет Kubernetes Операции создания, чтения, обновления и удаления ресурсов (CRUD) стали более интуитивно понятными и простыми для понимания.
  • Просмотр статуса в реальном времени:Показывает информацию о кластере и приложении.из Информация о статусе в режиме реального времени,включать Pods、Deployments、Services ждать.

2. Упрощение сложных операций

  • Графический интерфейс:Для тех, кто не знаком с командной строкой или Kubernetes Файл ресурсов (YAML) пользователя, Графический Интерфейс может упростить многие сложные операции.
  • Быстрый старт:для новичков,Dashboard обеспечил обучение Kubernetes Быстрый путь к концепции и управлению ресурсами.

3. Мониторинг ресурсов и устранение неполадок

  • Централизованный мониторинг:Dashboard Может использоваться для мониторинга использования ресурсов кластера, в том числе Процессор, ожидание использования памяти.
  • Просмотр журнала:Пользователи могут напрямую Dashboard Посмотреть в Pod Журналы, которые очень полезны для быстрого обнаружения проблем.

4. Безопасность и контроль доступа

  • Управление доступом на основе ролей:Dashboard поддерживать Kubernetes из RBAC(Управление доступом на основе ролей), позволяющих детально контролировать права доступа для разных пользователей.
  • многопользовательская среда:существоватьмногопользовательская В среде разные пользователи могут видеть разные представления и ресурсы в зависимости от своих разрешений.

5. Плагины и расширения

  • Масштабируемость:Dashboard Дизайн позволяет интегрировать дополнительные функции и плагины, предоставляя пользователям большую гибкость.

Сказав все это, как установить эту приборную панель? Можно сказать, что установка любого компонента в сетевых Kubernetes очень проста.

Установить панель управления

Эта панель управления по-прежнему наследует прекрасную традицию установки одной командой:

Язык кода:javascript
копировать
###Проведите пальцем влево и вправо
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml

пример
ubuntu@master:~$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
namespace/kubernetes-dashboard created
serviceaccount/kubernetes-dashboard created
service/kubernetes-dashboard created
secret/kubernetes-dashboard-certs created
secret/kubernetes-dashboard-csrf created
secret/kubernetes-dashboard-key-holder created
configmap/kubernetes-dashboard-settings created
role.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrole.rbac.authorization.k8s.io/kubernetes-dashboard created
rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
deployment.apps/kubernetes-dashboard created
service/dashboard-metrics-scraper created
deployment.apps/dashboard-metrics-scraper created
ubuntu@master:~$ 

Вы можете видеть, что после запуска Apply,создаст файл с именемkubernetes-dashboardизnamespace,Затем создайте соответствующийизservicesecretconfigmapи важноизdeploymentи другой сопутствующий контент。

Запуск происходит очень быстро. Менее чем за минуту POD уже находится в состоянии готовности. По умолчанию создаются сервисы типа ClusterIP:

Язык кода:javascript
копировать
###Проведите пальцем влево и вправо
ubuntu@master:~$ kubectl get pods,svc -n kubernetes-dashboard
NAME                                             READY   STATUS    RESTARTS   AGE
pod/dashboard-metrics-scraper-5cb4f4bb9c-x827t   1/1     Running   0          41s
pod/kubernetes-dashboard-6967859bff-hqcqr        1/1     Running   0          41s

NAME                                TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
service/kubernetes-dashboard        ClusterIP   10.43.236.108   <none>        443/TCP    41s
service/dashboard-metrics-scraper   ClusterIP   10.43.174.125   <none>        8000/TCP   41s
ubuntu@master:~$ 
Как войти в графический интерфейс?

Непосредственно авторизовать свой графический интерфейс.,нужноkubernetes-dashboardэтотserviceделать ремонт,ВоляtypeИзменить наNodePort,После завершения преобразования вы увидите, что его тип — NodePort.,и назначил внешнийPort443:30306/TCPсерединаиз30306:

Язык кода:javascript
копировать
###Проведите пальцем влево и вправо
kubectl patch svc kubernetes-dashboard --type='json' -p '[{"op":"replace","path":"/spec/type","value":"NodePort"}]' -n kubernetes-dashboard

пример
ubuntu@master:~$ kubectl patch svc kubernetes-dashboard --type='json' -p '[{"op":"replace","path":"/spec/type","value":"NodePort"}]' -n kubernetes-dashboard
service/kubernetes-dashboard patched
ubuntu@master:~$ 
ubuntu@master:~$ 
ubuntu@master:~$ kubectl get svc -n kubernetes-dashboard 
NAME                        TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)         AGE
dashboard-metrics-scraper   ClusterIP   10.43.174.125   <none>        8000/TCP        92s
kubernetes-dashboard        NodePort    10.43.236.108   <none>        443:30306/TCP   92s
ubuntu@master:~$ 

На данный момент для входа в графический интерфейс еще осталась последняя часть информации — учетные данные: информация для проверки входа. Есть два способа входа в Dashboard: токен и другой — kubeconfig. Условно говоря, токен относительно прост, поэтому токен используется непосредственно в эксперименте.

Создайте ServiceAccount и временный токен в качестве учетных данных для входа в графический интерфейс.

Язык кода:javascript
копировать
###Проведите пальцем влево и вправо
cat >k3s-dashboard.yaml<<EOF
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard
EOF

kubectl create -f k3s-dashboard.yaml

kubectl -n kubernetes-dashboard create token admin-user

пример:
ubuntu@master:~$ kubectl -n kubernetes-dashboard create token admin-user
eyJhbGciOiJSUzI1NiIsImtpZCI6InNLVzY0OHVvZXgyU0pfTXNpRG8zejR2ZUNXbVNrQlp0d0JZbm1lMFF5T1EifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiLCJrM3MiXSwiZXhwIjoxNzAyMTM2MzE4LCJpYXQiOjE3MDIxMzI3MTgsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsInNlcnZpY2VhY2NvdW50Ijp7Im5hbWUiOiJhZG1pbi11c2VyIiwidWlkIjoiMTBmMmQzNTEtMzdmMC00ZTRiLWEwYWMtMjhmNzJlZWVkN2VmIn19LCJuYmYiOjE3MDIxMzI3MTgsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTphZG1pbi11c2VyIn0.u_Iz8nNF7_HmaTZR2BbjXOo9es6sfdJnmCT6znXfy2tHek-wJyfUnHvUBbGF1efZnEBAk6Z518DWDU88E2Us9Okq7oX4AcVe_Rgk_b78Z2KxgzOMhXjFf4mhY0H9DymNA_Qow_3E4ylU4AM0oumHBHTC6B7kUhnQxSdCVAR5NpKoaLdj3eEY0Bd7ckDr9zJ6sRZYsAJfCZffBug0XSXcxIp1m3QATuW4D18FZo4mMIRfwuive2B48y3QyTDyPkCG6VKw-SYYD_Yj-Oyl2bdvAPCKvjKEfv87Ke_f-hIpgekpevbSokk7xw2hhqrFSQTKAkxslDMCg96JHLaPKFSThg
ubuntu@master:~$ 

Все готово, начните вход в графический интерфейс, IP — это IP-адрес узла (включая главный, рабочий), Порт — это внешний порт в SVC, а Credential — это токен, напечатанный выше:

Выберите пространство имен как Все пространства имен:

Статистика развертывания:

Из информации об узлах в кластере видно, что мастер четко указан в списке, поэтому было подчеркнуто, что мастер является рабочим узлом с ролью контроллера:

На этом этапе панель управления Kubernetes готова.

Улучшения входа в систему

Почему здесь этот? Причина в том, что при входе в панель управления вам необходимо временно получить токен, и вам придется каждый раз заполнять длинную строку, что отнимает много времени, трудоемко и хлопотно. Вот я и подумал, как это сделать. Я могу войти в графический интерфейс панели управления в любое время, используя имя пользователя и пароль?

Так что это дикий путь, который я выбрал. Это не официальная рекомендация kubernetes (в нем нет никаких рекомендаций). Его можно использовать только экспериментально для расширения моих идей.

Мое решение — использовать Nginx в качестве обратного прокси-сервера, установить имя пользователя и пароль для входа в Nginx, а затем использовать обратный прокси-сервер для входа в панель управления kubernetes. Конкретный метод заключается в следующем:

Сначала сделайте токен информационной панели постоянным. На предыдущих шагах у токена был срок действия. Если срок его действия истечет, вам придется получить новый токен. Очевидно, что это невозможно, поэтому вам необходимо сделать его постоянным.

Язык кода:javascript
копировать
###Проведите пальцем влево и вправо

##yaml-файл
cat >k3s-dashboard-secret.yaml<<EOF
apiVersion: v1
kind: Secret
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
  annotations:
    kubernetes.io/service-account.name: "admin-user"   
type: kubernetes.io/service-account-token  
EOF

### apply yaml
kubectl apply -f k3s-dashboard-secret.yaml 

###Получите постоянный изтокен
kubectl get secret admin-user -n kubernetes-dashboard -o jsonpath={".data.token"} | base64 -d;echo

пример:
ubuntu@master:~$ kubectl get secret admin-user -n kubernetes-dashboard -o jsonpath={".data.token"} | base64 -d;echo
eyJhbGciOiJSUzI1NiIsImtpZCI6InNLVzY0OHVvZXgyU0pfTXNpRG8zejR2ZUNXbVNrQlp0d0JZbm1lMFF5T1EifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJhMWVmNTBiNi0zNjYyLTRhN2UtYTBlNi0xZWNkM2E0NWI1NDIiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZXJuZXRlcy1kYXNoYm9hcmQ6YWRtaW4tdXNlciJ9.BI08SEMjg6W-234DIg_sTGVU4Z9zM9FcO0qhSfdumMDtT7sw6ddhYc55FUaXNdp10vCRktFSLbGAJ4UR3z1TPXKikZ4T1pS1cVlviTxX4nJHw9FdiSvsZLmhSB9hDMiPtrL6Mu_C8i6z3VqTgjEGgwv01ZUpGhYPJPmPbzurUNheJxj6Zf5LZcRyfcbwGPhZSmgx7aTK2Z-HNjXGF5tofBoCcN-XYUE9J-mIXZB77m3vz3kA8ar-FTRDo1k8RAc6wdgIhSzGz8fjVXA4SLezHzlo9o6Hj8RPfmAey2Bfzuxz76pXQOP1rah6oB7LjZeGXyqMiKgkKaI2xxMT0uc7bQ
ubuntu@master:~$  

Далее идет операционная часть ngnix.

Сначала нужно пройтиhtpasswdпользователюadminСоздать файл паролей

Язык кода:javascript
копировать
###Проведите пальцем влево и вправо
#потому это наш образец На виртуальной машине не установлен Apache, поэтому его необходимо сначала установить.
sudo apt install -y apache2-utils

# Имя пользователя admin, пароль admin, используется для Nginx, имя файла паролей — nginx_htpasswd.
htpasswd -cBb nginx_htpasswd admin admin

Создайте файл, содержащийизфайл паролейизsecret:

Язык кода:javascript
копировать
###Проведите пальцем влево и вправо
kubectl create ns nginx

kubectl create secret -n nginx generic basic-auth --from-file=nginx_htpasswd

Следующий контент очень важен,Это определениеnginxобратный проксиизconfigmap,其серединаnginx.confнемедленноиз几个参数需要修Изменить на自己实验серединаизценить:

  1. proxy_pass: IP и порт — это IP и порт, которые ранее использовались авторизацией панели мониторинга.,Конечно, вы также можете использоватьkubernetes-dashboardэтотServiceизCLUSTER-IPи внутренний порт по умолчаниюиз443
  2. proxy_set_headerиз Составproxy_set_header Authorization "Bearer <постоянныйtoken>
  3. auth_basic_user_fileфиксированоиз/etc/nginx/.htpasswdВот и все。
Язык кода:javascript
копировать
###Проведите пальцем влево и вправо
cat >nginx-configmap.yaml<<EOF
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-config
  namespace: nginx
data:
  nginx.conf: |
    events {}
    http {
        server {
            listen 80;
            location / {
                proxy_pass https://192.168.100.106:30306;
                proxy_set_header Host \$http_host;
                proxy_set_header X-Real-IP \$remote_addr;
                proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto \$scheme;
                proxy_set_header Authorization "Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6InNLVzY0OHVvZXgyU0pfTXNpRG8zejR2ZUNXbVNrQlp0d0JZbm1lMFF5T1EifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJhMWVmNTBiNi0zNjYyLTRhN2UtYTBlNi0xZWNkM2E0NWI1NDIiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZXJuZXRlcy1kYXNoYm9hcmQ6YWRtaW4tdXNlciJ9.BI08SEMjg6W-234DIg_sTGVU4Z9zM9FcO0qhSfdumMDtT7sw6ddhYc55FUaXNdp10vCRktFSLbGAJ4UR3z1TPXKikZ4T1pS1cVlviTxX4nJHw9FdiSvsZLmhSB9hDMiPtrL6Mu_C8i6z3VqTgjEGgwv01ZUpGhYPJPmPbzurUNheJxj6Zf5LZcRyfcbwGPhZSmgx7aTK2Z-HNjXGF5tofBoCcN-XYUE9J-mIXZB77m3vz3kA8ar-FTRDo1k8RAc6wdgIhSzGz8fjVXA4SLezHzlo9o6Hj8RPfmAey2Bfzuxz76pXQOP1rah6oB7LjZeGXyqMiKgkKaI2xxMT0uc7bQ";

                auth_basic "Restricted Access";
                auth_basic_user_file /etc/nginx/.htpasswd;
            }
        }
    }
EOF

kubectl apply -f nginx-configmap.yaml 

kubectl get configmaps -n nginx 

Следующий шаг — создание NgnixизPod через контроллер развертывания.,其серединаvolumeMountsВнизиз Два содержания очень важны。Один из них — файл конфигурации,Один из них — Авторизоватьсяngnixиз имени пользователя и пароля.,Конкретное развертывание yaml выглядит следующим образом.,После подготовки подайте заявку напрямую и дождитесь готовности:

Язык кода:javascript
копировать
###Проведите пальцем влево и вправо
cat >nginx-deployment.yaml<<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-proxy
  namespace: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-proxy
  template:
    metadata:
      labels:
        app: nginx-proxy
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
        volumeMounts:
        - name: config-volume
          mountPath: /etc/nginx/nginx.conf
          subPath: nginx.conf
        - name: auth-volume
          mountPath: /etc/nginx/.htpasswd
          subPath: nginx_htpasswd
      volumes:
      - name: config-volume
        configMap:
          name: nginx-config
      - name: auth-volume
        secret:
          secretName: basic-auth
EOF

kubectl apply -f nginx-deployment.yaml 

kubectl get pod -n nginx 

в то же время,нужно датьnginxСоздайтеService,并ВоляService暴漏给внешний可以Авторизоваться,в настоящий моментиз做法是ВоляserviceизtypeИзменить наNodePort,同时也Воля暴漏извнешнийPortЗафиксированный30000,Предпосылка30000не другимизserviceзанимать:

Язык кода:javascript
копировать
###Проведите пальцем влево и вправо
cat >nginx-service.yaml<<EOF
apiVersion: v1
kind: Service
metadata:
  name: nginx-proxy-service
  namespace: nginx
spec:
  selector:
    app: nginx-proxy
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
EOF

kubectl apply -f nginx-service.yaml 

kubectl get svc -n nginx

kubectl patch svc -n nginx nginx-proxy-service --type='json' -p='[{"op": "replace", "path": "/spec/type", "value": "NodePort"}, {"op": "replace", "path": "/spec/ports/0/nodePort", "value": 30000}]'

После прохождения вышеуказанных шагов вы можете использовать IP определенного узла и Nginx. Сервисный внешний порт 30000Авторизоваться,Вам будет предложено ввести имя пользователя и пароль,Следует отметить, что данный эксперимент требует использования протокола httpиз Авторизоватьсяnginx,Прямо сейчасhttp://<node ip>:30000

После входа в систему с правильным именем пользователя и паролем вы автоматически перейдете на панель управления Kubernetes:

Выше описан процесс установки панели управления и использования прокси-сервера nginx. Если у вас есть лучшее решение или идеи, оставьте сообщение в чате!

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose