K8S:Pod 与节点之间的隧道

K8S:Pod 与节点之间的隧道

我需要部署一个作为 CCM(云控制器管理器)工作的应用程序,因此它需要能够访问主服务器。

我有一个由 Kubespray 设置的 K8S 集群,所有运行的节点均kubelet采用 的配置/etc/kubernetes/kubelet.confkubelet.conf如下所示:

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: ***
    server: https://localhost:6443
  name: default-cluster
contexts:
- context:
    cluster: default-cluster
    namespace: default
    user: default-auth
  name: default-context
current-context: default-context
kind: Config
preferences: {}
users:
- name: default-auth
  user:
    client-certificate: /var/lib/kubelet/pki/kubelet-client-current.pem
    client-key: /var/lib/kubelet/pki/kubelet-client-current.pem

此配置文件和证书将提供给 CCM 服务,我将以下卷和挂载点添加到部署 YAML:

      containers:
      - name: cloud-controller-manager
        image: swisstxt/cloudstack-cloud-controller-manager:v0.0.1
        # Command line arguments: https://kubernetes.io/docs/reference/command-line-tools-reference/cloud-controller-manager/
        command:
        - /root/cloudstack-ccm
        - --cloud-provider=external-cloudstack
        - --cloud-config=/config/cloud-config
        - --kubeconfig=/var/lib/kubelet/kubelet.conf # Connection Params
        - --v=4
        volumeMounts:
        - name: config-volume
          mountPath: /config
        - name: kubeconfig-config-file
          mountPath: /var/lib/kubelet/kubelet.conf
        - name: kubernetes-pki-volume
          mountPath: /var/lib/kubelet/pki
        - name: kubernetes-config-volume
          mountPath: /var/lib/kubernetes
      volumes:
      - name: config-volume
        configMap:
          name: cloud-controller-manager-config
      - name: kubeconfig-config-file
        hostPath:
          path: /etc/kubernetes/kubelet.conf
      - name: kubernetes-pki-volume
        hostPath:
          path: /var/lib/kubelet/pki
      - name: kubernetes-config-volume
        hostPath:
          path: /var/lib/kubernetes

到目前为止,一切都很好。

我的问题是我的kubelet.conf有以下句子:.clusters.cluster.server: https://localhost:6443。因此,kubelet配置为通过 Kubespray 设置的代理服务器与主服务器交互,以分配主服务之间的连接。

因此,当 CCM 应用程序检查时,kubelet.conf它知道它应该通过与主服务器通信https://localhost:6443,但是该应用程序的 pod 内部localhost:6443未被该代理服务器监听,所以 CCM 无法使用它localhost:6443与主服务器通信,因为localhost:6443只能从节点本身访问。

问题是:有没有办法让节点localhost:6443可从 pod 访问?我目前唯一的想法是在 pod 和它运行的节点之间建立一个 SSH 隧道,但我不喜欢它,因为 (1) 它需要在所有节点上传播一些 RSA 密钥并将其添加到每个新节点上,(2) 我不知道如何从容器中找出节点的 IP 地址。

感谢您阅读这篇长篇大论。我将非常感激所有的想法和线索。

相关内容