你的位置:首页 > 信息动态 > 新闻中心
信息动态
联系我们

Kubernetes

2021/12/14 4:49:15

文章目录

  • 一、Kubernetes简介
    • 1.1 kubernetes简介
    • 1.2 kubernetes发展历程
    • 1.3 k8s核心功能
      • 自动装箱
      • 自我修复(自愈能力)
      • 水平扩展
      • 服务发现
      • 滚动更新
      • 版本回退
      • 密钥和配置管理
      • 存储编排
      • 批处理
  • 二、k8s架构组件
    • 2.1 Master节点
    • 2.2 Node节点
  • 三、k8s集群搭建
    • 3.1 使用kubeadm方式搭建K8S集群
      • 安装要求
      • 环境准备
      • 安装Docker/kubeadm/kubelet
        • 安装docker
      • 部署Kubernetes Master(master节点上操作)
      • 部署CNI网络插件(只在master节点上操作)
      • 测试kubernetes集群
    • 3.2 使用二进制方式搭建K8S集群

一、Kubernetes简介

1.1 kubernetes简介

kubernetes,简称K8s,是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes 的目标是让部署容器化的应用简单并且高效(powerful), 能够进行应用的自动化部署和扩缩容。Kubernetes 提供了应用部署,规划,更新,维护的一种机制。

传统的应用部署方式是通过插件或脚本来安装应用。这样做的缺点是应用的运行、配置、管理、所有生存周期将与当前操作系统绑定,这样做并不利于应用的升级更新/回滚等操作,当然也可以通过创建虚拟机的方式来实现某些功能,但是虚拟机非常重,并不利于可移植性。

新的方式是通过部署容器方式实现,每个容器之间互相隔离,每个容器有自己的文件系统,容器之间进程不会相互影响,能区分计算资源。相对于虚拟机,容器能快速部署,由于容器与底层设施、机器文件系统解耦的。
Kubernetes 积累了作为Google 生产环境运行工作负载15 年的经验,并吸收了来自于社区的最佳想法和实践。

  • K8s是谷歌在2014年发布的容器化集群管理系统
  • 使用k8s进行容器化应用部署
  • 使用k8s利于应用扩展
  • k8s目标实施让部署容器化应用更加简洁和高效

1.2 kubernetes发展历程

我们的项目部署经历了下面的这样一个历程

传统部署 -> 虚拟化部署时代 -> 容器部署时代

在这里插入图片描述

  • 传统部署时代:早期,组织在物理服务器上运行应用程序。无法为物理服务器中的应用程序定义资源边界,这会导致资源分配问题。例如,如果在物理服务器上运行多个应用程序,则可能会出现-一个应用程序占用大部分资源的情况,结果可能导致其他应用程序的性能下降。–种解决方案是在不同的物理服务器上运行每个应用程序,但是由于资源利用不足而无法扩展,并且组织维护许多物理服务器的成本很高。
  • 虚拟化部署时代:作为解决方案,引入了虚拟化功能,它允许您在单个物理服务器的CPU.上运行多个虚拟机(VM)。虚拟化功能允许应用程序在VM之间隔离,并提供安全级别,因为一个应用程序的信息不能被另一应用程序自由地访问。因为虚拟化可以轻松地添加或更新应用程序、降低硬件成本等等,所以虚拟化可以更好地利用物理服务器中的资源,并可以实现更好的可伸缩性。每个VM是一台完整的计算机,在虚拟化硬件之上运行所有组件,包括其自己的操作系统。
  • 容器部署时代:容器类似于VM,但是它们具有轻量级的隔离属性,可以在应用程序之间共享操作系统 (OS),因此,容器被认为是轻量级的。容器与VM类似,具有自己的文件系统、CPU、内存、进程空间等。由于它们与基础架构分离,因此可以跨云和OS分发进行移植。

容器因具有许多优势而变得流行起来。下面列出了容器的一些好处:

  • 敏捷应用程序的创建和部署:与使用VM镜像相比,提高了容器镜像创建的简便性和效率。
  • 持续开发、集成和部署:通过简单的回滚(由于镜像不可变性),提供可靠且频繁的容器镜像构建和部署。
  • 关注开发与运维的分离:在构建/时而不是在部署时创建应用程序容器镜像,将应用程序与基础架构分离。
  • 可观察性:不仅可以显示操作系统级别的信息和指标,还可以显示应用程序的运行状况和其他指标信号。
  • 跨开发、测试和生产的环境一致性:在便携式计算机上与在云中相同地运行。
  • 云和操作系统分发的可移植性:可在Ubuntu、RHEL、RHEL、CoreOS、本地、Google Kubernetes Engine和其它任何其它地方运行。
  • 以应用程序为中心的管理:提高抽象级别,从在虚拟硬件上运行OS到使用逻辑资源在OS上运行应用程序。
  • 松散耦合、分布式、弹性、解放的微服务:应用程序被分解成较小的独立部分,并且可以动态部署和管理-而不是在一台大型单机上器体运行。
  • 资源隔离:可预测的应用程序性能。

