K8S такой горячий! Разве не восхитительно провести 10 минут, играя с ним?

Java Kubernetes
K8S такой горячий! Разве не восхитительно провести 10 минут, играя с ним?

Адрес фактического центра электронной коммерции SpringBoot (40k+star):GitHub.com/macro-positive/…

Резюме

Реальный проект электронной коммерции My Mall использует контейнерное развертывание Docker, и многие друзья предложили развертывание Kubernetes. Я только недавно изучаю Kubernetes, и я готов его обновить! Сегодня давайте сначала изучим основные концепции и основы использования Kubernetes и надеемся помочь всем!

Введение в Кубернет

Kubernetes (сокращенно K8S, с 8 буквами между K и S) — это система с открытым исходным кодом для автоматического развертывания, масштабирования и управления контейнерными приложениями. Он объединяет контейнеры, из которых состоит приложение, в логические единицы для упрощения управления и поиска служб. Kubernetes создан на основе 15-летнего опыта работы Google в производственных средах и включает в себя лучшие идеи и практики сообщества.

Kubernetes имеет следующие особенности:

  • Обнаружение служб и балансировка нагрузки. Используйте незнакомые механизмы обнаружения служб без изменения приложения.
  • Оркестрация хранилища: автоматическое подключение выбранных систем хранения, включая локальное хранилище.
  • Управление секретами и конфигурацией. Развертывание обновлений секретов и конфигурации приложений без перестроения образов контейнеров и раскрытия секретов в конфигурации стека программного обеспечения.
  • Пакетное выполнение: помимо обслуживания, Kubernetes может управлять вашими пакетными рабочими нагрузками и рабочими нагрузками непрерывной интеграции, при необходимости заменяя отказавшие контейнеры.
  • Горизонтальное масштабирование: используйте простую команду, пользовательский интерфейс или автоматически масштабируйте приложение в зависимости от загрузки ЦП.
  • Автоматическое развертывание и откат: Kubernetes развертывает изменения в приложении или его конфигурации шаг за шагом, одновременно отслеживая работоспособность приложения, чтобы гарантировать, что вы не завершите работу всех экземпляров одновременно.
  • Автоупаковка: автоматическое размещение контейнеров в зависимости от требований к ресурсам и других ограничений без ущерба для доступности.
  • Самовосстановление: перезапустите неисправные контейнеры, замените и перепланируйте контейнеры, когда узлы умирают, убивайте контейнеры, которые не отвечают на определенные пользователем проверки работоспособности.

Введение в миникубе

Minikube – это облегченная реализация Kubernetes, которая создает виртуальные машины на вашем локальном компьютере и развертывает простой кластер всего с одним узлом. Minikube доступен для систем Linux, MacOS и Windows. Minikube CLI предоставляет различные операции для начальной загрузки кластера, включая запуск, остановку, просмотр состояния и удаление.

Основные концепции Kubernetes

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

Node

Кластер Kubernetes относится к Kubernetes, координирующему кластер высокодоступных компьютеров, и каждый компьютер работает как независимая единица, связанная друг с другом.

Кластер Kubernetes содержит два типа ресурсов:

  • Мастер: отвечает за управление всем кластером. Координирует все действия в кластере, такие как планирование приложений, поддержание желаемого состояния приложений, масштабирование приложений и развертывание новых обновлений.
  • Узел: используется для размещения запущенных приложений. Это может быть виртуальная машина или физическая машина, которая действует как рабочая машина в кластере Kubernetes.Каждый узел имеет Kubelet, который управляет узлом и является агентом для связи узла с мастером.У узла также есть инструменты для обработки контейнерные операции, например Docker или rkt.

Deployment

Развертывания отвечают за создание и обновление экземпляров приложения. После создания развертывания мастер Kubernetes планирует запуск экземпляров приложения на каждом узле в кластере. Если узел, на котором размещен экземпляр, выходит из строя или удаляется, контроллер развертывания заменяет экземпляр экземпляром на другом узле в кластере. Это обеспечивает механизм самовосстановления для устранения неполадок оборудования.

Развертывания можно создавать и управлять ими с помощью интерфейса командной строки Kubernetes, Kubectl. Kubectl использует Kubernetes API для взаимодействия с кластером.

Pod

Pod эквивалентен逻辑主机Концепция, отвечающая за размещение экземпляров приложений. Включите один или несколько контейнеров приложений (таких как Docker) и некоторые общие ресурсы для этих контейнеров (общее хранилище, сеть, рабочая информация и т. д.).

Service

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

