Рубрики
Uncategorized

K8S Твердый путь на Centos

Информационный технический писатель Haider Рад Кубернаны Твердый способ этого учебника … Теги с DevOps, Kubernetes, Docker, Linux.

Информация

Технический писатель Haider Raed.

Кубернаны трудно

Этот учебник проходит вас через настройку Kubernetes трудно. Это руководство не для людей, ищущих полностью автоматизированную команду, чтобы вызвать кластер Kubernetes. Если это вы, тогда проверьте Google Kubernetes Engine или Начало работы Гиды Отказ репо K8S-The-Hard-Way

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

Результаты этого руководства не должны рассматриваться как готовые к производству и могут получить ограниченную поддержку от сообщества, но не позволяйте этой остановке вас от обучения!

Целевая аудитория

Целевая аудитория этого урока — это кто-то планирует поддержать производство кластера Kubernetes и хочет понять, как все вписывается вместе.

Кластерные детали

Кубернеты Трудный способ направляет вас через загрузку высокодоступных кластеров Kubernetes с концептуальным шифрованием между компонентами и аутентификацией RBAC.

Лаборатория

Предварительные условия

  • Его нужно 6 CentOS VM
    • Совместимый хост Linux. Проект Kubernetes предоставляет общие инструкции
    • 2 ГБ или больше оперативной памяти на машину (все меньше оставит маленькую комнату для ваших приложений).
    • 2 процессора или больше.
    • Полное сетевое подключение между всеми машинами в кластере (публичная или частная сеть в порядке).
    • Уникальное имя хоста, MAC-адрес и Product_UUID для каждого узла. Смотрите здесь для более подробной информации.
    • Поменять отключение. Вы должны отключить своп, чтобы kubelet работать правильно> Вы можете увидеть лабораторную диграм в вашем случае вы только для того, чтобы изменить IP-адрес для вашего механизма редактировать имя хоста и сопоставление на IP-адреса машин, затем добавьте в/etc/hosts

Редактирование хоста файла

Примечание. IP изменится на ваш IP-диапазон

# cat <> /etc/hosts 
192.168.0.1 kubecon01.k8s.com
192.168.0.2 kubecon02.k8s.com
192.168.0.5 worknode01.k8s.com
192.168.0.6 worknode02.k8s.com
192.168.0.3 api_loadbalancer.k8s.com
EOF

Установить какой-нибудь пакет в машине поможет вам

# yum install bash-completion vim telnet -y 

Убедитесь, что сервис брандмарейда останавливается и отключен

# systemctl disable --now firewalld

Убедитесь, что Selinux отключен

# setenforce 0
# sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

Установка клиентских инструментов

В этой лаборатории вы установите утилиты командной строки, необходимые для завершения этого руководства: CFSSL , CFSSLJSON и kubectl Отказ В этих лиссиях будет работать на дистанционном кубкте

Установите CFSSL

CFSSL и CFSSLJSON Утилиты командной строки будут использоваться для обеспечения A Инфраструктура PKI и генерировать сертификаты TLS.

Скачать и установить CFSSL и CFSSLJSON :

# wget https://storage.googleapis.com/kubernetes-the-hard-way/cfssl/1.4.1/linux/cfssl
# wget https://storage.googleapis.com/kubernetes-the-hard-way/cfssl/1.4.1/linux/cfssljson
# chmod +x cfssl cfssljson
# sudo mv cfssl cfssljson /usr/local/bin/

Проверка

Проверить CFSSL и CFSSLJSON Версия 1.4.1 или выше установлена:

cfssl version

вывод

Version: 1.4.1
Runtime: go1.12.12
cfssljson --version
Version: 1.4.1
Runtime: go1.12.12

Установите Kubectl

kubectl Утилита командной строки используется для взаимодействия с сервером API Kubernetes. Скачать и установить kubectl Из официальных двоичных файлов релиза:

# wget https://storage.googleapis.com/kubernetes-release/release/v1.21.0/bin/linux/amd64/kubectl
# chmod +x kubectl
# sudo mv kubectl /usr/local/bin/

Проверка

Проверить kubectl Версия 1.21.0 или выше установлена:

# kubectl version --client

вывод

Client Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.0", GitCommit:"cb303e613a121a29364f75cc67d3d580833a7479", GitTreeState:"clean", BuildDate:"2021-04-08T16:31:21Z", GoVersion:"go1.16.1", Compiler:"gc", Platform:"linux/amd64"}

В этой лаборатории вы предоставите Инфраструктура PKI Использование PKI Toolkit CloudFlare, CFSSL Затем используйте его для загрузки авторитета сертификата и генерируйте сертификаты TLS для следующих компонентов: ETCD, Kube-Apisiserver, Kube-Controller-Manager, Kube-Scheduler, Kubelet и Kube-Proxy.

Почему нам нужен сертификаты CA и TLS?

Примечание: В этом разделе мы будем обеспечивать власть сертификата (CA). Затем мы будем использовать CA для создания нескольких сертификатов

Сертификаты.

используются для подтверждения (аутентификации) идентичности. Они используются для доказательства того, что вы, кто вы говорите, что вы.

Центр сертификации

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

Какие сертификаты нам нужны?

  • Клиентские сертификаты
    • Эти сертификаты предоставляют аутентификацию клиента для различных пользователей: admin, KubeController-Manager, Kube-Proxy, Kube-планировщик и клиент Kublet на каждом уземе работника.
  • Сертификат сервера API Kubernetes
    • Это сертификат TLS для API Kubernetes.
  • Пара ключа обслуживания учетной записи
    • Kubernetes использует сертификат, чтобы подписать токены учетной записи службы, поэтому нам нужно предоставить сертификат для этой цели. ## Предоставление власти сертификата Для создания сертификатов, необходимых Kubernetes, вы должны сначала обеспечить власть сертификата. Этот урок проведет вас через процесс предоставления нового органа сертификата для ваших кластеров Kubernetes. После завершения этого урока у вас должен быть авторитет сертификата, который состоит из двух файлов: ca-key.pem и ca.pem позволяет создавать dir, который содержит все сертификаты ## генерирующие клиентские сертификаты Теперь, когда вы оказали администратор сертификата для кластера Kubernetes, вы готовы начать генерировать сертификаты. Первый набор сертификатов вам понадобится генерировать состоит из клиентских сертификатов, используемых различными компонентами Kubernetes. В этом уроке мы будем генерировать следующие клиентские сертификаты: admin, kubelet (один для каждого узера работника), Kube-Controller-Manager, Kube-Proxy и Kube-планировщик. После завершения этого урока у вас будет файлы клиентских сертификатов, которые вам понадобится позже, чтобы настроить кластер. Вот команды, используемые в демо. Командные блоки, окруженные фигурными бремами, могут быть введены как одна команда: В этой лаборатории вы предоставите инфраструктуру PKI, используя PKI CloudFlare PKI Toolkit, CFSSL, затем используйте его для загрузки полномочий сертификата и генерируют сертификаты TLS для следующих компонентов: EtCD, Kube-Apiserver, Kube-Controller-Manager, Kube-Scheduler, Кублет и Kube-Proxy. ## Центр сертификации В этом разделе вы предоставите авторитет сертификата, который можно использовать для создания дополнительных сертификатов TLS. Создайте файл конфигурации CA, сертификата и закрытый ключ:
# mkdir k8s
# cd k8s 

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