1.3 k8s核心功能

自动装箱

基于容器对应用运行环境的资源配置要求自动部署应用容器

自我修复(自愈能力)

当容器失败时,会对容器进行重启

当所部署的Node节点有问题时,会对容器进行重新部署和重新调度

当容器未通过监控检查时,会关闭此容器直到容器正常运行时,才会对外提供服务

水平扩展

通过简单的命令、用户UI 界面或基于CPU 等资源使用情况,对应用容器进行规模扩大或规模剪裁
当我们有大量的请求来临时,我们可以增加副本数量,从而达到水平扩展的效果

服务发现

用户不需使用额外的服务发现机制,就能够基于Kubernetes 自身能力实现服务发现和负载均衡

滚动更新

可以根据应用的变化,对应用容器运行的应用,进行一次性或批量式更新
添加应用的时候,不是加进去就马上可以进行使用,而是需要判断这个添加进去的应用是否能够正常使用

版本回退

可以根据应用部署情况,对应用容器运行的应用,进行历史版本即时回退
类似于Git中的回滚

密钥和配置管理

在不需要重新构建镜像的情况下,可以部署和更新密钥和应用配置,类似热部署。

存储编排

自动实现存储系统挂载及应用,特别对有状态应用实现数据持久化非常重要
存储系统可以来自于本地目录、网络存储(NFS、Gluster、Ceph 等)、公共云存储服务

批处理

提供一次性任务,定时任务;满足批量数据处理和分析的场景

二、k8s架构组件

在这里插入图片描述在这里插入图片描述
Kubernetes属于典型的Server-Client形式的二层架构
k8s主要包含两部分,Master主节点和Node工作节点

2.1 Master节点

Master主要由API Server、Controller-Manager和Scheduler三个组件,以及一个用于集群状态存储的Etcd存储服务组成,它们构成整个集群的控制平面

  • kube-apiserver:所有服务访问统一入口
    • 整个集群的API网关,相关应用程序为kube-apiserver
    • 基于http/https协议以REST风格提供,几乎所有功能全部抽象为“资源”及相关的“对象”
    • 声明式API,用于只需要声明对象的“终态”,具体的业务逻辑由各资源相关的Controller负责完成
    • 无状态,数据存储于etcd中
  • CrontrollerManager:维持副本期望数目
    • 负责实现客户端通过API提交的终态声明,相应应用程序为kube-controller-manager
    • 由相关代码通过一系列步骤驱动API对象的“实际状态”接近或等同“期望状态”
  • Scheduler::负责调度任务,选择合适的节点进行分配任务
    • 调度器,负责为Pod挑选出(评估这一刻)最合适的运行节点
    • 相关程序为kube-scheduler
  • ETCD:键值对数据库 储存K8S集群所有重要信息(持久化),协助分布式集群的正常运转。
    • 集群状态数据存储系统,通常指的就是etcd
    • 仅会同API Server交互

2.2 Node节点

每个Node节点则主要包含Kubelet、Kube Proxy及容器运行时(docker是最为常用的实现)三个组件,它们承载运行各类应用容器

  • Kubelet:Kubernetes集群于每个Worker节点上的代理,直接跟容器引擎交互实现容器的生命周期管理
    • 接收并执行Master发来的指令,管理由Scheduler绑定至当前节点上的Pod对象的容器
    • 通过API Server接收Pod资源定义,或从节点本地目录中加载静态Pod配置
    • 借助于兼容CRI的容器运行时管理和监控Pod相关的容器
  • Kube-proxy:负责写入规则至 IPTABLES、IPVS 实现服务映射访问的
    • ptables模式:将Service资源的定义转为适配当前节点视角的iptables规则
    • ipvs模式:将Service资源的定义转为适配当前节点视角的ipvs和少量iptables规则
    • 是打通Pod网络在Service网络的关键所在
  • COREDNS:可以为集群中的SVC创建一个域名IP的对应关系解析
  • DASHBOARD:给 K8S 集群提供一个 B/S 结构访问体系
  • INGRESS CONTROLLER:官方只能实现四层代理,INGRESS 可以实现七层代理
  • FEDERATION:提供一个可以跨集群中心多K8S统一管理功能
  • PROMETHEUS:提供K8S集群的监控能力
  • ELK:提供 K8S 集群日志统一分析介入平台