Хотя у каждого модуля есть уникальный IP-адрес, эти IP-адреса не видны за пределами кластера без службы. Сервис позволяет вашему приложению получать трафик. Служба также может быть представлена ​​по типу маркировки в ServiceSpec. Тип выглядит следующим образом:

  • ClusterIP (по умолчанию): предоставление службы на внутреннем IP-адресе кластера. Этот тип делает службу доступной только внутри кластера.
  • NodePort: используйте NAT, чтобы предоставить сервису один и тот же порт для каждого выбранного узла в кластере. использовать<NodeIP>:<NodePort>Получите доступ к сервису из-за пределов кластера. Является надмножеством ClusterIP.
  • LoadBalancer: создает внешний балансировщик нагрузки (если поддерживается) в текущем облаке и назначает службе фиксированный внешний IP-адрес. является надмножеством NodePort.
  • ExternalName: Предоставьте Службе произвольное имя (указанное externalName в спецификации), вернув запись CNAME с этим именем. Прокси не используется.

Установка докера

Поскольку Kubernetes требует зависимостей для запуска容器运行时(программное обеспечение, отвечающее за запуск контейнера), наиболее распространенными средами выполнения контейнеров являются Docker, containerd и CRI-O. Выберите здесь Docker, сначала установите среду Docker на сервер Linux.

  • Установитьyum-utils:
yum install -y yum-utils device-mapper-persistent-data lvm2
  • Добавьте расположение репозитория docker для источника yum:
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  • Установите Докер:
yum install docker-ce
  • Запустите Докер:
systemctl start docker

Установка миникуба

  • Сначала нам нужно скачать бинарный установочный пакет Minikube и установить его:
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
  • Затем запустите Minikube с помощью следующей команды:
minikube start
  • если вы используетеrootПользователь не сможет запуститься и запросить следующую информацию, потому что Minikube не позволяет запускаться с привилегиями root и для повторного запуска необходимо создать учетную запись без полномочий root;
* minikube v1.16.0 on Centos 7.6.1810
* Automatically selected the docker driver
* The "docker" driver should not be used with root privileges.
* If you are running minikube within a VM, consider using --driver=none:
*   https://minikube.sigs.k8s.io/docs/reference/drivers/none/

X Exiting due to DRV_AS_ROOT: The "docker" driver should not be used with root privileges.
  • Здесь созданdockerгруппа пользователейmacroпользователя и переключиться на этого пользователя;
# 创建用户
useradd -u 1024 -g docker macro
# 设置用户密码
passwd macro
# 切换用户
su macro
  • использовать сноваminikube startКоманда запускает Minikube, и после успешного запуска будет отображаться следующая информация:
* To pull new external images, you may need to configure a proxy: https://minikube.sigs.k8s.io/docs/reference/networking/proxy/
* Preparing Kubernetes v1.20.0 on Docker 20.10.0 ...
  - Generating certificates and keys ...
  - Booting up control plane ...
  - Configuring RBAC rules ...
* Verifying Kubernetes components...
* Enabled addons: default-storageclass, storage-provisioner
* kubectl not found. If you need it, try: 'minikube kubectl -- get pods -A'
* Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default

Использование Кубернета

Создать кластер

Через Minikube мы можем создать одноузловой кластер K8S, а на этом узле развернут Мастер управления кластером и Нода, отвечающая за запуск приложения.

  • Проверьте номер версии Minikube:
minikube version
minikube version: v1.16.0
commit: 9f1e482427589ff8451c4723b6ba53bb9742fbb1
  • Проверьте номер версии kubectl, при первом использовании kubectl будет установлен напрямую:
minikube kubectl version
Client Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.0", GitCommit:"af46c47ce925f4c4ad5cc8d1fca46c7b77d13b38", GitTreeState:"clean", BuildDate:"2020-12-08T17:59:43Z", GoVersion:"go1.15.5", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.0", GitCommit:"af46c47ce925f4c4ad5cc8d1fca46c7b77d13b38", GitTreeState:"clean", BuildDate:"2020-12-08T17:51:19Z", GoVersion:"go1.15.5", Compiler:"gc", Platform:"linux/amd64"}
  • Если вы хотите использовать команду kubectl напрямую, вы можете скопировать ее в/binПерейти в каталог:
# 查找kubectl命令的位置
find / -name kubectl
# 找到之后复制到/bin目录下
cp /mydata/docker/volumes/minikube/_data/lib/minikube/binaries/v1.20.0/kubectl /bin/
# 直接使用kubectl命令
kubectl version
  • Просмотр сведений о кластере:
kubectl cluster-info
Kubernetes control plane is running at https://192.168.49.2:8443
KubeDNS is running at https://192.168.49.2:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
  • Глядя на все узлы в кластере, вы можете видеть, что Minikube создал простой кластер с одним узлом:
