<span class="log-zd"><span class="log-close"><a title="隐藏目录"><i class="be be-cross"></i><strong>目录</strong></a></span></span>

1. 架构篇

1.1 kubernetes 架构说明

1.2 Flannel网络架构图

集群功能各模块功能描述:
Master节点:
Master节点上面主要由四个模块组成,APIServer,schedule,controller-manager,etcd
APIServer: APIServer负责对外提供RESTful的kubernetes API的服务,它是系统管理指令的统一接口,任何对资源的增删该查都要交给APIServer处理后再交给etcd,如图,kubectl(kubernetes提供的客户端工具,该工具内部是对kubernetes API的调用)是直接和APIServer交互的。
schedule: schedule负责调度Pod到合适的Node上,如果把scheduler看成一个黑匣子,那么它的输入是pod和由多个Node组成的列表,输出是Pod和一个Node的绑定。 kubernetes目前提供了调度算法,同样也保留了接口。用户根据自己的需求定义自己的调度算法。
controller manager: 如果APIServer做的是前台的工作的话,那么controller manager就是负责后台的。每一个资源都对应一个控制器。而control manager就是负责管理这些控制器的,比如我们通过APIServer创建了一个Pod,当这个Pod创建成功后,APIServer的任务就算完成了。
etcd:etcd是一个高可用的键值存储系统,kubernetes使用它来存储各个资源的状态,从而实现了Restful的API。

Node节点:
每个Node节点主要由三个模板组成:kublet, kube-proxy
kube-proxy: 该模块实现了kubernetes中的服务发现和反向代理功能。kube-proxy支持TCP和UDP连接转发,默认基Round Robin算法将客户端流量转发到与service对应的一组后端pod。服务发现方面,kube-proxy使用etcd的watch机制监控集群中service和endpoint对象数据的动态变化,并且维护一个service到endpoint的映射关系,从而保证了后端pod的IP变化不会对访问者造成影响,另外,kube-proxy还支持session affinity。
kublet:kublet是Master在每个Node节点上面的agent,是Node节点上面最重要的模块,它负责维护和管理该Node上的所有容器,但是如果容器不是通过kubernetes创建的,它并不会管理。本质上,它负责使Pod的运行状态与期望的状态一致。

1.3 Kubernetes工作流程

2. 环境说明

2.1 部署节点说明

主机名 IP 用途 部署软件
k8s-1 192.168.123.211 master apiserver,scheduler,controller-manager
etcd,flanneld
k8s-2 192.168.123.212 node kubelet,kube-proxy
etcd,flanneld
k8s-3 192.168.123.213 node kubelet,kube-proxy
etcd,flanneld

2.2 操作系统环境

2.3 软件包版本

软件包 下载地址
kubernetes-node-linux-amd64.tar.gz https://dl.k8s.io/v1.15.1/kubernetes-node-linux-amd64.tar.gz
kubernetes-server-linux-amd64.tar.gz https://dl.k8s.io/v1.15.1/kubernetes-server-linux-amd64.tar.gz
flannel-v0.11.0-linux-amd64.tar.gz https://github.com/coreos/flannel/releases/download/v0.11.0/flannel-v0.11.0-linux-amd64.tar.gz
etcd-v3.3.10-linux-amd64.tar.gz https://github.com/etcd-io/etcd/releases/download/v3.3.10/etcd-v3.3.10-linux-amd64.tar.gz

3. Kubernetes 安装及配置

3.1 初始化环境

3.1.1 设置关闭防火墙及SELINUX

3.1.2 关闭swap

3.1.3 设置Docker所需参数

3.1.4 安装 Docker

3.1.5 创建相关目录

3.1.6 SSH 互信配置

3.1.7 添加 PATH 变量

3.2 创建ssl证书

3.2.1 安装及配置CFSSL

3.2.2 创建 ETCD 相关证书

以下操作均在/data/ssl_config/etcd/目录中
etcd证书ca配置

创建 ETCD CA 配置文件

创建 ETCD Server 证书

生成 ETCD CA 证书和私钥

3.2.3 创建 Kubernetes 相关证书

以下操作均在/data/ssl_config/kubernetes/目录中
kubernetes 证书ca配置

创建ca证书配置

生成API_SERVER证书

创建 Kubernetes Proxy 证书

生成 **kubernetes ** CA 证书和私钥

3.3 部署etcd

3.3.1 配置软件包

3.3.2 编辑etcd配置文件

3.3.3 创建 etcd的 systemd unit 文件

3.3.4 配置证书文件

3.3.5 配置文件拷贝到 节点1、节点2

修改另外两台机器配置文件

另外两台机器配置完成后,启动etcd服务,三台都需启动。

3.3.6 启动ETCD服务

3.3.7 检查服务是否正常

3.4 部署Flannel网络

3.4.1 向 etcd 写入集群 Pod 网段信息

写入的 Pod 网段 ${CLUSTER_CIDR} 必须是 /16 段地址,必须与 kube-controller-manager 的 --cluster-cidr 参数值一致;

