概念
什么是k8s
K8s是一组服务器集群
K8s所管理的集群节点上的容器
K8s的功能
+ 自我修复:如果物理机上的容器故障或者物理机宕机,k8s会自动在其他机器启动容器
+ 弹性伸缩:实时根据服务器的并发情况增加或者缩减容器数量
+ 自动部署和回滚:使用yaml文件实现自动部署
+ 服务发现和负载均衡
+ 机密和配置共享管理
+ 储存编排
+ 批处理
k8s集群架构
- K8s集群分为两类节点:Master Node主节点 ,Worker Node工作节点
- Master节点的组件(服务程序):
- apiserver:接收客户端操作k8s的命令
- Schduler:从后端的多个worker中找到一个节点
- Controller Manager:控制后端节点Kubelet启动docker容器的程序
- Etcd数据库:K8s的数据库,用于注册节点、服务、记录账号、记录名称解析等
- Node节点组件:
- Kubelet:像docker发送指令,管理docker容器
- Kubeproxy:管理docker容器的网络,分配ip暴露端口等
- Pod:
- 就是一组容器打包之后的一个集合称之为pod(容器组),是k8s调度的最小单元,一个pod中可以有一个或者多个容器,pod是短暂的,运行完就消失
K8s不能直接启动容器
- 就是一组容器打包之后的一个集合称之为pod(容器组),是k8s调度的最小单元,一个pod中可以有一个或者多个容器,pod是短暂的,运行完就消失
- Controllers:
- 控制器,用于控制pod,启动,停止、删除pod,控制器类型比较多
- Service:
- 用于关联一组pod,防止pod失联,pod在运行过程中会动态的销毁和创建,导致pod的ip会改变,由service在最上层,提供统一的入口,即使pod信息改变,统一的入口也不会变化,可以保证用户访问得了,更新各个组件的信息,保证实时能够链接得上。
- 用于关联一组pod,防止pod失联,pod在运行过程中会动态的销毁和创建,导致pod的ip会改变,由service在最上层,提供统一的入口,即使pod信息改变,统一的入口也不会变化,可以保证用户访问得了,更新各个组件的信息,保证实时能够链接得上。
- Label:
- 想要关联一组pod就需要给每一个pod打标签
- Namespace:
- 命名空间,默认情况下,一个k8s集群下的pod是可以互相访问的,实现业务的隔离,为不同的公司提供隔离的pod运行环境;为开发、测试、生产环境分别准备不同的名称空间进行业务隔离。
- Master节点的组件(服务程序):
K8s部署步骤
集群结构
- 生产环境:
- Master节点必须实现高可用,避免单机故障,生产环境绝对不允许出现单点故障 (建议三台)
- Etcd也要求有三个节点(必须,必须是奇数,为了解决选举问题)
- Worker越多越好
- 测试环境:
先部署为单master再升级多maste
实验环境规划
三个节点(2G内存 2核CPU)
- Minikube:只能体验一下k8s,没有其他作用
- Kubeadm:不清楚做了什么
- 二进制:比较复杂,要改很多配置文件
部署单master集群
集群规划:
master:
主机名:k8s-master1
IP:193.168.10.63
Worker1:
主机名:k8s-node1
IP:193.168.10.65
Worker2:
主机名:k8s-node1
IP:193.168.10.66
K8s版本:1.16
安装方式:离线二进制
操作系统:centos7.7(1904)
初始化服务器
关闭防火墙(所有节点都执行)
systemctl stop firewalld
systemctl disable firewalld
关闭selinux(所有节点都执行)
先临时关闭selinux:
setenforce 0 #如果没有打印信息就代表已经关闭了
vim /etc/selinux/config #编辑这个文件 设置disabled
SELINUX=disabled
配置主机名称(所有节点都执行)
hostnamectl set-hostname k8s-master1
hostnamectl set-hostname k8s-node1
hostnamectl set-hostname k8s-node2
hostname #执行该命令确定名字改好
配置名称解析 host文件(所有节点都执行)
vim /etc/hosts #将以下内容加入各个节点机器的hosts文件
193.168.10.63 k8s-master1
193.168.10.64 k8s-master2
193.168.10.65 k8s-node1
193.168.10.66 k8s-node2
配置时间同步
选择一个节点作为服务端 剩下的作为客户端
使用master1作为时间服务器的服务端 其他节点作为时间服务器的客户端
+++![在这里插入图片描述](https://img-blog.csdnimg.cn/20210709190142746.png)
配置k8s-master1
yum install chrony
vim /etc/chrony.config
- 修改上游服务器
对于master节点,使用自己的时间在集群内部完成时间同步,则把所有外部的server全部注释掉,添加一个127.0.0.1
- 允许访问的网段
- 修改度量值
- 启动服务
systemctl start chronyd
systemctl enable chronyd
- 确定服务
ss -unl | grep 123
配置客户端 node1 node2
安装时间同步 -> 修改配置文件 只用指定上游服务器
- 启动服务
systemctl start chronyd
systemctl enable chronyd
注:客户端端口无所谓 查一下时间同步
- 确定服务
chronyc sources
^*:时间已经同步
^?:时间未同步
关闭交换分区(会导致服务起不来)
swapoff -a #临时关闭
实现每次开机时候交换分区都关掉:
vim /etc/fstab #删除最后一行
确认交换分区关闭: free -m
Swap: 0 0 0
部署集群
所有节点和etcd通信都是基于https,则需要自签一个证书实现加密传输。
注:关于加密: 1:对称加密:用相同的密钥,在传输过程中,加密解密使用的密钥是相同的
2:非对称加密:加密解密过程中使用的是密钥对,分为公钥和私钥,发送使用公钥加密,只能使用与之对应的那一个私钥进行解密
3:单向加密:只管加密不管解密,md5等进行数据校验
- Ssl:证书来源:
- 网络第三方机构购买,一般用于外部用户访问使用
- 自己给自己发:自签证书(也可以给外部,但是浏览器会提示证书不受信任)
- 自建CA:
1):使用openssl
2):使用cfssl:让集群中的机器通过这个CA完成https的通信
CA:证书颁发机构
给etcd颁发证书
项目所需所有资料
链接:https://pan.baidu.com/s/15PfdIqns3PSfrWvgcwrn3A
提取码:0br6
将文件按图放置到master的家目录下
含有两个目录:
- etcd:为etcd颁发证书使用
- k8s:为k8s颁发证书使用
- 执行cfssl.sh脚本
./cfssl.sh
- 进入etcd目录
- 修改server-csr.json(改要给哪几个主机的etcd颁发证书) 项目结构如下图
- 修改server-csr.json(改要给哪几个主机的etcd颁发证书) 项目结构如下图
master:
主机名:k8s-master1
IP:193.168.10.63
Worker1:
主机名:k8s-node1
IP:193.168.10.65
Worker2:
主机名:k8s-node1
IP:193.168.10.66
-
修改结果(注意细节):
- 创建CA
- 执行 generate_etcd_cert.sh 脚本
- 创建CA
cd ~/TSL
./generate_e