kubectl get nodes
NAME       STATUS   ROLES                  AGE   VERSION
minikube   Ready    control-plane,master   46m   v1.20.0

Развернуть приложение

После запуска кластера K8S на нем можно развернуть контейнерные приложения. Создавая объект Deployment, вы можете указать K8S, как создавать и обновлять экземпляры приложения.

  • Указываем образ приложения и создаем Deployment, вот приложение Nginx:
kubectl create deployment kubernetes-nginx --image=nginx:1.10
  • При создании Deployment K8S выполнит следующие операции:

    • Выберите подходящий узел для развертывания приложения;
    • Разверните приложение на Node;
    • Повторно разверните приложение, если оно было аварийно закрыто или удалено.
  • Посмотреть все развертывания:

kubectl get deployments
NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
kubernetes-nginx      1/1     1            1           21h
  • мы можем пройтиkubectl proxyКоманда создает агент, так что к API K8S можно получить прямой доступ через открытый интерфейс.Здесь вызывается интерфейс для запроса версии K8S;
[macro@linux-local root]$ kubectl proxy
Starting to serve on 127.0.0.1:8001
[root@linux-local ~]# curl http://localhost:8001/version
{
  "major": "1",
  "minor": "20",
  "gitVersion": "v1.20.0",
  "gitCommit": "af46c47ce925f4c4ad5cc8d1fca46c7b77d13b38",
  "gitTreeState": "clean",
  "buildDate": "2020-12-08T17:51:19Z",
  "goVersion": "go1.15.5",
  "compiler": "gc",
  "platform": "linux/amd64"
}

Просмотр приложений

Управляя модулем, на котором запущено приложение, вы можете просматривать журналы контейнера и выполнять команды внутри контейнера.

  • Проверьте статус всех модулей в K8s:
kubectl get pods
NAME                                   READY   STATUS             RESTARTS   AGE
kubernetes-nginx-78bcc44665-8fnnn      1/1     Running            1          21h
  • Просмотр подробного состояния Pod, включая IP-адрес, занятые порты, зеркалирование и другую информацию;
kubectl describe pods
Name:         kubernetes-nginx-78bcc44665-8fnnn
Namespace:    default
Priority:     0
Node:         minikube/192.168.49.2
Start Time:   Tue, 05 Jan 2021 13:57:46 +0800
Labels:       app=kubernetes-nginx
              pod-template-hash=78bcc44665
              version=v1
Annotations:  <none>
Status:       Running
IP:           172.17.0.7
IPs:
  IP:           172.17.0.7