3.4.2 部署 flannel

3.5.3 配置flannel

3.5.4 创建 flanneld 的 systemd unit 文件

mk-docker-opts.sh 脚本将分配给 flanneld 的 Pod 子网网段信息写入 /run/flannel/docker 文件,后续 docker 启动时 使用这个文件中的环境变量配置 docker0 网桥;

flanneld 使用系统缺省路由所在的接口与其它节点通信,对于有多个网络接口(如内网和公网)的节点,可以用 -iface 参数指定通信接口,如上面的 eth0 接口;
flanneld 运行时需要 root 权限;

3.5.5 配置Docker启动指定子网段

3.5.6 将flanneld systemd unit 文件到所有节点

3.5.7 验证fannel网络配置

3.5 部署 master 节点

kubernetes master 节点运行如下组件:
kube-apiserver
kube-scheduler
kube-controller-manager
kube-scheduler 和 kube-controller-manager 可以以集群模式运行,通过 leader 选举产生一个工作进程,其它进程处于阻塞模式。

3.5.1 配置 master 节点文件

3.5.2 配置 kubernetes相关证书

3.5.3 部署 kube-apiserver 组件

创建 TLS Bootstrapping Token

创建apiserver配置文件

创建 kube-apiserver systemd unit 文件

启动服务

查看apiserver是否运行

3.5.4 部署kube-scheduler

创建kube-scheduler配置文件

--address:在 127.0.0.1:10251 端口接收 http /metrics 请求;kube-scheduler 目前还不支持接收 https 请求;

–kubeconfig:指定 kubeconfig 文件路径,kube-scheduler 使用它连接和验证 kube-apiserver;
–leader-elect=true:集群运行模式,启用选举功能;被选为 leader 的节点负责处理工作,其它节点为阻塞状态;

创建kube-scheduler systemd unit 文件

启动kube-scheduler服务

查看kube-scheduler是否运行

3.5.5 部署kube-controller-manager

创建kube-controller-manager配置文件

创建kube-controller-manager systemd unit 文件

启动服务

查看kube-controller-manager是否运行

3.5.6 查看master集群状态

3.6 部署node 节点

kubernetes work 节点运行如下组件:
docker
kubelet
kube-proxy

3.6.1 部署 kubelet 组件

kublet 运行在每个 worker 节点上,接收 kube-apiserver 发送的请求,管理 Pod 容器,执行交互式命令,如exec、run、logs 等;

kublet 启动时自动向 kube-apiserver 注册节点信息,内置的 cadvisor 统计和监控节点的资源使用情况;
为确保安全,本文档只开启接收 https 请求的安全端口,对请求进行认证和授权,拒绝未授权的访问(如apiserver、heapster)。

配置node节点

创建 kubelet bootstrap.kubeconfig 文件

通过 bash environment.sh获取 bootstrap.kubeconfig 配置文件。

创建 kubelet.kubeconfig 文件

创建kube-proxy kubeconfig文件

将bootstrap kubeconfig kube-proxy.kubeconfig 文件拷贝到所有 nodes节点

3.6.2 创建kubelet 参数配置文件拷贝到所有 nodes节点

创建 kubelet 参数配置模板文件

创建kubelet配置文件

创建kubelet systemd unit 文件

将kubelet-bootstrap用户绑定到系统集群角色

3.6.3 启动kubelet服务

3.6.4 approve kubelet CSR 请求

  • Requesting User:请求 CSR 的用户,kube-apiserver 对它进行认证和授权;
  • Subject:请求签名的证书信息;
  • 证书的 CN 是 system:node:kube-node2, Organization 是 system:nodes,kube-apiserver 的 Node 授权模式会授予该证书的相关权限;

3.6.5 查看集群状态

3.7 部署 node kube-proxy 组件

kube-proxy 运行在所有 node节点上,它监听 apiserver 中 service 和 Endpoint 的变化情况,创建路由规则来进行服务负载均衡。

3.7.1 创建kube-proxy配置文件

3.7.2 创建kube-proxy systemd unit 文件

3.7.3 启动kube-proxy服务

3.7.4 检查服务运行状态

至此 kubernetes 1.15 版本简单部署完成~
[未完待续]

<li>
  <a href="#2">2. 环境说明</a><ul>
    <li>
      <a href="#21">2.1 部署节点说明</a>
    </li>
    <li>
      <a href="#22">2.2 操作系统环境</a>
    </li>
    <li>
      <a href="#23">2.3 软件包版本</a>
    </li>
  </ul>
</li>

