суббота, 28 декабря 2019 г.

смена версии python на ansible


Смена версии Python на Ansible 2.9. В /etc/ansible/hosts меняем в inventory интерпретатор на python3



[local]
## alpha.example.org
## beta.example.org
192.168.0.11
## 192.168.1.110


[local:vars]
ansible_python_interpreter=/usr/bin/python3

среда, 23 октября 2019 г.

nginx location regexp/регулярка

Регулярка для закрытия/открытия доступа к определенным папкам.
В этом примере закрываем доступ в папку sms и voice.

location ~* (/path/to/folder/sms|/path/to/folder/voice)($|\/) {
...
deny all;
}

понедельник, 21 октября 2019 г.

Снимаем свои метрики в node_exporter

Понадобилось снимать свои метрики в Prometheus и Node Exporter. Больше информации тут: https://www.robustperception.io/using-the-textfile-collector-from-a-shell-script


1) Создаем service в  /etc/systemd/system/node_exporter.service и запускаем service с ключом --collector.textfile.directory=/var/lib/node_exporter/textfile_collector

[Unit]
Description=node_exporter

[Service]
User=root
Group=root
Type=Simple
ExecStart=/etc/node_exporter/node_exporter --collector.textfile.directory=/var/lib/node_exporter/textfile_collector
WorkingDirectory=/etc/node_exporter
TimeoutSec=15
Restart=always

[Install]
WantedBy=multi-user.target


2)  Сам баш скрипт.


#!/bin/bash
# Adjust as needed.
#https://www.robustperception.io/using-the-textfile-collector-from-a-shell-script
TEXTFILE_COLLECTOR_DIR=/var/lib/node_exporter/textfile_collector/
# Note the start time of the script.
# Your code goes here.
sleep 10
# Write out metrics to a temporary file.
END="$(cat /var/log/cron | wc -l)"
cat << EOF > "$TEXTFILE_COLLECTOR_DIR/test.prom.$$"
test $END
EOF
# Rename the temporary file atomically.
# This avoids the node exporter seeing half a file.
mv "$TEXTFILE_COLLECTOR_DIR/test.prom.$$" \
"$TEXTFILE_COLLECTOR_DIR/test.prom"

пятница, 27 сентября 2019 г.

вторник, 3 сентября 2019 г.

пятница, 30 августа 2019 г.

Установка Kubernetes + calico CNI/Install Kubernetes with calico CNI

Устанавливаю Kubernetes с CNI Calico.

Версия ПО и требования к железу на момент написания статьи.

1. Docker 18.09 (последняя стабильная версия поддерживаемая кубером)
2. Kubernetes 15.3
3. CNI Calico 3.8
4. отключить swap
5. минимум 2(обязательно) ядра ЦП и 3ГБ ОЗУ(желательно)


1)  Устанавливаем Докер версии 18.09 следуя инструкцииhttps://docs.docker.com/install/linux/docker-ce/ubuntu/


2) Kubernetes install
      
apt-get update && apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
apt-get update
apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl


3) kubeadm init --pod-network-cidr=172.16.0.0/12 --control-plane-endpoint "192.168.0.131:6443" --upload-certs

ВЫВОД:

