单master集群搭建
系统初始化
1  | 关闭防火墙:  | 
1  | # 快速添加主机名  | 
etcd 集群
理解 ssl 证书
1  | 集群中的通信都是基于https进行交互  | 
生成 etcd 证书
- cfssl 与 openssl一样都可以生成证书
 - cfssl 使用json文件内容生成,比较直观
 
1  | # 任意一台机器 上传压缩包  | 
cfssl 下载与安装
1  | # 脚本中 含有下载地址 和 安装  | 
1  | [root@k8s-master1 TLS]# cp -rf cfssl cfssl-certinfo cfssljson /usr/local/bin  | 
创建 CA证书和私钥
1  | [root@k8s-master1 TLS]# cd /opt/TLS/etcd/  | 
1  | # 创建 CA证书和私钥 用来颁发证书  | 
自签 etcd 证书
1  | # hosts 可信任IP,里面包含所有etcd节点的IP  | 
1  | # 向ca请求证书  | 
1  | # 生成server开头的 数字证书和私钥  | 
etcd 简介
- CoreOS 开源
 - etcd首先是一个键值存储仓库,用于配置共享和服务发现。
 - etcd 负责保存 Kubernetes Cluster 的配置信息和各种资源的状态信息。当数据发生变化时,etcd 会快速地通知 Kubernetes 相关组件。
 - 官方推荐奇数节点部署,常见的有3 5 7 分别对应 1 2 3个冗余节点
 - 3台etcd会先选举出1台为主节点,负责写消息,主节点同步给2个从节点。
 - 当主节点挂了,两台从节点会选举出一台新的主节点
 - 介绍文档
 
1  | https://blog.csdn.net/bbwangj/article/details/82584988  | 
1  | # 优点  | 
部署 etcd 集群节点
1  | # 环境  | 
1  | # 二进制包下载地址  | 
安装 etcd
1  | [root@k8s-master1 opt]# mkdir -p /opt/src  | 
1  | # 解压  | 
1  | [root@k8s-master1 opt]# ls -l /opt/  | 
1  | # 查看启动文件 注意工作目录  | 
1  | # 查看工作目录  | 
1  | # 先删除掉之前的证书,一会替换刚才生成的  | 
修改 etcd 配置文件
1  | # 节点之间通信 2380,面向客户端 2379 ,需要https通信 拥有证书  | 
拷贝证书
1  | # 将证书copy 到ssl目录  | 
部署其他 etcd 节点
1  | # scp分发 再修改配置文件的 ETCD_NAME 和 IP  | 
拷贝启动服务文件
1  | # 本机的别忘记了  | 
启动服务
1  | # 启动第一个节点会一直处于等待状态,直到有集群节点加入  | 
服务检查
1  | # 日志查看  | 
1  | # etcdctl 相当于客户端访问  | 
1  | # 查询 member 列表  | 
部署 Master 节点
自签 APIServer SSL证书
1  | [root@k8s-master1 k8s]# ls -l  | 
1  | [root@k8s-master1 k8s]# cat kube-proxy-csr.json  | 
1  | # apiserver 证书  | 
1  | # 执行脚本 生成证书  | 
1  | [root@k8s-master1 k8s]# ls -l *.pem  | 
部署 apiserver
1  | # 部署步骤  | 


上传解压压缩包
1  | # k8s-master.tar.gz  | 
1  | # 解压 得到三个服务的启动文件 和 kubernetes的工作目录  | 
1  | [root@k8s-master1 kubernetes]# ls -l  | 
拷贝证书
1  | [root@k8s-master1 ssl]# cd /opt/kubernetes/ssl/  | 
apiserver 配置文件
1  | # apiserver 配置文件官方文档  | 
1  | [root@k8s-master1 cfg]# vim kube-apiserver.conf  | 
部署 controller-manager
配置文件
1  | [root@k8s-master1 cfg]# vim kube-controller-manager.conf  | 
部署 scheduler
scheduler 配置文件
1  | [root@k8s-master1 cfg]# vim kube-scheduler.conf  | 
修改配置文件
1  | 1. 只需要修改 apiserver.conf 里面的etcd集群和本地IP  | 
配置服务启动文件
1  | [root@k8s-master1 opt]# mv kube*.service /usr/lib/systemd/system/  | 
启动服务
1  | systemctl start kube-apiserver  | 
查看日志
1  | # 查看日志  | 
kubectl配置
1  | # 将kubectl 放入/usr/bin 方便使用  | 
查看集群状态
1  | [root@k8s-master1 kubernetes]# kubectl get node  | 
查看进程
1  | [root@k8s-master1 kubernetes]# ps -ef|grep kube  | 
启用 TLS Bootstrapping
1  | # 启用了 为 kubelet TLS Bootstrapping 授权  | 
1  | # 引用的token文件  | 
给 kubelet-bootstrap授权
1  | # 如果不给与权限,token可以用但是用户没有权限 也不会正常办法  | 
token 自行生成替换
1  | # apiserver配置的token必须要与node节点bootstrap.kubeconfig配置里一致。  | 
部署 Node 节点
1  | 172.17.70.253 k8s-node1  | 
Docker 二进制安装
1  | # Docker 二进制包下载地址:  | 
上传解压安装包
1  | [root@k8s-node1 ~]# mkdir -p /opt/src  | 
二进制安装docker
1  | [root@k8s-node1 src]# tar -zxvf docker-18.09.6.tgz  | 
docker配置文件
1  | [root@k8s-node1 src]# mkdir -p /etc/docker  | 
启动docker服务
1  | [root@k8s-node1 src]# systemctl start docker  | 
部署 harbor仓库
1  | # 该主机也需要二进制安装docker  | 
1  | [root@k8s-master2 src]# mkdir -p /etc/docker  | 
1  | [root@k8s-node1 src]# systemctl start docker  | 
1  | # 上传文件  | 
1  | # 部署 compose  | 
1  | # 部署 harbor  | 
免https使用
1  | [root@Docker harbor]# vim /etc/docker/daemon.json  | 
登录
1  | # 两个node节点都先登录下 好下载基础镜像  | 
下载 pod基础镜像 并上传到私有仓库
1  | [root@k8s-master2 opt]# docker pull lizhenliang/pause-amd64:3.0  | 
部署 kubelet
配置文件介绍
1  | [root@k8s-node1 src]# tree kubernetes/  | 
1  | # 1. conf 基本配置文件  | 
配置 kubelet.conf
1  | [root@k8s-node1 src]# mv kubernetes /opt/  | 
配置 bootstrap.kubeconfig
1  | # 用于自动办法kubelet证书  | 
TLS Bootstrapping 机制流程(kubelet)
1  | 1. node节点上的 kubelet 启动  | 