<li>
  <a href="#3_Kubernetes">3. Kubernetes 安装及配置</a><ul>
    <li>
      <a href="#31">3.1 初始化环境</a><ul>
        <li>
          <a href="#311_SELINUX">3.1.1 设置关闭防火墙及SELINUX</a>
        </li>
        <li>
          <a href="#312_swap">3.1.2 关闭swap</a>
        </li>
        <li>
          <a href="#313_Docker">3.1.3 设置Docker所需参数</a>
        </li>
        <li>
          <a href="#314_Docker">3.1.4 安装 Docker</a>
        </li>
        <li>
          <a href="#315">3.1.5 创建相关目录</a>
        </li>
        <li>
          <a href="#316_SSH">3.1.6 SSH 互信配置</a>
        </li>
        <li>
          <a href="#317_PATH">3.1.7 添加 PATH 变量</a>
        </li>
      </ul>
    </li>
    
    <li>
      <a href="#32_ssl">3.2 创建ssl证书</a><ul>
        <li>
          <a href="#321_CFSSL">3.2.1 安装及配置CFSSL</a>
        </li>
        <li>
          <a href="#322_ETCD">3.2.2 创建 ETCD 相关证书</a>
        </li>
        <li>
          <a href="#323_Kubernetes">3.2.3 创建 Kubernetes 相关证书</a>
        </li>
      </ul>
    </li>
    
    <li>
      <a href="#33_etcd">3.3 部署etcd</a><ul>
        <li>
          <a href="#331">3.3.1 配置软件包</a>
        </li>
        <li>
          <a href="#332_etcd">3.3.2 编辑etcd配置文件</a>
        </li>
        <li>
          <a href="#333_etcd_systemd_unit">3.3.3 创建 etcd的 systemd unit 文件</a>
        </li>
        <li>
          <a href="#334">3.3.4 配置证书文件</a>
        </li>
        <li>
          <a href="#335_12">3.3.5 配置文件拷贝到 节点1、节点2</a>
        </li>
        <li>
          <a href="#336_ETCD">3.3.6 启动ETCD服务</a>
        </li>
        <li>
          <a href="#337">3.3.7 检查服务是否正常</a>
        </li>
      </ul>
    </li>
    
    <li>
      <a href="#34_Flannel">3.4 部署Flannel网络</a><ul>
        <li>
          <a href="#341_etcd_Pod">3.4.1 向 etcd 写入集群 Pod 网段信息</a>
        </li>
        <li>
          <a href="#342_flannel">3.4.2 部署 flannel</a>
        </li>
        <li>
          <a href="#353_flannel">3.5.3 配置flannel</a>
        </li>
        <li>
          <a href="#354_flanneld_systemd_unit">3.5.4 创建 flanneld 的 systemd unit 文件</a>
        </li>
        <li>
          <a href="#355_Docker">3.5.5 配置Docker启动指定子网段</a>
        </li>
        <li>
          <a href="#356_flanneld_systemd_unit">3.5.6 将flanneld systemd unit 文件到所有节点</a>
        </li>
        <li>
          <a href="#357_fannel">3.5.7 验证fannel网络配置</a>
        </li>
      </ul>
    </li>
    
    <li>
      <a href="#35_master">3.5 部署 master 节点</a><ul>
        <li>
          <a href="#351__master">3.5.1 配置 master 节点文件</a>
        </li>
        <li>
          <a href="#352_kubernetes">3.5.2 配置 kubernetes相关证书</a>
        </li>
        <li>
          <a href="#353_kube-apiserver">3.5.3 部署 kube-apiserver 组件</a>
        </li>
        <li>
          <a href="#354_kube-scheduler">3.5.4 部署kube-scheduler</a>
        </li>
        <li>
          <a href="#355_kube-controller-manager">3.5.5 部署kube-controller-manager</a>
        </li>
        <li>
          <a href="#356_master">3.5.6 查看master集群状态</a>
        </li>
      </ul>
    </li>
    
    <li>
      <a href="#36_node">3.6 部署node 节点</a><ul>
        <li>
          <a href="#361_kubelet">3.6.1 部署 kubelet 组件</a>
        </li>
        <li>
          <a href="#362_kubelet_nodes">3.6.2 创建kubelet 参数配置文件拷贝到所有 nodes节点</a>
        </li>
        <li>
          <a href="#363_kubelet">3.6.3 启动kubelet服务</a>
        </li>
        <li>
          <a href="#364_approve_kubelet_CSR">3.6.4 approve kubelet CSR 请求</a>
        </li>
        <li>
          <a href="#365">3.6.5 查看集群状态</a>
        </li>
      </ul>
    </li>
    
    <li>
      <a href="#37_node_kube-proxy">3.7 部署 node kube-proxy 组件</a><ul>
        <li>
          <a href="#371_kube-proxy">3.7.1 创建kube-proxy配置文件</a>
        </li>
        <li>
          <a href="#372_kube-proxy_systemd_unit">3.7.2 创建kube-proxy systemd unit 文件</a>
        </li>
        <li>
          <a href="#373_kube-proxy">3.7.3 启动kube-proxy服务</a>
        </li>
        <li>
          <a href="#374">3.7.4 检查服务运行状态</a>
        </li>
      </ul>
    </li>
  </ul>
</li>