root@osboxes:/home/nurlan# kubeadm init --pod-network-cidr=172.16.0.0/12
[init] Using Kubernetes version: v1.15.3
[preflight] Running pre-flight checks
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of your internet connection
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Activating the kubelet service
[certs] Using certificateDir folder "/etc/kubernetes/pki"
[certs] Generating "ca" certificate and key
[certs] Generating "apiserver-kubelet-client" certificate and key
[certs] Generating "apiserver" certificate and key
[certs] apiserver serving cert is signed for DNS names [osboxes kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 192.168.0.112]
[certs] Generating "front-proxy-ca" certificate and key
[certs] Generating "front-proxy-client" certificate and key
[certs] Generating "etcd/ca" certificate and key
[certs] Generating "etcd/server" certificate and key
[certs] etcd/server serving cert is signed for DNS names [osboxes localhost] and IPs [192.168.0.112 127.0.0.1 ::1]
[certs] Generating "etcd/peer" certificate and key
[certs] etcd/peer serving cert is signed for DNS names [osboxes localhost] and IPs [192.168.0.112 127.0.0.1 ::1]
[certs] Generating "etcd/healthcheck-client" certificate and key
[certs] Generating "apiserver-etcd-client" certificate and key
[certs] Generating "sa" key and public key
[kubeconfig] Using kubeconfig folder "/etc/kubernetes"
[kubeconfig] Writing "admin.conf" kubeconfig file
[kubeconfig] Writing "kubelet.conf" kubeconfig file
[kubeconfig] Writing "controller-manager.conf" kubeconfig file
[kubeconfig] Writing "scheduler.conf" kubeconfig file
[control-plane] Using manifest folder "/etc/kubernetes/manifests"
[control-plane] Creating static Pod manifest for "kube-apiserver"
[control-plane] Creating static Pod manifest for "kube-controller-manager"
[control-plane] Creating static Pod manifest for "kube-scheduler"
[etcd] Creating static Pod manifest for local etcd in "/etc/kubernetes/manifests"
[wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory "/etc/kubernetes/manifests". This can take up to 4m0s
[kubelet-check] Initial timeout of 40s passed.
[apiclient] All control plane components are healthy after 40.086714 seconds
[upload-config] Storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace
[kubelet] Creating a ConfigMap "kubelet-config-1.15" in namespace kube-system with the configuration for the kubelets in the cluster
[upload-certs] Skipping phase. Please see --upload-certs
[mark-control-plane] Marking the node osboxes as control-plane by adding the label "node-role.kubernetes.io/master=''"
[mark-control-plane] Marking the node osboxes as control-plane by adding the taints [node-role.kubernetes.io/master:NoSchedule]
[bootstrap-token] Using token: x8xiz4.38svqa5kf4t6vtwu
[bootstrap-token] Configuring bootstrap tokens, cluster-info ConfigMap, RBAC Roles
[bootstrap-token] configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials
[bootstrap-token] configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token
[bootstrap-token] configured RBAC rules to allow certificate rotation for all node client certificates in the cluster
[bootstrap-token] Creating the "cluster-info" ConfigMap in the "kube-public" namespace
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:


4)Выполняем

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config


5) Сохраняем токен в надежное место, в дальнейшем он понадобится для добавления воркеров и мастер-нодов

   kubeadm join 192.168.0.112:6443 --token x8xiz4.38svqa5kf4t6vtwu \
    --discovery-token-ca-cert-hash sha256:7d937af3216263a79f5c83e4bab1b0fa4b580e560f30c27e05cf398b233f75b5

6) Проверяем список подов и видим что некоторые поды в статусе Pending, это означает что не установлен плагин сети. Я использую Calico

   kubectl get pods -A
   NAMESPACE     NAME                              READY   STATUS    RESTARTS   AGE
   kube-system   coredns-5c98db65d4-c9kbh          0/1     Pending   0          39m
   kube-system   coredns-5c98db65d4-hbc8n          0/1     Pending   0          39m
   kube-system   etcd-osboxes                      1/1     Running   0          38m
   kube-system   kube-apiserver-osboxes            1/1     Running   0          38m
   kube-system   kube-controller-manager-osboxes   1/1     Running   0          38m
   kube-system   kube-proxy-4vwbd                  1/1     Running   0          39m
   kube-system   kube-scheduler-osboxes            1/1     Running   0          38m

7) curl https://docs.projectcalico.org/v3.8/manifests/calico.yaml -O
редактируем скачанный calico.yaml, меняем подсеть с 192.168.0.0/16 на 172.16.0.0/12 и применяем файл kubectl apply -f calico.yaml

