k8s高可用集群搭建之概念与基础环境

一、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
k8s高可用集群搭建之概念与基础环境_第1张图片

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
配置其它服务器中的无密码登陆。

你可能感兴趣的:(部署,kubernetes,k8s,容器,高可用集群,虚拟机)