ajout branche vagrant
This commit is contained in:
parent
089109f21c
commit
5ff96acc12
51
README.md
51
README.md
@ -1,66 +1,43 @@
|
||||
# Kind cluster
|
||||
# Kubernetes cluster avec Vagrant
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
Kind permet de créer des cluster k8s facilement via des conteneurs docker
|
||||
|
||||
## Pré requis
|
||||
|
||||
- [Docker](https://docs.docker.com/engine/install/debian/)
|
||||
- Virtualbox
|
||||
- [Kubectl](https://kubernetes.io/fr/docs/tasks/tools/install-kubectl/)
|
||||
- [Kind](https://kind.sigs.k8s.io/docs/user/quick-start/)
|
||||
|
||||
### Install Kind
|
||||
### Install Vagrant
|
||||
|
||||
```bash
|
||||
# For AMD64 / x86_64
|
||||
[ $(uname -m) = x86_64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.20.0/kind-linux-amd64
|
||||
# For ARM64
|
||||
[ $(uname -m) = aarch64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.20.0/kind-linux-arm64
|
||||
chmod +x ./kind
|
||||
sudo mv ./kind /usr/local/bin/kind
|
||||
wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
|
||||
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
|
||||
sudo apt update -y && sudo apt install vagrant -y
|
||||
```
|
||||
|
||||
### Créer cluster :hammer:
|
||||
|
||||
```bash
|
||||
cat <<EOF | kind create cluster --config=-
|
||||
kind: Cluster
|
||||
apiVersion: kind.x-k8s.io/v1alpha4
|
||||
name: test
|
||||
nodes:
|
||||
- role: control-plane
|
||||
kubeadmConfigPatches:
|
||||
- |
|
||||
kind: InitConfiguration
|
||||
nodeRegistration:
|
||||
kubeletExtraArgs:
|
||||
node-labels: "ingress-ready=true"
|
||||
extraPortMappings:
|
||||
- containerPort: 80
|
||||
hostPort: 80
|
||||
protocol: TCP
|
||||
- containerPort: 443
|
||||
hostPort: 443
|
||||
protocol: TCP
|
||||
- role: worker
|
||||
- role: worker
|
||||
EOF
|
||||
cp .env.example .env
|
||||
vagrant up
|
||||
```
|
||||
|
||||
> Note: 1 manager and 2 workers config
|
||||
>> https://kind.sigs.k8s.io/docs/user/configuration/
|
||||
> :coffee: Laisser le temps à Vagrant de construire les machines :watch: 15 min approximativement
|
||||
|
||||
### Déployer app :rocket:
|
||||
|
||||
```bash
|
||||
vagrant ssh m
|
||||
# vagrant scp devops.yml ...
|
||||
kubectl apply -f devops.yml
|
||||
```
|
||||
|
||||
### Déployer ingress Nginx :crossed_flags:
|
||||
|
||||
```bash
|
||||
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml
|
||||
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.2/deploy/static/provider/baremetal/deploy.yaml
|
||||
```
|
||||
|
||||
>> http://localhost/devops
|
||||
|
||||
70
Vagrantfile
vendored
Normal file
70
Vagrantfile
vendored
Normal file
@ -0,0 +1,70 @@
|
||||
Vagrant.configure("2") do |config|
|
||||
|
||||
# enable vagrant-env (.env)
|
||||
config.env.enable
|
||||
|
||||
# set constants
|
||||
IMAGE_NAME = ENV['IMAGE_NAME']
|
||||
MEMORY_SIZE_IN_GB = ENV['MEMORY_SIZE_IN_GB'].to_i
|
||||
CPU_COUNT = ENV['CPU_COUNT'].to_i
|
||||
MASTER_NODE_COUNT = ENV['MASTER_NODE_COUNT'].to_i
|
||||
WORKER_NODE_COUNT = ENV['WORKER_NODE_COUNT'].to_i
|
||||
MASTER_NODE_IP_START = ENV['MASTER_NODE_IP_START']
|
||||
WORKER_NODE_IP_START = ENV['WORKER_NODE_IP_START']
|
||||
|
||||
# set variables
|
||||
master_node_ip = ''
|
||||
worker_node_ip = ''
|
||||
|
||||
config.vm.box = IMAGE_NAME
|
||||
|
||||
config.vm.provider "virtualbox" do |vb|
|
||||
|
||||
vb.memory = 1024 * MEMORY_SIZE_IN_GB
|
||||
vb.cpus = CPU_COUNT
|
||||
|
||||
end
|
||||
|
||||
config.vm.provision "shell", path: "pre.sh"
|
||||
|
||||
config.vm.provision "shell", path: "install-docker.sh"
|
||||
config.vm.provision "shell", path: "install-kube-tools.sh"
|
||||
|
||||
config.vm.provision "shell", path: "post.sh"
|
||||
|
||||
(1..MASTER_NODE_COUNT).each do |i|
|
||||
config.vm.define "m" do |master|
|
||||
|
||||
master_node_ip = "#{MASTER_NODE_IP_START}#{i}"
|
||||
master.vm.network "private_network", ip: "#{master_node_ip}"
|
||||
master.vm.hostname = "m"
|
||||
|
||||
# init master node.
|
||||
master.vm.provision "shell", path: "init-master-node.sh", env: {"NODE_IP" => "#{master_node_ip}"}
|
||||
|
||||
# prepare kubectl for vagrant user
|
||||
master.vm.provision "shell", privileged: false, path: "prepare-kubectl.sh"
|
||||
|
||||
# prepare kubectl for root user
|
||||
master.vm.provision "shell", privileged: true, path: "prepare-kubectl.sh"
|
||||
|
||||
# install cni.
|
||||
master.vm.provision "shell", path: "install-cni.sh"
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
(1..WORKER_NODE_COUNT).each do |i|
|
||||
config.vm.define "n#{i}" do |node|
|
||||
|
||||
worker_node_ip = "#{WORKER_NODE_IP_START}#{i}"
|
||||
node.vm.network "private_network", ip: "#{worker_node_ip}"
|
||||
node.vm.hostname = "n#{i}"
|
||||
|
||||
# init slave node.
|
||||
node.vm.provision "shell", path: "init-slave-node.sh", env: {"NODE_IP" => "#{worker_node_ip}"}
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
14
init-master-node.sh
Normal file
14
init-master-node.sh
Normal file
@ -0,0 +1,14 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Install kubernetes via kubeadm.
|
||||
kubeadm init --apiserver-advertise-address=$NODE_IP
|
||||
|
||||
# Hostname -i must return a routable address on second (non-NATed) network interface.
|
||||
# @see http://kubernetes.io/docs/getting-started-guides/kubeadm/#limitations
|
||||
sed "s/127.0.0.1.*m/$NODE_IP m/" -i /etc/hosts
|
||||
|
||||
# Export k8s cluster token to an external file.
|
||||
OUTPUT_FILE=/vagrant/join.sh
|
||||
rm -rf /vagrant/join.sh
|
||||
kubeadm token create --print-join-command > /vagrant/join.sh
|
||||
chmod +x $OUTPUT_FILE
|
||||
7
init-slave-node.sh
Normal file
7
init-slave-node.sh
Normal file
@ -0,0 +1,7 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Join kubernetes cluster.
|
||||
/vagrant/join.sh
|
||||
echo "Environment='KUBELET_EXTRA_ARGS=--node-ip=$NODE_IP'" | tee -a /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
|
||||
systemctl daemon-reload
|
||||
systemctl restart kubelet
|
||||
4
install-cni.sh
Normal file
4
install-cni.sh
Normal file
@ -0,0 +1,4 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Apply flannel.
|
||||
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
|
||||
44
install-docker.sh
Normal file
44
install-docker.sh
Normal file
@ -0,0 +1,44 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Install packages to allow apt to use a repository over HTTPS.
|
||||
apt-get install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common
|
||||
|
||||
# Add Docker apt repository.
|
||||
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
|
||||
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
|
||||
apt-get update
|
||||
|
||||
apt-cache policy docker-ce
|
||||
|
||||
# Install Docker CE.
|
||||
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
|
||||
|
||||
# apt-get install -y \
|
||||
# containerd.io=1.4.6-1 \
|
||||
# docker-ce=5:20.10.7~3-0~ubuntu-$(lsb_release -cs) \
|
||||
# docker-ce-cli=5:20.10.7~3-0~ubuntu-$(lsb_release -cs)
|
||||
|
||||
# Setup daemon.
|
||||
cat > /etc/docker/daemon.json <<EOF
|
||||
{
|
||||
"exec-opts": ["native.cgroupdriver=systemd"],
|
||||
"log-driver": "json-file",
|
||||
"log-opts": {
|
||||
"max-size": "100m"
|
||||
},
|
||||
"storage-driver": "overlay2"
|
||||
}
|
||||
EOF
|
||||
|
||||
mkdir -p /etc/systemd/system/docker.service.d
|
||||
|
||||
# Restart and enable docker service.
|
||||
systemctl daemon-reload
|
||||
systemctl start docker
|
||||
systemctl enable docker
|
||||
|
||||
# Hold Docker at this specific version.
|
||||
apt-mark hold docker-ce
|
||||
|
||||
sed -i '/^disabled_plugins/d' /etc/containerd/config.toml
|
||||
systemctl restart containerd
|
||||
26
install-kube-tools.sh
Normal file
26
install-kube-tools.sh
Normal file
@ -0,0 +1,26 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Install packages to allow apt to use a repository over HTTPS
|
||||
apt-get install -y apt-transport-https ca-certificates curl
|
||||
|
||||
# Add Kubernetes apt repository.
|
||||
|
||||
sudo mkdir /etc/apt/keyrings
|
||||
## Download the Google Cloud public signing key
|
||||
curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-archive-keyring.gpg
|
||||
|
||||
## Add the Kubernetes apt repository
|
||||
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
|
||||
|
||||
## Update apt package index with the new repository
|
||||
apt-get update
|
||||
|
||||
# Install kubelet, kubeadm and kubectl.
|
||||
apt-get install -y kubelet=1.21.2-00 kubeadm=1.21.2-00 kubectl=1.21.2-00
|
||||
|
||||
# Hold the Kubernetes components at this specific version.
|
||||
apt-mark hold kubelet kubeadm kubectl
|
||||
|
||||
# Turn off swap for kubeadm.
|
||||
swapoff -a
|
||||
sed -i '/swap/d' /etc/fstab
|
||||
13
kubernetes/flask-ingress.yml
Normal file
13
kubernetes/flask-ingress.yml
Normal file
@ -0,0 +1,13 @@
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: service-flask
|
||||
spec:
|
||||
type: NodePort
|
||||
selector:
|
||||
app: flask-backend
|
||||
ports:
|
||||
- protocol: TCP
|
||||
port: 5000
|
||||
targetPort: 5000
|
||||
name: tcp-5000
|
||||
13
kubernetes/nodeport.yml
Normal file
13
kubernetes/nodeport.yml
Normal file
@ -0,0 +1,13 @@
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: service-flask
|
||||
spec:
|
||||
type: NodePort
|
||||
selector:
|
||||
app: flask
|
||||
ports:
|
||||
- protocol: TCP
|
||||
port: 5000
|
||||
targetPort: 5000
|
||||
name: tcp-5000
|
||||
11
kubernetes/postgres-config.yml
Normal file
11
kubernetes/postgres-config.yml
Normal file
@ -0,0 +1,11 @@
|
||||
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: postgres-config
|
||||
labels:
|
||||
app: postgres
|
||||
data:
|
||||
POSTGRES_DB:
|
||||
POSTGRES_USER:
|
||||
POSTGRES_PASSWORD:
|
||||
41
kubernetes/postgres-service-2.yml
Normal file
41
kubernetes/postgres-service-2.yml
Normal file
@ -0,0 +1,41 @@
|
||||
# apiVersion: v1
|
||||
# kind: Service
|
||||
# metadata:
|
||||
# name: service-postgres
|
||||
# labels:
|
||||
# name: postgres
|
||||
# spec:
|
||||
# ports:
|
||||
# - port: 5432
|
||||
# selector:
|
||||
# app: postgres
|
||||
|
||||
# apiVersion: v1
|
||||
# kind: Service
|
||||
# metadata:
|
||||
# name: postgres
|
||||
# spec:
|
||||
# type: NodePort
|
||||
# selector:
|
||||
# app: postgres
|
||||
# ports:
|
||||
# - protocol: TCP
|
||||
# port: 5432
|
||||
# targetPort: 5432
|
||||
# name: tcp-5432
|
||||
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: postgres # Sets service name
|
||||
labels:
|
||||
app: postgres # Labels and Selectors
|
||||
spec:
|
||||
type: NodePort # Sets service type
|
||||
ports:
|
||||
- protocol: TCP
|
||||
port: 5432
|
||||
targetPort: 5432
|
||||
name: tcp-5432
|
||||
selector:
|
||||
app: postgres
|
||||
11
post.sh
Normal file
11
post.sh
Normal file
@ -0,0 +1,11 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Clear apt cache.
|
||||
apt-get clean
|
||||
|
||||
# Cleanup disk.
|
||||
#dd if=/dev/zero of=/EMPTY bs=1M
|
||||
#rm -f /EMPTY
|
||||
|
||||
# Clear bash history.
|
||||
cat /dev/null > ~/.bash_history && history -c && exit
|
||||
10
pre.sh
Normal file
10
pre.sh
Normal file
@ -0,0 +1,10 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Update apt registry.
|
||||
apt-get update
|
||||
|
||||
# Pass grub.
|
||||
apt-mark hold package grub-pc grub-pc-bin grub2-common grub-common
|
||||
|
||||
# Upgrade packages and kernel.
|
||||
apt-get dist-upgrade -y
|
||||
6
prepare-kubectl.sh
Normal file
6
prepare-kubectl.sh
Normal file
@ -0,0 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Prepare kubectl.
|
||||
sudo mkdir -p $HOME/.kube
|
||||
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
|
||||
sudo chown $(id -u):$(id -g) $HOME/.kube/config
|
||||
Loading…
x
Reference in New Issue
Block a user