kubernetes https外部用户证书访问

问题:在弄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/

 

 

你可能感兴趣的:(kubernetes)