第十部分 认证和serviceaccount
前面讲的都是admin超级用户在操作k8s,Kubectl不能所有人都可以使用和访问。
用户访问逻辑图,
认证:第一种令牌认证token,最简单的认证,(只需要对方认证的共享密钥即可)
服务器需要认可客户端的证书。
授权:RBAC,基于角色的访问控制,目前用的比较多。
web服务
目前一直在使用admin(类似root)用户使用。
准入控制:后续可操作范围
实现原理:
客户端——>API Server User:username,uid Group: Extra: Request path: https://192.168.19.134:6443/apis/apps/v1/namespaces/default/deployments/myapp-deploy/ HTTP request verb: Get、post、put、delete API request verb: Get、list、create、update、path、watch、proxy Resource: API group: beta公测版本 默认https,需要进行双向证书认证。
通过kubectl proxy代理https实现http方式访问(本地已有证书)。
Restful接口形式存在
[root@master ~]# kubectl proxy --port=8081
Starting to serve on 127.0.0.1:8081
[root@k8s-master ~]# nohup kubectl proxy --port=8081 &
[root@master ~]# ss -ntl |grep 8081
LISTEN 0 128 127.0.0.1:8081
[root@k8s-master ~]# curl http://localhost:8081/api/v1/namespaces
[root@k8s-master ~]# curl http://localhost:8081/api/v1/namespaces/kube-system/
Api接口有两类客户端访问。 集群内部pod客户端 集群外部访问的客户端 默认所有pod都有对应的secert密钥。
[root@k8s-master ~]# kubectl get pod/myapp-0 -oyaml --export |grep serviceaccount
Flag --export has been deprecated, This flag is deprecated and will be removed in future.
- mountPath: /var/run/secrets/kubernetes.io/serviceaccount
--dry-run 来生成pod结构。
[root@k8s-master ~]# kubectl create sa mysa --dry-run -oyaml apiVersion: v1 kind: ServiceAccount metadata: creationTimestamp: null name: mysa
[root@k8s-master ~]# kubectl get sa # 如上,--dry-run没有真正创建,可以查看生成框架。
NAME SECRETS AGE
default 1 4d19h
示例,自行生成了一个token信息;创建pod并使用自定义的sa
[root@k8s-master ~]# kubectl create sa sunny serviceaccount/sunny created [root@k8s-master sa]# kubectl describe sa sunny Name: sunny Namespace: default Labels: <none> Annotations: <none> Image pull secrets: <none> Mountable secrets: sunny-token-8drq6 Tokens: sunny-token-8drq6 Events: <none> [root@k8s-master sa]# cat sa-demol.yaml apiVersion: v1 kind: Pod metadata: labels: app: myapp tier: frontend name: pod-sa-demo namespace: default spec: containers: - image: ikubernetes/myapp:v1 name: myapp ports: - name: http containerPort: 80 serviceAccountName: sunny
[root@k8s-master sa]# kubectl apply -f sa-demol.yaml
[root@k8s-master sa]# kubectl describe pods/pod-sa-demo # 查看token,跟上述token信息保持一致。
Name: pod-sa-demo
Namespace: default
...
Volumes:
sunny-token-8drq6:
Type: Secret (a volume populated by a Secret)
SecretName: sunny-token-8drq6
...
如上,token关系对应。
Kubernetes认证时用户账户有两类
Useracount:用户账户 Serveracount:服务账户,pod运行账户
将secert方法sa中,不直接放置到pod里面。私有ca不要轻易授权给别人,需要做专用ca。
查看系统内部配置信息,
[root@k8s-master sa]# kubectl config view
[root@k8s-master sa]# kubectl config view apiVersion: v1 clusters: - cluster: certificate-authority-data: DATA+OMITTED server: https://192.168.1.203:6443 name: kubernetes contexts: - context: cluster: kubernetes user: kubernetes-admin name: kubernetes-admin@kubernetes current-context: kubernetes-admin@kubernetes kind: Config preferences: {} users: - name: kubernetes-admin user: client-certificate-data: REDACTED client-key-data: REDACTED
如上,以集群维度扩展,集群之间的使用。
[root@k8s-master stateful]# ls /etc/kubernetes/pki/ # 系统证书,安全保密,不要随便泄漏。
apiserver.crt apiserver.key ca.crt front-proxy-ca.crt front-proxy-client.key apiserver-etcd-client.crt apiserver-kubelet-client.crt ca.key front-proxy-ca.key sa.key apiserver-etcd-client.key apiserver-kubelet-client.key etcd front-proxy-client.crt sa.pub
这里的ca证书都是被apiserver所信任的,ca证书不要泄露。
自作证书,创建新的账户。
自作证书,作为另外一个账号去认证k8s apiserver证书文件(连接apiserver账号)。
a、做私钥
[root@k8s-master pki]# cd /etc/kubernetes/pki
[root@k8s-master pki]# (umask 077;openssl genrsa -out sunny.key 2048)
[root@k8s-master pki]# ll sunny.key
-rw------- 1 root root 1675 7月 14 22:13 sunny.key
b、通过上面私钥做证书
通过上面私钥做证书,有ca.crt来签署。
[root@k8s-master pki]# openssl req -new -key sunny.key -out sunny.csr -subj "/CN=sunny" # 证书签署请求:CN=sunny,代表生成的用户账号是sunny
[root@k8s-master pki]# openssl x509 -req -in sunny.csr -CA ./ca.crt -CAkey ./ca.key -CAcreateserial -days 365 -out # ca签证:
配置客户端证书
把这个用户添加到连接认证的k8s集群信息,
[root@k8s-master pki]# kubectl config set-credentials sunny --client-certificate=./sunny.csr --client-key=./sunny.key --embed-certs=true # --embed-certs=true参数表示把证书隐藏起来
User "sunny" set.
[root@k8s-master pki]# kubectl config set-context sunny@kubernetes --cluster=kubernetes --user=sunny # 配置上下文
Context "sunny@kubernetes" created.
切换到新的用户访问。
[root@k8s-master pki]# kubectl config use-context sunny@kubernetes
[root@k8s-master pki]# kubectl get pods # 切换用户,看不到权限了
Error from server (Forbidden): pods is forbidden: User "sunny" cannot list resource "pods" in API group "" in the namespace "default"
[root@k8s-master pki]# kubectl config use-context kubernetes-admin@kubernetes
[root@k8s-master pki]# kubectl get pods
回切到admin用户,将证书文件加到新的集群中。
kubectl config use-context kubernetes-admin@kubernetes kubectl config set-cluster mycluster --kubeconfig=/tmp/test.conf --server="https://192.168.1.203:6443" --certificate-authority=/etc/kubernetes/pki/ca.crt --embed-certs=true kubectl config view --kubeconfig=/tmp/test.conf apiVersion: v1 clusters: - cluster: certificate-authority-data: DATA+OMITTED server: https://192.168.1.203:6443 name: mycluster contexts: [] current-context: "" kind: Config preferences: {} users: []
整节内容综合:如何使用k8s认证接入apiserver。接下来就是讲授权了,RBAC。
标签:kubectl,kubernetes,serviceaccount,sunny,认证,master,k8s,root From: https://www.cnblogs.com/sunnyyangwang/p/17555356.html