Kubernetes介绍以及使用kubeadm安装Kubernetes集群

一.Kubernetes介绍

        Kubernetes(通常缩写为 K8s)是一个开源的容器编排平台,旨在自动化容器应用的部署、扩展和管理。它最初由 Google 开发,后来捐赠给了云原生计算基金会(CNCF)。

  1. 集群

    Kubernetes 集群由一组主机组成,这些主机运行着容器化的应用。集群包括一个或多个主节点和一组工作节点。
  2. 主节点(Master Node)

    主节点负责管理集群的整体状态,包括调度、控制和API服务。主节点上的关键组件包括:
    • etcd:一个分布式键值存储,用于保存集群的所有数据和状态。
    • 控制器管理器:处理各种控制循环,如副本控制器(Replication Controller)和部署控制器(Deployment Controller)。
    • 调度器:负责将 Pods 调度到合适的工作节点上。
    • API 服务器:提供 Kubernetes API 接口,所有的操作都通过它来完成。
  3. 工作节点(Worker Node)

    工作节点运行实际的应用容器。它们的主要组件包括:
    • kube-proxy:负责网络服务的负载均衡和网络通信。
    • 容器运行时:如 Docker 或 containerd,用于运行容器。
    • kubelet:负责在工作节点上管理容器的生命周期。

 二.重要资源

  1. Pod

    Pod 是 Kubernetes 中的最小可部署单元,可以包含一个或多个容器。它们共享存储和网络资源,并且在一个节点上调度和运行。
  2. Service

    Service 是一个抽象层,用于定义访问 Pod 的方法。它提供稳定的网络访问点,并进行负载均衡。
  3. Deployment

    Deployment 用于声明性地管理 Pod 的副本和更新。它确保指定数量的 Pod 副本在任何时候都是可用的,并且可以进行滚动更新。
  4. ConfigMap 和 Secret

    ConfigMap 用于管理配置数据,而 Secret 用于存储敏感数据(如密码和密钥)。它们可以以环境变量、命令行参数或配置文件的形式注入到 Pod 中。
  5. Namespace

    Namespace 提供了逻辑上的隔离,使得不同的团队或应用可以共享一个集群而不会互相干扰。
  6. Volume

    Volume 是用于存储数据的抽象层。Kubernetes 支持多种存储类型,包括本地存储、网络存储和云存储。

 三.节点组件

1.master节点组件

(1)API server

        API server提供了集群网关,是整个集群的控制中枢,提供集群中各个模块之间的数据交换,并将集群信息存储到ETCD集群中,同时,他也是集群管理,资源配额,提供完备的集群安全机制的入口,为集群各类资源对象提供增删改查。API server 在客户端对集群进行访问,客户端需要通过认证,并使用API server作为访问节点和pod(以及服务)的堡垒和代理/通道。

  1. API服务器公开kubernetes API。
  2. REST/kubectl的入口——它是kubernetes控制平面的前端
  3. 它跟踪所有集群组件的状态并管理它们之间的交互。
  4. 它旨在水平扩展
  5. 它使用YAML/JSON manifest文件
  6. 它验证和处理通过API发出的请求。
(2)Scheduler

        Scheduler主要功能是资源调度,将pod调度到对应的主机上。依据请求资源的可用性、服务请求的质量等约束条件,K8s也支持用户自己提供的调度器

  1. 它将pod调度到工作节点。
  2. 它监视api-server以查找没有分配节点的新创建的Pod,并选择一个健康的节点让它们运行。
  3. 如果没有合适的节点,则Pod将处于挂起状态,直到出现这样一个健康的节点。
  4. 它监视APIServer的新工作任务 
(3)Controller Manager

        ControllerManager负责维护集群的状态,比如故障检测、内存垃圾回收、滚动更新等,也执行API业务逻辑:K8s默认提供replication controler controler  daemonsetcontroller等控制器。

  1. 它监视它管理的对象的期望状态并通过API服务器监视它们的当前状态
  2. 采取纠正措施以确保当前状态与所需状态相同
  3. 它是控制器的控制器
  4. 它运行控制器进程。从逻辑上讲,每个控制器都是一个单独的进程,但为了降低复杂性,它门都被编译成一个二进制文件并在单个进程中运行 

