K8S 使用简介

2018-11-30 Friday    


简介

Kubernetes 的整体架构如下。

k8s arch

K8S 包含了两类节点,Master 和 Nodes ,前者用于管理协调集群,包含了 kube-apiserver kube-controller-manager kube-scheduler 三个进程;后者则是真正工作的机器,包含了 kubelet kube-proxy 两个进程。

API-Server

--admission-control 权限控制

Kubectl

kubectl 是 Kubernetes API 的客户端,可以用来执行所有可能的 Kubernetes 操作。

自动补全

一般的 Bash 或者 Zsh 都提供了自动补全的方式,不过需要安装单独的依赖包,默认是安装的,例如 bash-completion ,可以通过 type _init_completion 命令检查,详细参考 自动补全

可以通过 kubectl completion bash 生成命令补全内容,参数也可以是 zsh ,然后通过如下方式进行配置。

----- 1. 生成配置文件,并添加到~/.bashrc文件中
# kubectl completion bash > /usr/share/bash-completion/bash_completion
# source /usr/share/bash-completion/bash_completion

----- 2. 加载默认配置,添加到默认的加载目录
# kubectl completion bash > /etc/bash_completion.d/kubectl

在输出的时候,可以通过 -o custom-columns=XXX 指定输出内容以及格式。

kubeconfig

K8S 中通过配置文件保存了集群、用户、命名空间、鉴权等与集群建立连接相关信息,默认保存在 ~/.kube/config 文件中,也可以通过 KUBECONFIG 环境变量,或者 --kubeconfig 参数指定。

当通过 kubectl config view 命令查看时,有可能是几个配置文件的合并,详见 Organizing Cluster Access Using kubeconfig Files 中的介绍。

通常一个集群对应了一个上下文,其上下文包括了:

  • 集群 (Cluster),集群API服务器的URL地址;
  • 用户 (User),集群的特定用户的身份验证凭据;
  • 命名空间 (Namespace),连接到集群时使用的命名空间。

也就是说,在切换集群的时候,实际上就是切换上下文,当然,也可以通过 --cluster --user --namespace 指定。

如下是常用的命令。

----- 查看配置,也就是~/.kube/config,可以通过 --minify 减少输出
# client/bin/kubectl config view

----- 设置ctl命令的默认NS
# client/bin/kubectl config set-context --current --namespace=default

----- 列出所有上下文信息以及当前上下文信息
# client/bin/kubectl config get-contexts
# client/bin/kubectl config current-contexts

Kube-Proxy

在 K8S 中,Service 是一组 pod 服务的抽象,会提供统一的 IP (Cluster IP),类似于一组 pod 的 LB,负责将请求分发给对应的 pod 。

而 kube-proxy 就是用来实现 Service ,具体来说,就是实现了内部从 pod 到service和外部的从node port向service的访问。

举个例子,现在有podA,podB,podC和serviceAB。serviceAB是podA,podB的服务抽象(service)。 那么kube-proxy的作用就是可以将pod(不管是podA,podB或者podC)向serviceAB的请求,进行转发到service所代表的一个具体pod(podA或者podB)上。 请求的分配方法一般分配是采用轮询方法进行分配。

另外,kubernetes还提供了一种在node节点上暴露一个端口,从而提供从外部访问service的方式。

假设有如下的配置。

apiVersion: v1
kind: Service
metadata:
  labels:
    name: mysql
    role: service
  name: mysql-service
spec:
  ports:
    - port: 3306
      targetPort: 3306
      nodePort: 30964
  type: NodePort
  selector:
    mysql-service: "true"

https://www.cnblogs.com/xuxinkun/p/5799986.html

Label

Label 是 K8S 中一个核心的概念,通过 Key-Value 方式组织,可以附加到任何对象上,例如 Pod、Service、Node 等。

部署

在部署服务时,通过 YMAL 文件进行定义,主要包括了两个配置文件:A) 服务文件,定义 POD 逻辑组及其策略;B) 部署文件,定义应用程序的运行状态,比如什么时间应该运行多少副本。

鉴权

https://www.cnblogs.com/breg/p/5923604.html

除了双向认证方式,Kubernets 还提供了基于 Token 和 HTTP Base 的简单认证方式。通信方式仍然采用 HTTPS ,但不使用数字证书。

Token

设置 Token 文件。

----- 生成Token
$ head -c 16 /dev/urandom | od -An -t x | tr -d ' '

----- 设置并保存Token文件
$ cat config/pki/token_auth_file
731810196d8de1282306b2552d6b0bc5,admin,1

其中,第一列为 token ,第二列为用户名,第三列表示编号或者序列号。

然后,重启 APIServer ,并添加参数 --token-auth-file=config/pki/token_auth_file

修改配置

通过 kubectl config 修改配置文件。

----- 设置集群参数
# client/bin/kubectl config set-cluster kubernetes \
	--insecure-skip-tls-verify=true            \
	--server=http://127.0.0.1:8080

----- 设置客户端认证参数
# client/bin/kubectl config set-credentials admin  \
	--token=731810196d8de1282306b2552d6b0bc5

----- 设置上下文参数
# client/bin/kubectl config set-context kubernetes \
	--cluster=kubernetes                       \
	--user=admin                               \
	--namespace=crd

----- 设置默认上下文
# client/bin/kubectl config use-context kubernetes

----- 查看配置,也就是~/.kube/config
# client/bin/kubectl config view

----- 列出所有上下文信息以及当前上下文信息
# client/bin/kubectl config get-contexts

RBAC

配置客户端 RBAC 相关,限制 admin 用户的行为,将该用户的行为限制在某个 namespace 空间范围内。

在使用 kubectl 命令时,一般会通过 YAML 格式定义一个任务,并用来创建所需要的对象,其中在配置中通过 spec 定义了期望的状态,同时 K8S 还会在内部维护一个状态信息。

其中有几个参数是必须的。

apiVersion  使用的K8S API版本号,可以通过 kubectl api-versions 命令查看支持版本号
kind        对象的类型,例如Pod Deployment
metadata    用于唯一确定创建的对象,包括了name UID 以及 namespace
spec        对于这一对象的期望目标状态

在对 K8S 中的对象进行操作时,可以通过直接通过命令行,也可以是某个定义的配置文件,或者在某个目录下定义一组配置。

Namespace

用来做逻辑隔离,一般在用户比较多的时候使用,在不同 Namespace 中可以出现相同的 name 。

----- 查看当前所有的NS
# kubectl get namespace

----- 查看某个NS下的Pods信息
# kubectl get pods --namespace=default

默认会创建三个命名空间:

  • default 如果在创建对象的时候不指定,则使用该空间;
  • kube-system 由K8S系统本身所使用的空间;
  • kube-public 一般在集群管理的时候使用,可以被多个集群同时访问。

Label

可以附加到对象 (例如Pod) 的 KV 字符串,通常是一些标识信息,用来快速查询;对于非标识性质的,可以使用 annotations 。

常用的 label 如。

release       alpha beta stable canary
environment   dev production
tier          frontend backend cache


如果喜欢这里的文章,而且又不差钱的话,欢迎打赏个早餐 ^_^