第6篇:Kubeadm部署K8S的工作原理

第6篇:Kubeadm部署K8S的工作原理,第1张

本博客涉及到的问题:
1、容器技术,就是在容器化我们的应用,对于Java Web 和 Oracle这样的组合可以用启动容器的方式,建立关系即可,但是,像是Cassandra这样的分布式的系统,仅仅是用容器运行起来是不够的。重点在于怎样去处理好这些Cassandra容器之间的编排关系 ,
哪些Cassandra容器是主?哪些是从?主从怎样区分 ?
主从,从从之间是怎样通信?
整个集群是怎样做到自动发现的?
整个集群的持久化数据怎样保持?
答:这就需要我们安装能编排容器的方法,并解决上面的问题,K8S可以做到
2、一键部署K8S的方法 本博客已经解决
3、相对于Saltstack专业的运维工具Kubeadm一键部署的优势是什么? 本博客已经解决
4、为什么不用容器去部署K8S呢? 本博客已经解决

5、Centos安装K8S的部署工具Kubeadm
6、详细解释 Kubeadm init 的工作原理 本博客已经解决
7、详细解释 Kubeadm join 的工作原理 本博客已经解决
8、Kubeadm怎样能自定义的定制 整个集群的组件参数呢? 本博客已经解决
9、在Linux上面,为一个类似Kube_apiserver 的web server 制作证书,都有哪些工具能够实现呢? 本博客已经解决

10、未来的问题:
修改Kubelet 和 Kube_Proxy的配置
修改Kubernetes 的基础镜像
指定自己生成的 证书文件
指定 特殊的 “容器进行时”
上述的问题应该怎样更改Yaml文件呢?
11、通过Kubeadm的工作原理的分析,K8S功能有那麽多,通过Kubeadm一键部署的集群,可以用于生产环境吗? 本博客已经解决

知识点1:Kubeadm使用

  建立master节点 : kubeadm init
  将新的Node节点 加入到现在的集群中 : kubeadm join

知识点2:Kubeadm一键部署的优势

相对于Saltstack专业的运维工具Kubeadm一键部署的优势是什么?

各大厂商用Saltstack等专业的运维工具来部署K8S,部署的时候,K8S的每一个组件都是 “一个需要被执行的单独的二进制的文件”,
  Saltstack运维工具来部署K8S,其实就是将这些组件的二进制文件传输到指定的机器中进行编译。
  编写脚本文件来启停这些组件
  运维需要为这些二进制文件编写对应的配置文件
  编写自启动脚本
  编写Kube_apiserver 的配置授权文件
所以说Kubeadm的一键安装比较省事,并且Kubeadm安装的K8S集群和二进制安装的是一样的
但是,也有不能用Kubeadm安装的情况,文后分析

知识点3:不能用 容器镜像的方式 安装K8S的原因


把K8S做成 容器镜像,用docker run来启动这个容器,假设这个K8S容器为 "容器K8S ",
  那么K8S的 重要组件Kubelet是存在于 容器K8S 之内的
  Kubelet 除了和容器运行的时候 打交道,还要去 配置容器的网络CNI,管理容器数据卷等等
  以上的 *** 作都是需要直接 *** 作虚拟机
  K8S本身是在 __容器K8S__之内的,对于网络可以不开启Network NameSpace的方式直接共享宿主机的网络栈
  但是,K8S想要让 Kubelet 隔着 容器K8S的Mount NameSpace 以及容器K8S的文件系统 去 *** 作宿主机的文件系统,是比较有难度的
栗子:
K8S容器 需要在容器A进行Mount NameSpace挂载之前,在宿主机的NFS目录上面,先挂载NFS的远程目录
  K8S容器在 容器内发起 “mount -F nfs” 命令,这个命令被隔离在了容器K8S上面,不能运行到宿主机上面
  所以,将Kubelet 直接运行在宿主机上面,然后用容器去部署其他的组件,是目前为止最简便的方式

