API Server是k8s集群的网关,是能够与etcd通信的唯一入口
kube-controller-manager、kube-scheduler、kubelet、kube-proxy,以及后续部署的集群插件CoreDNS、ProjectCalico等,彼此间互不通信,彼此间的所有协作均经由API Server的REST API进行,它们都是API Server的客户端, 确保对API Server的安全访问至关重要。
客户端对API Server的访问应经过身份验证以及权限检查
为防止中间人攻击,各类客户与API Server间的通信都应使用TLS进行加密,kubelet也会监听一些套接字,提供一个小型的REST API
10250是具有所在节点上Pod管理权限的读写端口,应谨慎管理
10255仅提供只读操作,是REST API的子集
10248是本地healthz端点使用的端口

API Server内置一个三级别的访问控制机制

插件化机制,每种访问控制机制均有一组专用的插件栈

在RBAC API中,通过以下步骤进行授权:
1、**定义角色:**在定义角色时会指定此角色对于资源的访问控制的规则
2、**绑定角色:**将主体与角色进行绑定,对用户进行访问授权。
角色:
角色绑定
主体(subject)

Role针对特定的命名空间,ClusterRole针对是整个集群范围内都生效
概念:
kubeconfig文件保存了k8s集群的集群、用户、命名空间、认证的信息。kubectl命令使用kubeconfig文件获取集群的信息然后和API Server进行通信
注意:用于配置对集群的访问的文件称为 kubecconfig 文件。也就是说,kubeconfig 文件中包含的内容是集群的配置。但是,并不是必须有个文件名字叫 kubeconfig。默认情况下,kubectl命令从 $HOME/.kube 目录下查找一个名字叫做 config 的文件。可以通过 KUBECONFIG 环境变量或者–kubeconfig 参数来指定其他的 kubeconfig 文件。
kubeconfig中的组成部分:
kubeconfig支持多集群、多用户、多认证
实际使用场景:
都可以使用kubeconfig来组织集群、用户、命名空间的信息。同样也可以使用context在集群和命名空间之间进行切换
要求:
root@k8s-master1:/app/yaml/rbac# kubectl create sa wengsq -n linux
root@k8s-master1:/app/yaml/rbac# cat wengsq-role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: wengsq-role
namespace: linux
rules:
- apiGroups:
- ""
resources:
- pods
- pods/exec
verbs: ["*"]
- apiGroups:
- apps
resources:
- deployments
verbs: ["*"]
root@k8s-master1:/app/yaml/rbac# kubectl apply -f wengsq-role.yaml
#验证
root@k8s-master1:/app/yaml/rbac# kubectl get role -n linux
NAME CREATED AT
wengsq-role 2024-02-23T06:36:53Z
root@k8s-master1:/app/yaml/rbac# kubectl describe role wengsq-role -n linux
Name: wengsq-role
Labels: <none>
Annotations: <none>
PolicyRule:
Resources Non-Resource URLs Resource Names Verbs
--------- ----------------- -------------- -----
pods/exec [] [] [*]
pods [] [] [*]
deployments.apps [] [] [*]
新建一个名为role-bind-wengsq的Rolebinding
root@k8s-master1:/app/yaml/rbac# cat role-bind-wengsq.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: role-bind-wengsq
namespace: linux
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: wengsq-role
subjects:
- kind: ServiceAccount
name: wengsq
namespace: linux
root@k8s-master1:/app/yaml/rbac#kubectl apply -f role-bind-wengsq.yaml
#验证
root@k8s-master1:/app/yaml/rbac# kubectl describe rolebindings.rbac.authorization.k8s.io role-bind-wengsq -n linux
Name: role-bind-wengsq
Labels: <none>
Annotations: <none>
Role:
Kind: Role
Name: wengsq-role
Subjects:
Kind Name Namespace
---- ---- ---------
ServiceAccount wengsq linux
root@k8s-master1:/app/yaml/rbac# kubectl get secrets -n linux
NAME TYPE DATA AGE
default-token-b55qx kubernetes.io/service-account-token 3 2d22h
wengsq-token-jmfx5 kubernetes.io/service-account-token 3 26h
root@k8s-master1:/app/yaml/rbac# kubectl describe secrets wengsq-token-jmfx5 -n linux
Name: wengsq-token-jmfx5
Namespace: linux
Labels: <none>
Annotations: kubernetes.io/service-account.name: wengsq
kubernetes.io/service-account.uid: 9c74cff9-351e-4f8e-8414-192cceb1d9d9
Type: kubernetes.io/service-account-token
Data
====
token: eyJhbGciOiJSUzI1NiIsImtpZCI6IjNKazJfUnF2c0stSkFVbHZkT2VPVXRRSlBINVM5SEtmWTRqR013RmpKRUkifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJsaW51eCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJ3ZW5nc3EtdG9rZW4tam1meDUiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoid2VuZ3NxIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiOWM3NGNmZjktMzUxZS00ZjhlLTg0MTQtMTkyY2NlYjFkOWQ5Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50OmxpbnV4OndlbmdzcSJ9.NkUN9E6wYcjw4TzFA5julmOOkey2Gq1jUOUw6jP5f9Z7lb9MnbG3ecZ58-RqZ7GL7TD4BsbCQAYd_uAiZseHOvdb8wYmPIZZF-T04MnjwX_O2ZVTCm3pN-w2p0nAsFe8ofPxWjFWM5NvJBwhXHvBl8roh0bz5X-Fg8NELRv7vsO0xd5TkVQFBiVOn5n_0rWvdjXhwgNGjG6VSEGI9WUXPB1kw-wLcLZ39ZclCA1hJLHSt5NCLASnYRZC83J_OAnSnOwE6woCQyRLXHzcZYfYIC2gxsdQEoC1K-S97IliJ0qwmnGijRUN_CKsVCQI0uKX1FFJpWnvIes0EHMsbZivfw
ca.crt: 1350 bytes
namespace: 5 bytes


