kubernetes

kube-apiserver

kube-apiserver是Kubernetes最重要的核心组件之一。

  • 提供集群管理的REST API接口,包括认证授权、数据校验及集群状态变更等。
  • 提供与其他组件之间的数据交换(只有API Server才能直接操作etcd)

OpenAPI和Swagger定义

kube-apiserver使用OpenAPI记录了完整的API详细信息。从Kubernetes 1.10开始使用/openapi/v2定义资源接口。

1
2
kubectl proxy --port=8080
curl http://127.0.0.1:8080/openapi/v2 | python -m json.tool

直接访问kubernetes REST API

kube-apiserver支持https(默认6443端口)和http(监听127.0.0.1的8080端口),两个接口提供的REST API格式相同,
参考Kubernetes API Reference查看所有API的调用格式。

kubernetes api结构
(图片来自 OpenShift Blog)

使用kubectl访问

1
2
3
4
5
6
7
kubectl get --raw /api/

{
"versions": [
"v1"
]
}
1
2
kubectl get --raw /apis/batch/v1
kubectl get --raw /apis/node.k8s.io/v1beta1

使用kubectl proxy访问

下面的命令以反向代理的模式运行kubectl,它负责定位apiserver并进行身份验证:

1
kubectl proxy --port=8080
1
2
3
4
5
6
7
curl http://localhost:8080/api/

{
"versions": [
"v1"
]
}
1
curl http://localhost:8080/api/v1

编写资源文件

Kubernetes可以使用资源文件管理资源。但是我们定义资源配置清单时,apiVersion、kind、metadata尽管有章可循,但spec字段对于不同的资源来说却是千差万别,因此用户需要参考Kubernetes API的参考文档来了解各种可用属性字段。好在Kubernetes内建系统提供了部分文档可以参考,可以使用kubectl explain获取相关帮助,它给出相关对象的下一级文档。比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
$ kubectl explain pods
KIND: Pod
VERSION: v1

DESCRIPTION:
Pod is a collection of containers that can run on a host. This resource is
created by clients and scheduled onto hosts.

FIELDS:
apiVersion <string>
APIVersion defines the versioned schema of this representation of an
object. Servers should convert recognized schemas to the latest internal
value, and may reject unrecognized values. More info:
https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources

kind <string>
Kind is a string value representing the REST resource this object
represents. Servers may infer this from the endpoint the client submits
requests to. Cannot be updated. In CamelCase. More info:
https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds

metadata <Object>
Standard object's metadata. More info:
https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata

spec <Object>
Specification of the desired behavior of the pod. More info:
https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status

status <Object>
Most recently observed status of the pod. This data may not be up to date.
Populated by the system. Read-only. More info:
https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status

要了解二级对象或三级对象的资源时:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ kubectl explain pods.spec
KIND: Pod
VERSION: v1

RESOURCE: spec <Object>

DESCRIPTION:
Specification of the desired behavior of the pod. More info:
https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status

PodSpec is a description of a pod.

FIELDS:
...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ kubectl explain pods.spec.containers
KIND: Pod
VERSION: v1

RESOURCE: containers <[]Object>

DESCRIPTION:
List of containers belonging to the pod. Containers cannot currently be
added or removed. There must be at least one container in a Pod. Cannot be
updated.

A single application container that you want to run within a pod.

FIELDS:
...

还有一种方式可以快速定义资源文件,即参考现有的资源配置。比如:

1
kubectl get pods open-user-74b8b67bc9-kgkxx -o yaml --export > pods-demo.yaml

Kubernetes认证授权

使用kubeadm部署的Kubernetes集群默认提供了拥有集群管理权限的kubeconfig配置文件/etc/kubernetes/admin.conf,它可以复制到任何拥有kubectl的主机上管理集群。管理员可以创建其他账号授予非管理员管理部分资源,其配置过程可以分为两部分:

  1. 为用户创建专用私钥及证书

  2. 将步骤1的配置置于kubeconfig文件中
    下面给出创建过程,创建了一个kubernetes-ljun51用户,(需要以root身份):

  3. 为目标用户kubernetes-ljun51创建专用私钥及证书,保存在/etc/kubernetes/pki目录

    1. 生成私钥文件

      1
      2
      # cd /etc/kubernetes/kpi
      # (umask 077; openssl genrsa -out kubernetes-ljun51.key 2048)
    2. 创建证书签署请求,-subj选项中的CN的值将作为用户名,O的值作为用户组

      1
      2
      # openssl req -new -key kubernetes-ljun51.key -out kubernetes-ljun51.csr \
      -subj "/CN=kubernetes-ljun51/O=kubernetes-Users"
    3. 基于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
    4. 验证证书信息

      1
      # openssl x509 -in kubernetes-ljun51.crt -text -noout
  4. 以默认管理员kubenetes-admin@kubernetes为新建的kubernetes-ljun51设定kube-config配置文件,配置结果将默认保存于当前系统用户的./kube/config文件中,也可以使用kubectl –kubeconfig选项指定自定义的专用文件路径。

    1. 配置集群信息,包括集群名称、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"
    2. 配置客户端证书及密钥,用户名信息会通过命令从证书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
    3. 配置上下文,用来组合cluster和credentials,即访问的集群上下文。如果为管理了多个集群而设置了多个环境,则可以使用use-context切换:

      1
      $ k config set-context kubernetes-ljun51@abc12366 --cluster=abc12366 --user=kubernetes-ljun51
    4. 指定要使用的上下问,切换为以kubernetes-ljun51访问集群:

      1
      $ k config use-context kubernetes-ljun51@abc12366
    5. 测试访问集群资源,不过在启用RBAC的集群上没有访问权限:

      1
      $ k get pods

      若需要切换至管理账号,可使用kubectl config use-context kubernetes-admin@kubernetes命令,临时使用可使用kubectl --context=kubernetes-ljun51@abc12366 get pods命令.