首页 > 解决方案 > 无法使用 kube-vip 在 Kubernetes 集群上安装 Istio 服务网格

问题描述

我一直在徒劳地尝试在 7 个节点(3 个控制,4 个工作人员)测试集群上安装 istio 1.10.0,每个 VM CentOS 7.9.2009,我在我的 VMware ESXi 6.7.0 Update 3 家庭实验室上运行它使我抓狂。我在 /etc/kubernetes/manifests/kube-vip.yaml 中使用“kube-vip:latest”对三个控制节点进行负载平衡,指向kubernetes -lb,当我尝试按照官方说明安装 istio 时,它在“安装出口/入口网关”并在旋转 5 分钟后失败。

我在任何控制平面/主节点上的/var/log/messages中看到了大量诸如此类的错误。

kube-api-access-4phqm\" (UniqueName: \"kubernetes.io/projected/26b8bd27-e5ca-46a3-b7b2-87dcf8d515bd-kube-api-access-4phqm\") pod \"kube-proxy-mtzjn\" (UID: \"26b8bd27-e5ca-46a3-b7b2-87dcf8d515bd\") : failed to fetch token: the API server does not have TokenRequest endpoints enabled"

如果我在混合模式下正确阅读有关kube-vip 作为静态 pod 的信息,它表示它不支持“kubernetes 令牌”。那是我似乎无法工作的“TokenRequest”吗?kube-vip 的文档质量很差,我似乎无法让它在 DaemonSet 模式下工作。

在打开 80 个 Chrome 选项卡的过程中,每个选项卡都向 Gooble 询问不同的行,我发现这个 Stack Overflow 问题触及了同一个问题。它提到了以下命令,如果它没有返回任何内容,则不支持第三方 JWT 令牌,并且确实没有返回任何内容。

kubectl get --raw /api/v1 | jq '.resources[] | select(.name | index("serviceaccounts/token"))'

相同的链接说要对kube-apiserver.yaml进行一些更改,但我尝试过的值没有产生预期的结果。

我在这里完全错过了什么吗?我是否需要启动一个全新的 K8S 集群并从头开始?如果是这样,除了 kube-vip 之外,是否有人对控制平面进行负载平衡有任何建议?

这是与我的测试集群有关的一些信息。kube-vip 似乎工作正常,因为如果我重新启动甚至硬关闭通过kube-vip pod 为 VIP 提供服务的节点,该节点具有kubernetes-lb的内部 DNS 记录,它会切换到另一个控制平面 /主节点没有问题。

Kubernetes-lb 192.168.0.29

[16:01:23] [root@kubernetes1 helm-chart] kubectl get nodes -o wide
NAME          STATUS   ROLES                  AGE    VERSION    INTERNAL-IP    EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION                CONTAINER-RUNTIME
kubernetes1   Ready    control-plane,master   328d   v1.21.1    192.168.0.30   <none>        CentOS Linux 7 (Core)   3.10.0-1160.25.1.el7.x86_64   docker://20.10.6
kubernetes2   Ready    control-plane,master   328d   v1.21.1    192.168.0.31   <none>        CentOS Linux 7 (Core)   3.10.0-1160.25.1.el7.x86_64   docker://20.10.6
kubernetes3   Ready    control-plane,master   328d   v1.21.1    192.168.0.32   <none>        CentOS Linux 7 (Core)   3.10.0-1160.25.1.el7.x86_64   docker://20.10.6
kubernetes4   Ready    worker                 328d   v1.19.11   192.168.0.33   <none>        CentOS Linux 7 (Core)   3.10.0-1160.25.1.el7.x86_64   docker://20.10.6
kubernetes5   Ready    worker                 328d   v1.19.11   192.168.0.34   <none>        CentOS Linux 7 (Core)   3.10.0-1160.25.1.el7.x86_64   docker://20.10.6
kubernetes6   Ready    worker                 328d   v1.19.11   192.168.0.35   <none>        CentOS Linux 7 (Core)   3.10.0-1160.25.1.el7.x86_64   docker://20.10.6
kubernetes7   Ready    worker                 328d   v1.19.11   192.168.0.36   <none>        CentOS Linux 7 (Core)   3.10.0-1160.25.1.el7.x86_64   docker://20.10.6

kube-vip.yaml

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  name: kube-vip
  namespace: kube-system
spec:
  containers:
  - args:
    - manager
    env:
    - name: vip_arp
      value: "true"
    - name: vip_interface
      value: ens224
    - name: port
      value: "6443"
    - name: vip_cidr
      value: "32"
    - name: cp_enable
      value: "true"
    - name: cp_namespace
      value: kube-system
    - name: vip_ddns
      value: "false"
    - name: svc_enable
      value: "true"
    - name: vip_leaderelection
      value: "true"
    - name: vip_leaseduration
      value: "5"
    - name: vip_renewdeadline
      value: "3"
    - name: vip_retryperiod
      value: "1"
    - name: vip_address
      value: 192.168.0.28
    image: plndr/kube-vip:0.3.4
    imagePullPolicy: Always
    name: kube-vip
    resources: {}
    securityContext:
      capabilities:
        add:
        - NET_ADMIN
        - NET_RAW
        - SYS_TIME
        - NET_BROADCAST
    volumeMounts:
    - mountPath: /etc/kubernetes/admin.conf
      name: kubeconfig
  hostNetwork: true
  volumes:
  - hostPath:
      path: /etc/kubernetes/admin.conf
    name: kubeconfig
status: {}

kubectl -n kube-system edit cm kubeadm-config -o yaml 的输出

apiVersion: v1
data:
  ClusterConfiguration: |
    apiServer:
      extraArgs:
        authorization-mode: Node,RBAC
      timeoutForControlPlane: 4m0s
    apiVersion: kubeadm.k8s.io/v1beta2
    certificatesDir: /etc/kubernetes/pki
    clusterName: kubernetes
    controlPlaneEndpoint: kubernetes-lb:6443
    controllerManager: {}
    dns:
      type: CoreDNS
    etcd:
      local:
        dataDir: /var/lib/etcd
    imageRepository: k8s.gcr.io
    kind: ClusterConfiguration
    kubernetesVersion: v1.21.1
    networking:
      dnsDomain: cluster.local
      podSubnet: 10.244.0.0/16
      serviceSubnet: 10.96.0.0/12
    scheduler: {}
  ClusterStatus: |
    apiEndpoints:
      kubernetes1:
        advertiseAddress: 192.168.0.30
        bindPort: 6443
      kubernetes2:
        advertiseAddress: 192.168.0.31
        bindPort: 6443
      kubernetes3:
        advertiseAddress: 192.168.0.32
        bindPort: 6443
    apiVersion: kubeadm.k8s.io/v1beta2
    kind: ClusterStatus
kind: ConfigMap
metadata:
  creationTimestamp: "2020-07-06T02:01:54Z"
  name: kubeadm-config
  namespace: kube-system
  resourceVersion: "17302171"
  selfLink: /api/v1/namespaces/kube-system/configmaps/kubeadm-config
  uid: a7d3beae-a3c5-49b5-b1f0-7e9007b181fe

标签: kubernetesistio

解决方案


推荐阅读