# Api-Server
Kubernetes運作主要基於Api-Server
溝通的方式為REST-Api
[API Overview](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.29/)
[Authorization Overview](https://kubernetes.io/docs/reference/access-authn-authz/authorization/)
[Managing Service Accounts](https://kubernetes.io/docs/reference/access-authn-authz/service-accounts-admin/#manual-secret-management-for-serviceaccounts)
[Secrets](https://kubernetes.io/docs/concepts/configuration/secret/#secret-types)
[Resource types](https://kubernetes.io/docs/reference/kubectl/#resource-types)
## ServiceAccount
要打K8s的Api,那就需要一個Bearer Token
那要取得這個Bearer Token,並要設定對應權限的話,就要建立一個ServiceAccount並設定RBAC
- ServiceAccount
```
apiVersion: v1
kind: ServiceAccount
metadata:
name: jenkins
namespace: kube-system
```
Type為`kubernetes.io/service-account-token`時,`kubernetes.io/service-account.name`必填,且需符合ServiceAccount
- Secret
```
apiVersion: v1
kind: Secret
type: kubernetes.io/service-account-token
metadata:
name: jenkins
namespace: kube-system
annotations:
kubernetes.io/service-account.name: "jenkins"
```
### RBAC
`<ip>:8443/apis`可以取得目前Token可取得的Api
`kubectl api-resources -o wide` 可以確認rules的各項要填什麼值
基本上從[API Overview](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.29/)確認各自Api需要填寫的rules比較直接
``` bash
NAME SHORTNAMES APIVERSION NAMESPACED KIND VERBS CATEGORIES
bindings v1 true Binding create
componentstatuses cs v1 false ComponentStatus get,list
configmaps cm v1 true ConfigMap create,delete,deletecollection,get,list,patch,update,watch
endpoints ep v1 true Endpoints create,delete,deletecollection,get,list,patch,update,watch
events ev v1 true Event create,delete,deletecollection,get,list,patch,update,watch
limitranges limits v1 true LimitRange create,delete,deletecollection,get,list,patch,update,watch
```
NAME對應到resources,APIVERSION去掉Version則對應到apiGroups
`GET /api/v1/namespaces/{namespace}/pods/{name}/log`
有些Api會有Subresource,以這個Url來說,若要存取log這個有些Api會有Subresource,則需要輸入`pods/log`
``` yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: pod-and-pod-logs-reader
rules:
- apiGroups: [""]
resources: ["pods", "pods/log"]
verbs: ["get", "list"]
```
也可以限制可存取的resourceNames
```yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: configmap-updater
rules:
- apiGroups: [""]
#
# at the HTTP level, the name of the resource for accessing ConfigMap
# objects is "configmaps"
resources: ["configmaps"]
resourceNames: ["my-configmap"]
verbs: ["update", "get"]
```
- ClusterRole
```
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: jenkins-pod-create
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["create", "delete", "get", "list", "patch", "update", "watch"]
- apiGroups: [""]
resources: ["pods/exec"]
verbs: ["create", "delete", "get", "list", "patch", "update", "watch"]
- apiGroups: [""]
resources: ["pods/log"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["events"]
verbs: ["watch"]
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get"]
```
- ClusterRoleBinding
```
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: jenkins
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: jenkins-pod-create
subjects:
- kind: ServiceAccount
name: jenkins
namespace: kube-system
```