вторник, 27 ноября 2018 г.

Установка кластера Kubernetes c помощью SaltStack

Чтобы установить и настроить кластер Kubernetes c помощью SaltStack можно использовать готовую формулу - salt-formula-kubernetes.

1) Скачиваем формулу salt-formula-kubernetes:
cd /srv/formulas
git clone https://github.com/salt-formulas/salt-formula-kubernetes.git
2) Для кластера также потребуется установить etcd. Скачиваем формулу salt-formula-etcd:
cd /srv/formulas
git clone https://github.com/salt-formulas/salt-formula-etcd.git
3) Добавляем скачанные формулы в конфиг salt-мастера - /etc/salt/master:
file_roots:
  base:
    - /srv/salt/base
    - /srv/formulas/salt-formula-etcd
    - /srv/formulas/salt-formula-kubernetes
Примечание: примеры настроек, скриптов и salt-стейтов, используемых в дальнейшем, можно взять из репозитория https://github.com/itrm/salt-for-kube:
git clone https://github.com/itrm/salt-for-kube.git
Содержимое репозитория нужно скопировать в папку /srv.

4) Kubernetes использует TLS для связи между компонентами. TLS-сертификаты создаём с помощью утилит cfssl.
Примеры настроек и скрипт для генерации сертификатов можно взять из папки https://github.com/itrm/salt-for-kube/tree/master/scripts/k8s-certs

4.1 Скачиваем утилиты cfssl и cfssljson:
wget --https-only --timestamping https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
chmod +x cfssl_linux-amd64 cfssljson_linux-amd64
mv cfssl_linux-amd64 /usr/local/bin/cfssl
mv cfssljson_linux-amd64 /usr/local/bin/cfssljson

4.2 Создаём файл ca-csr.json по образцу https://github.com/itrm/salt-for-kube/blob/master/scripts/k8s-certs/ca-csr.json

4.3 Создаём ca-сертификат:
cfssl gencert -initca ca-csr.json | cfssljson -bare ca

4.4 Создаём ca-config.json по образцу https://github.com/itrm/salt-for-kube/blob/master/scripts/k8s-certs/ca-config.json

4.5 Создаём файл kubernetes-csr.json по образцу https://github.com/itrm/salt-for-kube/blob/master/scripts/k8s-certs/kubernetes-csr.json

4.6 Создаём остальные сертификаты:
cfssl gencert   -ca=ca.pem   -ca-key=ca-key.pem   -config=ca-config.json   -profile=kubernetes   kubernetes-csr.json | cfssljson -bare kubernetes
cfssl gencert   -ca=ca.pem   -ca-key=ca-key.pem   -config=ca-config.json   -profile=kubernetes   kubernetes-csr.json | cfssljson -bare kubelet-client
cfssl gencert   -ca=ca.pem   -ca-key=ca-key.pem   -config=ca-config.json   -profile=kubernetes   kubernetes-csr.json | cfssljson -bare kube-controller-manager-client
cfssl gencert   -ca=ca.pem   -ca-key=ca-key.pem   -config=ca-config.json   -profile=kubernetes   kubernetes-csr.json | cfssljson -bare kube-scheduler-client
cfssl gencert   -ca=ca.pem   -ca-key=ca-key.pem   -config=ca-config.json   -profile=kubernetes   kubernetes-csr.json | cfssljson -bare kube-proxy-client
cfssl gencert   -ca=ca.pem   -ca-key=ca-key.pem   -config=ca-config.json   -profile=kubernetes   kubernetes-csr.json | cfssljson -bare etcd-server
cfssl gencert   -ca=ca.pem   -ca-key=ca-key.pem   -config=ca-config.json   -profile=kubernetes   kubernetes-csr.json | cfssljson -bare etcd-client
4.7 Копируем сертификаты для kubernetes в папку /srv/salt/base/_certs/kubernetes:
mkdir -p /srv/salt/base/_certs/kubernetes
cp kubernetes-key.pem /srv/salt/base/_certs/kubernetes/kubernetes-server.key
cp kubernetes.pem /srv/salt/base/_certs/kubernetes/kubernetes-server.crt
cp ca.pem /srv/salt/base/_certs/kubernetes/ca-kubernetes.crt
cp ca-key.pem /srv/salt/base/_certs/kubernetes/ca-kubernetes.key
cp kubelet-client-key.pem /srv/salt/base/_certs/kubernetes/kubelet-client.key
cp kubelet-client.pem /srv/salt/base/_certs/kubernetes/kubelet-client.crt
cp kube-controller-manager-client.pem /srv/salt/base/_certs/kubernetes/kube-controller-manager-client.crt
cp kube-controller-manager-client-key.pem /srv/salt/base/_certs/kubernetes/kube-controller-manager-client.key
cp kube-scheduler-client-key.pem /srv/salt/base/_certs/kubernetes/kube-scheduler-client.key
cp kube-scheduler-client.pem /srv/salt/base/_certs/kubernetes/kube-scheduler-client.crt
cp kube-proxy-client.pem /srv/salt/base/_certs/kubernetes/kube-proxy-client.crt
cp kube-proxy-client-key.pem /srv/salt/base/_certs/kubernetes/kube-proxy-client.key
4.8 Копируем сертификаты для etcd в папку /srv/salt/base/_certs/etcd:
mkdir /srv/salt/base/_certs/etcd
cp ca.pem /srv/salt/base/_certs/etcd/ca.pem
cp etcd-server.pem /srv/salt/base/_certs/etcd/etcd-server.crt
cp etcd-server-key.pem /srv/salt/base/_certs/etcd/etcd-server.key
cp etcd-client.pem /srv/salt/base/_certs/etcd/etcd-client.crt
cp etcd-client-key.pem /srv/salt/base/_certs/etcd/etcd-client.key
Шаги 4.6 - 4.8 можно также выполнить с помощью скрипта https://github.com/itrm/salt-for-kube/blob/master/scripts/k8s-certs/generate_ssl.sh

