【问题标题】:Using a custom certificate for the Kubernetes api server with minikube通过 minikube 为 Kubernetes api 服务器使用自定义证书
【发布时间】:2021-07-14 22:08:18
【问题描述】:

我一直在尝试找到如何做到这一点,但到目前为止还没有找到任何东西,我对 Kubernetes 很陌生,所以我可能只是看过它。我想为 Kubernetes API 服务器使用自己的证书,这可能吗?如果是这样,有人可以给我一个链接吗?

【问题讨论】:

  • 为什么要使用自己的证书?
  • @Matt 因为我们的 Kubernetes 服务器位于大学防火墙后面,并且没有使用正确证书的应用程序无法从外部访问。
  • 恐怕没那么容易。如果您想使用自己的自定义证书,我假设您想使用自己的 CA。如果您更改根 CA 证书,您还需要更改集群中的所有证书,因为它们都是连接的。如果您只更改 api server 证书,kubelet(和其他组件)将停止工作,因为它们将不再将此 apiserver 证书识别为有效证书。你能看到我看到的,还是我错过了什么?
  • @Matt 是的,我在尝试时遇到了同样的问题。这真的很糟糕,因为现在我们不能真正将 Kubernetes 集成到我们的 Gitlab 环境中。在集群中的任何地方都使用相同的证书会起作用还是会遇到问题?
  • 我想我可能有一个想法,但需要先尝试一下

标签: kubernetes certificate kubectl kubernetes-apiserver


【解决方案1】:

好的,这就是我的想法。我们知道我们无法更改集群证书,但还有其他方法可以做到这一点。我们应该能够通过 ingress 进行代理。

首先我们启用了ingres插件:

➜  ~ minikube addons enable ingress

鉴于tls.crttls.key,我们创建了一个秘密(如果您使用的是 certmanager,则不需要这样做,但这需要一些额外的步骤,我不会在这里描述):

➜  ~ kubectl create secret tls my-tls --cert=tls.crt --key tls.key

还有一个入口对象:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-k8s
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
  tls:
  - hosts:
    - foo.bar.com
    secretName: my-tls
  rules:
  - host: foo.bar.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: kubernetes
            port:
              number: 443

注意文档对 CN 和 FQDN 的评价:k8s docs

在 Ingress 中引用此密钥会告诉 Ingress 控制器使用 TLS 保护从客户端到负载均衡器的通道。 您需要确保您创建的 TLS 机密来自包含通用名称 (CN) 的证书,也称为 https-example.foo.com 的完全限定域名 (FQDN)

这种方法的唯一问题是我们在从外部访问时无法使用证书进行身份验证。

但是我们可以使用令牌。这是 k8s 文档中的一个页面:https://kubernetes.io/docs/reference/access-authn-authz/authentication/,其中列出了所有可能的身份验证方法。

为了测试,我选择了 serviceaccout 令牌,但可以随意尝试其他令牌。

让我们创建一个服务帐号,绑定一个角色,然后尝试访问集群:

➜  ~ kubectl create sa cadmin
serviceaccount/cadmin created
➜  ~ kubectl create clusterrolebinding --clusterrole cluster-admin --serviceaccount default:cadmin cadminbinding
clusterrolebinding.rbac.authorization.k8s.io/cadminbinding created

现在我们按照以下说明:access-cluster-api from docs 尝试使用 sa 令牌访问集群。

➜  ~ APISERVER=https://$(minikube ip)
➜  ~ TOKEN=$(kubectl get secret $(kubectl get serviceaccount cadmin -o jsonpath='{.secrets[0].name}') -o jsonpath='{.data.token}' | base64 --decode )
➜  ~ curl $APISERVER/api --header "Authorization: Bearer $TOKEN" --insecure -H "Host: foo.bar.com"
{
  "kind": "APIVersions",
  "versions": [
    "v1"
  ],
  "serverAddressByClientCIDRs": [
    {
      "clientCIDR": "0.0.0.0/0",
      "serverAddress": "192.168.39.210:8443"
    }
  ]
}

注意:我正在使用无效/自签名证书对其进行测试,并且我不拥有 foo.bar.com 域,因此我需要手动传递 Host 标头。对你来说,它可能看起来有点不同,所以不要只是复制;尝试了解正在发生的事情并进行调整。如果你有一个域,你应该可以直接访问它(不需要$(minikube ip))。

如您所见,它奏效了!我们得到了来自 api 服务器的有效响应。

但我们可能不想使用 curl 访问 k8s。

让我们使用令牌创建一个 kubeconfig。

kubectl config set-credentials cadmin --token $TOKEN --kubeconfig my-config
kubectl config set-cluster mini --kubeconfig my-config --server https://foo.bar.com
kubectl config set-context mini --kubeconfig my-config --cluster mini --user cadmin
kubectl config use-context --kubeconfig my-config mini

现在我们可以使用这个配置访问 k8s:

➜  ~ kubectl get po --kubeconfig my-config
No resources found in default namespace.

【讨论】:

  • 如果我忘记提及某事或某事不清楚,请告诉我
【解决方案2】:

是的,您可以使用自己的证书并设置在 Kubernetes API 服务器中。

假设您已经创建了证书移动并将它们保存到特定的节点目录:

{
  sudo mkdir -p /var/lib/kubernetes/

  sudo mv ca.pem ca-key.pem kubernetes-key.pem kubernetes.pem \
    service-account-key.pem service-account.pem \
    encryption-config.yaml /var/lib/kubernetes/
}

实例内部 IP 地址将用于向集群成员通告 API Server。获取内部IP:

INTERNAL_IP=$(curl -s -H "Metadata-Flavor: Google" \
  http://metadata.google.internal/computeMetadata/v1/instance/network-interfaces/0/ip)

您可以创建API服务器的服务并设置它。

注意:上面提到的示例是专门考虑 GCP 实例的,因此您可能需要更改一些命令,例如。

INTERNAL_IP=$(curl -s -H "Metadata-Flavor: Google" \
      http://metadata.google.internal/computeMetadata/v1/instance/network-interfaces/0/ip) 

对于上述命令,如果不使用,可以提供手动裸机IP列表,而不是从GCP实例API获取。

我们开始吧,请参考这个链接:https://github.com/kelseyhightower/kubernetes-the-hard-way/blob/master/docs/08-bootstrapping-kubernetes-controllers.md#configure-the-kubernetes-api-server

在这里您可以找到从头开始创建和设置整个 Kubernetes 集群的所有详细信息以及详细的文档和命令:https://github.com/kelseyhightower/kubernetes-the-hard-way

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-06
    • 2018-11-19
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    • 2020-05-28
    • 2020-01-16
    • 2014-09-16
    相关资源
    最近更新 更多