知识点4 :Kubeadm init 的工作原理

  • 第一步:执行Kuberadm init 命令
  • 第二步: Kuberadm 执行检查 *** 作
      检查:检查这个机器是不是适合部署K8S
  • 第三步:生成证书 / 目录
      生成的 K8S对外提供服务的时候需要的证书和 需要的目录
    补充解释1:K8S在对外提供服务的时候,除非专门的开启了“不安全模式”
    否则都是要通过HTTPS才能访问Kube-apiserver,这就需要Kubeadm的证书能配置到K8S当中
    补充解释2:这些证书都生成到了哪里?
    证书文件全部都在Master节点的 /etc/kubenetes/pki/目录下
    补充解释3:需要证书的栗子
    Kuberctl 获取容器日志等straming *** 作的时候,需要通过Kube-apiserver 向kubectl发送请求
    连接Kube-apiserver的动作需要证书
    K8S 的很多的特性也是需要证书的
    补充解释4:其实这里的证书我们是可以自己生成的
    我们只需要把自己生成好的证书放置到 /etc/kubenetes/pki/ca.{crt,key} 即可
    ca.crt 是证书文件 ca.key 是对应的私钥文件
  • 第四步:生成的这些配置文件,都是做什么的呢?
      这些配置文件 记录了 Master节点服务器的地址、监听端口、证书目录等等信息
    v这样,有了这些配置文件,客户端kubelet就可以直接加载对应的配置文件,去和Kube-apiserver建立安全的连接
  • 第五步:生成Pod配置文件
      master的3个组件 :Kube-apiserver、Kube-controller-manager、Kube-Scheduler
      以上的3个组件都会被 用Pod的方式部署起来
  • 第六步:预启动容器 static pod
      至此,K8S的Master节点部署完成,但是K8S集群 还不存在 ,还不能启动容器
      把要部署的Pod的Yaml文件 放置到一个指定目录里面 (/etc/kubernetes/manifests/)
      当Kubelet 启动的时候,会自动的加载这个目录的所有的Yaml文件,然后将对应的Pod去启动起来
    补充解释:可以看出, Kubelet 在设计上是完全独立的组件,其他的Master组件,都是辅助型的系统容器
    Kuberadm会将master 组件的Yaml文件生成到/etc/kubernetes/manifests/ 目录下面
    Kuberlet会监视这个目录下所有的Yaml文件,自动的去创建文件中定义的Pod,也就是Master组件的容器
  • 第七步:生成Etcd的Pod的Yaml文件
      这一步就是为了通过同样的yaml文件定义Pod的方式,去生成并启动Etcd
  • 第八步:Master容器启动后Kuberadm通过检查localhost这个master组件的健康URL等待master的组件全部启动起来
  • 第九步: 生成token
      只要有了这个token,任何安装Kubelet和Kubeadm的节点,都可以通过 kubeadm join 命令加入到K8S的集群中
      token的使用方法会在 Kubeadm init执行完成的时候显示出来
  • 第十步:Kubeadm将 master节点的重要信息 存储在Etcd中 —cluster-info
    kubeadm 将ca crt等master节点的重要信息 通过Config Map方式保存在Etcd中,供后续部署Node节点来用
  • 第十一步:Kubeadm的最后一步,安装默认的插件
      默认的插件 :kube-proxy 负责集群的发现功能 DNS 负责集群的DNS功能
      以上的插件都属于 容器镜像 ,它们都是通过K8S客户端创建的这两个插件的Pod
知识点5 :Kubeadm join的工作流程

问题 : 为什么 Kubeadm join 在执行的时候必须需要 Token呢?
  Kubeadm init 在 (Kubeadm工作原理图中第九步) 生成bootstrap token,至此任何一台安装了Kubelet 和 Kubeadm 的机器上都可以运行 Kubeadm join 命令
  新机器想要加入到 K8S的集群中作为集群中的一个节点,需要在集群的 Kube-apiserver上面进行注册
  新机器 想要联系上 Kube-apiserver 得先有相应的证书文件 (ca crt 文件)
新机器并没有,怎末办?
  如果想要一键安装,我们就不能让用户手动去Master节点的对应的目录上复制证书文件
解决办法: Kubeadm发起一次不安全的连接到 Kube-apiserver上面,利用这次的连接去拿 ”保存在ConfigMap中的Cluster-info (Kubeadm工作原理图中第十步)。这次不安全的连接也不是 能随便连接 Kube-apiserver的,这个Token就是用来做安全验证的
  在拿到了Cluster-info文件(kube-apiserver地址、kube-apiserver端口、kube-apiserver相关的证书)以后,从此新节点就可以用 Kubelet 安全连接 kube-apiserver了

知识点6:自定义集群组件的参数

kubeadm怎样能定制集群组件呢? 想要指定Kube-apiserver的启动参数,怎末做?
在kubeadm init 部署master节点的时候,要指定配置文件
kubeadm init —config kubeadm.yml
想自定义参数的时候,可以直接去更改此配置文件

通过该配置文件能解决很多的问题:栗子
(1)可以修改kubelet 和 kube-proxy的配置
(2)可以修改Kubernetes的基础镜像URL
(3)可以指定自己的证书文件
(4)可以指定 特殊容器的 “容器进行时 ”

问题:通过以上kubeadm的主要命令的运行原理分析,我们想一下 K8S的功能如此之多,那么我可以在生产环境中 使用Kubeadm一键部署K8S的方式吗?
答:是不能的
kubeadm 目前最欠缺的,是一键部署高可用的K8S集群
高可用,即Etcd 、Master组件 都能是多节点的集群,但是Kubeadm是单节点集群
所以不能用户生产环境的部署
问题:在Linux上面,为一个类似Kube_apiserver 的web server 制作证书,都有哪些工具能够实现呢?
OpenSSL 、GnvGPG 、Keybase

注释:此博客为学习博客,如有侵权,请联系博主

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/719858.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-25
下一篇 2022-04-25

发表评论

登录后才能评论

评论列表(0条)

保存