天天看点

Kubernetes全栈架构师(二进制高可用安装k8s集群扩展篇)--学习笔记

二进制Metrics&Dashboard安装

二进制高可用集群可用性验证

生产环境k8s集群关键性配置

Bootstrapping: Kubelet启动过程

Bootstrapping: CSR申请和证书颁发原理

Bootstrapping: 证书自动续期原理

安装CoreDNS

安装Metrics Server

安装dashboard

安装对应版本(推荐)

如果更改了k8s service的网段需要将coredns的serviceIP改成k8s service网段的第十个IP

安装coredns

安装最新版CoreDNS(不推荐)

查看状态

状态

强制删除一直处于Terminating的pod

在新版的Kubernetes中系统资源的采集均使用Metrics-server,可以通过Metrics采集节点和Pod的内存、磁盘、CPU和网络的使用率。

安装metrics server

等待metrics server启动然后查看状态

节点状态

查看pod状态

pod状态

安装指定版本dashboard

安装最新版dashboard

登录dashboard

Dashboard用于展示集群中的各类资源,同时也可以通过Dashboard实时查看Pod的日志和在容器中执行一些命令等。

官方GitHub地址:https://github.com/kubernetes/dashboard

可以在官方dashboard查看到最新版dashboard

创建管理员用户

执行

在谷歌浏览器(Chrome)启动文件中加入启动参数,用于解决无法访问Dashboard的问题,因为使用的证书是自签名(属性->快捷方式->目标,粘贴到最后)

更改dashboard的svc为NodePort:

修改 type: ClusterIP 为 type:NodePort

修改完成之后会暴露一个端口号,查看端口号:

端口号

根据自己的实例端口号,通过任意安装了kube-proxy的宿主机或者VIP的IP+端口即可访问到dashboard:访问Dashboard:https://192.168.232.236:31874(请更改18282为自己的端口),选择登录方式为令牌(即token方式)

查看token值:

token值

安装busybox

Pod必须能解析Service

Pod必须能解析跨namespace的Service

每个节点都必须要能访问Kubernetes的kubernetes svc 443和kube-dns的service 53

Pod和Pod之前要能通(同namespace能通信、跨namespace能通信、跨机器能通信)

集群安装成功后默认的kubernetes server

每个节点都必须要能访问Kubernetes的kubernetes svc 443和kube-dns的service 53(发送键输入到所有的会话)

Pod和Pod之前要能通(同namespace能通信、跨namespace能通信、跨机器能通信)(取消发送键输入到所有的会话)

创建一个带有三个副本的deployment

docker配置

controller-manager配置

kubelet配置

kubelet-conf.yml

安装总结

(发送键输入到所有的会话)

更新配置

注释新版本已经默认配置,设置证书过期时间

(发送键输入到所有的会话,取消node节点)

k8s默认加密方式会被识别为漏洞,需要修改加密方式

kubelet下载镜像的deadline,避免重复循环加载

查看日志

验证

kubeadm

二进制

自动化安装

安装需要注意的细节

Master节点安装不需要写自动化。

添加Node节点,playbook。

上面的细节配置

生产环境中etcd一定要和系统盘分开,一定要用ssd硬盘。

Docker数据盘也要和系统盘分开,有条件的话可以使用ssd硬盘

Bootstrapping:自动为node节点颁发证书

二进制高可用安装生成证书的时候,我们为每个k8s组件都生成了一个kubeconfig文件,比如controller-manager.kubeconfig,配置中保存了apiserver的一些信息,以及它去连接apiserver的证书

kube-controller-manager.service指定了kubeconfig,组件启动的时候会通过config文件去连接apiserver进行认证,通讯

kube-controller-manager.service和kube-scheduler.service是我们自己颁发证书,但是kubelet不建议通过这种方式,建议使用TLS BootStrapping,它会自动地为node节点的kubelet颁发证书,那么它是如何生成的呢?

使用node02节点举例

当我们配置一个节点的时候,节点上面是没有kubelet.kubeconfig文件的,它是通过bootstrap-kubelet.kubeconfig与apiserver进行交互,然后自动申请了一个kubelet.kubeconfig文件,kubelet启动的时候如果缺少kubelet.kubeconfig文件,就会这样申请

删除kubelet.kubeconfig

查看kubelet配置文件

在配置中可以看到指定了bootstrap-kubeconfig文件

指定了kubeconfig文件,但是这个文件是没有的,kubelet启动的时候会通过前面描述的方式申请一个新的kubelet.kubeconfig

