ajout branche vagrant

This commit is contained in:
Grégory Lebreton 2023-11-08 16:12:23 +01:00
parent 089109f21c
commit 5ff96acc12
14 changed files with 284 additions and 37 deletions

View File

@ -1,66 +1,43 @@
# Kind cluster
# Kubernetes cluster avec Vagrant
![vagrant](https://www.vectorlogo.zone/logos/vagrantup/vagrantup-official.svg)
![kind](https://kind.sigs.k8s.io/logo/logo.png)
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
View 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
View 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
View 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
View 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
View 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
View 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

View 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
View 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

View File

@ -0,0 +1,11 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: postgres-config
labels:
app: postgres
data:
POSTGRES_DB:
POSTGRES_USER:
POSTGRES_PASSWORD:

View 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
View 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
View 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
View 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