8) через несколько минут состояние контейнеров из Pending станет Running

   kubectl get pods -A
   NAMESPACE     NAME                                       READY   STATUS    RESTARTS   AGE
   kube-system   calico-kube-controllers-65b8787765-hxmnl   1/1     Running   0          72s
   kube-system   calico-node-6kphm                          1/1     Running   0          2m26s
   kube-system   coredns-5c98db65d4-c9kbh                   1/1     Running   0          62m
   kube-system   coredns-5c98db65d4-hbc8n                   1/1     Running   0          62m
   kube-system   etcd-osboxes                               1/1     Running   0          61m
   kube-system   kube-apiserver-osboxes                     1/1     Running   0          61m
   kube-system   kube-controller-manager-osboxes            1/1     Running   0          61m
   kube-system   kube-proxy-4vwbd                           1/1     Running   0          62m

   kube-system   kube-scheduler-osboxes                     1/1     Running   0          61m

четверг, 1 августа 2019 г.

helm упаковка своего приложения и выкат в свой репозитории.

Бывает необходимо чтобы ваше упакованное приложение для Kubernetes хранилось в какой-нибудь онлайн репозитории для установки из любой точки мира, например в GitHub.
Например я упаковал в Helm Grafana со своим дашбордом, дабы каждый раз не настраивать и т.д

Для этого нам понадобится установленный Helm в вашем кластере и уже настроенный chart.


1. helm package /home/ubuntu/test-chart  - после создание архива tar.gz с вашим приложением, перемещаем его в корень test-chart
2. cd /home/ubuntu/test-chart - переходим в корень вашего приложения
3. helm repo index .  --url https://nurlan199206.github.io/test-chart - после этой команды генерируется файл index.yaml
4) Пушим в GitHub
5) в настройках GitHub включаем GitHub Pages
6) helm repo add test-chart https://youraccount.github.io/test-chart
7) helm repo list - проверяем добавился ли новый репозитории
8) helm install test/test-chart --name test


среда, 31 июля 2019 г.

git merge branch с master

Пример добавления изменений из ветки mybranch1 в ветку master.

git branch -b mybranch1 - создаем новую ветку, пропускаем этот шаг, если ветку уже создали.
git checkout mybranch1 - переходим в ветку mybranch1
git add . 
git commit -m "prometheus-chart"
git checkout master - переходим в ветку master
git merge mybranch1 - делаем merge в master ветку из mybranch1.
git push origin master - пушим измененный мастер в github

git tag

Иногда бывает необходимость пушить в git код под определенным тэгом. Например v2.0.

Примеры

1. git tag -a v2.0 -m 'v2.0' - создаем новый тэг v2.0
2. git push origin v2.0 - пушим новый тэг
3. git tag - посмотреть список тэгов



пятница, 26 июля 2019 г.

Kubernetes - nodeSelector запуска пода на определенной ноде



Иногда бывает необходимость запускать поды именно на какой-либо ноде...
Для этого использую nodeSelector.


1. kubectl label node YOURNODE1 hehe=fortest - создаю лэйбл с меткой hehe=fortest
2. kubectl get nodes --show-labels - получаем лейблы из нод

beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,hehe=fortest,kubernetes.io/arch=amd64,kubernetes.io/hostname=kubernetes1,kubernetes.io/os=linux,node-role.kubernetes.io/master=,node=master1

среда, 24 июля 2019 г.

Service account GCP для взаимодействия с Compute app

  1. Open the Google Cloud Platform Console Credentials page.
  2. If it's not already selected, select the project that you're creating credentials for.
  3. To set up a new service account, click New credentials and then select Service account key.
  4. Choose the service account to use for the key.
  5. Choose whether to download the service account's public/private key as a standard P12 file, or as a JSON file that can be loaded by a Google API client library.
подробнее тут: https://support.google.com/cloud/answer/6158849?hl=en&ref_topic=6262490#serviceaccounts

Необходимо получить доступы для Ansible к GCP, нашел мануал выше.