(4)etcd
        etcd用于可靠的存储集群的配置数据,是一种持久性、轻量型、分布式的键值数据存储组件可以理解为一种分布式的非关系型数据库。etcd是集群的状态,K8s默认使用分布式的etcd集群整体存储用来实现发现服务和共享配置集群的所有状态部存储在etcd实例中,并具有监控的能力,因此当etcd中的信息发生变化时,能够快地通知集群中相关的组件

  1. 它是一个一致的、分布式的、高度可用的键值存储器(非关系型数据库)
  2. 它是有状态的持久存储,用于存储所有Kubernetes集群数据(集群状态和配置)
  3. 它是集群的真相来源
  4. 它可以是控制平面的一部分,也可以在外部进行配置 

备注:
tcd集群最少3个节点,容错点才会有1个。
3个节点和4个节点的容错能力是一样的,所以有时候保持奇数节点更好,从这里可以判断出我们在部署k8s的时候,至少有3个节点,才保证etcd有1个节点容错性。
另外,etcd的Leader选举和数据写入都需要半数以上的成员投票通过确认,因此,集群最好由奇个成员组成,以确保集群内部一定能够产生多数投票通过的场景所以etcd集至少需要3个以上的奇数个成员。 

  • 偶数个节点集群不可用风险更高,表现在选主(Leader选举)过程中,有较大概的等额选票,从而触发下一轮选举。
  • 偶数个节点集群在某些网络分割的场景下无法正常工作。 网络分割发生后,将集群节点对半分割开,形成脑裂。

2.node节点组件

(1)容器运行时

        docker引擎是本地的容器运行时环境,负责镜像管理以及pod和容器的真正运行。K8s本身并不提供容器运行时环境,但提供了接口,可以插入所选择的容器运行时环境,目前支持Dockerrkt

  1. 容器运行时是负责运行容器(在Pod中)的软件
  2. 为了运行容器,每个工作节点都有一个容器运行时引擎
  3. 它从容器镜像注册表(containerimageregistry)中提取镜像并启动和停止容器

Kubernetes支持多种容器运行时:

  1. Docke
  2. containerd
  3. CRI-O
  4. Kubernetes CRI (Container  Runtime Interface,容器运行时接口)的任何实现 
(2) kubelet

        kubelet是node节点上最主要的工作代理,用于汇报节点状态并负责维护pod的生命周期,也负责volume(CVI)和网络(CNI)的管理。kubelet是pod和节点API的主要实现者,负责驱动容器执行层。作为基本的执行单元,pod可以拥有多个容器和存储卷,能够方便地在每个容器中打包一个单一的应用,从而解耦了应用构建时和部署时所关心的事项,方便在物理机或虚拟机之间进行迁移。

  1. 它是在集群中的每个节点上运行的代理
  2. 它充当API服务器和节点之间的管道
  3. 它确保容器在Pod中运行并且它们是健康的
  4. 它实例化并执行Pod。
  5. 它监祝APIServer的工作任务
  6. 它从主节点那里得到指令并报告给主节点
(3)kube-proxy代理

        kube-proxy代理对抽象的应用地址的访问,服务提供了一种访问一群pod的途径,kube-proxy负责为服务提供集群内部的服务发现和应用的负载均衡(通常利用iptables规则)实现服务到pod的路由和转发。此方式通过创建一个虚拟的IP来实现,客户端能够访问此IP,并能够将服务透明地代理至pod

  1. 它是网络组件,在网络中起着至关重要的作用
  2. 它管理IP转换和路由
  3. 它是运行在集群中每节点上的网络代理
  4. 它维护节点上的网络规则。这些网络规则允许从集群内部或外部与Pod进行网络通信它确保每个Pod获得唯一的IP地址
  5. 这使得pod中的所有容器共享一个IP成为可能 
  6. 它促进了Kubernetes网络服务和服务中所有pod的负载平衡
  7. 它处理单个主机子网并确保服务可供外部各方使用

四.Kubernetes网络插件 

