kube-apiserver
kube-apiserver是Kubernetes最重要的核心组件之一。
- 提供集群管理的REST API接口,包括认证授权、数据校验及集群状态变更等。
- 提供与其他组件之间的数据交换(只有API Server才能直接操作etcd)
OpenAPI和Swagger定义
kube-apiserver使用OpenAPI记录了完整的API详细信息。从Kubernetes 1.10开始使用/openapi/v2
定义资源接口。
1 | kubectl proxy --port=8080 |
直接访问kubernetes REST API
kube-apiserver支持https(默认6443端口)和http(监听127.0.0.1的8080端口),两个接口提供的REST API格式相同,
参考Kubernetes API Reference查看所有API的调用格式。
(图片来自 OpenShift Blog)
使用kubectl访问
1 | kubectl get --raw /api/ |
1 | kubectl get --raw /apis/batch/v1 |
使用kubectl proxy访问
下面的命令以反向代理的模式运行kubectl,它负责定位apiserver并进行身份验证:
1 | kubectl proxy --port=8080 |
1 | curl http://localhost:8080/api/ |
1 | curl http://localhost:8080/api/v1 |
编写资源文件
Kubernetes可以使用资源文件管理资源。但是我们定义资源配置清单时,apiVersion、kind、metadata尽管有章可循,但spec字段对于不同的资源来说却是千差万别,因此用户需要参考Kubernetes API的参考文档来了解各种可用属性字段。好在Kubernetes内建系统提供了部分文档可以参考,可以使用kubectl explain
获取相关帮助,它给出相关对象的下一级文档。比如:
1 | $ kubectl explain pods |
要了解二级对象或三级对象的资源时:
1 | $ kubectl explain pods.spec |
1 | $ kubectl explain pods.spec.containers |
还有一种方式可以快速定义资源文件,即参考现有的资源配置。比如:
1 | kubectl get pods open-user-74b8b67bc9-kgkxx -o yaml --export > pods-demo.yaml |
Kubernetes认证授权
使用kubeadm部署的Kubernetes集群默认提供了拥有集群管理权限的kubeconfig配置文件/etc/kubernetes/admin.conf,它可以复制到任何拥有kubectl的主机上管理集群。管理员可以创建其他账号授予非管理员管理部分资源,其配置过程可以分为两部分:
为用户创建专用私钥及证书
将步骤1的配置置于kubeconfig文件中
下面给出创建过程,创建了一个kubernetes-ljun51用户,(需要以root身份):为目标用户
kubernetes-ljun51
创建专用私钥及证书,保存在/etc/kubernetes/pki目录生成私钥文件
1
2# cd /etc/kubernetes/kpi
# (umask 077; openssl genrsa -out kubernetes-ljun51.key 2048)创建证书签署请求,
-subj
选项中的CN的值将作为用户名,O
的值作为用户组1
2# openssl req -new -key kubernetes-ljun51.key -out kubernetes-ljun51.csr \
-subj "/CN=kubernetes-ljun51/O=kubernetes-Users"基于kubeadm安装坤儿呢特色集群时生成的CA签署证书,有效时长3650天
1
2# openssl x509 -req -in kubernetes-ljun51.csr -CA ca.crt -CAkey ca.key \
-CAcreateserial -out kubernetes-ljun51.crt -days 3650验证证书信息
1
# openssl x509 -in kubernetes-ljun51.crt -text -noout
以默认管理员kubenetes-admin@kubernetes为新建的kubernetes-ljun51设定kube-config配置文件,配置结果将默认保存于当前系统用户的./kube/config文件中,也可以使用kubectl –kubeconfig选项指定自定义的专用文件路径。
配置集群信息,包括集群名称、API Server URL和CA证书。若集群已经存在可省略此步,另外,提供的新配置不能与现有配置中的集群名称相同,否则会覆盖:
1
2
3$ k config set-cluster abc12366 --embed-certs=true \
--certificate-authority=/etc/kubernetes/pki/ca.crt \
--server="https://118.118.116.142:6443"配置客户端证书及密钥,用户名信息会通过命令从证书Subject的CN值中自动提取,例如前面创建csr时使用的”CN=kubernetes-ljun51”,而组名则来自于”O=kubernetes-Users”的定义:
1
2
3$ sudo kubectl config set-credentials kubernetes-ljun51 --embed-certs=true \
--client-certificate=/etc/kubernetes/pki/kubernetes-ljun51.crt \
--client-key=/etc/kubernetes/pki/kubernetes-ljun51.key配置上下文,用来组合cluster和credentials,即访问的集群上下文。如果为管理了多个集群而设置了多个环境,则可以使用use-context切换:
1
$ k config set-context kubernetes-ljun51@abc12366 --cluster=abc12366 --user=kubernetes-ljun51
指定要使用的上下问,切换为以
kubernetes-ljun51
访问集群:1
$ k config use-context kubernetes-ljun51@abc12366
测试访问集群资源,不过在启用RBAC的集群上没有访问权限:
1
$ k get pods
若需要切换至管理账号,可使用
kubectl config use-context kubernetes-admin@kubernetes
命令,临时使用可使用kubectl --context=kubernetes-ljun51@abc12366 get pods
命令.