好的,这就是我的想法。我们知道我们无法更改集群证书,但还有其他方法可以做到这一点。我们应该能够通过 ingress 进行代理。
首先我们启用了ingres插件:
➜ ~ minikube addons enable ingress
鉴于tls.crt 和tls.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.