在 Kubernetes 集群中,网络插件(CNI 插件)用于实现集群中的网络功能,包括 Pod 网络、服务发现、负载均衡等。Kubernetes 本身并不提供网络插件,而是允许用户选择和部署不同的 CNI 插件来满足特定的网络需求。下面是一些常见的 Kubernetes 网络插件及其功能概述:

1. Flannel

特点:

  • 网络模型:Flannel 是一个简单的网络插件,使用 Overlay 网络模型。
  • 实现:通过在集群节点上创建一个虚拟网络(通常使用 VXLAN 或其他隧道技术),Flannel 实现了 Pod 间的网络通信。
  • 优点:易于部署和配置,适合中小型集群。

缺点:

  • 性能:由于使用 Overlay 网络,可能会导致一定的性能开销。
  • 功能:功能相对简单,不支持复杂的网络策略。

2. Calico

特点:

  • 网络模型:Calico 支持两种主要的网络模型:Overlay 网络(使用 IP-in-IP 或 VXLAN)和非 Overlay 网络(基于 BGP 路由)。
  • 实现:Calico 提供了高性能的网络解决方案,支持复杂的网络策略和安全控制。
  • 优点:强大的网络策略支持,性能优秀,支持与其他网络方案集成。

缺点:

  • 配置:可能较为复杂,特别是在大规模集群中。

 3. Cilium

特点:

  • 网络模型:Cilium 使用 eBPF 技术来实现网络和安全功能。
  • 实现:通过 eBPF 提供高效的网络数据包处理和安全策略执行。
  • 优点:高性能、安全性强,支持细粒度的流量控制和可观察性。

缺点:

  • 兼容性:要求较新的 Linux 内核版本和支持 eBPF 的环境。

4. Weave

特点:

  • 网络模型:Weave 提供 Overlay 网络,通过自定义的网络协议在集群节点之间创建虚拟网络。
  • 实现:自动创建和管理网络拓扑,支持网络隔离和加密。
  • 优点:易于安装和配置,支持网络隔离。

缺点:

  • 性能:由于使用 Overlay 网络,可能存在一定的性能开销。

5. Kube-router

特点:

  • 网络模型:Kube-router 结合了网络和网络策略的功能,使用 BGP 路由来实现网络连接。
  • 实现:通过 BGP 实现高效的网络路由,同时提供网络策略支持。
  • 优点:提供集成的路由和策略功能,性能较好。

缺点:

  • 配置:可能需要对 BGP 和路由有一定了解。

6. Antrea

特点:

  • 网络模型:Antrea 是一个基于 Open vSwitch (OVS) 的 CNI 插件,支持 Overlay 和 Underlay 网络。
  • 实现:使用 OVS 实现网络功能,支持网络策略和流量监控。
  • 优点:支持网络策略和流量监控,适合复杂的网络环境。

缺点:

  • 配置:配置和管理可能相对复杂。

总结

选择合适的网络插件取决于集群的需求,包括网络性能、安全性、策略管理和易用性等。每个插件都有其优点和适用场景,管理员可以根据具体需求选择最适合的网络插件。

 五.Kubeadm快速安装Kubernetes集群

1.实验环境

三台已经安装了docker的主机

备注:

Kubernetes v1.23支持高达5000节点。更准确地说,在使用Kubernetes使,应当遵循以下准则:

  1. 每个节点不要超过110个pad
  2. 集群不要超过5000个节点
  3. 集群不要超过150000个pad
  4. 不要超过300000个container

2.要求

通过kubeadm实现快速部署KUbernetes集群。

3.实现思路

(1)部署三台docker主机的基础环境

(2)通过Kubeadm快速部署KUbernetes集群

4.部署Kubernetes集群

(1)配置三台主机名称(三台)

分别对应k8s-master,k8s-node01,k8s-node02

(2)修改后文件(三台)

vim /etc/hosts
192.168.10.101 k8s-master
192.168.10.102 k8s-node01
192.168.10.103 k8s-node02

(3)关闭交换分区(三台)

swapoff -a

进入/etc/fstab文件将关于swap的内容注释掉就可是实现永久关闭

备注:

