Как использовать RKE для развертывания готового кластера Kubernetes?
Kubernetes приобрел большую популярность и теперь является стандартным уровнем оркестрации для контейнерных рабочих нагрузок.
Если вам нужна система с открытым исходным кодом для автоматизации развертывания контейнерных приложений, не беспокоясь о масштабировании и управлении, то Kubernetes – подходящий инструмент.
Что такое RKE?
Подготовка рабочей станции
1. kubectl:
--- Linux ---
curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/amd64/kubectl
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl
kubectl version --client
--- macOS ---
curl -LO "https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/darwin/amd64/kubectl"
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl
kubectl version --client
2. rke
--- Linux ---
curl -s https://api.github.com/repos/rancher/rke/releases/latest | grep download_url | grep amd64 | cut -d '"' -f 4 | wget -qi -
chmod +x rke_linux-amd64
sudo mv rke_linux-amd64 /usr/local/bin/rke
rke --version
--- macOS ---
curl -s https://api.github.com/repos/rancher/rke/releases/latest | grep download_url | grep darwin-amd64 | cut -d '"' -f 4 | wget -qi -
chmod +x rke_darwin-amd64
sudo mv rke_darwin-amd64 /usr/local/bin/rke
rke --version
3. helm
--- Helm 3 ---
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh
Установка Kubernetes с RKE
Я буду работать на 5 узлах:
- 3 мастер ноды – etcd и controlplane ( 3 для HA)
- 2 воркер ноды– масштабируйте для удовлетворения ваших потребностей
- Мастера – 8 ГБ ОЗУ и 4 vcpus
- Воркеры – 16 ГБ ОЗУ и 8 vpcus
RKE Поддерживаемые операционные системы
RKE работает практически на любой ОС Linux с установленным Docker.
Rancher был протестирован и поддерживает работу с:
- Red Hat Enterprise Linux
- Oracle Enterprise Linux
- CentOS Linux
- Ubuntu
- RancherOS
Шаг 1: Обновите вашу систему Linux
Первым шагом является обновление ваших машин Linux, которые будут использоваться для создания кластера.
--- CentOS ---
$ sudo yum -y update
$ sudo reboot
--- Ubuntu / Debian ---
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo reboot
Шаг 2: Создайте пользователя rke
Если вы используете Red Hat Enterprise Linux, Oracle Enterprise Linux или CentOS, вы не можете использовать пользователя root в качестве пользователя SSH из-за Bugzilla 1527565.
По этой причине мы создадим учетную запись пользователя с именем rke для целей развертывания.
Используя Ansible Playbook:
---
- name: Create rke user with passwordless sudo
hosts: rke-hosts
remote_user: root
tasks:
- name: Add RKE admin user
user:
name: rke
shell: /bin/bash
- name: Create sudo file
file:
path: /etc/sudoers.d/rke
state: touch
- name: Give rke user passwordless sudo
lineinfile:
path: /etc/sudoers.d/rke
state: present
line: 'rke ALL=(ALL:ALL) NOPASSWD: ALL'
- name: Set authorized key taken from file
authorized_key:
user: rke
state: present
key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"
Создание пользователя вручную на всех хостах
Войдите в каждый из узлов вашего кластера и создайте пользователя rke.
sudo useradd rke
sudo passwd rke
Включите sudo без пароля для пользователя:
$ sudo vim /etc/sudoers.d/rke
rke ALL=(ALL:ALL) NOPASSWD: ALL
for i in rke-master-01 rke-master-02 rke-master-03 rke-worker-01 rke-worker-02; do
ssh-copy-id rke@$i
done
$ ssh rke@rke-master-01 Warning: Permanently added 'rke-master-01,x.x.x.x' (ECDSA) to the list of known hosts. [rke@rke-master-01 ~]$ sudo su - # No password prompt Last login: Mon Jan 27 21:28:53 CET 2020 from y.y.y.y on pts/0 [root@rke-master-01 ~]# exit [rke@rke-master-01 ~]$ exit logout Connection to rke-master-01 closed.
Шаг 3: Включите необходимые модули ядра:
Использование Ansible:
Создайте плейбук с содержимым, показанным ниже и запустите его для инвентаризации ваших серверов RKE.
---
- name: Load RKE kernel modules
hosts: rke-hosts
remote_user: root
vars:
kernel_modules:
- br_netfilter
- ip6_udp_tunnel
- ip_set
- ip_set_hash_ip
- ip_set_hash_net
- iptable_filter
- iptable_nat
- iptable_mangle
- iptable_raw
- nf_conntrack_netlink
- nf_conntrack
- nf_conntrack_ipv4
- nf_defrag_ipv4
- nf_nat
- nf_nat_ipv4
- nf_nat_masquerade_ipv4
- nfnetlink
- udp_tunnel
- veth
- vxlan
- x_tables
- xt_addrtype
- xt_conntrack
- xt_comment
- xt_mark
- xt_multiport
- xt_nat
- xt_recent
- xt_set
- xt_statistic
- xt_tcpudp
tasks:
- name: Load kernel modules for RKE
modprobe:
name: "{{ item }}"
state: present
with_items: "{{ kernel_modules }}"
Ручной способ
Войдите на каждый хост и включите модули ядра, необходимые для запуска Kubernetes.
for module in br_netfilter ip6_udp_tunnel ip_set ip_set_hash_ip ip_set_hash_net iptable_filter iptable_nat iptable_mangle iptable_raw nf_conntrack_netlink nf_conntrack nf_conntrack_ipv4 nf_defrag_ipv4 nf_nat nf_nat_ipv4 nf_nat_masquerade_ipv4 nfnetlink udp_tunnel veth vxlan x_tables xt_addrtype xt_conntrack xt_comment xt_mark xt_multiport xt_nat xt_recent xt_set xt_statistic xt_tcpudp;
do
if ! lsmod | grep -q $module; then
echo "module $module is not present";
fi;
Шаг 4: Отключите SWAP и измените записи sysctl
Рекомендация Kubernetes – отключить swap и добавить некоторые значения sysctl.
С Ansible:
---
- name: Disable swap and load kernel modules
hosts: rke-hosts
remote_user: root
tasks:
- name: Disable SWAP since kubernetes can't work with swap enabled (1/2)
shell: |
swapoff -a
- name: Disable SWAP in fstab since kubernetes can't work with swap enabled (2/2)
replace:
path: /etc/fstab
regexp: '^([^#].*?\sswap\s+.*)$'
replace: '# \1'
- name: Modify sysctl entries
sysctl:
name: '{{ item.key }}'
value: '{{ item.value }}'
sysctl_set: yes
state: present
reload: yes
with_items:
- {key: net.bridge.bridge-nf-call-ip6tables, value: 1}
- {key: net.bridge.bridge-nf-call-iptables, value: 1}
- {key: net.ipv4.ip_forward, value: 1}
Вручную
swap:
$ sudo vim /etc/fstab
# Добавте комментарий
$ sudo swapoff -a
Sysctl:
$ sudo tee -a /etc/sysctl.d/99-kubernetes.conf <<EOF
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
$ sysctl --system
$ free -h
total used free shared buff/cache available
Mem: 7.6G 180M 6.8G 8.5M 633M 7.2G
Swap: 0B 0B 0B
Шаг 5: Установите поддерживаемую версию Docker
Каждая версия Kubernetes поддерживает разные версии Docker.
Примечания к выпуску Kubernetes содержат текущий список проверенных версий Docker.
На момент этой статьи, поддерживаются следующие версии Docker:
Версия Docker | скрипт установки |
---|---|
18.09.2 | curl https://releases.rancher.com/install-docker/18.09.2.sh | sh |
18.06.2 | curl https://releases.rancher.com/install-docker/18.06.2.sh | sh |
17.03.2 | curl https://releases.rancher.com/install-docker/17.03.2.sh | sh |
curl https://releases.rancher.com/install-docker/18.09.2.sh | sudo bash -
Запустите и включите службу Docker:
sudo systemctl enable --now docker
$ sudo docker version --format '{{.Server.Version}}'
18.09.2
Добавить пользователя rke в группу Docker.
$ sudo usermod -aG docker rke
$ id rke
uid=1000(rke) gid=1000(rke) groups=1000(rke),994(docker)
Шаг 6: Откройте порты на брандмауэре
- Для установки с одним узлом вам нужно только открыть порты, необходимые для того, чтобы Rancher мог взаимодействовать с нижестоящими пользовательскими кластерами.
- Для установки HA необходимо открыть те же порты, а также дополнительные порты, необходимые для настройки кластера Kubernetes, на котором установлен Rancher.
Таблицу портов можно посмотреть тут : https://rancher.com/docs/rancher/v2.x/en/installation/requirements/#operating-systems-and-docker-requirements
TCP-порты:
for i in 22 80 443 179 5473 6443 8472 2376 8472 2379-2380 9099 10250 10251 10252 10254 30000-32767; do
sudo firewall-cmd --add-port=${i}/tcp --permanent
done
sudo firewall-cmd --reload
for i in 8285 8472 4789 30000-32767; do
sudo firewall-cmd --add-port=${i}/udp --permanent
done
Шаг 6: разрешить проброс SSH TCP
Вам необходимо включить общесистемный проброс TCP вашего сервера SSH.
Откройте файл конфигурации ssh, расположенный в /etc/ssh/sshd_config:
$ sudo vi /etc/ssh/sshd_config
AllowTcpForwarding yes
Перезапустите службу ssh после внесения изменений.
--- CentOS ---
$ sudo systemctl restart sshd
--- Ubuntu ---
$ sudo systemctl restart ssh
Шаг 7: Сгенерируйте файл конфигурации кластера RKE.
RKE использует файл конфигурации кластера, называемый cluster.yml, чтобы определить, какие узлы будут в кластере и как развернуть Kubernetes.
Есть много параметров конфигурации, которые могут быть установлены в cluster.yml.
Этот файл может быть создан из минимальных примеров шаблонов или сгенерирован командой rke config.
Запустите команду rke config, чтобы создать новый cluster.yml в вашем текущем каталоге.
rke config --name cluster.yml
Эта команда запросит у вас всю информацию, необходимую для создания кластера.
Если вы хотите создать пустой файл шаблона cluster.yml, укажите флаг –empty.
rke config --empty --name cluster.yml
Вот так выглядит мой файл конфигурации кластера – не копируйте и не вставляйте, просто используйте его как ссылку для создания собственной конфигурации.
# https://rancher.com/docs/rke/latest/en/config-options/
nodes:
- address: 10.10.1.10
internal_address:
hostname_override: rke-master-01
role: [controlplane, etcd]
user: rke
- address: 10.10.1.11
internal_address:
hostname_override: rke-master-02
role: [controlplane, etcd]
user: rke
- address: 10.10.1.12
internal_address:
hostname_override: rke-master-03
role: [controlplane, etcd]
user: rke
- address: 10.10.1.13
internal_address:
hostname_override: rke-worker-01
role: [worker]
user: rke
- address: 10.10.1.114
internal_address:
hostname_override: rke-worker-02
role: [worker]
user: rke
# using a local ssh agent
# Using SSH private key with a passphrase - eval `ssh-agent -s` && ssh-add
ssh_agent_auth: true
# SSH key that access all hosts in your cluster
ssh_key_path: ~/.ssh/id_rsa
# By default, the name of your cluster will be local
# Set different Cluster name
cluster_name: rke
# Fail for Docker version not supported by Kubernetes
ignore_docker_version: false
# prefix_path: /opt/custom_path
# Set kubernetes version to install: https://rancher.com/docs/rke/latest/en/upgrades/#listing-supported-kubernetes-versions
# Check with -> rke config --list-version --all
kubernetes_version:
# Etcd snapshots
services:
etcd:
backup_config:
interval_hours: 12
retention: 6
snapshot: true
creation: 6h
retention: 24h
kube-api:
# IP range for any services created on Kubernetes
# This must match the service_cluster_ip_range in kube-controller
service_cluster_ip_range: 10.43.0.0/16
# Expose a different port range for NodePort services
service_node_port_range: 30000-32767
pod_security_policy: false
kube-controller:
# CIDR pool used to assign IP addresses to pods in the cluster
cluster_cidr: 10.42.0.0/16
# IP range for any services created on Kubernetes
# # This must match the service_cluster_ip_range in kube-api
service_cluster_ip_range: 10.43.0.0/16
kubelet:
# Base domain for the cluster
cluster_domain: cluster.local
# IP address for the DNS service endpoint
cluster_dns_server: 10.43.0.10
# Fail if swap is on
fail_swap_on: false
# Set max pods to 150 instead of default 110
extra_args:
max-pods: 150
# Configure network plug-ins
# KE provides the following network plug-ins that are deployed as add-ons: flannel, calico, weave, and canal
# After you launch the cluster, you cannot change your network provider.
# Setting the network plug-in
network:
plugin: canal
options:
canal_flannel_backend_type: vxlan
# Specify DNS provider (coredns or kube-dns)
dns:
provider: coredns
# Currently, only authentication strategy supported is x509.
# You can optionally create additional SANs (hostnames or IPs) to
# add to the API server PKI certificate.
# This is useful if you want to use a load balancer for the
# control plane servers.
authentication:
strategy: x509
sans:
- "k8s.computingforgeeks.com"
# Set Authorization mechanism
authorization:
# Use `mode: none` to disable authorization
mode: rbac
# Currently only nginx ingress provider is supported.
# To disable ingress controller, set `provider: none`
# `node_selector` controls ingress placement and is optional
ingress:
provider: nginx
options:
use-forwarded-headers: "true"
role: [controlplane, etcd, worker]
Шаг 7. Развертывание кластера Kubernetes с помощью RKE.
Создав файл cluster.yml, вы можете развернуть кластер с помощью простой команды.
rke up
$ rke up --config ./rancher_cluster.yml
Убедитесь, что в настройках нет ошибок на выводе:
......
INFO[0181] [sync] Syncing nodes Labels and Taints
INFO[0182] [sync] Successfully synced nodes Labels and Taints
INFO[0182] [network] Setting up network plugin: canal
INFO[0182] [addons] Saving ConfigMap for addon rke-network-plugin to Kubernetes
INFO[0183] [addons] Successfully saved ConfigMap for addon rke-network-plugin to Kubernetes
INFO[0183] [addons] Executing deploy job rke-network-plugin
INFO[0189] [addons] Setting up coredns
INFO[0189] [addons] Saving ConfigMap for addon rke-coredns-addon to Kubernetes
INFO[0189] [addons] Successfully saved ConfigMap for addon rke-coredns-addon to Kubernetes
INFO[0189] [addons] Executing deploy job rke-coredns-addon
INFO[0195] [addons] CoreDNS deployed successfully..
INFO[0195] [dns] DNS provider coredns deployed successfully
INFO[0195] [addons] Setting up Metrics Server
INFO[0195] [addons] Saving ConfigMap for addon rke-metrics-addon to Kubernetes
INFO[0196] [addons] Successfully saved ConfigMap for addon rke-metrics-addon to Kubernetes
INFO[0196] [addons] Executing deploy job rke-metrics-addon
INFO[0202] [addons] Metrics Server deployed successfully
INFO[0202] [ingress] Setting up nginx ingress controller
INFO[0202] [addons] Saving ConfigMap for addon rke-ingress-controller to Kubernetes
INFO[0202] [addons] Successfully saved ConfigMap for addon rke-ingress-controller to Kubernetes
INFO[0202] [addons] Executing deploy job rke-ingress-controller
INFO[0208] [ingress] ingress controller nginx deployed successfully
INFO[0208] [addons] Setting up user addons
INFO[0208] [addons] no user addons defined
INFO[0208] Finished building Kubernetes cluster successfully
Шаг 8: Доступ к вашему кластеру Kubernetes
Как часть процесса создания Kubernetes, файл kubeconfig был создан и записан в kube_config_cluster.yml.
Установите переменную KUBECONFIG для сгенерированного файла.
export KUBECONFIG=./kube_config_cluster.yml
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
rke-master-01 Ready controlplane,etcd 16m v1.17.0
rke-master-02 Ready controlplane,etcd 16m v1.17.0
rke-master-03 Ready controlplane,etcd 16m v1.17.0
rke-worker-01 Ready worker 6m33s v1.17.0
rke-worker-02 Ready worker 16m v1.17.0
mkdir ~/.kube
cp kube_config_rancher-cluster.yml ~/.kube/config