Kubernetes
一、认识Kubernetes
1.服务部署方式演变
大致来说,在部署应用程序的方式上,我们主要经历了三个时代:
- 传统部署时代:早期,企业直接将应用程序部署在物理机上。由于物理机上不能为应用程序定义资源使用边界,我们也就很难合理地分配计算资源。例如:如果多个应用程序运行在同一台物理机上,可能发生这样的情况:其中的一个应用程序消耗了大多数的计算资源,导致其他应用程序不能正常运行。应对此问题的一种解决办法是,将每一个应用程序运行在不同的物理机上。然而,这种做法无法大规模实施,因为资源利用率很低,且企业维护更多物理机的成本昂贵。
- 虚拟化部署时代:针对上述问题,虚拟化技术应运而生。用户可以在单台物理机的CPU上运行多个虚拟机(Virtual Machine)。
虚拟化技术使得应用程序被虚拟机相互分隔开,限制了应用程序之间的非法访问,进而提供了一定程度的安全性。
虚拟化技术提高了物理机的资源利用率,可以更容易地安装或更新应用程序,降低了硬件成本,因此可以更好地规模化实施。
每一个虚拟机可以认为是被虚拟化的物理机之上的一台完整的机器,其中运行了一台机器的所有组件,包括虚拟机自身的操作系统。 - 容器化部署时代:容器与虚拟机类似,但是降低了隔离层级,共享了操作系统。因此,容器可以认为是轻量级的。
与虚拟机相似,每个容器拥有自己的文件系统、CPU、内存、进程空间等
运行应用程序所需要的资源都被容器包装,并和底层基础架构解耦
容器化的应用程序可以跨云服务商、跨Linux操作系统发行版进行部署
2.kubernetes简介
kubernetes的本质是一组服务器集群,它支持自动化部署、大规模可伸缩、 应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。 在 Kubernetes 中,我们可以创建多个容器,每个容器里面运行一个应用实例,然后通过内置的负载均衡策略,实现对这一组应用实例的管理、发现、访问,而这些细节都不需要运维人员去进行复杂的手工配置和处理。
k8s 主要提供以下服务:
- (1)自动装箱:基于容器对应用运行环境的资源配置要求自动部署应用容器
- (2)自我修复(自愈能力):当容器失败时,会对容器进行重启。当所部署的 Node 节点有问题时,会对容器进行重新部署和重新调度。当容器未通过监控检查时,会关闭此容器直到容器正常运行时,才会对外提供服务
- (3)水平扩展:通过简单的命令、用户 UI 界面或基于 CPU 等资源使用情况,对应用容器进行规模扩大或规模剪裁
- (4)服务发现:服务可以通过自动发现的形式找到它所依赖的服务。
- (5)滚动更新:可以根据应用的变化,对应用容器运行的应用,进行一次性或批量式更新。
- (6)版本回退:可以根据应用部署情况,对应用容器运行的应用,进行历史版本即时回退
- (6)密钥和配置管理:在不需要重新构建镜像的情况下,可以部署和更新密钥和应用配置,类似热部署。
- (7)存储编排:自动实现存储系统挂载及应用,特别对有状态应用实现数据持久化非常重要。存储系统可以来自于本地目录、网络存储(NFS、Gluster、Ceph 等)、公共云存储服务
- (8)批处理:提供一次性任务,定时任务;满足批量数据处理和分析的场景。
- (9)负载均衡:如果一个服务起动了多个容器,能够自动实现请求的负载均衡。
Kubernetes 组件介绍:
![](/markdownimages/Kubernetes/256932907635207.png =601x)
一个 kubernetes 集群主要是由 控制节点(master)、工作节点(node) 构成,每个节点上都会安装不同的组件。
master:集群的控制平面,负责集群的决策 ( 管理 )
- ApiServer : 资源操作的唯一入口,接收用户输入的命令,提供认证、授权、API注册和发现等机制
- Scheduler : 负责集群资源调度,按照预定的调度策略将Pod调度到相应的node节点上
- ControllerManager : 负责维护集群的状态,比如程序部署安排、故障检测、自动扩展、滚动更新等
- Etcd :负责存储集群中各种资源对象的信息
node(worker):集群的数据平面,负责为容器提供运行环境 ( 干活 )
- Kubelet : 负责维护容器的生命周期,即通过控制docker,来创建、更新、销毁容器
- KubeProxy : 负责提供集群内部的服务发现和负载均衡
- Docker : 负责节点上容器的各种操作
3.kubernetes 组件调用关系的应用示例
以部署一个 Nginx 服务来说明 Kubernetes 系统各个组件调用关系:
- ① 首先需要明确,一旦 Kubernetes 环境启动之后,master 和 node 都会将自身的信息存储到etcd数据库中。
- ② 一个Nginx服务的安装请求首先会被发送到 master 节点上的 API Server 组件。
- ③ API Server 组件会调用 Scheduler 组件来决定到底应该把这个服务安装到那个 node 节点上。此时,它会从 etcd 中读取各个 node 节点的信息,然后按照一定的算法进行选择,并将结果告知 API Server 。
- ④ API Server 调用 Controller-Manager 去调用 Node 节点安装 Nginx 服务。
- ⑤ Kubelet 接收到指令后,会通知 Docker ,然后由 Docker 来启动一个 Nginx 的 Pod 。Pod 是 Kubernetes 的最小操作单元,容器必须跑在 Pod 中。
4.Kubernetes 其他概念
- Master:集群控制节点,每个集群需要至少一个master节点负责集群的管控
- Node:工作负载节点,由master分配容器到这些node工作节点上,然后node节点上的docker负责容器的运行
- Pod:kubernetes的最小控制单元,容器都是运行在pod中的,一个pod中可以有1个或者多个容器
- Controller:控制器,通过它来实现对pod的管理,比如启动pod、停止pod、伸缩pod的数量等等
- Service:pod对外服务的统一入口,下面可以维护者同一类的多个pod
- Label:标签,用于对pod进行分类,同一类pod会拥有相同的标签
- NameSpace:命名空间,用来隔离pod的运行环境
二、搭建K8s集群
kubernetes有多种部署方式,目前主流的方式有kubeadm、minikube、二进制包,本次选择方式二。
- minikube:一个用于快速搭建单节点的kubernetes工具。
- kubeadm:一个用于快速搭建kubernetes集群的工具。
- 二进制包:从官网上下载每个组件的二进制包,依次去安装,此方式对于理解kubernetes组件更加有效。
- 使用 KuboardSpray 安装kubernetes_v1.23.1
1.环境准备
(1) 三台Centos7.9
查看操作系统版本:
cat /etc/redhat-release
(2) 关闭防火墙与Iptable
systemctl stop firewalld # 关闭防火墙
systemctl disable firewalld # 禁止防火墙开机自启
systemctl stop iptables # 没有就算了
systemctl disable iptables
(3) 同步时钟
#安装ntp软件包。
yum -y install ntp
#设置ntp服务开机自启。
systemctl enable ntpd
#启动ntp服务。
systemctl start ntpd
#从公共ntp服务器同步一次时间。
sudo ntpdate -u pool.ntp.org
#将系统时间同步到硬件时钟。
hwclock --systohc
#设置系统时区为上海。
timedatectl set-timezone Asia/Shanghai
(4) 关闭selinux 与 swap分区
# 永久关闭 selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config
# 关闭swap分区
sed -ri 's/.*swap.*/#&/' /etc/fstab
(5) 其他
# 修改系统配置(k8s 强制要求的,做就是了)
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
EOF
# 使能配置
sysctl -p
# 加载网桥过滤模块
modprobe br_netfilter
# 查看网桥过滤模块是否加载成功
lsmod | grep br_netfilter
(6) 配置ipvs
在kubernetes中service有两种代理模型,一种是基于iptables,另一种是基于ipvs的。ipvs的性能要高于iptables的,但是如果要使用它,需要手动载入ipvs模块。
(7) 安装Docker
# 0.yum 安装 wget
sudo yum install wget
# 1、切换镜像源
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
# 2、查看当前镜像源中支持的docker版本
yum list docker-ce --showduplicates
# 3、安装特定版本的docker-ce
# 必须指定--setopt=obsoletes=0,否则yum会自动安装更高版本
yum install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7 -y
# 4、配置加速
tee /etc/docker/daemon.json <<-'EOF'
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://du3ia00u.mirror.aliyuncs.com"],
"live-restore": true,
"log-driver":"json-file",
"log-opts": {"max-size":"500m", "max-file":"3"},
"storage-driver": "overlay2"
}
EOF
systemctl daemon-reload
systemctl restart docker
# 5、启动dokcer
systemctl restart docker
systemctl enable docker
(8) 安装Kubernetes
# 1、设置镜像源
vi /etc/yum.repos.d/kubernetes.repo
# 2、添加下面的配置
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgchech=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
# 3、安装kubeadm、kubelet和kubectl
yum install --setopt=obsoletes=0 kubeadm-1.17.4-0 kubelet-1.17.4-0 kubectl-1.17.4-0 -y
# 4、配置kubelet的cgroup
vi /etc/sysconfig/kubelet
# 添加下面的配置
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
# 5、设置kubelet开机自启
systemctl enable kubelet
(9) 提前下载Kubernetes组件镜像
kubeadm config images list
images=(
kube-apiserver:v1.17.7
kube-controller-manager:v1.17.7
kube-scheduler:v1.17.7
kube-proxy:v1.17.7
pause:3.1
etcd:3.4.3-0
coredns:1.6.5
)
for imageName in ${images[@]};do
docker pull registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/$imageName
docker tag registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/$imageName k8s.gcr.io/$imageName
docker rmi registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/$imageName
done