三、k8s集群搭建

主要有两种方式搭建,第一种是kubeadm工具搭建,第二种是通过二进制方式搭建

3.1 使用kubeadm方式搭建K8S集群

kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具。
这个工具能通过两条指令完成一个kubernetes集群的部署:

# 创建一个 Master 节点
kubeadm init

# 将一个 Node 节点加入到当前集群中
kubeadm join <Master节点的IP和端口 >

使用kubeadm方式搭建K8s集群主要分为以下几步

  • 准备三台虚拟机,同时安装操作系统CentOS 7.x
  • 对三个安装之后的操作系统进行初始化操作
  • 在三个节点安装 docker kubelet kubeadm kubectl
  • 在master节点执行kubeadm init命令初始化
  • 在node节点上执行 kubeadm join命令,把node节点添加到当前集群
  • 配置CNI网络插件,用于节点之间的连通【失败了可以多试几次】
  • 通过拉取一个nginx进行测试,能否进行外网测试

安装要求

在开始之前,部署Kubernetes集群机器需要满足以下几个条件:

  • 一台或多台机器,操作系统 CentOS7.x-x86_64
  • 硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多【注意master需要两核】
  • 可以访问外网,需要拉取镜像,如果服务器不能上网,需要提前下载镜像并导入节点
  • 禁止swap分区

环境准备

节点ip
k8s-master10.0.0.180
k8s-node110.0.0.181
k8s-node210.0.0.182

在每个机器执行如下命令,可以工具----发送键到所有会话

# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

# 关闭selinux
# 永久关闭
sed -i 's/enforcing/disabled/' /etc/selinux/config  
# 临时关闭
setenforce 0  

# 关闭swap
# 临时
swapoff -a 
# 永久关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab

# 根据规划设置主机名【master节点上操作】
hostnamectl set-hostname k8s-master
# 根据规划设置主机名【node1节点操作】
hostnamectl set-hostname k8s-node1
# 根据规划设置主机名【node2节点操作】
hostnamectl set-hostname k8s-node2

# 在master添加hosts
cat >> /etc/hosts << EOF
10.0.0.180 k8s-master
10.0.0.181 k8s-node1
10.0.0.182 k8s-node2
EOF


# 将桥接的IPv4流量传递到iptables的链
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# 生效
sysctl --system  
sysctl -p

# 时间同步
yum install ntpdate -y
ntpdate time.windows.com

安装Docker/kubeadm/kubelet

所有节点安装Docker/kubeadm/kubelet ,Kubernetes默认CRI(容器运行时)为Docker,因此先安装Docker

安装docker

首先配置一下Docker的阿里yum源

wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O/etc/yum.repos.d/docker-ce.repo

安装docker

# yum安装
yum -y install docker-ce

# 查看docker版本
docker --version  

# 启动docker
systemctl enable docker
systemctl start docker

配置docker阿里加速源

mkdir -p /etc/docker


cat  >> /etc/docker/daemon.json <<EOF 
{
  "registry-mirrors": ["https://e76wqvv9.mirror.aliyuncs.com"]
}
EOF

# 重启docker
systemctl restart docker

添加kubernetes yum软件源

cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://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

安装kubeadm,kubelet和kubectl

kubelet # 运行在 Cluster 所有节点上,负责启动 Pod 和容器

kubeadm # 用于初始化 Cluster

kubectl # 是 Kubernetes 命令行工具。通过 kubectl 可以部署和管理应用,查看各种资源,创建、删除和更新各种组件

也可以指定版本号

yum install kubelet-1.20.1 kubeadm-1.20.1 kubectl-1.20.1 -y

# 设置开机自启
systemctl enable kubelet

部署Kubernetes Master(master节点上操作)

初始化kubeadm
(只需要修改apiserver-advertise-address及kubernetes-version)

先查看版本

[root@k8s-master ~]# kubelet --version
Kubernetes v1.20.1

kubeadm init \
--apiserver-advertise-address=10.0.0.180 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.20.1 \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16

–image-repository string:
用于指定从什么位置来拉取镜像(1.13版本才有的),默认值是k8s.gcr.io,我们将其指定为国内镜像地址:registry.aliyuncs.com/google_containers

–kubernetes-version string:
指定kubenets版本号,默认值是stable-1,会导致从https://dl.k8s.io/release/stable-1.txt下载最新的版本号,我们可以将其指定为固定版本(v1.15.1)来跳过网络请求。

–apiserver-advertise-address 指明用 Master 的哪个 interface 与 Cluster的其他节点通信。如果 Master 有多个 interface,建议明确指定,如果不指定,kubeadm 会自动选择有默认网关的interface。