{

cat > ca-config.json < ca-csr.json <

Результаты:

ca-key.pem
ca.pem

Клиентские и серверные сертификаты

В этом разделе вы будете генерировать клиентские и серверные сертификаты для каждого компонента Kubernetes и клиентский сертификат для Kubernetes Админ Пользователь.

Сертификат клиента администратора

Генерировать Админ Клиентский сертификат и закрытый ключ:

{

cat > admin-csr.json <

Результаты:

admin-key.pem
admin.pem

Клиентские сертификаты Kublet

Kubernetes использует Режим авторизации специального назначения называется Unode autorizer, который конкретно разрешает запросы API, сделанные Кубелец Отказ Чтобы уполномочить авторизатор узла, Kubelets должен использовать учетные данные, которые идентифицируют их как на Система: узлы Группа, с именем пользователя Система: Узел: Отказ В этом разделе вы создадите сертификат для каждого узера рабочего узла Kubernetes, который соответствует требованиям авторитета узла.

Клиентские сертификаты Kublet. Обязательно введите свои фактические значения автоматов для всех четырех переменных в верхней части:

# WORKER0_HOST=worknode01.k8s.com
# WORKER0_IP=192.168.0.5
# WORKER1_HOST=worknode02.k8s.com
# WORKER1_IP=192.168.0.6
for instance in worknode01.k8s.com worknode02.k8s.com; do
cat > ${instance}-csr.json <

Результаты:

worknode01.k8s.com-key.pem
worknode01.k8s.com.pem
worknode02.k8s.com-key.pem
worknode02.k8s.com.pem

Клиентский сертификат Controller Manager

Генерировать Kube-Controller-Manager Клиентский сертификат и закрытый ключ:

{

cat > kube-controller-manager-csr.json <

Результаты:

kube-controller-manager-key.pem
kube-controller-manager.pem

Клиентский сертификат Kube Proxy

Генерировать Kube-Proxy Клиентский сертификат и закрытый ключ:

{

cat > kube-proxy-csr.json <

Результаты:

kube-proxy-key.pem
kube-proxy.pem

Сертификат клиента планировщика

Генерировать Kube-планировщик Клиентский сертификат и закрытый ключ:

{

cat > kube-scheduler-csr.json <

Результаты:

kube-scheduler-key.pem
kube-scheduler.pem

Сертификат сервера API Kubernetes

Кубернеты-Твердый путь Статический IP-адрес будет включен в список объектов альтернативных имен для сертификата сервера API Kubernetes. Это гарантирует, что сертификат может быть подтвержден удаленными клиентами. Мы сгенерировали все клиентские сертификаты наших кластеров Kubernetes, но нам также нужен сертификат сервера для API Kubernetes. В этом уроке мы будем генерировать один, подписанный со всеми именами хостов и IPS, которые могут использоваться позже, чтобы получить доступ к API Kubernetes. После завершения этого урока у вас будет сертификат сервера API Kubernetes в виде двух файлов, называемых kubernetes-key.pem и kubernetes.pem.

Вот команды, используемые в демо. Обязательно замените все значения заполнителей в CERT_HOSTNAME со своими реальными значениями из ваших машин.

# CERT_HOSTNAME=10.32.0.1,,,,,,,127.0.0.1,localhost,kubernetes.default
CERT_HOSTNAME=10.32.0.1,192.168.0.1,kubecon01.k8s.com,192.168.0.2,kubecon02.k8s.com,192.168.0.3,api_loadbalancer.k8s.com,127.0.0.1,localhost,kubernetes.default

Создайте сертификат сервера API Kubernetes и закрытый ключ:

{
cat > kubernetes-csr.json <

Сервер API Kubernetes автоматически назначается Кубернаны Внутреннее имя DNS, которое будет связано с первым IP-адресом ( 10.32.0.1 ) из диапазона адресов ( 10.32.0.0/24 ) Зарезервировано для внутренних кластерных услуг во время Контроль плоскости загрузки лаборатория

Результаты:

kubernetes-key.pem
kubernetes.pem

Kubernetes предоставляет возможность сервисных учетных записей для аутентификации с использованием токенов. Он использует ключ для предоставления подписей для этих токенов. В этом уроке мы будем генерировать сертификат, который будет использоваться в качестве этой пары ключей. После завершения этого урока у вас будет сертификат, который будет использоваться в качестве пары ключей учетной записи службы в виде двух файлов: Service-account-key.pem и Service-account.pem .pem. Вот используемые команды

Пара ключа службы учетной записи

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

Генерировать Сервисный счет Сертификат и закрытый ключ:

{

cat > service-account-csr.json <

Результаты:

service-account-key.pem
service-account.pem

Распространите клиентские и серверные сертификаты

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

# scp ca.pem $WORKER0_HOST-key.pem $WORKER0_HOST.pem root@$WORKER0_HOST:~/
# scp ca.pem $WORKER1_HOST-key.pem $WORKER1_HOST.pem root@$WORKER1_HOST:~/

Переместить файлы сертификата в узлы контроллера:

# scp ca.pem ca-key.pem kubernetes-key.pem kubernetes.pem service-account-key.pem service-account.pem root@kubecon01.k8s.com:~/
# scp ca.pem ca-key.pem kubernetes-key.pem kubernetes.pem service-account-key.pem service-account.pem root@kubecon02.k8s.com:~/

В этой лаборатории вы будете генерировать Файлы конфигурации Kubernetes , также известный как KubeConfigs, которые позволяют клиентам Kubernetes найти и аутентифицироваться на серверах API Kubernetes.

Что такое Kubeconfigs и почему мы им нужны?

  • Kubeconfigs.
    • Файл конфигурации Kubernetes или KubeConfig, является файлом, который хранит информацию о кластерах, пользователях, пользователях, пространствах имен и механизмах аутентификации. «Он содержит данные конфигурации, необходимые для подключения и взаимодействия с одним или несколькими кластерами Kubernetes. Вы можете найти больше информации о KubeConfigs в документации Kubernetes: Файлы конфигурации Kubernetes KubeConfigs содержит информацию, такой как

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

      Почему нам нужны KubeConfigs?

  • Как генерировать kubeconfig
    • KubeConfigs может быть сгенерирован с помощью kubectl
# kubectl config set-cluster // set up the configuration for the location of the cluster.
# kubectl config set-credentials // set the username and client certificate that will be used to authenticate.
# kubectl config set-context default // set up the default context
# kubectl config use-context default // set the current context to the configuration we provided

Какие KubeConfigs нам нужно создать?

  • Нам понадобится несколько файлов Kubeconfig для различных компонентов кластера Kubernetes:
    • Кублет (один для каждого рабочего узла)
    • Kube-proxy.
    • Kube-контроллер-менеджер
    • Kube-планировщик
    • Админ
  • Следующим шагом в создании кластера Kubernetes Трудный способ состоит в том, чтобы генерировать KubeConfigs, которые будут использоваться различными службами, которые состоят в том, чтобы составить кластер. В этом уроке мы будем генерировать эти кубеконфы. После завершения этого урока у вас должен быть набор KubeConfigs, который вам понадобится позже, чтобы настроить кластер Kubernetes. Вот команды, используемые в демо. Обязательно замените заполнителей фактическими значениями с вашей машины. Создайте переменную среды для хранения адреса API Kubernetes и установите его на IP-адрес вашего балансировщика нагрузки> в нашем DIGRAM IP для Leadblancer — 192.168.0.3 Вы можете увидеть удар
# KUBERNETES_PUBLIC_ADDRESS=192.168.0.3

Конфиги по аутентификации клиента

В этом разделе вы будете генерировать файлы Kubeconfig для Менеджер контроллера , Кублет , Kube-Proxy и Планировщик Клиенты и Админ Пользователь.

Файл конфигурации Kublet Kubernetes

При генерации файлов KubeConfig для Kubelets необходимо использовать сертификат клиента, необходимо использовать имя узла Kubelet. Это гарантирует, что Kubelets должным образом уполномочены Kubernetes Узел авторизатор Отказ

Следующие команды должны выполняться в том же каталоге, используемом для генерации сертификатов SSL во время Генерация сертификатов TLS лаборатория

Создайте файл Kubeconfig для каждого узела рабочего:

for instance in worknode01.k8s.com worknode02.k8s.com; do
  kubectl config set-cluster kubernetes-the-hard-way \
    --certificate-authority=ca.pem \
    --embed-certs=true \
    --server=https://${KUBERNETES_PUBLIC_ADDRESS}:6443 \
    --kubeconfig=${instance}.kubeconfig

  kubectl config set-credentials system:node:${instance} \
    --client-certificate=${instance}.pem \
    --client-key=${instance}-key.pem \
    --embed-certs=true \
    --kubeconfig=${instance}.kubeconfig

  kubectl config set-context default \
    --cluster=kubernetes-the-hard-way \
    --user=system:node:${instance} \
    --kubeconfig=${instance}.kubeconfig

  kubectl config use-context default --kubeconfig=${instance}.kubeconfig
done

Результаты:

worknode01.k8s.com.kubeconfig
worknode02.k8s.com.kubeconfig

Файл конфигурации Kube-Proxy Kubernetes

Создайте файл kubeconfig для Kube-Proxy услуга:

{
  kubectl config set-cluster kubernetes-the-hard-way \
    --certificate-authority=ca.pem \
    --embed-certs=true \
    --server=https://${KUBERNETES_PUBLIC_ADDRESS}:6443 \
    --kubeconfig=kube-proxy.kubeconfig

  kubectl config set-credentials system:kube-proxy \
    --client-certificate=kube-proxy.pem \
    --client-key=kube-proxy-key.pem \
    --embed-certs=true \
    --kubeconfig=kube-proxy.kubeconfig

  kubectl config set-context default \
    --cluster=kubernetes-the-hard-way \
    --user=system:kube-proxy \
    --kubeconfig=kube-proxy.kubeconfig

  kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig
}

Результаты:

kube-proxy.kubeconfig

Файл конфигурации Kube-Controller-Manager Kubernetes

Создайте файл kubeconfig для Kube-Controller-Manager услуга:

{
  kubectl config set-cluster kubernetes-the-hard-way \
    --certificate-authority=ca.pem \
    --embed-certs=true \
    --server=https://127.0.0.1:6443 \
    --kubeconfig=kube-controller-manager.kubeconfig

  kubectl config set-credentials system:kube-controller-manager \
    --client-certificate=kube-controller-manager.pem \
    --client-key=kube-controller-manager-key.pem \
    --embed-certs=true \
    --kubeconfig=kube-controller-manager.kubeconfig

  kubectl config set-context default \
    --cluster=kubernetes-the-hard-way \
    --user=system:kube-controller-manager \
    --kubeconfig=kube-controller-manager.kubeconfig

  kubectl config use-context default --kubeconfig=kube-controller-manager.kubeconfig
}

Результаты:

kube-controller-manager.kubeconfig

Файл конфигурации Kube-планировщика Kubernetes

Создайте файл kubeconfig для Kube-планировщик услуга:

{
  kubectl config set-cluster kubernetes-the-hard-way \
    --certificate-authority=ca.pem \
    --embed-certs=true \
    --server=https://127.0.0.1:6443 \
    --kubeconfig=kube-scheduler.kubeconfig

  kubectl config set-credentials system:kube-scheduler \
    --client-certificate=kube-scheduler.pem \
    --client-key=kube-scheduler-key.pem \
    --embed-certs=true \
    --kubeconfig=kube-scheduler.kubeconfig

  kubectl config set-context default \
    --cluster=kubernetes-the-hard-way \
    --user=system:kube-scheduler \
    --kubeconfig=kube-scheduler.kubeconfig

  kubectl config use-context default --kubeconfig=kube-scheduler.kubeconfig
}

Результаты:

kube-scheduler.kubeconfig

Файл конфигурации admin kubernetes

Создайте файл kubeconfig для Админ Пользователь:

{
  kubectl config set-cluster kubernetes-the-hard-way \
    --certificate-authority=ca.pem \
    --embed-certs=true \
    --server=https://127.0.0.1:6443 \
    --kubeconfig=admin.kubeconfig

  kubectl config set-credentials admin \
    --client-certificate=admin.pem \
    --client-key=admin-key.pem \
    --embed-certs=true \
    --kubeconfig=admin.kubeconfig

  kubectl config set-context default \
    --cluster=kubernetes-the-hard-way \
    --user=admin \
    --kubeconfig=admin.kubeconfig

  kubectl config use-context default --kubeconfig=admin.kubeconfig
}

Результаты:

admin.kubeconfig

Распределите файлы конфигурации Kubernetes

Скопируйте соответствующие Кублет и Kube-Proxy Кубеконфиг файлы каждому примеру работника:

for instance in worknode01.k8s.com worknode02.k8s.com; do
    scp ${instance}.kubeconfig kube-proxy.kubeconfig ${instance}:~/
done

Скопируйте соответствующие Kube-Controller-Manager и Kube-планировщик Кубеконфиг файлы в каждый экземпляр контроллера:

for instance in kubecon01.k8s.com kubecon02.k8s.com; do 
    scp admin.kubeconfig kube-controller-manager.kubeconfig kube-scheduler.kubeconfig ${instance}:~/
done

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

В этой лаборатории вы будете генерировать ключ шифрования и Configption Config Подходит для шифрования секретов Kubernetes.

Что такое он шифрование данных Kubernetes Config?

  • Cubernetes Secret шифрование

    • Kubernetes поддерживает возможность шифрования секретных данных в покое. Это означает, что секреты зашифрованы, чтобы они никогда не хранялись на диске в простом тексте. Эта функция важна для безопасности, но для того, чтобы использовать его, нам нужно предоставить Kubernetes с ключом шифрования. Мы будем генерировать ключ шифрования и поместите его в файл конфигурации. Затем мы скопируем этот файл на наши серверы контроллера Kubernetes.
    • Чтобы воспользоваться способностью Kubernetes в покое шифрование конфиденциальных данных в покое, вам необходимо предоставить Kubernetes с помощью клавиши encrpytion с помощью файла конфигурации шифрования данных. Этот урок проходит вас через процесс создания ключа шифрования и сохраняя его в нужный файл, а также показывая, как скопировать этот файл на ваши контроллеры Kubernetes. После завершения этого урока у вас должна быть действующая файл конфигурации шифрования данных Kubernetes, и должна быть копия этого файла на каждой из серверов Cubernetes Controller. ## ключ шифрования Вот команды, используемые в демо. Создайте файл конфигурации шифрования данных Kubernetes, содержащий ключ шифрования

Создайте ключ шифрования:

ENCRYPTION_KEY=$(head -c 32 /dev/urandom | base64)

Файл конфигурации шифрования

Создать Encryption-config.yaml Шифрование файл конфигурации:

cat > encryption-config.yaml <

Распространение конфигурации шифрования Kubernetes

Скопируйте Encryption-config.yaml Файл конфигурации шифрования каждому экземпляру контроллера:

for instance in kubecon01.k8s.com kubecon02.k8s.com; do
     scp encryption-config.yaml ${instance}:~/
done

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

Что такое etcd?

«ETCD — это распределенный магазин значений ключей, который обеспечивает надежный способ хранения данных по кластеру машин». etcd ETCD обеспечивает способ хранения данных по распределенному кластеру машин и убедиться, что данные синхронизируются по всем машинам. Вы можете найти больше информации, а также исходный код EtCD, в репозитории GitHUB ETCD etcd

Как Используется EtCD в Куберане?

Kubernetes использует EtCD для хранения всех его внутренних данных о состоянии кластера. Эти данные должны быть сохранены, но также необходимо надежно синхронизировать все узлы контроллера в кластере. ETCD выполняет эту цель. Нам нужно будет установить EtCD на каждом из наших узлов контроллера Kubernetes и создать кластер ETCD, который включает в себя все эти узлы контроллера. Вы можете найти больше информации о управлении кластером EtCD для Kubernetes здесь k8stcd.

Создание кластера ETCD

Прежде чем вы сможете выдержать контроллеры для кластера Kubernetes, вы должны сначала построить кластер EtCD на узлах управления Kubernetes. Этот урок предоставляет демонстрацию того, как настроить кластер ETCD в приготовлении для загрузки Kubernetes. После завершения этого урока вы должны иметь рабочий кластер ETCD, который состоит из ваших узлов управления Kubernetes. Вот команды, используемые в демо (обратите внимание, что они должны работать на обоих серверах контроллера, с несколькими различиями между ними):

Скачать и установить двоичные файлы ETCD

Скачать официальные двоичные файлы выпуска ETCD из etcd Проект GitHub:

wget "https://github.com/etcd-io/etcd/releases/download/v3.4.15/etcd-v3.4.15-linux-amd64.tar.gz"

Извлечь и установить etcd Сервер и etcdctl Утилита командной строки:

# tar -xvf etcd-v3.4.15-linux-amd64.tar.gz
# mv etcd-v3.4.15-linux-amd64/etcd* /usr/local/bin/

Настройте ETCD Server

# mkdir -p /etc/etcd /var/lib/etcd
# chmod 700 /var/lib/etcd
# cp ca.pem kubernetes-key.pem kubernetes.pem /etc/etcd/

Настройте следующие переменные среды.

# ETCD_NAME=$(hostname -s)
# INTERNAL_IP=$(/sbin/ip -o -4 addr list eth0 | awk '{print $4}' | cut -d/ -f1)

Настройте следующие переменные среды. Убедитесь, что вы заменяете все свои соответствующие реальные значения:

Вы можете увидеть диаграмму лаборатории в вашем случае вы только для изменения IP для переменной

# CONTROLLER0_IP=192.168.0.1
# CONTROLLER0_host=kubecon01
# CONTROLLER1_IP=192.168.0.2
# CONTROLLER1_host=kubecon02

Создать etcd.service Файл системы SystemD:

cat <

Запустите EtCD Server

# systemctl daemon-reload
# systemctl enable etcd
# systemctl start etcd

Не забудьте запустить вышеуказанные команды на каждом узле контроллера: Kubecon01 , Kubecon02 Отказ

Проверка

Список членов кластера EtCD:

sudo ETCDCTL_API=3 etcdctl member list \
  --endpoints=https://127.0.0.1:2379 \
  --cacert=/etc/etcd/ca.pem \
  --cert=/etc/etcd/kubernetes.pem \
  --key=/etc/etcd/kubernetes-key.pem

вывод

19e6cf768d9d542e, started, kubecon02, https://192.168.0.2:2380, https://192.168.0.2:2379, false
508e54ff346cdb88, started, kubecon01, https://192.168.0.1:2380, https://192.168.0.1:2379, false

В этой лаборатории вы будете загружать плоскость управления Kubernetes через три вычислительных экземпляра и настроить его для высокой доступности. Вы также будете создавать внешний балансировщик нагрузки, который обнажает серверы API Kubernetes для удаленных клиентов. Следующие компоненты будут установлены на каждом узле: Cubernetes API-сервер, планировщик и менеджер контроллера.

Предварительные условия

Команды в этой лаборатории должны работать на каждом экземпляре контроллера: Kubecon01 , kubecon02.

Предоставление плоскости управления Kubernetes

Первый шаг в загрузке новой плоскости управления Kubernetes — установить необходимые двоичные файлы на серверах контроллера. Мы пройдемся по процессу загрузки и установки дворовиков на обоих контроллерах Kubernetes. Это подготовит вашу среду для следующих уроков, в которых мы настроим этих двоичных файлов для запуска Systemd Services. Вы можете установить дистанционные двоичные файлы на каждом узле управления, как это

# mkdir -p /etc/kubernetes/config

Загрузить и установить бинары контроллера Kubernetes

Скачать официальные двоичные файлы выпуска Kubernetes

# wget "https://storage.googleapis.com/kubernetes-release/release/v1.21.0/bin/linux/amd64/kube-apiserver" \
  "https://storage.googleapis.com/kubernetes-release/release/v1.21.0/bin/linux/amd64/kube-controller-manager" \
  "https://storage.googleapis.com/kubernetes-release/release/v1.21.0/bin/linux/amd64/kube-scheduler" \
  "https://storage.googleapis.com/kubernetes-release/release/v1.21.0/bin/linux/amd64/kubectl"

Давайте изменим разрешение на исполнение исполнения

# chmod +x kube-apiserver kube-controller-manager kube-scheduler kubectl 

Давайте MV двоичным в/usr/local/bin

# mv kube-apiserver kube-controller-manager kube-scheduler kubectl /usr/local/bin/

Настройте сервер API Kubernetes

Сервер API Kubernetes предоставляет основной интерфейс для плоскости управления Kubernetes и кластера в целом. Когда вы взаимодействуете с Kubernetes, вы почти всегда делаете это через сервер API Kubernetes. Этот урок проведет вас через процесс настройки службы KUBE-APISERVER на двух ваших узлах управления Kubernetes. После завершения этого урока у вас должна быть установлена системный блок для запуска Kube-ApiserVer в качестве службы на каждом узле управления Kubernetes. Вы можете настроить сервер API Kubernetes, как так

# mkdir -p /var/lib/kubernetes/
# mv ca.pem ca-key.pem kubernetes-key.pem kubernetes.pem \
    service-account-key.pem service-account.pem \
    encryption-config.yaml /var/lib/kubernetes/

Установите некоторые переменные среды, которые будут использоваться для создания файла системного блока. Убедитесь, что вы замените заполнителей своими фактическими значениями

# INTERNAL_IP=$(/sbin/ip -o -4 addr list eth0 | awk '{print $4}' | cut -d/ -f1)
# CONTROLLER0_IP=192.168.0.1
# KUBERNETES_PUBLIC_ADDRESS=$(/sbin/ip -o -4 addr list eth0 | awk '{print $4}' | cut -d/ -f1)
# CONTROLLER1_IP=192.168.0.2

Создайте файл блока KUBE-APISERVER для SystemD:

# cat <

Настройте управляющий контроллер Kubernetes

Переместить Kube-Controller-Manager kubeconfig на место:

sudo mv kube-controller-manager.kubeconfig /var/lib/kubernetes/

Создать Kube-Controller-Manager.service Файл системы SystemD:

cat <

Настройте планировщик Kubernetes

Переместить Kube-планировщик kubeconfig на место:

sudo mv kube-scheduler.kubeconfig /var/lib/kubernetes/

Создать Kube-struleber.yaml конфигурационный файл:

cat <

Создать Kube-Scheduler.service Файл системы SystemD:

cat <

Начните службы контроллера

# systemctl daemon-reload
# systemctl enable kube-apiserver kube-controller-manager kube-scheduler
# systemctl start kube-apiserver kube-controller-manager kube-scheduler

Разрешить до 10 секунд для сервера API Kubernetes для полного инициализации.

Включить проверки HTTP Health

  • Почему нам нужно включить проверки здоровья HTTP?
    • В оригинале Keley Hightower Kubernetes Tard Way Guide, он использует хорошую облачную платформу (GCP) Balancer нагрузки. Балансировщик нагрузки должен иметь возможность выполнять проверки здоровья против API Kubernetes для измерения состояния здоровья узлов API. Балансировщик нагрузки GCP не может легко выполнить проверки здоровья через HTTPS, поэтому руководство поручает настроить прокси-сервер, чтобы эти проверки здоровья выполняются по адресу http. Поскольку мы используем Nginx в качестве нашего балансировщика нагрузки, нам на самом деле не нужно делать это, но это будет хорошая практика для нас. Это упражнение поможет вам понять методы, используемые в оригинальном руководстве.
    • Часть оригинальных Kubernetes Kelsey Hightower Kubernetes Tard Pare Guide включает настройку прокси Nginx на каждом контроллере для обеспечения доступа к
    • Конечная точка Kubernetes API/Healthz EndPoint через http Этот урок объясняет рассуждение за включение этого шага и направляет вас через
- the process of implementing the http /healthz proxy. You can set up a basic nginx proxy for the healthz endpoint by first installing nginx" 

/Healthz Конечная точка сервера API не требует аутентификации по умолчанию.

Установите базовый веб-сервер для обработки проверки HTTP Health:

# yum install epel-release  nginx -y

Создайте конфигурацию Nginx для проверки здоровья Proxy:

cat > /etc/nginx/conf.d/kubernetes.default.svc.cluster.local.conf <

Начал и включен nginx

# systemctl enable --now nginx

Проверка

kubectl cluster-info --kubeconfig admin.kubeconfig
Kubernetes control plane is running at https://127.0.0.1:6443

Проверьте прокси проверки здоровья NGINX HTTP:

curl -H "Host: kubernetes.default.svc.cluster.local" -i http://127.0.0.1/healthz
HTTP/1.1 200 OK
Server: nginx/1.18.0 (Ubuntu)
Date: Sun, 02 May 2021 04:19:29 GMT
Content-Type: text/plain; charset=utf-8
Content-Length: 2
Connection: keep-alive
Cache-Control: no-cache, private
X-Content-Type-Options: nosniff
X-Kubernetes-Pf-Flowschema-Uid: c43f32eb-e038-457f-9474-571d43e5c325
X-Kubernetes-Pf-Prioritylevel-Uid: 8ba5908f-5569-4330-80fd-c643e7512366

ok

Не забудьте запустить вышеуказанные команды на каждом узле контроллера: Kubecon01 , kubecon02.

RBAC для авторизации кублета

Одной из необходимых этапов настройки новой кластеры Kubernetes с нуля является назначение разрешений, которые позволяют API Kubernetes получить доступ к различным функциям в Kubelets. Этот урок направляет вас через процесс создания кластеров и привязывает его к пользователю Kubernetes, чтобы эти права были на месте. После завершения этого урока ваш кластер будет иметь необходимую конфигурацию контроля на основе ролей, чтобы позволить API кластера доступа к функциям Kubelet, таких как журналы и метрики. Вы можете настроить RBAC для авторизации Kubelet с этими командами. Обратите внимание, что эти команды должны работать только на одном узле управления. Создать роль с необходимыми разрешениями

В этом разделе вы настроите разрешения RBAC, чтобы позволить серверу API Kubernetes получить доступ к API Kubelet на каждом уземе работника. Доступ к API kublet требуется для извлечения метрик, журналов и выполнения команд в стручках.

Это руководство устанавливает кублет - Авторизация-режима Флаг к WebHook Отказ Режим веб -ook использует PublicAccessReview API для определения авторизации.

Команды в этом разделе повлияют на весь кластер и нужно только один раз от одного из узлов контроллера.

Создать Система: Kube-Apiserver-to-kublet Клостерроль С разрешениями для доступа к API kubelet и выполнение наиболее распространенных задач, связанных с управлением стручками:

cat <

Сервер API Kubernetes аутентифицируется на кублет, как Кубернаны Пользователь, использующий сертификат клиента, как определено --Кубелет-клиент-сертификат флаг.

Связывать Система: Kube-Apiserver-to-kublet Клостерроль к Кубернаны Пользователь:

cat <

Настройка балансировщика нагрузки на нагрузку на Kube API

Чтобы добиться избыточности для ваших кластеров Kubernetes, вам нужно будет загрузить использование баланса API Kubernetes через несколько узлов управления. В этом уроке вы узнаете, как создать простой сервер Nginx для выполнения этой балансировки. После завершения этого урока вы сможете взаимодействовать с помощью узлов управления вашим кластером Kubernetes, используя балансировщик нагрузки NGINX. Вот команды, которые вы можете использовать для настройки балансировщика нагрузки NGINX. Запустите их на сервере, который вы обозначали как сервер балансировщика нагрузки:

# ssh root@192.168.0.3

ПРИМЕЧАНИЕ Будут использовать модуль потока для Nginx для Easy Wiil Создать изображение Docker, которое содержит All All Mool Config сначала, позволяет устанавливать Docker

# yum install -y yum-utils
# yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
# yum-config-manager --enable docker-ce-nightly
# yum install docker-ce docker-ce-cli containerd.io -y  
# systemctl enable --now docker

Конфигурация LoadBalancer

Теперь создадим DIR для изображения, чтобы настроить все изображение Nassry

# mkdir nginx && cd nginx 

Настройте некоторые переменные окружающей среды для файла конфигурации балансировки свинца:

# CONTROLLER0_IP=192.168.0.1
# CONTROLLER1_IP=192.168.0.2

Создайте файл конфигурации Balancer Balancer Nginx

# cat << EOF | sudo tee k8s.conf
   stream {
    upstream kubernetes {
        least_conn;
        server $CONTROLLER0_IP:6443;
        server $CONTROLLER1_IP:6443;
     }
    server {
        listen 6443;
        listen 443;
        proxy_pass kubernetes;
    }
}
EOF

Давайте создадим конфигурацию nginx

# cat << EOF |  tee nginx.conf 
user www-data;
worker_processes auto;
pid /run/nginx.pid;

events {
        worker_connections 768;
        # multi_accept on;
}

http {

        ##
        # Basic Settings
        ##

        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;
        # server_tokens off;

        # server_names_hash_bucket_size 64;
        # server_name_in_redirect off;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        ##
        # SSL Settings
        ##

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
        ssl_prefer_server_ciphers on;

        ##
        # Logging Settings
        ##

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

        ##
        # Gzip Settings
        ##

        gzip on;
        gzip_disable "msie6";

        # gzip_vary on;
        # gzip_proxied any;
        # gzip_comp_level 6;
        # gzip_buffers 16 8k;
        # gzip_http_version 1.1;
        # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

        ##
        # Virtual Host Configs
        ##

        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
}


#mail {
#       # See sample authentication script at:
#       # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
#
#       # auth_http localhost/auth.php;
#       # pop3_capabilities "TOP" "USER";
#       # imap_capabilities "IMAP4rev1" "UIDPLUS";
#
#       server {
#               listen     localhost:110;
#               protocol   pop3;
#               proxy      on;
#       }
#
#       server {
#               listen     localhost:143;
#               protocol   imap;
#               proxy      on;
#       }
#}
include /etc/nginx/tcpconf.d/*;
EOF

Давайте создадим Dockerfile

# cat << EOF |  tee Dockerfile
FROM ubuntu:16.04
RUN apt-get update -y && apt-get upgrade -y && apt-get install -y nginx && mkdir -p  /etc/nginx/tcpconf.d
RUN rm -rf /etc/nginx/nginx.conf
ADD nginx.conf /etc/nginx/
ADD k8s.conf /etc/nginx/tcpconf.d/
CMD ["nginx", "-g", "daemon off;"]
EOF

Давайте строим и запустить докер

# docker build -t nginx .
# docker run -d --network host --name nginx --restart unless-stopped nginx

Сделайте HTTP-запрос на информацию о версии Kubernetes:

curl --cacert ca.pem https://${KUBERNETES_PUBLIC_ADDRESS}:6443/version

вывод

{
  "major": "1",
  "minor": "21",
  "gitVersion": "v1.21.0",
  "gitCommit": "cb303e613a121a29364f75cc67d3d580833a7479",
  "gitTreeState": "clean",
  "buildDate": "2021-04-08T16:25:06Z",
  "goVersion": "go1.16.1",
  "compiler": "gc",
  "platform": "linux/amd64"
}

В этой лаборатории вы будете загрузить три рабочие узлы Kubernetes. Следующие компоненты будут установлены на каждом узле: runc , Контейнеры Сетевые плагины , Контейнер , Кублет и Kube-Proxy Отказ

Каковы узлы рабочие кубернаны?

Узлы рабочие Kubernetes отвечают за фактическую работу беговых контейнеров, управляемых Kubernetes. «Узел Kubernetes имеет услуги, необходимые для запуска контейнеров приложений и управлять от основных систем. » Вы можете найти подробную информацию о рабочих узлах Kubernetes в документации Kubernetes:

Kubernetes рабочие узла компонентов

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

  • Кублет
    • Управляет узел каждого работника, обеспечивая API, которые используются плоскостью управления для управления узлами и стручками и взаимодействуют со временем выполнения контейнера для управления контейнерами
  • Kube-proxy.
    • Управляет правилам iptables на узле, чтобы предоставить виртуальную сеть доступа к стручкам.
  • Контейнерное время выполнения
    • Загрузка изображений и запускает контейнеры. Два примера контейнеровоза runtimes представляют собой Docker и Containerd (Kubernetes Трудно использует контейнер) ### Предварительные условия Команды в этой лаборатории должны работать на каждом экземпляре работника: Worknode01 , Worknode01 ## Предоставление узела рабочего узла Кубебени

Установите зависимости ОС:

# yum install socat conntrack ipset -y 

Бинар SOCAT позволяет поддерживать kubectl порт вперед команда.

Отключить своп

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

Убедитесь, что включен ли обмен:

sudo swapon --show

Если вывод пуст, то своп не включен. Если SWAP включен, запустите следующую команду, чтобы немедленно отключить своп:

# swapoff -a 
# sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

Скачать и устанавливать рабочие двоины

# wget https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.21.0/crictl-v1.21.0-linux-amd64.tar.gz \
  https://github.com/opencontainers/runc/releases/download/v1.0.0-rc93/runc.amd64 \
  https://github.com/containernetworking/plugins/releases/download/v0.9.1/cni-plugins-linux-amd64-v0.9.1.tgz \
  https://github.com/containerd/containerd/releases/download/v1.4.4/containerd-1.4.4-linux-amd64.tar.gz \
  https://storage.googleapis.com/kubernetes-release/release/v1.21.0/bin/linux/amd64/kubectl \
  https://storage.googleapis.com/kubernetes-release/release/v1.21.0/bin/linux/amd64/kube-proxy \
  https://storage.googleapis.com/kubernetes-release/release/v1.21.0/bin/linux/amd64/kubelet

Создайте каталоги установки:

# mkdir -p \
  /etc/cni/net.d \
  /opt/cni/bin \
  /var/lib/kubelet \
  /var/lib/kube-proxy \
  /var/lib/kubernetes \
  /var/run/kubernetes

Установите рабочие двоичные файлы:

# mkdir containerd
# tar -xvf crictl-v1.21.0-linux-amd64.tar.gz
# tar -xvf containerd-1.4.4-linux-amd64.tar.gz -C containerd
# tar -xvf cni-plugins-linux-amd64-v0.9.1.tgz -C /opt/cni/bin/
# mv runc.amd64 runc
# chmod +x crictl kubectl kube-proxy kubelet runc 
# mv crictl kubectl kube-proxy kubelet runc /usr/local/bin/
# mv containerd/bin/* /bin/

Настроить контейнер

Создайте файл конфигурации контейнера:

# mkdir -p /etc/containerd/
# cat << EOF | sudo tee /etc/containerd/config.toml
[plugins]
  [plugins.cri.containerd]
    snapshotter = "overlayfs"
    [plugins.cri.containerd.default_runtime]
      runtime_type = "io.containerd.runtime.v1.linux"
      runtime_engine = "/usr/local/bin/runc"
      runtime_root = ""
EOF

Создать Containerd.service Файл системы SystemD:

cat <

Настроить кублет

Kubelet — агент Кубератеса, который проходит на каждом уземе работника. Выступает в качестве посредника между плоскостью управления KUBERNETES и базовым временем выполнения контейнера, он координирует работу контейнеров на уземе работника. В этом уроке мы настроим нашу SystemD Service для Kubelet. После завершения этого урока у вас должна быть настроена SystemD Service и готова к запуску на каждом уземе работника. Вы можете настроить службу Kublet, как так. Запустите эти команды на обоих рабочих узлах. Установите переменную среды хоста, которая будет использоваться для создания файлов конфигурации. Убедитесь, что вы устанавливаете имя хоста, соответствующим образом для каждого узела рабочего:

# mv ${HOSTNAME}-key.pem ${HOSTNAME}.pem /var/lib/kubelet/
# mv ${HOSTNAME}.kubeconfig /var/lib/kubelet/kubeconfig
# mv ca.pem /var/lib/kubernetes/

Создать kublet-config.yaml конфигурационный файл:

# cat <

Создать kubelet.service Файл системы SystemD:

cat <

Настройте прокси Kubernetes

Kube-Proxy является важным компонентом каждого узела рабочего узла Кубернества. Он отвечает за предоставление сетевой маршрутизации для поддержки сетевых компонентов Kubernetes. В этом уроке мы настроим нашу систему Kube-Proxy Systemd. Поскольку это последний из трех служб узел рабочих узлов, которые нам нужно настроить, мы также будем идти вперед и начать все наши услуги узел нашего рабочего узла после того, как мы сделаем. Наконец, мы выполним несколько шагов, чтобы убедиться, что наш кластер устанавливается правильно и функционирует, как ожидается, до сих пор. После завершения этого урока у вас должно быть два рабочих Kubernetes US и работает, и они должны быть в состоянии успешно зарегистрировать себя с кластером. Вы можете настроить службу KUBE-прокси, как так. Запустите эти команды на обоих рабочих узлах:

# mv kube-proxy.kubeconfig /var/lib/kube-proxy/kubeconfig

Создать kube-proxy-config.yaml конфигурационный файл:

# cat <

Создать Kube-Proxy.Service Файл системы SystemD:

# cat <

Начать работников

# systemctl daemon-reload
# systemctl enable containerd kubelet kube-proxy
# systemctl start containerd kubelet kube-proxy

Проверка

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

# mkdir -p $HOME/.kube
# cp -i admin.kubeconfig $HOME/.kube/config
# chown $(id -u):$(id -g) $HOME/.kube/config
# kubectl get nodes

вывод

NAME                 STATUS     ROLES    AGE     VERSION
worknode01.k8s.com   NotReady      5m28s   v1.21.0
worknode02.k8s.com   NotReady      5m31s   v1.21.0

Дотно осторожно о Reforey Потому что в сети исправит эти проблемы

В этой лаборатории вы будете генерировать файл Kubeconfig для kubectl Утилита командной строки на основе Админ учетные данные пользователя.

Что такое kubectl?

Kubectl

  • инструмент командной строки Kubernetes. Это позволяет нам взаимодействовать с кластерами Kubernetes из командной строки. Мы настроим kubectl, чтобы разрешить удаленный доступ с нашей машины, чтобы удаленно управлять кластером. Для этого мы создадим локальный KubeConfig, который будет аутентифицироваться в качестве пользователя Admin и получить доступ к API Kubernetes через балансировку нагрузки. В этой лаборатории вы будете генерировать файл Kubeconfig для утилиты командной строки KUBECTL на основе учетных данных пользователя admin. Запустите команды в этой лаборатории из того же каталога, используемого для создания сертификатов клиента администратора. Есть несколько шагов для настройки локальной установки Kubectl для управления удаленным кластером. Этот урок будет направлять вас через этот процесс. После завершения этого урока у вас должна быть локальная установка KUBECTL, которая способна работать команды Kubectl против удаленного кластера Kubernetes. В отдельной оболочке откройте туннель SSH в порт 6443 на вашем балансе нагрузки Kubernetes API: Файл конфигурации admin Kubernetes каждый Kubeconfig требует подключения сервера API Kubernetes. Для поддержки высокой доступности будет использоваться IP-адрес, назначенный на внешний балансировщик нагрузки, которые будут использоваться серверы API Kubernetes. Создайте файл KubeConfig, подходящий для аутентификации в качестве администратора пользователя: давайте настроить
# cd /k8s
# mkdir -p $HOME/.kube
# cp -i admin.kubeconfig $HOME/.kube/config
# chown $(id -u):$(id -g) $HOME/.kube/config
# KUBERNETES_PUBLIC_ADDRESS=192.168.0.3

Файл конфигурации admin kubernetes

Каждый KubeConfig требует подключения к подключению сервера API Kubernetes. Для поддержки высокой доступности будет использоваться IP-адрес, назначенный на внешний балансировщик нагрузки, которые будут использоваться серверы API Kubernetes.

Создайте файл Kubeconfig, подходящий для аутентификации как Админ Пользователь:

{
  kubectl config set-cluster kubernetes-the-hard-way \
    --certificate-authority=ca.pem \
    --embed-certs=true \
    --server=https://${KUBERNETES_PUBLIC_ADDRESS}:6443

  kubectl config set-credentials admin \
    --client-certificate=admin.pem \
    --client-key=admin-key.pem

  kubectl config set-context kubernetes-the-hard-way \
    --cluster=kubernetes-the-hard-way \
    --user=admin

  kubectl config use-context kubernetes-the-hard-way
}

Проверка

Проверьте версию удаленного кластера Kubernetes:

kubectl version

вывод

Client Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.0", GitCommit:"cb303e613a121a29364f75cc67d3d580833a7479", GitTreeState:"clean", BuildDate:"2021-04-08T16:31:21Z", GoVersion:"go1.16.1", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.0", GitCommit:"cb303e613a121a29364f75cc67d3d580833a7479", GitTreeState:"clean", BuildDate:"2021-04-08T16:25:06Z", GoVersion:"go1.16.1", Compiler:"gc", Platform:"linux/amd64"}

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

kubectl get nodes

вывод

NAME                 STATUS     ROLES    AGE     VERSION
worknode01.k8s.com   NotReady      5m28s   v1.21.0
worknode02.k8s.com   NotReady      5m31s   v1.21.0

Дотно осторожно о Reforey Потому что в сети исправит эти проблемы

В этой лаборатории вы будете использовать калико

Есть Другие способы Для реализации сетевой модели Kubernetes.

Модель сети Kubernetes

  • Какие проблемы решают модель сети?
    • Как контейнеры будут общаться друг с другом?
    • Что если контейнеры на разных хостах (рабочие узлы)?
    • Как контейнеры будут общаться с услугами?
    • Как контейнеры будут назначены уникальные IP-адреса? Какой порт (ы) будет использоваться?

Модель докера

Docker позволяет контейнерам общаться друг с другом, используя виртуальный сетевой мост, настроенный на хосте. У каждого хоста есть собственная виртуальная сеть, обслуживающая все контейнеры на этом хосте. Но как насчет контейнеров на разных хозяевах? Мы должны прокси трафик от хоста к контейнерам, убедившись, что нет двух контейнеров не используют один и тот же порт на хосте. Модель сети Kubernetes была создана в ответ на модель докера. Он был разработан для улучшения некоторых ограничений модели докера

Модель сети Kubernetes

  • Одна виртуальная сеть для всего кластера.
  • Каждый POD имеет уникальный IP в кластере.
  • У каждого сервиса есть уникальный IP, который находится в другом диапазоне, чем POD IPS.

Архитектура кластерной сети

Некоторые важные диапазоны CIDR:

  • Кластер CIDR
    • Диапазон IP используется для назначения IPS для стручков в кластере. В этом курсе мы будем использовать кластер CIDR 10.200.0.0/16
  • Сервисный кластер IP-диапазона
    • Диапазон IP для услуг в кластере. Это не должно перекрывать с кластерным диапазоном CIDR! В этом курсе наш сервисный кластер IP-диапазона составляет 10,32.0.0/24.
  • POD CIDR
    • Диапазон IP для стручек на определенном узел рабочей силы. Этот диапазон должен попасть в кластер CIDR, но не перекрывать с помощью POD CIDR любого другого узела рабочего. В этом курсе наш сетевой плагин автоматически обрабатывает распределение IP на узлы, поэтому нам не нужно вручную установить POD CIDR. ### Установка Nation Calico на Kubernetes Мы будем использовать Net Calico для реализации сетей в наших кластере Kubernetes. Теперь мы готовы настроить сеть в наших кластере Kubernetes. Этот урок направляет вас через процесс установки Weave Net в кластере. Он также показывает, как проверить вашу кластерную сеть, чтобы убедиться, что все работает, как ожидалось, до сих пор. После завершения этого урока у вас должна быть функционирующая сеть кластеров в кластере Kubernetes. Вы можете настроить сеть Weave, как это: во-первых, войти в обеих рабочие узлы, так и включить экспедирование IP
# sysctl net.ipv4.conf.all.forwarding=1
# echo "net.ipv4.conf.all.forwarding=1" | sudo tee -a /etc/sysctl.conf

Войти в удаленный кубкт, затем установите Clico

# kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml 

Обратите внимание, что займет от 10 до 15 минут, чтобы быть установлена сейчас с 10 до 15 минут, но мы должны проверить нашу сеть, чтобы убедиться, что все работает. Во-первых, убедитесь, что Calico Net Pods работает и работает:

# kubectl get pods -n kube-system 

Проверка

Далее мы хотим проверить, что стручки могут подключаться друг к другу и что они могут подключиться к услугам. Мы создадим два стручка Nginx и услугу для этих двух стручков. Затем мы создадим POSEBOX POD и используем его для проверки подключения к PODS NGINX и службе. Во-первых, создайте развертывание Nginx с 2 репликами:

# cat <

Далее создайте услугу для этого развертывания, чтобы мы могли проверить подключение к услугам, а также:

# kubectl expose deployment/nginx 

Теперь давайте начнем другую стручок. Мы будем использовать этот POD для проверки нашей сети. Мы проверим, сможем ли мы подключиться к другим стручкам и услугам от этого POD.

# kubectl run busybox --image=radial/busyboxplus:curl --command -- sleep 3600
# POD_NAME=$(kubectl get pods -l run=busybox -o jsonpath="{.items[0].metadata.name}")

Теперь давайте получим IP-адреса наших двух стручков Nginx:

# kubectl get ep nginx 

Теперь давайте убедитесь, что POD Busebox POD может подключаться к стручкам Nginx на обоих этих IP-адреса

# kubectl exec $POD_NAME -- curl 
# kubectl exec $POD_NAME -- curl 

Обе команды должны вернуть некоторые HTML с заголовком «Добро пожаловать в Nginx! » Это означает, что мы можем успешно подключаться к другим стручкам. Теперь давайте проверим, мы сможем подключиться к услугам.

# kubectl get svc

Давайте посмотрим, сможем ли мы получить доступ к службе от Podbox Pod!

# kubectl exec $POD_NAME -- curl 

Это также должно вернуть HTML с названием «Добро пожаловать в Nginx!» Это означает, что мы успешно достигли службы Nginx изнутри POD и что наша сетевая конфигурация работает! Теперь, когда у нас есть сетевые настройки в кластере, нам нужно очистить объекты, которые были созданы для тестирования сетей. Эти объекты могут мешать или запутаться в более поздних уроках, поэтому хорошая идея удалить их из кластера перед продолжением. После завершения этого урока ваша сеть до сих пор должна быть на месте, но стручки и услуги, которые использовались для тестирования, он будет очищен.

# kubectl get deploy 
# kubectl delete deployment nginx
# kubectl delete svc nginx
# kubectl delete pod busybox

DNS в сети POD Kubernetes

  • Предоставляет службу DNS, которая будет использоваться стручками внутри сети.
  • Настраивает контейнеры для использования службы DNS для выполнения поиска DNS, например,
    • Вы можете получить доступ к услугам, используя назначенные им имена DNS.
    • Вы можете получить доступ к другим подводам, используя DNS-имена

В этой лаборатории вы будете развернуть DNS Add-on который предоставляет DNS на основе службы открытия, поддерживаемого Coredns. , к приложениям, работающим внутри кластера Kubernetes.

Развертывание надстройки кластера DNS в этой лаборатории вы будете развертывать дополнительный DNS, который предоставляет DNS-обнаружение на основе DNS, поддерживаемое Coredns, к приложениям, работающим внутри кластера Kubernetes. Дополнение кластера DNS

Дополнение кластера DNS

Развернуть Coredns Настройка кластера:

kubectl apply -f https://storage.googleapis.com/kubernetes-the-hard-way/coredns-1.8.yaml

вывод

serviceaccount/coredns created
clusterrole.rbac.authorization.k8s.io/system:coredns created
clusterrolebinding.rbac.authorization.k8s.io/system:coredns created
configmap/coredns created
deployment.apps/coredns created
service/kube-dns created

Список стручков, созданных Kube-DNS Развертывание:

kubectl get pods -l k8s-app=kube-dns -n kube-system

Это займет 3 минуты, то стручки будут

вывод

coredns-8494f9c688-j97h2   1/1     Running   5          3m31s
coredns-8494f9c688-wjn4n   1/1     Running   1          3m31s

Проверка

Создать Busybox Развертывание:

kubectl run busybox --image=busybox:1.28 --command -- sleep 3600

Список POD, созданный Busybox Развертывание:

kubectl get pods -l run=busybox

вывод

NAME      READY   STATUS    RESTARTS   AGE
busybox   1/1     Running   0          3s

Получить полное имя Busybox POD:

POD_NAME=$(kubectl get pods -l run=busybox -o jsonpath="{.items[0].metadata.name}")

Выполнить поиск DNS для Кубернаны Сервис внутри Busybox POD:

kubectl exec -ti $POD_NAME -- nslookup kubernetes

вывод

Server:    10.32.0.10
Address 1: 10.32.0.10 kube-dns.kube-system.svc.cluster.local

Name:      kubernetes
Address 1: 10.32.0.1 kubernetes.default.svc.cluster.local

Дымовой тест

В этой лаборатории вы заполните ряд задач, чтобы убедиться, что ваш кластер Kubernetes работает правильно. Теперь мы хотим запустить некоторые основные испытания дыма, чтобы убедиться, что все в нашем кластере работает правильно. Мы проверим следующие функции:

  • Шифрование данных
  • Развертывание
  • Перенаправление порта
  • Журналы
  • Предпринять
  • Услуги
  • Ненадежные рабочие нагрузки

Шифрование данных

В этом разделе вы проверите возможность шифровать секретные данные в покое Отказ

Создайте общий секрет:

  • Цель:
    • Убедитесь, что мы можем зашифровать секретные данные в покое.
  • Стратегия:
    • Создайте общий секрет в кластере.
    • Сбросьте необработанные данные из ETCD и убедитесь, что он зашифрован, мы устанавливаем конфигурацию шифрования данных, чтобы позволить Kubernetes зашифровать конфиденциальные данные. В этом уроке мы будем курить тестирование этой функциональности, создавая несколько секретных данных и проверяя, что она хранится в зашифрованном формате в ETCD. После завершения этого урока вы проверили, что ваш кластер может успешно зашифровать конфиденциальные данные
kubectl create secret generic kubernetes-the-hard-way \
  --from-literal="mykey=mydata"

Распечатать Hexdump из Кубернеты-Твердый путь Секрет хранится в ETCD: Войдите в один из серверов вашего контроллера и получите необработанные данные для Test Secret от EtCD

#  ETCDCTL_API=3 etcdctl get   \
   --endpoints=https://127.0.0.1:2379 \
   --cacert=/etc/etcd/ca.pem \
   --cert=/etc/etcd/kubernetes.pem \
   --key=/etc/etcd/kubernetes-key.pem\
    /registry/secrets/default/kubernetes-the-hard-way | hexdump -C

вывод

00000000  2f 72 65 67 69 73 74 72  79 2f 73 65 63 72 65 74  |/registry/secret|
00000010  73 2f 64 65 66 61 75 6c  74 2f 6b 75 62 65 72 6e  |s/default/kubern|
00000020  65 74 65 73 2d 74 68 65  2d 68 61 72 64 2d 77 61  |etes-the-hard-wa|
00000030  79 0a 6b 38 73 3a 65 6e  63 3a 61 65 73 63 62 63  |y.k8s:enc:aescbc|
00000040  3a 76 31 3a 6b 65 79 31  3a ea 5f 64 1f 22 63 ac  |:v1:key1:._d."c.|
00000050  e5 a0 2d 7f 1e cd e3 03  64 a0 8e 7f cf 58 db 50  |..-.....d....X.P|
00000060  d7 d0 12 a1 31 2e 72 53  e3 51 de 31 53 96 d7 3f  |....1.rS.Q.1S..?|
00000070  71 f5 e3 3f 07 bc 33 56  55 ed 9c 67 6a 91 77 18  |q..?..3VU..gj.w.|
00000080  52 bb ad 61 64 76 43 df  00 b5 aa 7e 8e cb 16 e9  |R..advC....~....|
00000090  9b 5a 21 04 49 37 63 a5  6c df 09 b7 2b 5c 96 69  |.Z!.I7c.l...+\.i|
000000a0  02 03 42 02 93 7d 42 57  c9 8d 28 2d 1c 9d dd 2b  |..B..}BW..(-...+|
000000b0  a3 69 fa ca c8 8f a0 0e  66 c8 5b 5a 40 29 80 0d  |.i......f.[Z@)..|
000000c0  06 c3 56 87 27 ba d2 19  a6 b0 e6 b5 70 b3 18 02  |..V.'.......p...|
000000d0  69 ed ae b1 4d 03 be 92  08 9e 20 62 41 cd e6 a4  |i...M..... bA...|
000000e0  8c e0 fd b0 5f 44 11 a1  e0 99 a4 61 71 b2 c2 98  |...._D.....aq...|
000000f0  b1 f3 bf 48 a5 26 11 8c  9e 4e 12 7a 81 f4 20 11  |...H.&...N.z.. .|
00000100  05 0d db 62 82 53 2c d9  71 0d 9f af d7 e2 b6 94  |...b.S,.q.......|
00000110  4c 67 98 2e 66 21 77 5e  ea 4d f5 23 6c d4 4b 56  |Lg..f!w^.M.#l.KV|
00000120  58 a7 f1 3b 23 8d 5b 45  14 2c 05 3a a9 90 95 a4  |X..;#.[E.,.:....|
00000130  9a 5f 06 cc 42 65 b3 31  d8 9c 78 a9 f1 da a2 81  |._..Be.1..x.....|
00000140  5a a6 f6 d8 7c 2e 8c 13  f0 30 b1 25 ab 6e bb 2f  |Z...|....0.%.n./|
00000150  cd 7f fd 44 98 64 97 9b  31 0a                    |...D.d..1.|
0000015a

Ключ ETCD должен быть префиксирован с K8S: ENC: AESCBC: V1: Key1 , что указывает на AESCBC Поставщик использовался для шифрования данных с Key1 ключ шифрования.

Развертывание

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

Создайте развертывание для nginx веб сервер:

kubectl create deployment nginx --image=nginx

Список POD, созданный nginx Развертывание:

kubectl get pods -l app=nginx

вывод

nginx-6799fc88d8-vtz4c   1/1     Running   0          21s

Перенаправление порта

  • Цель:
    • Убедитесь, что мы можем использовать переадресацию портов для удаленного доступа к стручкам
  • Стратегия:
    • Используйте Kubectl Port-Fired, чтобы настроить переадресацию портов для POD NGINX
    • Доступ к струнию удаленно с завитым. В этом разделе вы проверите возможность доступа к приложениям удаленно использовать Переадресация порта Отказ

Получить полное имя nginx POD:

POD_NAME=$(kubectl get pods -l app=nginx -o jsonpath="{.items[0].metadata.name}")

Передний порт 8080 На вашей местной машине для порта 80 из nginx POD:

kubectl port-forward $POD_NAME 8080:80

вывод

Forwarding from 127.0.0.1:8080 -> 80
Forwarding from [::1]:8080 -> 80

В новом терминале Сделайте HTTP-запрос с помощью адреса пересылки:

curl --head http://127.0.0.1:8080

вывод

HTTP/1.1 200 OK
Server: nginx/1.19.10
Date: Sun, 02 May 2021 05:29:25 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 13 Apr 2021 15:13:59 GMT
Connection: keep-alive
ETag: "6075b537-264"
Accept-Ranges: bytes

Переключитесь обратно на предыдущий терминал и остановите переадресацию порта к nginx POD:

Forwarding from 127.0.0.1:8080 -> 80
Forwarding from [::1]:8080 -> 80
Handling connection for 8080
^C

Журналы

  • Цель:
    • Убедитесь, что мы можем получить журналы контейнеров с помощью журналов Kubectl.
  • Стратегия:
    • Получите журналы с контейнера NGINX POD. При управлении кластером часто необходимо получить доступ к журналам контейнера для проверки своих проблем со здоровьем и диагностикой. Kubernetes предлагает доступ к журналам контейнера через команду kubectl logs. В этом уроке в этом разделе вы проверите способность Получить журналы контейнеров Отказ

Распечатать nginx Журналы POD:

kubectl logs $POD_NAME

вывод

2021/10/26 18:07:29 [notice] 1#1: start worker processes
2021/10/26 18:07:29 [notice] 1#1: start worker process 30
2021/10/26 18:07:29 [notice] 1#1: start worker process 31
127.0.0.1 - - [26/Oct/2021:18:20:44 +0000] "HEAD / HTTP/1.1" 200 0 "-" "curl/7.29.0" "-"

Предпринять

  • Цель:
    • Убедитесь, что мы можем запустить команды в контейнере с kubectl exec
  • Стратегия:
    • Используйте KUBECTL EXEC для запуска команды в контейнере POD NGINX. Команда KUBECTL EXEC — это мощный инструмент управления, который позволяет нам запускать команды внутри контейнеров, управляемых kubernetes. Чтобы убедиться, что наш кластер установлен правильно, нам нужно убедиться, что Rubectl Exec работает. В этом разделе вы проверите возможность Выполнить команды в контейнере Отказ

Распечатайте версию Nginx, выполняя nginx -v команда в nginx контейнер:

kubectl exec -ti $POD_NAME -- nginx -v

вывод

nginx version: nginx/1.21.3

Услуги

  • Цель:
    • Убедитесь, что мы можем создавать и получать доступ к услугам.
    • Убедитесь, что мы можем запустить ненадежную рабочую нагрузку под GVISOR (runsc)
  • Стратегия:
    • Создайте службу NODEPORT, чтобы открыть развертывание Nginx.
    • Доступ к сервису удаленно используя NodePort.
    • Запустите POD как ненадежная рабочая нагрузка.
    • Войдите в рабочий узел, который выполняет POD и убедитесь, что его контейнер работает с использованием runsc. Чтобы убедиться, что кластер правильно устанавливается правильно, нам необходимо убедиться, что услуги могут быть созданы и доступны соответствующим образом. В этом уроке мы будем курить тестирование возможности нашего кластера создавать и получать доступ к услугам, создавая простую службу тестирования и доступ к нему с помощью порта узла. Если мы сможем успешно создать службу и использовать его для доступа к нашему POD NGINX, то мы будем знать, что наш кластер умеет правильно обрабатывать услуги! В этом разделе вы проверите возможность выставить приложения, используя Сервис Отказ

Выставлять nginx Развертывание с использованием NodePort услуга:

kubectl expose deployment nginx --port 80 --type NodePort

Получить порт узла, назначенный на nginx услуга:

NODE_PORT=$(kubectl get svc nginx \
  --output=jsonpath='{range .spec.ports[0]}{.nodePort}')

Сделайте HTTP-запрос, используя внешний IP-адрес и nginx Узел порт:

curl -I http://${EXTERNAL_IP}:${NODE_PORT}

вывод

HTTP/1.1 200 OK
Server: nginx/1.19.10
Date: Sun, 02 May 2021 05:31:52 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 13 Apr 2021 15:13:59 GMT
Connection: keep-alive
ETag: "6075b537-264"
Accept-Ranges: bytes

В этой лаборатории вы удалите вычисленные ресурсы, созданные во время этого урока. Теперь, когда мы закончили тестирование дыма кластера, это хорошая идея, чтобы убрать объекты, которые мы создали для тестирования. В этом уроке мы проведем момент, удаляя объекты, которые были созданы в нашем кластере, чтобы выполнить тестирование дыма

# kubectl delete secret kubernetes-the-hard-way 
# kubectl delete svc nginx 
# kubectl delete deployment nginx

Оригинал: «https://dev.to/haydercyber/k8s-the-hard-way-4nmc»