【问题标题】:certificate signed by unknown authority when connect to remote kubernetes cluster using kubectl使用 kubectl 连接到远程 kubernetes 集群时由未知权威签署的证书
【发布时间】:2020-02-19 18:42:44
【问题描述】:

我正在使用 kubectl 连接远程 kubernetes 集群(v1.15.2),我正在将配置从远程服务器复制到本地 macOS:

scp -r root@ip:~/.kube/config ~/.kube

并将url更改为https://kube-ctl.example.com,我将api服务器暴露在互联网上:

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURvakNDQW9xZ0F3SUJBZ0lVU3FpUlZSU3FEOG1PemRCT1MyRzlJdGE0R2Nrd0RRWUpLb1pJaHZjTkFRRUwKQlFB92FERUxNQWtHQTFVRUJoTUNRMDR4RURBT0JnTlZCQWdUQjBKbGFVcHBibWN4RURBT0JnTlZCQWNUQjBKbAphVXBwYm1jeEREQUtCZ05WQkFvVEEyczRjekVTTUJBR0ExVUVDeE1KTkZCaGNtRmthV2R0TVJNd0VRWURWUVFECkV3cHJkV0psY201bGRHVnpNQ0FYR3RFNU1Ea3hNekUxTkRRd01Gb1lEekl4TVRrd09ESXdNVFUwTkRBd1dqQm8KTVFzd0NRWURWUVFHRXdKRFRqRVFNQTRHQTFVRUNCTUhRbVZwU21sdVp6RVFNQTRHQTFVRUJ4TUhRbVZwU21sdQpaekVNTUFvR0ExVUVDaE1EYXpoek1SSXdFQVlEVlFRTEV3azBVR0Z5WVdScFoyMHhFekFSQmdOVkJBTVRDbXQxClltVnlibVYwWlhNd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUNzOGFFR2R2TUgKb0E1eTduTjVydnAvQkEyTVM1RG1TNWwzQ0p4S3VMOGJ1bkF3alF1c0lTalUxVWlqeVdGOW03VzA3elZJaVJpRwpiYzZGT3JkSEJ2QXgzazBpT2pPRlduTHp1UjdaSFhqQ3lTbDJRam9YN3gzL0l1MERQelNHTXJLSzZETGpTRTk4CkdadEpjUi9OSmpiVFFJc3FXbWFEdUIyc3dmcEc1ZmlZU1A1KzVpcld1TG1pYjVnWnJYeUJJNlJ0dVV4K1NvdW0KN3RDKzJaVG5QdFF0QnFUZHprT3p3THhwZ0Zhd1kvSU1mbHBsaUlMTElOamcwRktxM21NOFpUa0xvNXcvekVmUApHT25GNkNFWlR6bkdrTWc2aUVGenNBcDU5N2lMUDBNTkR4YUNjcTRhdTlMdnMzYkdOZmpqdDd3WkxIVklLa0lGCm44Mk92cExGaElq2kFnTUJBQUdqUWpCQU1BNEdBMVVkRHdFQi93UUVBd0lCQmpBUEJnTlZIUk1CQWY4RUJUQUQKQVFIL01CMEdBMVVkRGdRV0JCUm0yWHpJSHNmVzFjMEFGZU9SLy9Qakc4dWdzREFOQmdrcWhraUc5dzBCQVFzRgpBQU9DQVFFQW1mOUozN3RYTys1dWRmT2RLejdmNFdMZyswbVJUeTBRSEVIblk5VUNLQi9vN2hLUVJHRXI3VjNMCktUeGloVUhvbHY1QzVUdG8zbUZJY2FWZjlvZlp0VVpvcnpxSUFwNE9Od1JpSnQ1Yk94K1d6SW5qN2JHWkhnZjkKSk8rUmNxQnQrUWsrejhTMmJKRG04WFdvMW5WdjJRNU1pUndPdnRIbnRxd3MvTlJ2bHBGV25ISHBEVExjOU9kVwpoMllzWVpEMmV4d0FRVDkxSlExVjRCdklrZGFPeW9USHZ6U2oybThSTzh6b3JBd09kS1NTdG9TZXdpOEhMeGI2ClhmaTRFbjR4TEE3a3pmSHFvcDZiSFF1L3hCa0JzYi9hd29kdDJKc2FnOWFZekxEako3S1RNYlQyRW52MlllWnIKSUhBcjEyTGVCRGRHZVd1eldpZDlNWlZJbXJvVnNRPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
    server: https://k8s-ctl.example.com
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    namespace: kube-system
    user: admin
  name: kubernetes
current-context: kubernetes
kind: Config
preferences: {}
users:
- name: admin
  user:

当我在本地 Mac 中获取集群 pod 信息时:

kubectl get pods --all-namespaces

给出这个错误:

Unable to connect to the server: x509: certificate signed by unknown authority

当我在谷歌浏览器中访问https://k8s-ctl.example.com时,结果是:

{
kind: "Status",
apiVersion: "v1",
metadata: { },
status: "Failure",
message: "Unauthorized",
reason: "Unauthorized",
code: 401
}

如何使用kubectl客户端访问远程k8s集群成功?

我尝试使用此.kube/config 通过命令生成的一种方法,但得到相同的结果:

apiVersion: v1
clusters:
- cluster:
    certificate-authority: ssl/ca.pem
    server: https://k8s-ctl.example.com
  name: default
contexts:
- context:
    cluster: default
    user: admin
  name: default
current-context: default
kind: Config
preferences: {}
users:
- name: admin
  user:
    client-certificate: ssl/admin.pem
    client-key: ssl/admin-key.pem

【问题讨论】:

    标签: kubernetes


    【解决方案1】:

    我已经重现了您的问题,并且当您按照 kubernetes-the-hard-way 创建集群时,您需要按照这些步骤才能从不同的控制台访问您的集群。

    首先,您必须将在引导集群时创建的以下证书复制到本地计算机中的~/.kube/ 目录:

    ca.pem
    admin.pem
    admin-key.pem
    

    将这些文件复制到本地机器后,执行以下命令:

    kubectl config set-cluster kubernetes-the-hard-way \
      --certificate-authority=~/.kube/ca.pem \
      --embed-certs=true \
      --server=https://${KUBERNETES_PUBLIC_ADDRESS}:6443
    
    kubectl config set-credentials admin \
      --client-certificate=~/.kube/admin.pem \
      --client-key=~/.kube/admin-key.pem
    
    kubectl config set-context kubernetes-the-hard-way \
      --cluster=kubernetes-the-hard-way \
      --user=admin
    
    kubectl config use-context kubernetes-the-hard-way
    

    请注意,您必须将 ${KUBERNETES_PUBLIC_ADDRESS} 变量替换为集群的远程地址。

    【讨论】:

      【解决方案2】:

      当 kubectl 与 kube API server 交互时,它会验证 kube API server 证书并将client-certificate 中的证书发送到 kube API server 以进行双向 TLS 身份验证。我相信问题出在以下任一方面。

      1. 你用来生成client-certificate的ca不是用来启动kube API server的ca。
      2. certificate-authority-data 中的 ca 不是用于生成 kube API 服务器证书的 ca。

      如果您确保使用相同的 ca 来一致地生成所有证书,那么它应该可以工作。

      【讨论】:

      • 我正在艰难地安装 kubernetes。 @Arghya Sadhu
      猜你喜欢
      • 2019-03-01
      • 1970-01-01
      • 2021-01-29
      • 2014-12-13
      • 2016-08-24
      • 1970-01-01
      • 2018-04-22
      • 2021-02-08
      • 1970-01-01
      相关资源
      最近更新 更多