Thank you for reading this post, don't forget to subscribe!
- Установка ingress отдельно после установки кластера
- Установка ingress на worker ноды
- Включение basic аутентификации для dashboard
Предварительно на ВСЕ ноды ставим
yum install sshpass
и правим время:
rm -rf /etc/localtime && ln -s /usr/share/zoneinfo/Asia/Bishkek /etc/localtime && /usr/sbin/ntpdate -u pool.ntp.org && date
далее:
[root@ansible ~]# mkdir southbridge-kubespray
[root@ansible ~]# cd southbridge-kubespray/
[root@ansible southbridge-kubespray]# git clone https://github.com/southbridgeio/kubespray
[root@ansible southbridge-kubespray]# cd kubespray/
[root@ansible kubespray]# yum install -y ansible sshpass python-netaddr python2-jmespath python2-ruamel-yaml python-pip
[root@ansible kubespray]# pip install --upgrade jinja2
отметим сразу что Ingress-controller мы будет ставить отдельно на мастера а не на отдельную тачку, поэтому мы поправим значения в инвентори файле:
inventory/s000/inventory.ini
и в addon:
inventory/s000/group_vars/k8s-cluster/addons.yml
[root@ansible kubespray]# cat inventory/s000/inventory.ini
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
kub-master-201 ansible_host=192.168.1.201 ip=192.168.1.201 kub-master-202 ansible_host=192.168.1.202 ip=192.168.1.202 kub-master-203 ansible_host=192.168.1.203 ip=192.168.1.203 #kub-ingress ansible_host=192.168.1.206 ip=192.168.1.206 kub-worker-204 ansible_host=192.168.1.204 ip=192.168.1.204 #kub-worker-205 ansible_host=192.168.1.205 ip=192.168.1.205 [kube-master] kub-master-201 kub-master-202 kub-master-203 [etcd] kub-master-201 kub-master-202 kub-master-203 [kube-node] kub-worker-204 #kub-ingress #kub-worker-205 [kube-ingress] kub-ingress [k8s-cluster:children] kube-node kube-master |
поменять устанавливаемую версию кластера можно в файле:
inventory/s000/group_vars/k8s-cluster/k8s-cluster.yml
переменная:
kube_version: v1.18.3
в этом же файле меняем сетевой плагин с:
kube_network_plugin: flannel
на
kube_network_plugin: calico
если всё же хотите использовать flannel то:
правим файл:
group_vars/k8s-cluster/k8s-net-flannel.yml
1 2 |
flannel_interface_regexp: '10\\.1\\.4\\.\\d{1,3}' flannel_backend_type: "host-gw" |
В данном случае 10\\.1\\.4\\.\\d{1,3} это регулярное выражение, которое описывает подсеть 10.1.4.0/24, в которой у меня размещены виртуальные машины под кластер. Если у вас подсеть машин для кластера, к примеру, 192.168.55.0, то регулярка будет 192\\.168\\.55\\.\\d{1,3}
НО мы будем юзать calico
в этом же файле меняем имя кластера с:
cluster_name: s000.local
на
cluster_name: cluster.local
Чтобы отключить автоустановку ingress-controller переводим в false следующие параметры в файле:
inventory/s000/group_vars/k8s-cluster/addons.yml
ingress_nginx_enabled: false
ingress_nginx_host_network: false
всё, дальше правим баш скрипт:
[root@ansible kubespray]# vim _deploy_cluster.sh
меняем строку:
ansible-playbook -u "$1" -i inventory/s000000/inventory.ini cluster.yml -b --diff
на
ansible-playbook -u "$1" $K -i inventory/s000/inventory.ini cluster.yml -b --diff --ask-pass
запускаем следующей командой:
[root@ansible kubespray]# bash _deploy_cluster.sh root
когда всё установится можем поставить ingress-controller командой:
[root@kub-master-201 ~]# kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.34.1/deploy/static/provider/baremetal/deploy.yaml
он поставится на worker ноды
проверяем:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
[root@kub-master-201 ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION kub-master-201 Ready master 15d v1.18.3 kub-master-202 Ready master 15d v1.18.3 kub-master-203 Ready master 15d v1.18.3 kub-worker-204 Ready node 15d v1.18.3 [root@kub-master-201 ~]# kubectl get deployments.apps -A NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE ingress-nginx ingress-nginx-controller 1/1 1 1 8m21s kube-system calico-kube-controllers 1/1 1 1 15d kube-system coredns 2/2 2 2 15d kube-system dns-autoscaler 1/1 1 1 15d kube-system kubernetes-dashboard 1/1 1 1 15d kube-system kubernetes-metrics-scraper 1/1 1 1 15d |
=========================================================
Вариант когда воркеры являются ингресами и на них могут запускаться поды.
[root@ansible ~]# mkdir southbridge-kubespray
[root@ansible ~]# cd southbridge-kubespray/
[root@ansible southbridge-kubespray]# git clone https://github.com/southbridgeio/kubespray
[root@ansible southbridge-kubespray]# cd kubespray/
[root@ansible kubespray]# yum install -y ansible sshpass python-netaddr python2-jmespath python2-ruamel-yaml python-pip
[root@ansible kubespray]# pip install --upgrade jinja2
[root@ansible kubespray]# cat inventory/s000/inventory.ini
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
kubmaster-1 ansible_host=192.168.1.101 ip=192.168.1.101 kubmaster-2 ansible_host=192.168.1.102 ip=192.168.1.102 kubmaster-3 ansible_host=192.168.1.103 ip=192.168.1.103 #kub-ingress ansible_host=192.168.1.206 ip=192.168.1.206 kubworker-1 ansible_host=192.168.1.104 ip=192.168.1.104 #kubworker-2 ansible_host=192.168.1.105 ip=192.168.1.105 [kube-master] kubmaster-1 kubmaster-2 kubmaster-3 [etcd] kubmaster-1 kubmaster-2 kubmaster-3 [kube-node] kubworker-1 #kubworker-2 #kub-ingress #kub-worker-205 [kube-ingress] kubworker-1 #kubworker-2 [k8s-cluster:children] kube-node kube-master |
поменять устанавливаемую версию кластера можно в файле:
inventory/s000/group_vars/k8s-cluster/k8s-cluster.yml
переменная:
kube_version: v1.18.3
в этом же файле меняем сетевой плагин с:
kube_network_plugin: flannel
на
kube_network_plugin: calico
если всё же хотите использовать flannel то:
правим файл:
group_vars/k8s-cluster/k8s-net-flannel.yml
1 2 |
flannel_interface_regexp: '10\\.1\\.4\\.\\d{1,3}' flannel_backend_type: "host-gw" |
В данном случае 10\\.1\\.4\\.\\d{1,3} это регулярное выражение, которое описывает подсеть 10.1.4.0/24, в которой у меня размещены виртуальные машины под кластер. Если у вас подсеть машин для кластера, к примеру, 192.168.55.0, то регулярка будет 192\\.168\\.55\\.\\d{1,3}
НО мы будем юзать calico
в этом же файле меняем имя кластера с:
cluster_name: s000.local
на
cluster_name: cluster.local
комментируем taint
[root@ansible kubespray]# cat inventory/s000/group_vars/kube-ingress.yml
1 2 3 4 5 |
node_labels: node-role.kubernetes.io/ingress: "" #node_taints: # - "node-role.kubernetes.io/ingress=:NoSchedule" |
[/codesyntax]
правим:
inventory/s000/group_vars/k8s-cluster/addons.yml
а именно комментируем для nginx ingress следующие строки:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# Nginx ingress controller deployment ingress_nginx_enabled: true ingress_nginx_host_network: true ingress_nginx_nodeselector: node-role.kubernetes.io/ingress: "" #ingress_nginx_tolerations: # - key: "node-role.kubernetes.io/ingress" # operator: "Exists" # ingress_nginx_namespace: "ingress-nginx" # ingress_nginx_insecure_port: 80 # ingress_nginx_secure_port: 443 ingress_nginx_configmap: server-tokens: "False" proxy-body-size: "2048M" proxy-buffer-size: "16k" worker-shutdown-timeout: "180" # ingress_nginx_configmap_tcp_services: # 9000: "default/example-go:8080" # ingress_nginx_configmap_udp_services: # 53: "kube-system/kube-dns:53" |
на все ноды ставим пакет sshpass
[root@kubermaster-1 ~]# yum install -y sshpass
[root@kubermaster-2 ~]# yum install -y sshpass
[root@kubermaster-3 ~]# yum install -y sshpass
[root@kuberworker-1 ~]# yum install -y sshpass
запускать будем с скрипта
[root@ansible kubespray]# cat _deploy_cluster.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#!/bin/sh ###ssh-agent bash #ssh-add ~/.ssh/id_rsa if [ -z "$1" ]; then echo "Usage: $0 adminname" exit 1 fi d=$(date '+%Y.%m.%d_%H:%M') # if ssh access to servers only with password, then # install sshpass on all nodes and add `-k` options export ANSIBLE_LOG_PATH=./deploy-$d.log ansible-playbook -u "$1" $K -i inventory/s000/inventory.ini cluster.yml -b --diff --ask-pass |
[root@ansible kubespray]# bash _deploy_cluster.sh root
ждём когда всё поставится и проверяем:
1 2 3 4 5 6 7 |
[root@kubmaster-1 ~]# kubectl get nodes -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME kubmaster-1 Ready master 71m v1.18.3 192.168.1.101 <none> CentOS Linux 7 (Core) 3.10.0-1160.11.1.el7.x86_64 docker://19.3.11 kubmaster-2 Ready master 71m v1.18.3 192.168.1.102 <none> CentOS Linux 7 (Core) 3.10.0-1160.11.1.el7.x86_64 docker://19.3.11 kubmaster-3 Ready master <invalid> v1.18.3 192.168.1.103 <none> CentOS Linux 7 (Core) 3.10.0-1160.11.1.el7.x86_64 docker://19.3.11 kubworker-1 Ready ingress 71m v1.18.3 192.168.1.104 Ready CentOS Linux 7 (Core) 3.10.0-1160.11.1.el7.x86_64 docker://19.3.11 |
как видим наш воркер отображается как ingress и на нём могут запускаться поды.
3. Включение basic аутентификации для dashboard
После установки через kubespray настроим dashboard и настроим basic аутентификацию
1 2 3 |
kubectl get deployments.apps -A | grep -i dashboard kube-system kubernetes-dashboard 1/1 1 1 177d |
Правим
kubectl -n kube-system edit deployments.apps kubernetes-dashboard
В перечислении agrs добавляем
- --authentication-mode=basic
Находим
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
template: metadata: creationTimestamp: null labels: k8s-app: kubernetes-dashboard spec: containers: - args: - --namespace=kube-system - --auto-generate-certificates - --authentication-mode=basic - --authentication-mode=token - --token-ttl=900 image: docker.io/kubernetesui/dashboard-amd64:v2.0.2 imagePullPolicy: IfNotPresent livenessProbe: |
сразу правим тут:
Можем поправить сразу тут:
/etc/kubernetes/dashboard.yml
в том же месте добавляем ту же строку
Создаём ingress
cat ingress-dashboard.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: dashboard annotations: nginx.ingress.kubernetes.io/secure-backends: "true" nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" namespace: kube-system labels: k8s-app: kubernetes-dashboard spec: rules: - host: dashboard.prod.test.local http: paths: - path: / backend: serviceName: kubernetes-dashboard servicePort: 443 |
применяем его:
kubectl apply -f ingress-dashboard.yml
На всех мастерах создаём файл для аутентификации
mkdir /etc/kubernetes/basic-user-auth/
cat /etc/kubernetes/basic-user-auth/users.csv
UeALRowpoh12Dpassword123,kube,admin,"system:masters"
На всех мастерах правим файл:
vim /etc/kubernetes/manifests/kube-apiserver.manifest
а именно добавляем - --basic-auth-file=
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
spec: hostNetwork: true dnsPolicy: ClusterFirst priorityClassName: system-node-critical containers: - name: kube-apiserver image: gcr.io/google-containers/hyperkube-amd64:v1.18.3 imagePullPolicy: IfNotPresent resources: limits: cpu: 1000m memory: 5000M requests: cpu: 500m memory: 1024M command: - /hyperkube - kube-apiserver - --basic-auth-file=/etc/kubernetes/basic-user-auth/users.csv |
и
1 2 3 4 |
volumeMounts: - mountPath: /etc/kubernetes/basic-user-auth name: basic-auth-config |
[/codesyntax]
и
1 2 3 4 5 6 |
volumes: - hostPath: path: /etc/kubernetes/basic-user-auth type: "" name: basic-auth-config |
Всё готово, ничего перезапускать не нужно.
Панель будет доступна по адресу:
https://dashboard.prod.test.local/