11、kubernetes之 认证和serviceaccount

第十部分 认证和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。

posted @ 2023-07-14 23:33  wang_wei123  阅读(33)  评论(0编辑  收藏  举报