单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是否正常工作 |
##