root@k8s-master1:/app/yaml/rbac# cat wengsq-csr.json
{
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "NanJing",
"L": "Nanjing",
"O": "Pana",
"OU": "System"
}
]
}
签发成功会生成:wengsq-key.pem、wengsq.csr、 wengsq.pem三个文件
root@k8s-master1:/app/yaml/rbac# ln -sf /etc/kubeasz/bin/cfssl* /usr/bin/
root@k8s-master1:/app/yaml/rbac# cfssl gencert -ca=/etc/kubernetes/ssl/ca.pem -ca-key=/etc/kubernetes/ssl/ca-key.pem -config=/etc/kubeasz/clusters/k8s-01/ssl/ca-config.json -profile=kubernetes wengsq-csr.json |cfssljson -bare wengsq
2024/02/23 16:20:26 [INFO] generate received request
2024/02/23 16:20:26 [INFO] received CSR
2024/02/23 16:20:26 [INFO] generating key: rsa-2048
2024/02/23 16:20:27 [INFO] encoded CSR
2024/02/23 16:20:27 [INFO] signed certificate with serial number 654959555428526687192265662714543254530197189889
2024/02/23 16:20:27 [WARNING] This certificate lacks a "hosts" field. This makes it unsuitable for
websites. For more information see the Baseline Requirements for the Issuance and Management
of Publicly-Trusted Certificates, v.1.1.6, from the CA/Browser Forum (https://cabforum.org);
specifically, section 10.2.3 ("Information Requirements")
root@k8s-master1:/app/yaml/rbac# ll
total 60
drwxr-xr-x 2 root root 299 Feb 23 14:59 ./
drwxr-xr-x 11 root root 136 Feb 21 10:48 ../
-rw-r--r-- 1 root root 260 Feb 20 17:39 role-bind-wengsq.yaml
-rw-r--r-- 1 root root 80 Feb 21 17:16 sa.yaml
-rw-r--r-- 1 root root 555 Feb 22 13:43 tomcat-app1.yaml
-rw-r--r-- 1 root root 202 Feb 21 17:04 wengsq-csr.json
-rw------- 1 root root 1675 Feb 21 17:04 wengsq-key.pem
-rw-r--r-- 1 root root 271 Feb 23 14:59 wengsq-role.yaml
-rw-r--r-- 1 root root 972 Feb 21 17:04 wengsq.csr
-rw------- 1 root root 6215 Feb 21 17:06 wengsq.kubeconfig
-rw-r--r-- 1 root root 1363 Feb 21 17:04 wengsq.pem
1、生成普通用户kubeconfig文件
root@k8s-master1:/app/yaml/rbac# kubectl config set-cluster cluster1 --certificate-authority=/etc/kubernetes/ssl/ca.pem --embed-certs --server=https://172.17.1.101:6443 --kubeconfig=wengsq.kubeconfig
Cluster "cluster1" set.
2、将证书信息嵌入kubeconfig文件
root@k8s-master1:/app/yaml/rbac# kubectl config set-credentials wengsq --client-certificate=/app/yaml/rbac/wengsq.pem --client-key=/app/yaml/rbac/wengsq-key.pem --embed-certs=true --kubeconfig=wengsq.kubeconfig
User "wengsq" set.
3、设置上下文参数
root@k8s-master1:/app/yaml/rbac# kubectl config set-context cluster1 --cluster=cluster1 --user=wengsq --namespace=linux --kubeconfig=wengsq.kubeconfig
Context "cluster1" created.
4、设置默认上下文
kubectl config use-context cluster1 --kubeconfig=wengsq.kubeconfig
注意:如果查看没有wengsq.kubeconfig文件,配置一下环境变量export KUBECONFIG=~/.kube/wengsq.kubeconfig

