F5 및 기존 Google 제공 컨트롤러를 사용한 부하 분산

버전 1.29 이하에서는 loadBalancer.f5BigIP 구성으로 만든 사용자 클러스터가 Google에서 제공하는 F5 컨트롤러를 배포했습니다. 이러한 컨트롤러에는 제한사항이 있으므로 버전 1.30 이상에서는 Google Distributed Cloud가 loadBalancer.f5BigIP 구성으로 클러스터를 만드는 것을 차단합니다. 대신 새 클러스터를 수동 부하 분산용으로 구성해야 하며 F5 컨트롤러를 직접 배포해야 합니다.

이 페이지에서는 Google Distributed Cloud로 만든 사용자 클러스터에 기존 Google 제공 F5 컨트롤러를 배포하는 방법을 보여줍니다. 이러한 컨트롤러를 배포하는 것이 지원되지만 F5의 최신 CIS 컨트롤러를 설치하는 것이 좋습니다.

기본 요건:

  • manualLB 구성이 적용된 사용자 클러스터가 있습니다.

  • 사용자 클러스터의 F5 서버가 있고 로그인 정보가 있습니다.

  • 사용자 클러스터의 LoadBalancer 유형 Kubernetes 서비스에 대해 F5에서 가상 서버를 구성하는 프로세스를 자동화하려고 합니다.

1단계. 컨트롤러의 템플릿 준비

F5 정보를 가져와 템플릿을 생성합니다.

F5 정보 가져오기

  1. F5 서버의 로그인 정보로 다음 자리표시자 변수를 설정합니다.

    • F5 사용자 이름: USERNAME

    • F5 비밀번호: PASSWORD

    • F5 주소: ADDRESS

    • F5 파티션: PARTITION

  2. SnatPoolName를 설정합니다. SNAT를 사용하지 않는 경우 자리표시자 변수를 비워 둡니다.

    SnatPoolName: SNAT_POOL_NAME
    

레지스트리 및 버전 정보 가져오기

  1. onpremusercluster 커스텀 리소스를 가져옵니다.

    kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get onpremusercluster -oyaml -n kube-system
    
  2. onpremusercluster 맞춤 리소스에서 다음 필드를 복사합니다.

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

템플릿 생성

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

2단계 사용자 클러스터에 템플릿 적용

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG apply -f templates.yaml