–pod-network-cidr 指定 Pod 网络的范围。Kubernetes支持多种网络方案,而且不同网络方案对pod-network-cidr有自己的要求,这里设置为10.244.0.0/16是因为我们将使用 flannel 网络方案,必须设置成这个 CIDR

初始化成功后会有提示信息,红色框内的命令是需要后续执行的(master节点执行第一个红框,node节点执行第二个红框)
在这里插入图片描述
master节点执行

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

所有node节点执行

kubeadm join 10.0.0.180:6443 --token uhtjon.tduranh20qsge775 \
    --discovery-token-ca-cert-hash sha256:6994f18e96bf6f8717cfe7586662952d33fc312e7f6348695e82533bc7734695 

默认token有效期为24小时,当过期之后,该token就不可用了。这时就需要重新创建token,操作如下:

kubeadm token create --print-join-command

在master节点查看信息

[root@k8s-master ~]# kubectl get nodes
NAME         STATUS     ROLES                  AGE    VERSION
k8s-master   NotReady   control-plane,master   43m    v1.20.1
k8s-node1    NotReady   <none>                 40s    v1.20.1
k8s-node2    NotReady   <none>                 7m8s   v1.20.1

部署CNI网络插件(只在master节点上操作)

上面的状态还是NotReady,下面我们需要网络插件,来进行联网访问

# 失败了可以多尝试几次
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

再次查看状态

[root@k8s-master ~]# kubectl get pods -n kube-system
NAME                                 READY   STATUS    RESTARTS   AGE
coredns-7f89b7bc75-vn95t             1/1     Running   0          63m
coredns-7f89b7bc75-xc4xj             1/1     Running   0          63m
etcd-k8s-master                      1/1     Running   0          63m
kube-apiserver-k8s-master            1/1     Running   0          63m
kube-controller-manager-k8s-master   1/1     Running   0          63m
kube-flannel-ds-gf4h4                1/1     Running   0          8m11s
kube-flannel-ds-ldhc7                1/1     Running   0          8m11s
kube-flannel-ds-wn7mh                1/1     Running   0          8m11s
kube-proxy-b8dfk                     1/1     Running   0          20m
kube-proxy-js9rg                     1/1     Running   0          63m
kube-proxy-s54sk                     1/1     Running   0          27m
kube-scheduler-k8s-master            1/1     Running   0          63m


运行完成后,我们查看状态可以发现,已经变成了Ready状态了
[root@k8s-master ~]# kubectl get nodes
NAME         STATUS   ROLES                  AGE   VERSION
k8s-master   Ready    control-plane,master   63m   v1.20.1
k8s-node1    Ready    <none>                 21m   v1.20.1
k8s-node2    Ready    <none>                 27m   v1.20.1

如果上述操作完成后,还存在某个节点处于NotReady状态,可以在Master将该节点删除

# master节点将该节点删除
kubectl delete node k8s-node1
# 然后到k8snode1节点进行重置
 kubeadm reset
# 重置完后在加入
kubeadm join 10.0.0.180:6443 --token uhtjon.tduranh20qsge775 \
    --discovery-token-ca-cert-hash sha256:6994f18e96bf6f8717cfe7586662952d33fc312e7f6348695e82533bc7734695 

测试kubernetes集群

K8S是容器化技术,它可以联网去下载镜像,用容器的方式进行启动
在Kubernetes集群中创建一个pod,验证是否正常运行:

# 下载nginx 会联网拉取nginx镜像
[root@k8s-master ~]# kubectl create deployment nginx --image=nginx

# 查看状态 Running 表示运行成功
[root@k8s-master ~]# kubectl get pod
NAME                     READY   STATUS    RESTARTS   AGE
nginx-6799fc88d8-zzdqb   1/1     Running   0          117s

将端口暴露出去,让其它外界能够访问

# 暴露端口
[root@k8s-master ~]# kubectl expose deployment nginx --port=80 --type=NodePort
service/nginx exposed

# 查看一下对外的端口
[root@k8s-master ~]# kubectl get pod,svc
NAME                         READY   STATUS    RESTARTS   AGE
pod/nginx-6799fc88d8-zzdqb   1/1     Running   0          3m38s

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
service/kubernetes   ClusterIP   10.1.0.1     <none>        443/TCP        76m
service/nginx        NodePort    10.1.51.12   <none>        80:31946/TCP   10s

我们到我们的宿主机浏览器上,访问如下地址

http://10.0.0.180:31946

在这里插入图片描述

3.2 使用二进制方式搭建K8S集群