问题:在弄k8s服务的时候一般和k8s集成的服务 如jenkins ansible等都支持serviceaccout认证, serviceaccout认证相对好弄一些(有时间我会写一下 serviceaccout的获取过程),今天碰到grafana要连接k8s集群,但是不支持serviceaccount,只能用证书了,本来我对https就有抵触心理,没办法只能硬着头皮去搞,翻看了官网的文档终于解决了,以下分享以下步骤避免其他人落坑
一:创建用户并绑定权限,创建grafana用户并绑定集群管理员权限,为了方便,对于权限要求严的可以按照自己的权限管理来
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: grafana-cluster-role-binding
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: User
name: grafana
apiGroup: rbac.authorization.k8s.io
二、创建grafana的客户端证书
1、copy kubernetes master节点的根证书以及私钥到任意一台linux服务器
scp ${master_ip}/etc/kubernetes/pki/ca* user@youmachine:/path
注:一定要用 k8s的根证书,官网给的例子是自签的,经验证不行
2、生成客户端私钥文件
openssl genrsa -out client.key 2048
生成 client.key 私钥文件
3、创建证书签名请求配置文件 csr.conf
[ req ]
default_bits = 2048
prompt = no
default_md = sha256
req_extensions = req_ext
distinguished_name = dn
[ dn ]
CN = grafana
[ req_ext ]
subjectAltName = @alt_names
[ alt_names ]
DNS.1 = kubernetes
DNS.2 = kubernetes.default
DNS.3 = kubernetes.default.svc
DNS.4 = kubernetes.default.svc.cluster
DNS.5 = kubernetes.default.svc.cluster.local
以上基于官网有所改动,官网说k8s只读取CN(common name)获取用户名,只需要替换 grafana用户名即可
4、创建证书签名请求
openssl req -new -key client.key -out client.csr -config csr.conf
生成client.csr 文件
5、用kubernetes的根证书以及私钥签发客户端证书(注意这里的cat.crt,ca.key 是k8s的根证书)
openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days 10000 -extensions v3_ext -extfile csr.conf
生成client.crt 证书
三 验证:
curl -v https://masterip:6443/ --cert ./client.crt --key ./client.key --cacert ca.crt
或者 curl -v https://masterip:6443/ --cert ./client.crt --key ./client.key --insecure
这里的client.crt 为客户端证书 client.key 为客户端私钥 ca.crt 为根证书
注:本人用的是阿里云提供的k8s服务基于rbac的
k8s文档:英文好的可以直接看
客户端证书生成(有点坑):https://kubernetes.io/docs/concepts/cluster-administration/certificates/
用户认证策略:https://kubernetes.io/docs/reference/access-authn-authz/authentication/#user-impersonation
rbac配置:https://kubernetes.io/docs/reference/access-authn-authz/rbac/