Déploiement de gate api avec cilium gateway-controller
Gateway API :
-
Déploiement :
- Prérequis
- Deployer un cluster rke2
-
Installer Gateway API avec cilium gateway-controller
Prérequis
- Connaitre les bases de k8s
Installer Gateway API avec cilium gateway-controller
- Deployer un cluster rke2
-
- Créer 3 VMs avec 3vCPU et 5Go RAM
-
-
-
- Desactive kube-proxy, il sera remplacé par cilium
- Desactive canal, il sera remplacé par cilium cni
- Désactive nginx-ingress-controller, il sera remplacé par gaetway-api
-
- Sur le premier node control-plane uniquement: generer le manifest daemonset pour kube-vip
sudo su
apt update -y && sudo apt install -y jq curl
apt install -y containerd && systemctl start containerd.service && systemctl status containerd.service
mkdir -p /var/lib/rancher/rke2/server/manifests
curl https://kube-vip.io/manifests/rbac.yaml > /var/lib/rancher/rke2/server/manifests/kube-vip-rbac.yaml
export KVVERSION=$(curl -sL https://api.github.com/repos/kube-vip/kube-vip/releases | jq -r '.[0].name')
echo "KVVERSION : $KVVERSION"
export VIP="10.10.10.11"
alias kube-vip="ctr image pull ghcr.io/kube-vip/kube-vip:$KVVERSION; ctr run --rm --net-host ghcr.io/kube-vip/kube-vip:$KVVERSION vip /kube-vip"
kube-vip manifest daemonset \
--address $VIP \
--inCluster \
--taint \
--controlplane \
--services \
--arp \
--leaderElection | tee /var/lib/rancher/rke2/server/manifests/kube-vip.yaml
cat /var/lib/rancher/rke2/server/manifests/kube-vip.yaml
-
- Initier le cluster sur le premier node control-plane
sudo su
# server node
curl -sfL https://get.rke2.io | INSTALL_RKE2_TYPE="server" INSTALL_RKE2_VERSION="v1.34.1+rke2r1" sh -
systemctl enable rke2-server.service
sudo mkdir -p /etc/rancher/rke2
sudo tee /etc/rancher/rke2/config.yaml << EOF
write-kubeconfig-mode: "0644"
token: JDKJDKJFDkdklfdlkdf14528654455211566332
disable-kube-proxy: true
disable:
- rke2-ingress-nginx
- rke2-canal
kube-controller-manager-arg:
- "bind-address=0.0.0.0"
kube-scheduler-arg:
- "bind-address=0.0.0.0"
etcd-expose-metrics: true
kube-proxy-arg:
- "metrics-bind-address=0.0.0.0:10249"
tls-san:
- 10.10.10.11
EOF
systemctl start rke2-server.service
systemctl status rke2-server.service
export KUBECONFIG=/etc/rancher/rke2/rke2.yaml
/var/lib/rancher/rke2/bin/kubectl get nodes
/var/lib/rancher/rke2/bin/kubectl get po -A

Sur la capture ci-dessous, on voit que coredns est pending. C'est parcque le cni plugin n'est pas encore deployé. Dans notre cas ça sera cilium.

Depluis le premier node control-plane, on recupere le kubeconfig avec cette commande et remplacer l"ip 127.0.0.1 par l'ip du permier control-plane.
- Configurer kubectl sur le master (control-plane 01)
mkdir -p $HOME/.kube
sudo cp -i /etc/rancher/rke2/rke2.yaml $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
sudo mv /var/lib/rancher/rke2/bin/kubectl /usr/local/bin/
kubectl get nodes

Se positionner sur le context recuperé pour deployer cilium
-
- cilium-values.yaml
- Activation de kubeProxyReplacement
- Activation de gateway api
- cilium-values.yaml
kubeProxyReplacement: true
k8sServiceHost: "localhost"
k8sServicePort: "6443"
encryption:
enabled: true
type: wireguard
nodeEncryption: true
strictMode:
enabled: true
cidr: "10.42.0.0/16"
ipam:
operator:
clusterPoolIPv4PodCIDRList: ["10.42.0.0/16"]
gatewayAPI:
enabled: true # active gateway api
bgpControlPlane:
enabled: true
operator:
enabled: true
replicas: 1
- Deployer cilium
helm repo add cilium https://helm.cilium.io
helm repo update
helm upgrade --install cilium-cni cilium/cilium -n cilium-system --version 1.18.3 -f cilium-values.yaml --create-namespace
Une fois que le node est ready, on peut remplacer l'ip <<10.10.10.11>> dans le kubeconfig pour pointer le la VIP.
-
-
cilium-operator: Control Plane
-
cilium- & cilium-envoy-: Data Plane
-

- Joindre les autres masters au cluster
sudo su
# server node
curl -sfL https://get.rke2.io | INSTALL_RKE2_TYPE="server" INSTALL_RKE2_VERSION="v1.34.1+rke2r1" sh -
systemctl enable rke2-server.service
sudo mkdir -p /etc/rancher/rke2
sudo tee /etc/rancher/rke2/config.yaml << EOF
server: https://10.10.10.11:9345
disable-kube-proxy: true
disable:
- rke2-ingress-nginx
- rke2-canal
write-kubeconfig-mode: "0644"
token: JDKJDKJFDkdklfdlkdf14528654455211566332
kube-controller-manager-arg:
- "bind-address=0.0.0.0"
kube-scheduler-arg:
- "bind-address=0.0.0.0"
etcd-expose-metrics: true
kube-proxy-arg:
- "metrics-bind-address=0.0.0.0:10249"
tls-san:
- 10.10.10.11
EOF
systemctl start rke2-server.service
systemctl status rke2-server.service
export KUBECONFIG=/etc/rancher/rke2/rke2.yaml
/var/lib/rancher/rke2/bin/kubectl get nodes
/var/lib/rancher/rke2/bin/kubectl get po -A
- Joindre les workers au cluster
- Dans cet exemple je me suis limité à 3 nodes control-plane qui seront workers egallement.
sudo su
# agent node
curl -sfL https://get.rke2.io | INSTALL_RKE2_TYPE="agent" INSTALL_RKE2_VERSION="v1.34.1+rke2r1" sh -
systemctl enable rke2-agent.service
# creer le fichier config.yaml avec le contenu server et token
sudo mkdir -p /etc/rancher/rke2
sudo tee /etc/rancher/rke2/config.yaml << EOF
server: https://10.10.10.11:9345
token: JDKJDKJFDkdklfdlkdf14528654455211566332
EOF
systemctl start rke2-agent.service
systemctl status rke2-agent.service
export KUBECONFIG=/etc/rancher/rke2/rke2.yaml
/var/lib/rancher/rke2/bin/kubectl get nodes
/var/lib/rancher/rke2/bin/kubectl get po -A

Pour que gateway api fonctione, il faut deployer les crd
export GATEWAY_API_VERSION=v1.4.0
kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/$GATEWAY_API_VERSION/standard-install.yaml

- Cilium supporte l'ipam des service type LoadBalancer
- Pour l'activer, il faut juste créer un CiliumLoadBalancerIPPool avec le range d'ip
apiVersion: "cilium.io/v2alpha1"
kind: CiliumLoadBalancerIPPool
metadata:
name: "default-pool"
namespace: cilium-system
spec:
blocks:
# - cidr: "10.0.10.0/24"
- start: "10.10.10.5"
stop: "10.10.10.8"
- Appliquer le fichier
kubectl apply -f cilium-ippool.yaml
- Deployer Cert-manager
- let's encrypt pour les certificats dns challenge
- Activer gateway api
- clusterissuer avec dns challenge pour cloudflare. A adapter selon votre cas
- cert-manager-values.yaml
installCRDs: true
config:
apiVersion: "controller.config.cert-manager.io/v1alpha1"
kind: "ControllerConfiguration"
enableGatewayAPI: true
extraObjects: []
- Deployer cert-manager
helm repo add jetstack https://charts.jetstack.io --force-update
helm repo update
helm upgrade --install cert-manager jetstack/cert-manager -n cert-manager --version 1.19.1 -f cert-manager.yaml --create-namespace
- Créer un clusterissuer
- Mon domaine est chez cloudflare. Donc à adapter selon votre cas.
apiVersion: v1
kind: Secret
metadata:
name: cloudflare-api-token-secret
namespace: cert-manager
type: Opaque
stringData:
api-token: dfdkfdkfdkfdkfdkfdfdfd
---
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
email: devops@techledger.io
server: https://acme-v02.api.letsencrypt.org/directory
privateKeySecretRef:
name: techledger-issuer-account-key
solvers:
- dns01:
cloudflare:
email: devops@techledger.io # cloudflare email
apiTokenSecretRef:
name: cloudflare-api-token-secret
key: api-token
- Appliquer le fichier
kubectl apply -f cluster-issuer.yaml
Commentaires
Aucun commentaire pour le moment.