k8s高可用集群搭建之概念与基础环境
k8s基础概念1.什么是kubernetes?是一个可移植,可扩展开源的容器管理平台。提供程序的快速部署,维护和扩展的基本机制。2.kubernetes容器编排工具具有哪些优势?a.灵活部署私有云,工业云,混合云虚拟机物理机等。b.完善授权机制,自带审计功能rbac授权,达到相互之间的操作完全隔离。c.复杂均衡支持四层、七层负载均衡d.可扩展性强f.根据节点资源使用情况对pod进行合理调度g.完善
一、k8s基础概念
1.什么是kubernetes?
是一个可移植,可扩展开源的容器管理平台。提供程序的快速部署,维护和扩展的基本机制。
2.kubernetes容器编排工具具有哪些优势?
a.灵活部署
私有云,工业云,混合云虚拟机物理机等。
b.完善授权机制,自带审计功能
rbac授权,达到相互之间的操作完全隔离。
c.复杂均衡
支持四层、七层负载均衡
d.可扩展性强
f.根据节点资源使用情况对pod进行合理调度
g.完善的灾备方案
用户有多种灾备预警方案,支持备份和容灾,出现故障可以秒级切换
h.可以进行动态部署
3.kubernetes功能
1)多组合网络隔离,多种网络插件flannel,calico,canel等,适用于多种场景,多租户场景可以一个用户一个名称空间
2)高可用,高可扩展性
支持多张高可用解决方案,如keepalive+nginx,keepalivued+haproxy,可以实现流量分发及节点切换,达到高可用。
3)支持数据持久化存储
本地存储:emptyDir,hostpath
网络链接类存储
SAN(存储居于网络):iSCSI
NAS(网络附加存储):nfs,cifs
分布式存储:glusterfs,ceph-块级别的存储,cephfs-文件系统级别的存储
云存储:Azure Disk等
4)拥有多中更新回滚策略
通过管理kubernetes控制器和service,可以实现灰度发布,蓝绿部署,金丝雀发布等,达到业务的快速部署和回滚等操作,用以满足不同客户的不同升级需求
5)弹性伸缩
6)节约资源
4.kubernetes应用场景
1)高效的日志管理系统
支持efk最受欢迎的日志管理系统。还可以通过动态volumeclaimetenplate动态生产pv实现es数据的持久化存储。通过deployment部署kibanna组件,实现日志的可视化管理。通过daemonset控制器部署fluentd组件,来收集货物k8s集群的日志。
如果机器扩容,daemonset控制器会自动检测到新增加的node节点,完成日志收集。
2)kubernetes在devops场景下的应用
devops是一套完整的运维开发流程,可以实现快速构建,测试和发布软件,整个流程包括敏捷开发,持续集成,持续交付,持续部署,devops,通过kubernetes实现统一调用,持久存储,虚拟网络及弹性伸缩。
多集群管理:
可以根据需求对开发,测试,生产环境部署多套kubernetes集群,每个环境使用独立的物理资源,相互之间避免影响。
多环境一致性:kubernetes是基于docker的容器编排,容器镜像不可变,所见将OS,业务代码,运行环境,程序库,目录结构都包含在内,镜像保存在我们的私有镜像仓库,可以保证环境一致性。
持续集成,持续部署,持续交付,产品快速迭代,自动部署,根据用户要求达到持续交付的能力。
3)kubernetes在微服务中的应用
- 服务发现:通过service实现服务发现,支持4层和7层负载均衡,支持https协议和证书认证签发,可是西安负载均衡,自修复,自动关联
- 通过i统一的配置管理中心
- 弹性伸缩
- 集群监控
- 通过Jenkins实现持续基础/持续部署
- 保证集群服务高可用
- 动态伸缩
- 扩展性好
5.kubernetes特点
- 可移植
- 可扩展
- 自愈:自动发布,自动重启,自动负责,自动扩展
- 进程协同:利用符合应用保证应用和容器一对一的模型。
6.kubernetes可实现的功能
- 存储系统挂载
- 分发密钥
- 应用健康监测
- 应用实例复制
- 水平自动扩展
- 命名和发现
- 负载均衡
- 滚动更新
- 资源健康
- 日志访问
- 自检和调试
- 识别和认证
这为pass提供laas层的便利,提供了基础设施提供者的可移植性。
7.kubernetes1.18+新增功能
kubernetes1.18包含了38个增强功能,其中15个增强功能趋于稳定,beta增强了11个,alpha增强了12个。
注:
alpha:内测版本
beta:公测版本,还没有稳定
stable:稳定版本
8.部署的方式演变
传统部署->虚拟化部署->容器部署
因此,容器编排工具上用场。
二、组件介绍
master节点(控制节点),node节点(工作节点)
1.master节点
单独机器部署,这台主机成为master节点。master节点组件能够对k8s集群做出全局决策(例如,调度),及检测和响应集群事件(例如,部署的副本字段不满足启动一个新的pod)。master节点组件可以在k8s集群中任何机器上都可以运行。为了简单起见,通常会在同一台机器上启动所有平面控制组件,最好不运行其它服务。
1)kube-apiserver
公开了kubernetesAPI。API服务是kubernetes master节点的前端,kubernetes API服务是通过kube-apiserver组件实现的,kube-apiserver被设计成可以进行自动扩缩容,可以运行多个kuber-apiserver组件,通过keepalive+lvs或者其它负载均衡策略在这些组件之间平衡流量。kube-apiserver提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制,负责接收、解析处理请求。
2)kube-scheduler
用来监视已经被创建就但是还没有调度到node节点的pod,按照预定的调度策略(如亲和性,反亲和性)等将pod调度到相应机器上。
3)kube-controller-manager
控制器管理器,负责维护集群状态,检查pod健康状态,例如故障检测,自动扩展,滚动更新等一些操作。
4)etcd
etcd是一个key/value的简直存储,保存了整个k8s集群状态,使用etcd时,需要对etcd做备份。有两个地方会用到etcd
(1)网络插件calico,对于其它网络插件也需要etcd存储网络的配置信息
(2)kubernrtes本身,包括各种休息和元信息配置
注意:网络插件使用v2的api,系统信息使用的v3版本,etcdctl_api环境变量,默认值为2
5)docker
容器引擎,运行容器。
6)kube-proxy
k8s代理,集群中网络代理,负责请求转发,一旦发现某个service关联的pod信息发生了改变,kube-proxy就会把变化后的service转换成ipvs或者iptables规则中,完成对pod的负载均衡
7)calico
calico是一个纯三册网络插件,balico的bgp模式类似与flannel的host-gw,calico在kubernetes中可提供网络功能和网络策略
8)coredns
k8s1.11之前使用,kube-dns,1.11之后有coredns,coredns是要给dns服务器,为kubernetes service提供dns记录
9)kubelet
负责与master节点的apiserver进行通信,管理创建,启动pos等相关操作。
*2.工作节点组件(node节点)
1)kubelet
kubelet需要在k8s集群每一个节点都需要运行,属于节点组件,负责与master的apiserver进行通信,接收到客户请求,进行创建启动和管理pod等相关操作。
2)kube-proxy
k8s代理,集群中网络代理,负责请求转发,一旦发现某个service关联的pod信息发生了改变,kube-proxy就会把变化后的service转换成ipvs或者iptables规则中,完成对pod的负载均衡
3)docker
是一个容器引擎,用于运行容器
4)calico
网络插件
3.附加组件
1)coredns
k8s1.11之前使用,kube-dns,1.11之后有coredns,coredns是要给dns服务器,为kubernetes service提供dns记录
2)webUI
web ui 界面,通过界面对k8s资源进行操作,传教pod,创建存储、网络等,也可以监控pod和节点资源使用情况。
3)Ingress Controller
七层负载均衡控制器,通过nginx或者traefik等七层负载组件,实现域名和https访问
4)prometheus+alertmanager+grafana
监控系统
5)eft(elasticserach、fluentd、kibana)
日志管理系统
6)metrics
收集资源指标,bpa需要基于metrics实现自动扩容
4.api介绍
kubernetes API是系统声明式配置架构的基础。kubectl命令行工具被用于创建,更新,删除,获取api对象。kubernetes通过api资源存储自己的序列化状态-etcd,被分成多个组件,通过api互相交互。
API变更
一般会向下兼容,了解兼容性变更要素以及如何百年更api的流程。
OPenapi与API swagger定义
kubernetes实现了另一种基于prorobuf的序列化格式,用户集群内通信。
api版本
alpha-内测版
beta-公测版
stable-稳定版本
二、k8s基础环境安装
一、k8s环境安装
镜像下载地址 http://mirrors.aliyun.com/centos/7/isos/x86_64/,我选择的是dvd版本
安装是默认是图形界面,为了节省资源,切换为命令界面
切换为命令行模式
sudo systemctl set-default multi-user.target
切换回图形界面:
sudo systemctl set-default graphical.target
1、准备实验环境
1).准备4台centos&虚拟机,安装k8s集权,下面是四台虚拟机配置情况
master1 (192.168.0.6)配置:
操作系统centos7 :4核cpu,2G内存,一块40G硬盘,网络桥接网络
master2 (192.168.0.16)配置:
操作系统centos7 :4核cpu,2G内存,一块40G硬盘,网络桥接网络
master3 (192.168.0.26)配置:
操作系统centos7 :4核cpu,2G内存,一块40G硬盘,网络桥接网络
node (192.168.0.36)配置:
操作系统centos7 :4核cpu,2G内存,一块40G硬盘,网络桥接网络
node节点服务器配置与master一致,方便克隆。
2)配置网络环境
虚拟机安装完成后网络默认采用动态配置,我们这里采用静态配置
配置master1环境
编辑文件
vim /etc/sysconfig/network-scripts/ifcfg-ens33
BOOTPROTO="static"
IPADDR="192.168.0.6"
NETMASK="255.255.255.0"
GATEWAY="192.168.0.1"
重启 systemctl restart network
DNS1=“192.168.0.1” (可选,我是在) /etc/resolv.conf 配置的nameserver 114.114.114.114 nameserver 8.8.8.8
3)修改yum源
3.1.进行yum源备份
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
3.2.下载阿里yum源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
3.3.生成新的yum缓存
yum makecache fast
3.4.添加k8syum源配置
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
3.5. 清理yum缓存
yum clean all
3.6.生成新的yum缓存
yum makecache fast
3.7.更新yum源(时间长)
yum -y update
也可以源配置好了之后一起清理和生成新的yum源
3.8.安装软件包
yum -y install yum-utils device-mapper-persistent-data lvm2
3.9.安装docker yum源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
同样的需要更新yum缓存
4).安装基础软件包
yum -y install wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip sudo ntp libaio-devel ncurses-devel autoconf automake zlib-devel python-devel epel-release openssh-server socat ipvsadm conntrack ntpdate
5) 关闭和禁用防火墙
systemctl stop firewalld && systemctl disable firewalld
我是在这里进行虚拟机克隆以及IP地址修改的
6) 时间同步,各个节点操作
ntpdate cn.pool.ntp.org
添加到定时任务
crontab -e
* */1 * * * /usr/sbin/ntpdate cn.pool.ntp.org
7) 关闭selinux,各个节点操作
需要修改两个文件的内容
/etc/sysconfig/selinux 里面的 SELINUX=enforcing 改为 SELINUX=disable
/etc/selinux/config里面的 SELINUX=enforcing 改为 SELINUX=disable
使用命令修改,修改完成后重启
sed -i 's/SELINUX=enforcing/SELINUX=disable/g' /etc/sysconfig/selinux
sed -i 's/SELINUX=enforcing/SELINUX=disable/g' /etc/selinux/config
8) 关闭交换分区(各个节点,避免初始化k8s出错)
临时关闭 swapoff -a
永久禁用
sed -i 's/.*swap.*/#&/' /etc/fstab
9)修改内核参数(使用iptables必须配置,这里建议配置)
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-ipaables = 1
EOF
sysctl --system
10)修改主机名
查询当前主机name,hostnamectl
hostnamectl set-hostname master1
同理修改其它节点
11)配置hosts文件,各个节点操作
配置主机内容,可相互访问
vim /etc/hosts
192.168.0.6 master1
192.168.0.16 master2
192.168.0.26 master3
192.168.0.36 node1
12)配置无密码登陆
master1上操作
生成密钥
ssh-keygen -t rsa
一直回车
将密钥发送给master2
ssh-copy-id -i .ssh/id_rsa.pub root@master2
输入master2的密码,同理发送给master3,node1
配置其它服务器中的无密码登陆。
更多推荐
所有评论(0)