Kubespray (ранее Kargo) — это набор Ansible ролей для установки и конфигурации системы оркестрации контейнерами Kubernetes. В качестве IaaS в этом случае могут выступать AWS, GCE, Azure, OpenStack или обычные виртуальные машины. Проект раньше назывался Kargo. Это проект с открытым исходным кодом и открытой моделью разработки, поэтому по желанию каждый может повлиять на его жизненный цикл.
На Хабре уже писали об установке Kubernetes с помощью Kubeadm, но в этом способе есть значительные недостатки: он до сих пор не поддерживает мультимастер конфигураций и, порой, не очень гибкий. Kubespray, хоть и использует Kubeadm под капотом, уже имеет функционал обеспечения высокой доступности как для мастера, так и для etcd на этапе инсталляции. О его сравнении с другими актуальными методами установки Kubernetes можно почитать по ссылке https://github.com/kubernetes-incubator/kubespray/blob/master/docs/comparisons.md
В этой статье мы создадим 5 серверов на ОС Ubuntu 16.04. В моем случае их перечень будет следующим:
192.168.20.10 k8s-m1.me
192.168.20.11 k8s-m2.me
192.168.20.12 k8s-m3.me
192.168.20.13 k8s-s1.me
192.168.20.14 k8s-s2.me
$ ssh-copy-id ubuntu@server.me
$ vim ~/.ssh/config
...
Host *.me
User ubuntu
ServerAliveInterval 60
IdentityFile ~/.ssh/id_rsa
$ git clone https://github.com/kubernetes-incubator/kubespray.git
$ cp -r inventory my_inventory
$ cd my_inventory
$ mv inventory.example inventory
$ vim inventory
k8s-m1.me ip=192.168.20.10
k8s-m2.me ip=192.168.20.11
k8s-m3.me ip=192.168.20.12
k8s-s1.me ip=192.168.20.13
k8s-s2.me ip=192.168.20.14
[kube-master]
k8s-m1.me
k8s-m2.me
k8s-m3.me
[etcd]
k8s-m1.me
k8s-m2.me
k8s-m3.me
[kube-node]
k8s-s1.me
k8s-s2.me
[k8s-cluster:children]
kube-node
kube-master
stream {
upstream kube_apiserver {
least_conn;
server kube-master_ip1:6443;
server kube-master_ip2:6443;
server kube-master_ip3:6443;
}
server {
listen 127.0.0.1:6443;
proxy_pass kube_apiserver;
proxy_timeout 10m;
proxy_connect_timeout 1s;
}
$ vim group_vars/all.yml
...
bootstrap_os: ubuntu
...
kubelet_load_modules: true
# pip install ansible
# pip install netaddr
$ ansible-playbook -i my_inventory/inventory cluster.yml -b -v
$ ansible-playbook -u ubuntu -i my_inventory/inventory cluster.yml -b -v --private-key=~/.ssh/id_rsa
root@k8s-m1:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-m1 Ready master 28m v1.8.4+coreos.0
k8s-m2 Ready master 28m v1.8.4+coreos.0
k8s-m3 Ready master 28m v1.8.4+coreos.0
k8s-s1 Ready node 28m v1.8.4+coreos.0
k8s-s2 Ready node 28m v1.8.4+coreos.0
root@k8s-m1:~# kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system calico-node-2z6jz 1/1 Running 0 27m
kube-system calico-node-6d6q6 1/1 Running 0 27m
kube-system calico-node-96rgg 1/1 Running 0 27m
kube-system calico-node-nld9z 1/1 Running 0 27m
kube-system calico-node-pjcjs 1/1 Running 0 27m
kube-system kube-apiserver-k8s-m1 1/1 Running 0 27m
...
kube-system kube-proxy-k8s-s1 1/1 Running 0 26m
kube-system kube-proxy-k8s-s2 1/1 Running 0 27m
kube-system kube-scheduler-k8s-m1 1/1 Running 0 28m
kube-system kube-scheduler-k8s-m2 1/1 Running 0 28m
kube-system kube-scheduler-k8s-m3 1/1 Running 0 28m
kube-system kubedns-autoscaler-86c47697df-4p7b8 1/1 Running 0 26m
kube-system kubernetes-dashboard-85d88b455f-f5dm4 1/1 Running 0 26m
kube-system nginx-proxy-k8s-s1 1/1 Running 0 28m
kube-system nginx-proxy-k8s-s2 1/1 Running 0 28m
$ vim first-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: first-pod
spec:
containers:
- name: sise
image: mhausenblas/simpleservice:0.5.0
ports:
- containerPort: 9876
resources:
limits:
memory: "64Mi"
cpu: "500m"
- name: shell
image: centos:7
command:
- "bin/bash"
- "-c"
- "sleep 10000"
$ kubectl apply -f first-pod.yaml
pod "first-pod" created
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
first-pod 2/2 Running 0 16s
$ kubectl exec first-pod -c sise -i -t -- bash
[root@first-pod /]# curl localhost:9876/info
{"host": "localhost:9876", "version": "0.5.0", "from": "127.0.0.1"}
$ vim my_inventory/inventory
k8s-m1.me ip=192.168.20.10
k8s-m2.me ip=192.168.20.11
k8s-m3.me ip=192.168.20.12
k8s-s1.me ip=192.168.20.13
k8s-s2.me ip=192.168.20.14
k8s-s3.me ip=192.168.20.15
[kube-master]
k8s-m1.me
k8s-m2.me
k8s-m3.me
[etcd]
k8s-m1.me
k8s-m2.me
k8s-m3.me
[kube-node]
k8s-s1.me
k8s-s2.me
k8s-s3.me
[k8s-cluster:children]
kube-node
kube-master
$ ansible-playbook -i my_inventory/inventory scale.yml -b -v
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-m1 Ready master 6h v1.8.4+coreos.0
k8s-m2 Ready master 6h v1.8.4+coreos.0
k8s-m3 Ready master 6h v1.8.4+coreos.0
k8s-s1 Ready node 6h v1.8.4+coreos.0
k8s-s2 Ready node 6h v1.8.4+coreos.0
k8s-s3 Ready node 19m v1.8.4+coreos.0
К сожалению, не доступен сервер mySQL