配置 kubelet-config.yml
1  | [root@k8s-node1 cfg]# vim kubelet-config.yml  | 
部署 kube-proxy
配置 kube-proxy.conf
1  | [root@k8s-node1 cfg]# vim kube-proxy.conf  | 
配置 kube-proxy.kubeconfig
1  | # kube-proxy 连接 apiserver的配置文件  | 
配置 kube-proxy-config.yml
1  | # 动态调整kube-proxy 配置  | 
拉取证书
1  | [root@k8s-master1 k8s]# cd /opt/TLS/k8s/  | 
配置启动服务
1  | [root@k8s-node1 opt]# cd /opt/src/  | 
启动服务
1  | [root@k8s-node1 opt]# systemctl start kubelet  | 
1  | # 查看日志  | 
允许给Node颁发证书
1  | # 在master上查看是否有新的node 请求办法证书  | 
1  | # 允许该node加入集群并颁发证书  | 
1  | # 查看node kubelet日志  | 
1  | # 现在node还是准备状态 需要部署完cni插件  | 
自动为 node 颁发证书
1  | # 是否为 node 颁发了证书  | 
自动生成配置文件 kubelet.kubeconfig
1  | # 自动生成 kubelet.kubeconfig 配置文件  | 
加入 node2 节点
1  | # 相当于重新部署一套 流程一致  | 
配置文件修改的地方
1  | # IP地址 后期可以改完 vip  | 
1  | # 同意node2 加入集群  | 
1  | # 应该先加入节点 再启动kukube-proxy 如果先启动了 就认证后重启下 kube-proxy 服务  | 
k8s的分层结构

部署 CNI 网络 (Flannel)
1  | # 二进制包下载地址:  | 
1  | # 当前的错误日志  | 

cni 网络插件接口介绍
- cni 网络插件 是k8s的网络接口
 - 用于对接第三网网络插件为pod提供网络
 - 必须符合cni的标准
 
1  | # cni只是第三方网络接口 看看这些网络都由哪些  | 

cni 网络插件接口部署
1  | # 在node节点 解压插件  | 
1  | # copy给其他node(node2) 别忘记创建目录  | 
1  | # 确保启用cni  | 
部署 flannel 网络插件
1  | # 在master上部署  | 
1  | # 实际上是个pod  | 
1  | [root@k8s-master1 src]# vim kube-flannel.yaml  | 
启动pod
1  | [root@k8s-master1 src]# kubectl apply -f kube-flannel.yaml  | 
查看pod是否启动
1  | # 会从 lizhenliang/flannel:v0.11.0-amd64 下载镜像有点慢  | 
1  | # 查看pod事件状态 如果是aliyun主机 别忘记node也要出公网啊  | 
1  | # 没起来试试  | 
1  | # 查看 node工作状态  | 
查看pod日志
1  | [root@k8s-master1 src]# kubectl logs kube-flannel-ds-amd64-nnrkz -n kube-system  | 
1  | # 上传授权yaml文件 并执行  | 
1  | # 集群角色授权  | 
1  | [root@k8s-master1 src]# kubectl logs kube-flannel-ds-amd64-b48fs -n kube-system  | 
查看 node上的 pod 和网络
1  | # 每个node上都会启动个pod  | 


创建 nginx pod 测试部署环境
1  | 1. 当创建pod的时候 部署到的节点会创建cni网络  | 

1  | # 暴露pod 到集群外部  | 
1  | # 测试访问node节点上的pod  | 


测试再加入一个node节点
1  | 1. 按照正常流程部署node节点  | 
K8S 高可用介绍
 
1  | LB : Nginx LVS HaProxy  | 
部署 master2
1  | 172.17.71.5 aliyun-slb 内网负载均衡  | 
1  | # 将kubernetes 传过去  | 
1  | # 修改配置文件  | 
1  | # 传递 kubectl  | 
1  | # 启动服务  | 
1  | # 查看资源 有数据即为正常  | 
配置阿里云内网SLB
1  | 1. 创建内网负载均衡 得到vip vip需要再证书里啊  | 


1  | # 测试vpi 6443端口访问  | 
修改node节点连接配置
1  | # 每个node连接SLB的vip  | 
1  | # 重启kubelet 和 kube-proxy服务  | 
验证
1  | # 还可以访问各节点  | 
1  | # 之前节点都连接的 master1上的api  | 
1  | # 可以继续使用 证明vpi正常工作  | 
1  | # 测试VIP是否正常工作  | 
##