重启kubelet,可以看到生成了kubelet.kubeconfig证书,生成之后就可以和apiserver进行交互

TLS BootStrapping 官方文档:https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet-tls-bootstrapping/#initialization-process

在一个k8s集群中,工作节点的组件kubelet和kube-proxy需要连接master节点的组件,尤其是apiserver。为了确保连接是私有的,强烈建议为每一个客户端配置一个TLS证书在所有的节点上

kubelet启动过程

查找kubeconfig文件,文件一般位于/etc/kubernetes/kubelet.kubeconfig

从kubeconfig文件中检索APIServer的URL和证书

然后去和APIServer进行交互

查看证书

查看kubelet.kubeconfig证书有效期:

然后使用OpenSSL即可查看证书过期时间(100年有效期):

官方文档:https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet-tls-bootstrapping/#bootstrap-initialization

1、 Kubelet启动

2、 Kubelet查看kubelet.kubeconfig文件,假设没有这个文件

3、 Kubelet会查看本地的bootstrap.kubeconfig

4、 Kubelet读取bootstrap.kubeconfig文件,检索apiserver的url和一个token

5、 Kubelet链接apiserver,使用这个token进行认证

a) Apiserver会识别tokenid,apiserver会查看该tokenid对于的bootstrap的一个secret

secret就是二进制高可用安装集群的时候创建的bootstrap.secret.yaml

如果要修改bootstrap.secret.yaml的token-id和token-secret,需要保证 c8ad9c 字符串一致的,并且位数是一样的。还要保证上个命令的黄色字体:c8ad9c.2e4d610cf3e7426e与你修改的字符串要一致

根据后缀c8ad9c找到token

读取secret中的内容,得到token-id,token-secret

解密token-id,与配置文件kubectl config中的token=c8ad9c.2e4d610cf3e7426e的前缀一致

解密token-secret,与配置文件kubectl config中的token=c8ad9c.2e4d610cf3e7426e的后缀一致

验证通过之后才会进入下一步

b) 找个这个secret中的一个字段auth-extra-groups,apiserver把这个token识别成一个username,名称是system:bootstrap:,属于system:bootstrappers这个组,这个组具有申请csr的权限,该组的权限绑定在一个叫system:node-bootstrapper的clusterrole

解密auth-extra-groups查询组名

clusterrole是k8s集群级别的权限控制,它作用整个k8s集群

clusterrolebinding是集群权限的绑定,它可以帮某个clusterrole绑定到一个用户、组或者seviceaccount

查看clusterrole

查看system:node-bootstrapper

查看clusterrolebinding

可以看到clusterrolebinding把一个名为system:node-bootstrapper的ClusterRole绑定到一个名为system:bootstrappers:default-node-token的Group

查看Group是否一致,解密auth-extra-groups查询组名

c) CSR:相当于一个申请表,可以拿着这个申请表去申请我们的证书。

6、 经过上面的认证,kubelet就有了一个创建和检索CSR的权限

7、 Kubelet为自己创建一个CSR,名称为kubernetes.io/kube-apiserver-client-kubelet

8、 CSR被允许有两种方式:

a) K8s管理员使用kubectl手动的颁发证书

b) 如果配置了相关权限,kube-controller-manager会自动同意。

i. Controller-manager有一个CSRApprovingController。他会校验kubelet发来的csr的username和group是否有创建csr的权限,而且还要验证签发着是否是kubernetes.io/kube-apiserver-client-kubelet

ii. Controller-manager同意CSR请求

9、 CSR被同意后,controller-manager创建kubelet的证书文件

10、 Controller-manager将证书更新至csr的status字段

11、 Kubelet从apiserver获取证书

12、 Kubelet从获取到的key和证书文件创建kubelet.kubeconfig

13、 Kubelet启动完成并正常工作

14、 可选:如果配置了自动续期,kubelet会在证书文件过期的时候利用之前的kubeconfig文件去申请一个新的证书,相当于续约。

15、 新的证书被同意或签发,取决于我们的配置

查看node-autoapprove-certificate-rotation

查看名为system:certificates.k8s.io:certificatesigningrequests:selfnodeclient的ClusterRole

a) Kubelet创建的CSR是属于一个组织:system:nodes

b) CN(比如域名):system:nodes:主机名

http://www.kubeasy.com/

Kubernetes全栈架构师(二进制高可用安装k8s集群扩展篇)--学习笔记

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

欢迎转载、使用、重新发布,但务必保留文章署名 郑子铭 (包含链接: http://www.cnblogs.com/MingsonZheng/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。