Controlled By:  ReplicaSet/kubernetes-nginx-78bcc44665
Containers:
  nginx:
    Container ID:   docker://31eb1277e507ec4cf8a27b66a9f4f30fb919d17f4cd914c09eb4cfe8322504b2
    Image:          nginx:1.10
    Image ID:       docker-pullable://nginx@sha256:6202beb06ea61f44179e02ca965e8e13b961d12640101fca213efbfd145d7575
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Wed, 06 Jan 2021 09:22:40 +0800
    Last State:     Terminated
      Reason:       Completed
      Exit Code:    0
      Started:      Tue, 05 Jan 2021 14:24:55 +0800
      Finished:     Tue, 05 Jan 2021 17:32:48 +0800
    Ready:          True
    Restart Count:  1
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-dhr4b (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  default-token-dhr4b:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-dhr4b
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                 node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:          <none>
  • Установите имя пода в качестве переменной среды для последующего использования.$POD_NAMEЧтобы применить имя модуля:
export POD_NAME=kubernetes-nginx-78bcc44665-8fnnn
  • Просмотрите журнал, напечатанный модулем:
kubectl logs $POD_NAME
  • использоватьexecКоманды можно выполнять в контейнере пода, здесь мы используемenvКоманда для просмотра переменных окружения:
kubectl exec $POD_NAME -- env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=kubernetes-nginx-78bcc44665-8fnnn
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
KUBERNETES_SERVICE_HOST=10.96.0.1
KUBERNETES_SERVICE_PORT=443
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_PORT=443
NGINX_VERSION=1.10.3-1~jessie
HOME=/root
  • зайти внутрь контейнера и выполнитьbashкоманда, если вы хотите выйти из контейнера, вы можете использоватьexitЗаказ:
kubectl exec -ti $POD_NAME -- bash

Общедоступные приложения

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

  • Создайте службу для предоставления развертывания kubernetes-nginx:
kubectl expose deployment/kubernetes-nginx --type="NodePort" --port 80
  • Проверьте состояние всех сервисов в K8S:
kubectl get services
NAME               TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes         ClusterIP   10.96.0.1        <none>        443/TCP        5h16m
kubernetes-nginx   NodePort    10.105.177.114   <none>        80:31891/TCP   5s
  • Для просмотра подробной информации об услуге перейдите наNodePortСвойства могут быть открыты для внешних портов;
kubectl describe services/kubernetes-nginx
Name:                     kubernetes-nginx
Namespace:                default
Labels:                   app=kubernetes-nginx
Annotations:              <none>
Selector:                 app=kubernetes-nginx
Type:                     NodePort
IP Families:              <none>
IP:                       10.106.227.54
IPs:                      10.106.227.54
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  30158/TCP
Endpoints:                172.17.0.7:80
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>
  • Через команду CURL черезMinikube IP:NodePort IPВы можете получить доступ к службе Nginx, и в это время будет распечатана информация о домашней странице Nginx;
curl $(minikube ip):30158
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

Использование ярлыков

Добавляя метки к ресурсам, вы можете легко управлять ресурсами (такими как развертывание, модуль, служба и т. д.).

  • Просмотрите метку, содержащуюся в развертывании;
kubectl describe deployment
Name:                   kubernetes-nginx
Namespace:              default
CreationTimestamp:      Tue, 05 Jan 2021 13:57:46 +0800
Labels:                 app=kubernetes-nginx
Annotations:            deployment.kubernetes.io/revision: 1
Selector:               app=kubernetes-nginx
Replicas:               1 desired | 1 updated | 1 total | 1 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
  • Модуль запроса по метке:
kubectl get pods -l app=kubernetes-nginx
NAME                                READY   STATUS    RESTARTS   AGE
kubernetes-nginx-78bcc44665-8fnnn   1/1     Running   1          21h
  • Служба запросов по метке:
kubectl get services -l app=kubernetes-nginx
NAME               TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes-nginx   NodePort   10.106.227.54   <none>        80:30158/TCP   4m44s
  • Добавьте метку к поду:
kubectl label pod $POD_NAME version=v1
  • Чтобы просмотреть сведения о поде, вы можете просмотреть информацию о ярлыке:
kubectl describe pods $POD_NAME
Name:         kubernetes-nginx-78bcc44665-8fnnn
Namespace:    default
Priority:     0
Node:         minikube/192.168.49.2
Start Time:   Tue, 05 Jan 2021 13:57:46 +0800
Labels:       app=kubernetes-nginx
              pod-template-hash=78bcc44665
              version=v1
  • Модуль запроса по метке:
kubectl get pods -l version=v1
  • Удалить сервис по метке:
kubectl delete service -l app=kubernetes-nginx
NAME               TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes         ClusterIP   10.96.0.1       <none>        443/TCP        30h

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

Dashboard — это веб-интерфейс пользователя K8S. Вы можете использовать Dashboard для развертывания контейнерных приложений в кластерах K8S, отладки контейнерных приложений и управления ресурсами кластера.

  • Проверьте встроенный плагин Minikube, плагин Dashboard не включен по умолчанию:
minikube addons list
|-----------------------------|----------|--------------|
|         ADDON NAME          | PROFILE  |    STATUS    |
|-----------------------------|----------|--------------|
| dashboard                   | minikube | disabled     |
| default-storageclass        | minikube | enabled ✅   |
|-----------------------------|----------|--------------|
  • Включите плагин Dashboard:
minikube addons enable dashboard
  • Откройте панель управления через--urlПараметр не откроет страницу управления, а получить путь доступа можно в консоли:
minikube dashboard --url
* Verifying dashboard health ...
* Launching proxy ...
* Verifying proxy health ...
http://127.0.0.1:44469/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/
  • Для доступа к Dashboard извне необходимо настроить прокси с помощью kubectl,--addressУстановите адрес вашего сервера;
kubectl proxy --port=44469 --address='192.168.5.94' --accept-hosts='^.*' &
  • Доступ к серверу извне требует открытия порта брандмауэра;
# 切换到root用户
su -
# 开启端口
firewall-cmd --zone=public --add-port=44469/tcp --permanent
# 重启防火墙
firewall-cmd --reload
  • Доступ к панели управления можно получить по следующему адресу:
http://192.168.5.94:44469/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/
  • Просмотр информации о состоянии ресурсов в кластере K8S:

  • Создайте ресурсы K8S через скрипт yaml:

  • Просмотрите информацию о состоянии всех модулей в K8S и используйте кнопку «Дополнительно» для просмотра журналов контейнеров и выполнения внутренних команд.

Суммировать

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

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

Официальная документация:Это особенное. IO/это/документы/хорошая покупка...

Эта статьяGitHubGitHub.com/macro-positive/…Он был записан, приветствую всех на Star!