Kubernetes 依赖于内存管理来确保 Pod 的稳定性和性能。开启 swap 分区可能导致节点的内存资源不稳定,从而影响容器的运行状态和调度决策。关闭 swap 可以确保所有内存使用都在物理 RAM 中,从而减少潜在的性能问题和不稳定性。

(4) 安装常用软件(三台)

yum -y install vim wget net-tools lrzsz

(5)配置Kubernetes的YUM源(三台)

cat <<EOF> /etc/yum.repos.d/kubernetes.repo
[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

 配置完之后清理缓存

yum clean all

(6)安装Kubelet,Kubeadm和Kubectl(三台)

yum -y install kubelet-1.23.0 kubeadm-1.23.0 kubectl-1.23.0

 备注:

a.如果在命令执行过程中出现索引gpg检查失败的情况,请使用“yum -y install  --nogpgcheck kubelet-1.23.0 kubeadm-1.23.0 kubectl-1.23.0”来安装,或者将gpgchek=1和repo_gpgcheck=1设置为0(使用阿里的镜像需要注意这些)

b.软件介绍

  • kubelet:在每个 Kubernetes 节点上运行的代理,负责管理容器的生命周期和节点的健康状态。
  • kubeadm:用于初始化 Kubernetes 集群和加入节点,简化了集群部署和管理过程。
  • kubectl:Kubernetes 的命令行工具,用于与集群交互和管理资源,如部署应用、查看状态等。

(7)kubelet设置开机启动(三台)

systemctl enable kubelet

备注:Kubelet刚安装完成后,通过systemctl start kubelet 方式是无法启动的,需要加入节点或者初始化为master 后才可以启动成功。

(8) 生成初始化配置文件(k8s-master)

操作节点:k8s-master

kubeadm提供了很多配置项,kubeadm配置在Kubernetes集群中是存储在ConfigMap中的,也可将这些配置项写入配置文件,方便管理复杂的配置项。kubeadm配置内容是通过Kubeam config命令写入配置文件的。

生成配置文件

kubeadm config print init-defaults > init-config.yaml

其中,kubeadmconfig除了用于输出配置项到文件中,还提供了其他一些常用功能,如下所示。

  • kubeadm  config  view:查看当前集群中的配置值
  • kubeadm config printjoin-defauts:输出kubeadm join默认参数文件的内容。
  • kubeadm config images list:列出所需的镜像列表
  • kubeadmconfigimagespul1:拉取镜像到本地。
  • kubeadm config upload from-flags:由配置参数生成Configap

(9)修改初始化配置文件

apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.168.10.101
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  imagePullPolicy: IfNotPresent
  name: k8s-master
  taints: null
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: 1.23.0
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
  podSubnet: 10.244.0.0/16
scheduler: {}

注意:1.24.0的版本中apiVersion:kubeadm.k8s.io/v1beta2被弃用

备注 :

advertiseAddress: 192.168.10.101 :主节点地址(API服务器地址)

name: k8s-master :为 Kubernetes 主节点指定一个名称。这通常用于标识和管理集群中的节点

imageRepository: registry.aliyuncs.com/google_containers :指定用于下载 Kubernetes 组件镜像的镜像仓库。

podSubnet: 10.244.0.0/1 :指定 Pod 网络的 CIDR 范围。(Flannel、Calico、Weave 等常用的 CNI 插件支持这个私有子网范围)podsubnet 10.244.0.0/16参数需要和后文中kube-flannel.yml中的保持一致,否则,可能会便得Node间cluster  IP不通。默认情况下,每个节点会从Podsubnet中注册一个码长度为24的子网,然后该节点的所有podip地址都会从该子网中分配

service subnet:指定使用ipvs网络进行通信,ipvs称之为IP虚拟服务器(IPVirtualServer简写为IPVS)。是运行在LVS下的提供负载平衡功能的一种技术。含义IPVS基本上是一种高效的Layer-4交换机

(10)拉取镜像(k8s-master)

列出配置文件所需镜像

kubeadm config images list --config init-config.yaml

拉取配置文件所需镜像

kubeadm config images pull --config=init-config.yaml

注意:如有离线镜像也可直接导入

(11)初始化k8s-master(k8s-master)

注意:k8s-master节点至少需要两个CPU和4G内存

kubeadm init --config=init-config.yaml

备注:执行该命令后要记住生成的token:

此外,kubeadm通过初始化安装是不包括网络插件的,也据说说初始化之后是不具备相关网络功能的,比如k8s-master 节点上查看节点信息都是“Not Ready”状态,pod的CoreDNS无法提供服务等。

(12)复制配置文件到用户的home目录(k8s-master) 

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

(13)node节点加入集群(k8snode01,k8snode02)

使用master节点生成的token令牌

(14)在k8s-master查看节点

export KUBECONFIG=/etc/kubernetes/admin.conf
查看所有节点
kubectl get nodes

获取 Kubernetes 集群中所有命名空间下的 Pod 信息
kubectl pod get -A

 注意:因为此时没有安装网络插件,coredns无法获得解析的IP,就会使得coredns处于pending状态

(15) 安装calico网络插件

使用网上的插件

kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

或使用本地已下载好的插件

kubectl apply -f calico.yaml
kubectl create -f colico.yaml

此时在 查看pod信息为runimg 

kubectl get pod -A

 六.Metrics-server部署(k8s-master)

        etricsServer是一种可扩展、高效的容器资源指标来源,适用于Kubernetes内置的自动缩放管道。MetpicsServer从Kubelets收集资源指标,并通过MetricsAPI将它们暴露在rnetes apiserver中,供Horizontal Pod Autoscaler和Vertical Pod Autoscale使用。指标API也可以通过访问kubectltop,从而更容易调试自动缩管道
         Metrics  Server对集群和网络配置有特定的要求。这些要求并不是所有集群分布的默认要求在使用Metrics  Server之前,请确保您的集群分布支持这些要求:

  • kube-apiserv 必须启用聚合层
  • 节点必须启用Webhook身份验证和投权
  • ubelet证书需由集群证书发机构签名(或通过传递--kubelet-insec e-t15etricsServer来用证书验证》注意这里是重点,如果本地没有签名需要传递argskubelet-insecure-tls”给Hatrics Server
  • 容器运行时必须实现容器指标RPC(或具有cAdvsor支持)
  • 网络应支持以下通信:

      (1)控制平面到指标服务器。控制平面节点需要到达Metric server 的 pod IP和端口10250(或节点IP和自定义端口,如果hostNetwork已启用)
      (2)所有节点上的Kubelet的指标服务器。指标服务器需要到达节点地址和端口。地址和端口在Kubelet中配置并作为Node对象的一部分发布。字段中的地址status.addresses和端口.status.daonEndpoints.kubeletEndpoint.port(默认10250)。Metrics将根把kubelet-prefer(InternalP,ExternalP,Hostname清单中的默认值)提供的列表选择第一个节点地址
源码位置
Metrics-server的github地址:https://github.com/kubernetes-sigs/metrice-server

 

1.下载Metric-server 的yaml文件

2.修改文件并安装

vim components.yaml

安装

kubectl create -f components.yaml

 3.测试安装结果

 七.Dashboard部署

1.下载dashboard.yaml和dashboard-user.yaml文件

2.在k8s工作目录下创建dashboard工作目录

mkdir -p /opt/k8s/dashboard
cd /opt/k8s/dashboard

 把两个文件上传进去

3.部署dashboard

kubectl create -f .

4.修改谷歌浏览器忽略证书报错

右键谷歌浏览器快捷方式,选择属性,在目标栏中添加 --test-type --ignore-certificate-errors

 5.查看端口号

kubectl get svc kubernetes-dashboard -n kubernetes-dashboard

使用下列命令进入dashboard配置文件改端口号 

kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard


  - nodePort: 31245

6.查看token

kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')

7.登录dashboard

https://192.168.10.101:31245/

输入查看到的token

八.安装helm客户端

1.下载helm-v3.9.4-linux-amd64.tar.gz包 

wget https://get.helm.sh/helm-v3.9.4-linux-amd64.tar.gz

2.解压

tar zxvf helm-v3.9.4-linux-amd64.tar.gz

3.安装

mv linux-amd64/helm /usr/local/bin/

4.查看版本

  • 25
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值