k8s入坑之路(5)kube-apiserver详解
API Server
kube-apiserver 是 Kubernetes 最重要的核心组件之一,主要提供以下的功能
- 提供集群管理的 REST API 接口,包括认证授权、数据校验以及集群状态变更等
- 提供其他模块之间的数据交互和通信的枢纽(其他模块通过 API Server 查询或修改数据,只有 API Server 才直接操作 etcd)
REST API
详情:https://www.bookstack.cn/read/feiskyer-kubernetes-handbook-202005/components-apiserver.md
kube-apiserver 支持同时提供 https(默认监听在 6443 端口)和 http API(默认监听在 127.0.0.1 的 8080 端口),其中 http API 是非安全接口,不做任何认证授权机制,不建议生产环境启用。两个接口提供的 REST API 格式相同,参考 Kubernetes API Reference 查看所有 API 的调用格式。
在实际使用中,通常通过 kubectl 来访问 apiserver,也可以通过 Kubernetes 各个语言的 client 库来访问 apiserver。在使用 kubectl 时,打开调试日志也可以看到每个 API 调用的格式,比如
- 1 kubectl --v=8 get pods
可通过 kubectl api-versions
和 kubectl api-resources
查询 Kubernetes API 支持的 API 版本以及资源对象。
- kubectl api-versions
- admissionregistration.k8s.io/v1beta1
- apiextensions.k8s.io/v1beta1
- apiregistration.k8s.io/v1
- apiregistration.k8s.io/v1beta1
- apps/v1
- apps/v1beta1
- apps/v1beta2
- authentication.k8s.io/v1
- authentication.k8s.io/v1beta1
- authorization.k8s.io/v1
- authorization.k8s.io/v1beta1
- autoscaling/v1
- autoscaling/v2beta1
- batch/v1
- batch/v1beta1
- certificates.k8s.io/v1beta1
- events.k8s.io/v1beta1
- extensions/v1beta1
- metrics.k8s.io/v1beta1
- networking.k8s.io/v1
- policy/v1beta1
- rbac.authorization.k8s.io/v1
- rbac.authorization.k8s.io/v1beta1
- scheduling.k8s.io/v1beta1
- storage.k8s.io/v1
- storage.k8s.io/v1beta1
- v1
- $ kubectl api-resources --api-group=storage.k8s.io
- NAME SHORTNAMES APIGROUP NAMESPACED KIND
- storageclasses sc storage.k8s.io false StorageClass
- volumeattachments storage.k8s.io false VolumeAttachment
OpenAPI 和 Swagger
通过 /swaggerapi
可以查看 Swagger API,/openapi/v2
查看 OpenAPI。
开启 --enable-swagger-ui=true
后还可以通过 /swagger-ui
访问 Swagger UI。
根据 OpenAPI 也可以生成各种语言的客户端,比如可以用下面的命令生成 Go 语言的客户端:
- 1 git clone https://github.com/kubernetes-client/gen /tmp/gen
- 2 cat >go.settings <<EOF
- 3 # Kubernetes branch name
- 4 export KUBERNETES_BRANCH="release-1.11"
- 5 # client version for packaging and releasing.
- 6 export CLIENT_VERSION="1.0"
- 7 # Name of the release package
- 8 export PACKAGE_NAME="client-go"
- 9 EOF
- 10 /tmp/gen/openapi/go.sh ./client-go ./go.settings
访问控制
Kubernetes API 的每个请求都会经过多阶段的访问控制之后才会被接受,这包括认证、授权以及准入控制(Admission Control)等。
认证
开启 TLS 时,所有的请求都需要首先认证。Kubernetes 支持多种认证机制,并支持同时开启多个认证插件(只要有一个认证通过即可)。如果认证成功,则用户的 username
会传入授权模块做进一步授权验证;而对于认证失败的请求则返回 HTTP 401。
- Kubernetes 不直接管理用户
- 虽然 Kubernetes 认证和授权用到了 username,但 Kubernetes 并不直接管理用户,不能创建 user 对象,也不存储 username。
更多认证模块的使用方法可以参考 Kubernetes 认证插件。
详情
授权
认证之后的请求就到了授权模块。跟认证类似,Kubernetes 也支持多种授权机制,并支持同时开启多个授权插件(只要有一个验证通过即可)。如果授权成功,则用户的请求会发送到准入控制模块做进一步的请求验证;而对于授权失败的请求则返回 HTTP 403.
更多授权模块的使用方法可以参考 Kubernetes 授权插件。
准入控制
准入控制(Admission Control)用来对请求做进一步的验证或添加默认参数。不同于授权和认证只关心请求的用户和操作,准入控制还处理请求的内容,并且仅对创建、更新、删除或连接(如代理)等有效,而对读操作无效。准入控制也支持同时开启多个插件,它们依次调用,只有全部插件都通过的请求才可以放过进入系统。
更多准入控制模块的使用方法可以参考 Kubernetes 准入控制。
启动 apiserver 示例
- 1 kube-apiserver --feature-gates=AllAlpha=true --runtime-config=api/all=true \
- 2 --requestheader-allowed-names=front-proxy-client \
- 3 --client-ca-file=/etc/kubernetes/pki/ca.crt \
- 4 --allow-privileged=true \
- 5 --experimental-bootstrap-token-auth=true \
- 6 --storage-backend=etcd3 \
- 7 --requestheader-username-headers=X-Remote-User \
- 8 --requestheader-extra-headers-prefix=X-Remote-Extra- \
- 9 --service-account-key-file=/etc/kubernetes/pki/sa.pub \
- 10 --tls-cert-file=/etc/kubernetes/pki/apiserver.crt \
- 11 --tls-private-key-file=/etc/kubernetes/pki/apiserver.key \
- 12 --kubelet-client-certificate=/etc/kubernetes/pki/apiserver-kubelet-client.crt \
- 13 --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt \
- 14 --insecure-port=8080 \
- 15 --admission-control=NamespaceLifecycle,LimitRanger,ServiceAccount,PersistentVolumeLabel,DefaultStorageClass,ResourceQuota,DefaultTolerationSeconds \
- 16 --requestheader-group-headers=X-Remote-Group \
- 17 --kubelet-client-key=/etc/kubernetes/pki/apiserver-kubelet-client.key \
- 18 --secure-port=6443 \
- 19 --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname \
- 20 --service-cluster-ip-range=10.96.0.0/12 \
- 21 --authorization-mode=RBAC \
- 22 --advertise-address=192.168.0.20--etcd-servers=http://127.0.0.1:2379
工作原理
kube-apiserver 提供了 Kubernetes 的 REST API,实现了认证、授权、准入控制等安全校验功能,同时也负责集群状态的存储操作(通过 etcd)。
以 /apis/batch/v2alpha1/jobs
为例,GET 请求的处理过程如下图所
API 访问
有多种方式可以访问 Kubernetes 提供的 REST API:
kubectl
- 1 kubectl get --raw /api/v1/namespaces
- 2 kubectl get --raw /apis/metrics.k8s.io/v1beta1/nodes
- 3 kubectl get --raw /apis/metrics.k8s.io/v1beta1/pods
kubectl proxy
- 1 $ kubectl proxy --port=8080&
- 2 $ curl http://localhost:8080/api/
- 3 {
- 4 "versions":[
- 5 "v1"
- 6 ]
- 7 }
curl
- 1 # In Pods with service account.
- 2 $ TOKEN=$(cat /run/secrets/kubernetes.io/serviceaccount/token)
- 3 $ CACERT=/run/secrets/kubernetes.io/serviceaccount/ca.crt
- 4 $ curl --cacert $CACERT --header "Authorization: Bearer $TOKEN" https://$KUBERNETES_SERVICE_HOST:$KUBERNETES_SERVICE_PORT/api
- 5 {
- 6 "kind":"APIVersions",
- 7 "versions":[
- 8 "v1"
- 9 ],
- 10 "serverAddressByClientCIDRs":[
- 11 {
- 12 "clientCIDR":"0.0.0.0/0",
- 13 "serverAddress":"10.0.1.149:443"
- 14 }
- 15 ]
- 16 }
- 1 # Outside of Pods.
- 2 $ APISERVER=$(kubectl config view | grep server | cut -f 2--d ":"| tr -d " ")
- 3 $ TOKEN=$(kubectl describe secret $(kubectl get secrets | grep default | cut -f1 -d ' ')| grep -E '^token'| cut -f2 -d':'| tr -d '\t')
- 4 $ curl $APISERVER/api --header "Authorization: Bearer $TOKEN"--insecure
- 5 {
- 6 "kind":"APIVersions",
- 7 "versions":[
- 8 "v1"
- 9 ],
- 10 "serverAddressByClientCIDRs":[
- 11 {
- 12 "clientCIDR":"0.0.0.0/0",
- 13 "serverAddress":"10.0.1.149:443"
- 14 }
- 15 ]
- 16 }
API 参考文档
最近 3 个稳定版本的 API 参考文档为:
k8s入坑之路(5)kube-apiserver详解的更多相关文章
- k8s入坑之路(4)kubenetes安装
三种安装方法: 1.kubeadm 2.kubespray 3.二进制安装 kubespray安装kubernetes集群 优点: 1.kuberspray对比kubeadm更加简洁内部集成了kube ...
- k8s入坑之路(13)kubernetes重要资源(namespace隔离 resources资源管理 label)
Namespace --- 集群的共享与隔离 语言中namespace概念 namespace核心作用隔离 以上是隔离的代码.namespace隔离的是: 1.资源对象的隔离:Service.Depl ...
- k8s入坑之路(7)kubernetes设计精髓List/Watch机制和Informer模块详解
1.list-watch是什么 List-watch 是 K8S 统一的异步消息处理机制,保证了消息的实时性,可靠性,顺序性,性能等等,为声明式风格的API 奠定了良好的基础,它是优雅的通信方式,是 ...
- k8s入坑之路(15)kubernetes共享存储与StatefulSet有状态
共享存储 docker默认是无状态,当有状态服务时需要用到共享存储 为什么需要共享存储: 1.最常见有状态服务,本地存储有些程序会把文件保存在服务器目录中,如果容器重新启停则会丢失. 2.如果使用vo ...
- k8s入坑之路(14)scheduler调度 kubelet管理及健康检查 更新策略
kubelet 主要功能 Pod 管理 在 kubernetes 的设计中,最基本的管理单位是 pod,而不是 container.pod 是 kubernetes 在容器上的一层封装,由一组运行在同 ...
- k8s入坑之路(9)k8s网络插件详解
Flannel: 最成熟.最简单的选择 Calico: 性能好.灵活性最强,目前的企业级主流 Canal: 将Flannel提供的网络层与Calico的网络策略功能集成在一起. Weave: 独有的功 ...
- k8s入坑之路(16)kubernetes中CICD/基于宿主机jenkins
cicd的结合组件 需要代码仓库如gitlab.github.包构建工具Maven等,持续集成工具如jenkins,github/cicd.结合自己脚本实现重复式任务自动化. 传统服务发布流程: 提交 ...
- k8s入坑之路(13)服务迁移(定时任务 微服务 传统服务)
定时任务迁移kubernetes 服务迁移步骤 1.安装好java 2.安装好maven 项目打包 mvn package 测试传参运行 java -cp cronjob-demo-1.0-SNAPS ...
- k8s入坑之路(12)ingress-nginx安装配置四层代理
ingress官方文档地址:http://docs.kubernetes.org.cn/ https://feisky.gitbooks.io/kubernetes/content/plugins/ ...
随机推荐
- Docker 配置国内镜像加速器
Docker 默认是从官方镜像地址 Docker Hub 下下载镜像,由于服务器在国外的缘故,导致经常下载速度非常慢.为了提升镜像的下载速度,我们可以手动配置国内镜像加速器,让下载速度飚起来. 国内的 ...
- Linux python 虚拟环境管理
直接复制的内容: 原著:https://www.cnblogs.com/q767498226/p/11099884.html 报错解决:https://blog.csdn.net/weixin_467 ...
- 【Golang】Go 通过结构(struct) 实现接口(interface)
一.通过结构(struct) 实现 接口(interface) 1.在了解iris框架的时候,经常看到有这样去写的使用一个空结构体作为接收器,来调用方法,有点好奇这样做有什么意义. 解释:在 Go 语 ...
- AOJ/高等排序习题集
ALDS1_5_B-MergeSort. Description: Write a program of a Merge Sort algorithm implemented by the follo ...
- docker 安装 wordpress,通过nginx反向代理,绑定域名,配置https
假设docker已经安装好了,如果没有安装,可以照着 5分钟安装docker教程. 一. 下载镜像 默认下载最新版本,如果想指定对应版本,可以用冒号后加版本,像这样mysql:5.7: docker ...
- NOIP 模拟六 考试总结
T1辣鸡 T1就搞得这莫不愉快.. 大致题意是给你几个矩形,矩形覆盖的点都标记上,每个矩形无重复部分,求满足(x,y) (x+1,y+1)都标记过的点对数,范围1e9. 看起来很牛的样子,我确实也被1 ...
- NOIP模拟69
T1 石子游戏 大坑未补 T2 大鱼吃小鱼 解题思路 set+桶可以得到 60pts (code) 线段树上二分每一次优先递归右区间从右区间贪心选择,并且记录下更改过的值,在处理完答案之后再复原回去. ...
- 配置Internal Load balancer中VM的外网访问
当在Azure中部署SQL VM时,处于安全考虑,不会配置VM的Public IP,会禁止外网的进出站访问,只允许从内部VNET,或者特定的内部IP访问.特别是当使用Azure Internal Lo ...
- 题解 有标号DAG计数
题目传送门 题目大意 给出\(n\),求出对于任意\(t\in[1,n]\),点数为\(t\)的弱联通\(\texttt{DAG}\)个数.答案对\(998244353\)取模. \(n\le 10^ ...
- appium+Andriod环境搭建遇到问题
报错:Caused by: org.openqa.selenium.WebDriverException: An unknown server-side error occurred while pr ...