пятница, 19 июля 2019 г.

Continious Deployment через pod с kubectl

В данный момент играюсь с GitLab, Kubernetes и CI/CD.

Легенда:
Kubernetes 1.14.3
kubectl pod 1.14.3


Для того чтобы делать CD, нашел специально собранный для этого образ.

Для Continious Deployment в GitLab понадобится добавить следующие переменные в Settings > Variables.


воскресенье, 14 июля 2019 г.

kubeadm join: error execution phase check-etcd: etcd cluster is not healthy: context deadline exceeded

При присоединении нового мастера в кластер была ошибка выше.

Помогло следующее решение.

1) т.к etcd у меня запущен в поде, заходим в него через shell и удаляем лишний зависшее значение нода.

Легенда:

1. 10.132.0.2 - мастер нода с pod'ом etcd
2. 10.132.0.4 - зависший мастер который остался в etcd

В моем случае было: b87bf07b1961a4e7: name=kubernetes3 peerURLs=https://10.132.0.4:2380 clientURLs=https://10.132.0.4:2379 isLeader=false

=======================================================


etcdctl --endpoints https://10.132.0.2:2379 --ca-file /etc/kubernetes/pki/etcd/ca.crt --cert-file /etc/kubernetes/pki/etcd/server.crt --key-file /etc/kubernetes/pki/etcd/server.key member list 

etcdctl --endpoints https://10.132.0.2:2379 --ca-file /etc/kubernetes/pki/etcd/ca.crt --cert-file /etc/kubernetes/pki/etcd/server.crt --key-file /etc/kubernetes/pki/etcd/server.key member remove b87bf07b1961a4e7

среда, 10 июля 2019 г.

установка haproxy_exporter на ubuntu 18.10

1) качаем под свою архитектуру бинарник: https://github.com/prometheus/haproxy_exporter/releases/download/v0.10.0/haproxy_exporter-0.10.0.linux-amd64.tar.gz

2) распаковываем архив tar xvzf haproxy_exporter-0.10.0.linux-amd64.tar.gz

3) переходим в папку с бинарником и делаем его исполняемым cd haproxy_exporter.... && mv haproxy_exporter /usr/bin


4) пишем service для systemctl в /etc/systemd/system/haproxy_exporter.service

[Unit]
Description=haproxy_exporter

[Service]
ExecStart=/usr/bin/haproxy_exporter
WorkingDirectory=/usr/bin
TimeoutSec=15
Restart=always

[Install]

WantedBy=multi-user.target

5) запускаем... systemctl start haproxy_exporter.service

понедельник, 8 июля 2019 г.

опрашиваем curl'ом API kubernetes сервера

Понадобилось выяснить есть ли коннект к API кубера, нашел решение.


1) на сервере Kubernetes пишем: kubectl get secrets

2) получаем secret на подобие: default-token-xxxxx

3) создаем роль kube-admin.yaml и применяем его kubectl apply -f kube-admin.yaml

apiVersion: v1
kind: ServiceAccount
metadata:
  name: kube-admin
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: kube-admin
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: kube-admin
  namespace: kube-system

4) получаем токен: kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep gitlab-admin | awk '{print $1}')

5) получаем ключ:  kubectl get secret <secret name> -o jsonpath="{['data']['ca\.crt']}" | base64 --decode

6) на своем компе создаем файл ca.crt и вставляем туда полученный ключ и токен.

7) curl -k --cacert ca.crt -H "Authorization: Bearer eyJhb...тут будет токен" https://YOURIP:6443/api/v1/namespaces/default/pods

8)  получаем значения в JSON формате.


        "hostIP": "10.164.15.224",

        "podIP": "172.19.64.36",

        "startTime": "2019-07-04T09:15:58Z",
        "containerStatuses": [
          {
            "name": "wordpress",
            "state": {
              "running": {
                "startedAt": "2019-07-08T15:26:03Z"
              }
            },