kubernetes关键概念总结
- service
每个service对应一个cluster IP,cluster IP对应的服务网段最初是在配置kube-apiserver、kube-controller-manager和kube-proxy的systemd unit时指定的,如kube-apiserver参数为--service-cluster-ip-range。
Service提供提供了一种稳定访问一组pod的方式。Service使用clusterIP:port(默认方式)对外暴露服务,将外部流量从clusterIP:port导入到service中定义的selector标签指定的endpoint的targetport端口上(默认情况下targetport将被设置为与port字段相同的值)。Kube-proxy则为service提供了一种实现负载均衡的策略。Endpoint会在service创建后被自动创建。
- kube-dns
集群中可以通过配置Kube-dns来实现服务发现的功能。Kube-dns实现了服务名到cluster IP的映射关系。Kube-dns通常会为service赋予一个名为“service名称.namespace.svc.cluster.local”的A记录,用来解析service的cluster IP。如果访问default namespace下的服务,可以通过“service名称”直接访问;如果访问其他namespace下的服务,可以通过“service名称.namespace”访问。k8s会为每个容器提供默认的/etc/resolv.conf配置,内容为:
search default.svc.cluster.local svc.cluster.local cluster.local
nameserver 10.0.0.10
options ndots:5
集群通过查询/etc/resolv.conf文件的nameserver字段来确定dns服务器,该文件是在kubelet服务启动配置中指定—cluster-dns,并在服务启动后自动生成的。当用“service名称”访问服务时,最终会使用default.svc.cluster.local这条search记录拼接完整的服务名称;当使用“service名称.namespace”时,最终会使用svc.cluster.local这条search记录。
- serviceaccount
Serviceaccount就是pod中的process访问kubernetes API的account。Serviceaccount只关联了一个secret资源作为token,该token也叫service-account-token,是真正在API server验证环节起作用的。
service-account-token分为3部分:
ca.crt:API Server的CA公钥证书,用于POD的process对API server服务端数字证书进行校验使用,由kube-controller-manager参数--root-ca-file指定;
namespace:secret所在的namespace值的base64编码
token:用API server私钥签发(sign)的bearer tokens的base64编码,用于POD访问API server的身份验证(Authorization header首部)
一旦API Server发现client发起的request使用的是service account token的方式,API Server就会自动采用signed bearer token方式进行身份校验。而request就会使用携带的service account token参与验证。该token是API Server在创建service account时用kube-controller-manager启动参数:--service-account-private-key-file指定的私钥签署(sign)的,同时必须指定kube-apiserver参数--service-account-key-file(如果没指定的话,会使用–tls-private-key-file替代)为该私钥对应的公钥,用来在认证阶段验证token(You must pass a service account private key file to the token controller in the controller-manager by using the --service-account-private-key-file option. The private key will be used to sign generated service account tokens. Similarly, you must pass the corresponding public key to the kube-apiserver using the --service-account-key-file option. The public key will be used to verify the tokens during authentication),也就是说该证书对通过CN和O指定了serviceaccount的授权权限。
通过authenticating后,API Server将根据Pod username所在的group system:serviceaccounts和system:serviceaccounts:(NAMESPACE)的权限对其进行authority 和admission control两个环节的处理。(Service Accounts have usernames with the system:serviceaccount: prefix and belong to groups with the system:serviceaccounts: prefix,形如system:serviceaccount:(NAMESPACE):(SERVICEACCOUNT))
不管是自动生成的token还是手动创建的token的值都是一样的,因为进行签署token的–service-account-key-file是同一个。
Serviceaccount中的token是API server私钥签署的,POD在对API Server发起请求的时候会带上该token,以确保能够通过API server的认证。对serviceaccount的授权通过对serviceaccount对应的用户或组进行RBAC控制即可
参见:https://k8smeetup.github.io/docs/admin/authorization/rbac/
- tls-bootstrapping
当前该功能仅支持为kubelet生成证书。Bootstrap-token是在新建集群或者在现有集群中添加新节点时使用的,为kubelet提供tls客户端证书。Bootstrap-token被定义成一个特定类型的 secrets(bootstrap.kubernetes.io/token)。
kubelet 发起的 CSR 请求都是由 controller manager 来做实际签署的,对于 controller manager 来说,TLS bootstrapping 下 kubelet 发起的 CSR 请求大致分为以下三种
- nodeclient: kubelet 以 O=system:nodes 和 CN=system:node:(node name) 形式发起的 CSR 请求,仅在第一次启动时会产生;
- selfnodeclient: kubelet client renew 自己的证书发起的 CSR 请求(与上一个证书就有相同的 O 和 CN),kubelet renew 自己作为 client 跟 apiserver 通讯时使用的证书产生;
- selfnodeserver: kubelet server renew 自己的证书发起的 CSR 请求,kubelet 首次申请或后续 renew 自己的 10250 api 端口证书时产生
首次启动时,kube-apiserver会指定--token-auth-file=FILENAME来启用用户的token,同时该用户的token和apiserver的CA证书被写入了kubelet的bootstrap.kubeconfig文件中,这样在首次请求时,kubelet 使用 bootstrap.kubeconfig 中的 apiserver CA 证书来与 apiserver 建立 TLS 通讯,使用 bootstrap.kubeconfig 中的用户kubelet-bootstrap(需要创建clusterRoBingding来将预设用户与内置的system:node-bootstrapper绑定到一起) 的Token 来向 apiserver 声明自己的 RBAC 授权身份(用户为kubelet-bootstrap,组为system:kubelet-bootstrap)。
export BOOTSTRAP_TOKEN=$(head -c /dev/urandom | od -An -t x | tr -d ' ')
cat > token.csv <<EOF
${BOOTSTRAP_TOKEN},kubelet-bootstrap,,"system:kubelet-bootstrap"
绑定用户kubelet-bootstrap到内置ClusterRole(system:node-bootstrapper):kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap
对于bootstrap下的kubelet的CSR的审批可以手动审批,也可以自动审批:
手动审批:
需要将用户与内置的clusterrole system:node-strapper绑定,并注意设置证书过期时间(默认有效期为1年):设置kube-controller-manager参数--experimental-cluster-signing-duration设置为10年(防止证书过期):8760h0m0s
手动签发证书命令为:kubectl certificate approve XXX (xxx为CSR,使用kubectl get csr获取)
自动审批:
k8s针对bootstrap下kubelet发起的3种CSR给出了3种对应的clusterrole,想要kubelet能够自动续期,只要将适当的clusterrole绑定到kubelet自动续期时采用的用户或用户组上即可。基于3种clusterrole需要创建3个clusterrolebinding。1.8中已经创建了前两条clusterrole,还需要创建一条:
# A ClusterRole which instructs the CSR approver to approve a node requesting a
# serving cert matching its client cert.
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: system:certificates.k8s.io:certificatesigningrequests:selfnodeserver
rules:
- apiGroups: ["certificates.k8s.io"]
resources: ["certificatesigningrequests/selfnodeserver"]
verbs: ["create"]
3个clusterrole对应的clusterbingding如下:
# 自动批准 system:bootstrappers 组用户 TLS bootstrapping 首次申请证书的 CSR 请求
kubectl create clusterrolebinding node-client-auto-approve-csr --clusterrole=system:certificates.k8s.io:certificatesigningrequests:nodeclient --group=system:bootstrappers # 自动批准 system:nodes 组用户更新 kubelet 自身与 apiserver 通讯证书的 CSR 请求
kubectl create clusterrolebinding node-client-auto-renew-crt --clusterrole=system:certificates.k8s.io:certificatesigningrequests:selfnodeclient --group=system:nodes # 自动批准 system:nodes 组用户更新 kubelet 10250 api 端口证书的 CSR 请求
kubectl create clusterrolebinding node-server-auto-renew-crt --clusterrole=system:certificates.k8s.io:certificatesigningrequests:selfnodeserver --group=system:nodes
启动自动续期:kubelet启动时增加--feature-gates=RotateKubeletClientCertificate=true,RotateKubeletServerCertificate=true,--rotate-certificates;kube-controller-manager启动时增加--feature-gates=RotateKubeletServerCertificate=true
- kubelet端口
10250 kubelet API –kublet暴露出来的端口,通过该端口可以访问获取node资源以及状态
10255 readonly API –kubelet暴露出来的只读端口,访问该端口不需要认证和鉴权,该http server提供查询资源以及状态的能力
参考:
https://mritd.me/2018/01/07/kubernetes-tls-bootstrapping-note/
https://kubernetes.io/docs/tasks/tls/certificate-rotation/
kubernetes关键概念总结的更多相关文章
- 容器技术研究-Kubernetes基本概念
最近在研究容器技术,作为入门,基本概念必须搞明白,今天整理一下Kubernetes的基本概念. 一.什么是Kubernetes Kubernetes(k8s)是自动化容器操作的开源平台,这些操作包括部 ...
- Kubernetes重要概念理解
Kubernetes重要概念理解 kubernetes是目前最主流的容器编排工具,是下一代分布式架构的王者.2018年的kubernetes第一个版本1.10已经发布.下面整理一下,kubernete ...
- Kubernetes 核心概念
什么是Kubernetes? Kubernetes(k8s)是自动化容器操作的开源平台,这些操作包括部署,调度和节点集群间扩展.如果你曾经用过Docker容器技术部署容器,那么可以将Docker看成K ...
- 十分钟带你理解Kubernetes核心概念
什么是Kubernetes? Kubernetes(k8s)是自动化容器操作的开源平台,这些操作包括部署,调度和节点集群间扩展.如果你曾经用过Docker容器技术部署容器,那么可以将Docker看成K ...
- Kubernetes核心概念简介
本文将会简单介绍Kubernetes的核心概念.因为这些定义可以在Kubernetes的文档中找到,所以文章也会避免用大段的枯燥的文字介绍.相反,我们会使用一些图表(其中一些是动画)和示例来解释这些概 ...
- Kubernetes 基本概念和术语
Kubernetes 基本概念和术语 Kubernetes 中大部分概念如 Node.Pod.Replication Controller. Service 等都可以看做一种 "资源对象&q ...
- 后端技术杂谈11:十分钟理解Kubernetes核心概念
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 本文转自 https://github.com/h2pl/Java-Tutorial 喜欢的 ...
- 01 . 容器编排简介及Kubernetes核心概念
Kubernetes简介 Kubernetes是谷歌严格保密十几年的秘密武器-Borg的一个开源版本,是Docker分布式系统解决方案.2014年由Google公司启动. Kubernetes提供了面 ...
- [转]十分钟带你理解Kubernetes核心概念
本文将会简单介绍 Kubernetes的核心概念.因为这些定义可以在Kubernetes的文档中找到,所以文章也会避免用大段的枯燥的文字介绍.相反,我们会使用一些图表(其中一些是动画)和示例来解释这些 ...
随机推荐
- java socket 模拟im 即时通讯
自己想了一下怎么实现,就写了,没有深究是否合理.更多处理没有写下去,例如收件人不在线,应该保存在数据库,等下一次连接的时候刷新map,再把数据发送过去,图片发送也没有做,也没有用json格式 sock ...
- Oracle安装、Navicat for Oracle、JDBCl连接、获取表结构
Oracle安装 Navicat for Oracle配置 Oracle JDBC连接(增删改查) Oracle安装 环境windows 7 64位 安装版本:oracle 11g(64位) 下载地址 ...
- Hama安装及示例运行
Hama介绍 Apache Hama是一个纯BSP(Bulk Synchronous Parallel)计算框架,模仿了Google的Pregel.用来处理大规模的科学计算,特别是矩阵和图计算. BS ...
- Python基础学习参考(六):列表和元组
一.列表 列表是一个容器,里面可以放置一组数据,并且列表中的每个元素都具有位置索引.列表中的每个元素是可以改变的,对列表操作都会影响原来的列表.列表的定义通过"[ ]"来定义,元素 ...
- select, poll, epoll的实现分析
select, poll, epoll都是Linux上的IO多路复用机制.知其然知其所以然,为了更好地理解其底层实现,这几天我阅读了这三个系统调用的源码. 以下源代码摘自Linux4.4.0内核. 预 ...
- CSRF的本质及防御
本质:产生的原因本质上是参数可知或可预测 防御: 1.加密参数:加密加盐,不可知,不可预测 忧虑,引入其他麻烦:一.数据分析困难 ...
- 如何进行系统配置 ——了解DOS下的内存
DOS操作系统最早设计时,PC机的硬件系统只支持1M字节的寻址空间,所以DOS只能管理最多1M字节的连续内存空间.在这1M内存中,又只有640K被留给应用程序使用,它们被称为常规内存或基本内存,其它3 ...
- 使用poi和jfreechart生成excel图表图片
最近项目在频繁的操作excel,里边涉及到很多和图表有关的东西.有时候需要使用java操作excel自带的图标,比较复杂的我们都是使用excel模板的形式实现. 除此之外,也有一些功能只需要生成对应的 ...
- bootrom脚本的创建
bootrom脚本的创建 以下以压缩版bootrom 为例,基于Powerpc 平台,详细介绍压缩版bootrom 的生成过程及执行流程,从而使读者对bootrom有一个彻底的了解.这对于Vx ...
- JAVA简便解析json文件
JAVA简便解析json文件 首先放上我要解析的json文件: { "resultcode":"200", "reason":"S ...