Kubernetes


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

todo

(7)

(7)

(7)

(7)

(7)


文章作者: Anubis
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Anubis !
评论
  目录