5) Копируем сертификаты kubernetes на все ноды.
Запускаем стейт:
salt -C 'G@roles:kube-master' state.sls kube-ssl
salt -C 'G@roles:kube-node' state.sls kube-ssl
6) Копируем сертификаты etcd на мастер ноды.
Запускаем стейт:
salt -C 'G@roles:kube-master' state.sls etcd-ssl
7) Затем нужно создать pillar файлы соответствующие вашему kubernetes кластеру. Для мастер-нод и для рабочих нод создаём разные файлы.

7.1 pillar-файл для мастер-нод /srv/pillar/kube-master.sls:
https://github.com/itrm/salt-for-kube/blob/master/pillar/kube-master.sls
7.2 Создаём pillar-файл для рабочих-нод /srv/pillar/kube-node.sls по образцу https://github.com/itrm/salt-for-kube/blob/master/pillar/kube-node.sls

8) Добавляем в файл /srv/pillar/top.sls строки по образцу https://github.com/itrm/salt-for-kube/blob/master/pillar/top.sls

9) Добавляем в файл /srv/salt/base/top.sls строки по образцу https://github.com/itrm/salt-for-kube/blob/master/salt/base/top.sls

10) Устанавливаем docker на все ноды кластера.
Запускаем стейт:
salt -C 'G@roles:kube-master' state.sls docker
salt -C 'G@roles:kube-node' state.sls docker
11) Теперь всё готово для установки kubernetes-кластера
salt -C 'G@roles:kube-master' state.highstate
salt -C 'G@roles:kube-node' state.highstate

пятница, 13 июля 2018 г.

Создание бесплатного TLS сертификата для сайта

С развитием сайта и в случае, если сайт предоставляет сервисы для клиентов, появляется необходимость обеспечения безопасного соединения клиентов с сайтом. Поэтому многие сайты переходят с протокола HTTP на HTTPS.
Для работы HTTPS версии сайта требуются TLS (SSL) сертификаты. Раньше сертификаты нужно было покупать в специализированных центрах сертификации, но c появлением технологии Let’s Encrypt, сертификаты теперь можно получить бесплатно.
Расскажем как можно получить такой сертификат, а также как настроить автоматическое продление TLS сертификата, ведь срок действия letsencrypt-сертификата составляет всего 3 месяца.

Перед началом убеждаемся, что у нас установлены python и git.

Затем нужно настроить web-сервер для того, чтобы он смог обработать запрос на подтверждение подлинности сайта, т.е. что сертификат запросил именно владелец сайта, а не кто-то другой. Для этого в конфигурационный файл сайта в nginx добавляем такой location:
location /.well-known/ {
  root /var/www/html;
}
И перезагружаем nginx:
service nginx reload
А для apache такие настройки:
Alias /.well-known /var/www/html/.well-known
<Directory "/var/www/html">
 Require all granted
 RewriteEngine off
</Directory>
И перезагружаем apache:
service apache2 reload

Далее скачиваем специализированное ПО для получения сертификата, называемое certbot:
cd /root
git clone https://github.com/certbot/certbot
Теперь всё готово, сертификат получаем такой командой:
cd /root/certbot/
./certbot-auto certonly --webroot -w /var/www/html -d <ваш_домен> -d www.<ваш_домен>
Certbot сохранит сделанные сертификаты в папке /etc/letsencrypt/live/<ваш_домен>/

Теперь настраиваем web-сервер для работы сайта по HTTPS. Для nginx настройки могут быть такие:
server {
  listen 443 ssl http2;
  server_name <ваш_домен> www.<ваш_домен>;

  ssl on;
  ssl_certificate /etc/letsencrypt/live/<ваш_домен>/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/<ваш_домен>/privkey.pem;

  error_log /var/log/nginx/<ваш_домен>-errors.log;
  access_log /var/log/nginx/<ваш_домен>-access.log;

  location /.well-known/ {
    root /var/www/html;
  }

  location / {
    root /var/www/<ваш_домен>;
  }
}
Для apache:
<VirtualHost *:443>
 DocumentRoot /var/www/<ваш_домен>
 ServerName <ваш_домен>
 ServerAlias www.<ваш_домен>

 ErrorLog /var/log/apache2/<ваш_домен>-error.log
 CustomLog /var/log/apache2/<ваш_домен>-access.log common

 SSLEngine on
 SSLCertificateFile /etc/letsencrypt/live/<ваш_домен>/fullchain.pem
 SSLCertificateKeyFile /etc/letsencrypt/live/<ваш_домен>/privkey.pem

 Alias /.well-known /var/www/html/.well-known
 <Directory "/var/www/html">
   Require all granted
   RewriteEngine off
 </Directory>

 <Directory "/var/www/<ваш_домен>">
   Require all granted
 </Directory>
</VirtualHost>
Перезагружаем web-сервер для применения настроек.
Чтобы по истечении срока годности сертификата сertbot продлил его автоматически, добавляем в /etc/crontab строки:
# Update all TLS certs
22 13 * * * root /root/certbot/certbot-auto renew -q --no-self-upgrade --post-hook 'service nginx restart'
Или, в случае с apache:
# Update all TLS certs
22 13 * * * root /root/certbot/certbot-auto renew -q --no-self-upgrade --post-hook 'service apache2 restart'

Теперь все готово, можно пользоваться https версией сайта!