Équilibrage de charge avec F5 et anciens contrôleurs fournis par Google

Dans la version 1.29 et les versions antérieures, les clusters d'utilisateurs créés avec la configuration loadBalancer.f5BigIP déployaient des contrôleurs F5 fournis par Google. Étant donné que ces contrôleurs présentent des limites, Google Distributed Cloud bloque la création de clusters avec la configuration loadBalancer.f5BigIP à partir de la version 1.30. À la place, les nouveaux clusters doivent être configurés pour l'équilibrage de charge manuel, et vous devez déployer vous-même les contrôleurs F5.

Cette page explique comment déployer les anciens contrôleurs F5 fournis par Google pour un cluster d'utilisateurs créé avec Google Distributed Cloud. Bien que le déploiement de ces contrôleurs soit pris en charge, nous vous recommandons d'installer le dernier contrôleur CIS de F5.

Prérequis :

  • Vous disposez d'un cluster d'utilisateurs avec la configuration manualLB.

  • Vous disposez d'un serveur F5 pour le cluster d'utilisateur et vous connaissez ses informations de connexion.

  • Vous souhaitez automatiser le processus de configuration des serveurs virtuels dans F5 pour les services Kubernetes de type LoadBalancer dans votre cluster utilisateur.

Étape 1 : Préparer des modèles pour les contrôleurs

Obtenez les informations F5 et générez les modèles.

Obtenir des informations sur F5

  1. Définissez les variables d'espace réservé suivantes avec les informations de connexion du serveur F5:

    • Nom d'utilisateur F5: USERNAME

    • Mot de passe F5: PASSWORD

    • Adresse F5: ADDRESS

    • Partition F5: PARTITION

  2. Définissez SnatPoolName. Si vous n'utilisez pas SNAT, laissez la variable d'espace réservé vide:

    SnatPoolName: SNAT_POOL_NAME
    

Obtenir les informations de registre et de version

  1. Obtenez la ressource personnalisée onpremusercluster:

    kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get onpremusercluster -oyaml -n kube-system
    
  2. Copiez les champs suivants de la ressource personnalisée onpremusercluster:

    Registry: REGISTRY (onpremusercluster.spec.registry.address)
    ImageTag: IMAGE_TAG (onpremusercluster.spec.gkeOnPremVersion)
    

Générer les modèles

cat > templates.yaml << EOF
apiVersion: v1
kind: Secret
metadata:
  name: bigip-login
  namespace: kube-system
stringData:
  password: "PASSWORD"
  username: "USERNAME"
  url: "ADDRESS"
  partition: "PARTITION"
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: bigip-ctlr
  namespace: kube-system
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: load-balancer-f5
  namespace: kube-system
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: k8s-bigip-ctlr-deployment
  namespace: kube-system
spec:
  replicas: 1
  selector:
    matchLabels:
      app: k8s-bigip-ctlr
  template:
    metadata:
      name: k8s-bigip-ctlr
      labels:
        app: k8s-bigip-ctlr
    spec:
      serviceAccountName: bigip-ctlr
      volumes:
        - name: bigip-login
          secret:
            secretName: bigip-login
      containers:
        - name: k8s-bigip-ctlr
          image: "REGISTRY/k8s-bigip-ctlr:v1.14.0-gke.28"
          resources:
            requests:
              cpu: 60m
              memory: 90Mi
          volumeMounts:
            - name: bigip-login
              readOnly: true
              mountPath: "/etc/bigip-login"
          env:
            - name: BIGIP_PARTITION
              valueFrom:
                secretKeyRef:
                  name: bigip-login
                  key: partition
          command: ["/app/bin/k8s-bigip-ctlr"]
          args: [
            # See the k8s-bigip-ctlr documentation for information about
            # all config options
            # http://clouddocs.f5.com/products/connectors/k8s-bigip-ctlr/latest
            "--http-listen-address=:9097",
            "--credentials-directory=/etc/bigip-login",
            "--bigip-partition=\$(BIGIP_PARTITION)",
            "--log-level=ERROR",
            "--pool-member-type=nodeport",
            "--manage-ingress=false",
            "--vs-snat-pool-name=SNAT_POOL_NAME"
          ]
      dnsPolicy: Default
      imagePullSecrets:
        - name: private-registry-creds
      nodeSelector:
        kubernetes.io/os: linux
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: load-balancer-f5
  namespace: kube-system
  labels:
    app: load-balancer-f5
spec:
  replicas: 1
  selector:
    matchLabels:
      app: load-balancer-f5
  template:
    metadata:
      name: load-balancer-f5
      labels:
        app: load-balancer-f5
    spec:
      serviceAccountName: load-balancer-f5
      containers:
        - name: load-balancer-f5
          image: "REGISTRY/load-balancer-f5:IMAGE_TAG"
          env:
            - name: BIGIP_PARTITION
              valueFrom:
                secretKeyRef:
                  name: bigip-login
                  key: partition
          command:
            - ./load-balancer-f5
          args:
            - "--bigip-partition=\$(BIGIP_PARTITION)"
          resources:
            requests:
              cpu: 2m
              memory: 13Mi
      imagePullSecrets:
        - name: private-registry-creds
      nodeSelector:
        kubernetes.io/os: linux
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: bigip-ctlr-clusterrole-binding
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: bigip-ctlr-clusterrole
subjects:
  - kind: ServiceAccount
    name: bigip-ctlr
    namespace: kube-system
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: load-balancer-f5-clusterrole-binding
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: load-balancer-f5-clusterrole
subjects:
  - kind: ServiceAccount
    name: load-balancer-f5
    namespace: kube-system
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name:
    bigip-ctlr-clusterrole
rules:
  - apiGroups: ["", "extensions"]
    resources: ["nodes", "services", "endpoints", "namespaces", "ingresses", "pods"]
    verbs: ["get", "list", "watch"]
  - apiGroups: ["", "extensions"]
    resources: ["configmaps", "events", "ingresses/status"]
    verbs: ["get", "list", "watch"]
  - apiGroups: ["", "extensions"]
    resources: ["secrets"]
    resourceNames: ["bigip-login"]
    verbs: ["get", "list", "watch"]
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name:
    load-balancer-f5-clusterrole
rules:
  - apiGroups: [""]
    resources: ["events", "nodes"]
    verbs: ["get", "list", "watch"]
  - apiGroups: [""]
    resources: ["services", "services/status"]
    verbs: ["get", "list", "watch", "patch", "update"]
  - apiGroups: [""]
    resources: ["configmaps"]
    verbs: ["get", "list", "watch",  "create", "patch", "delete"]
EOF

Étape 2 : Appliquer les modèles au cluster d'utilisateur

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG apply -f templates.yaml