首页 > 其他分享 >Kubernetes一文上手【手把手系列】

Kubernetes一文上手【手把手系列】

时间:2024-03-24 19:00:13浏览次数:172  
标签:容器 一文 Kubernetes 手把手 集群 minikube Pod 节点

目录

Kubernetes

前言

部署方式的演变

  • 传统部署时代
    各个组织是在物理服务器上运行应用程序,会造成多个应用在同一台物理机上互相影响,或者一台物理机只运行一个应用造成资源浪费,并且维护物理机的成本很高
  • 虚拟化部署时代
    虚拟化技术允许你在单个物理服务器的 CPU 上运行多台虚拟机(VM)。
    每个 VM 是一台完整的计算机,在虚拟化硬件之上运行所有组件,包括其自己的操作系统。
  • 容器部署时代
    容器比起 VM 被认为是更轻量级的。且与 VM 类似,每个容器都具有自己的文件系统、CPU、内存、进程空间等。 由于它们与基础架构分离,因此可以跨云和 OS 发行版本进行移植。

K8S概述

官网
K8S是一个用于管理容器的开源平台。它可以让用户更加方便地部署、扩展和管理容器化应用程序,并通过自动化的方式实现负载均衡、服务发现和自动弹性伸缩等功能。

K8S架构

Master节点

1. API Server

API Server 是 Kubernetes 最核心的组件之一,它提供了 Kubernetes 集群中各个组件之间的通信和管理接口,所有操作都需要通过 API Server 发起和处理。当用户使用 kubectl 命令或者其他 Kubernetes 客户端工具时,实际上是通过 API Server 和集群进行交互的。

2. Etcd

Etcd 是 Kubernetes 集群中的分布式键值存储系统,用于保存集群中的所有状态信息和元数据。所有与 Kubernetes 集群相关的信息,包括 Pod、Service、Deployment 等对象的创建、更新和删除等操作,都将被记录在 Etcd 中。这样可以使得 Kubernetes 系统具有高可用性和复原能力,并且允许多个 Master 节点之间进行数据同步和共享。

3. Controller Manager

Controller Manager 是 Kubernetes 集群中的另一个核心组件,它负责监控和维护集群中所有资源对象的状态,以及进行自动化控制和管理操作。Controller Manager 中包含多个控制器,每个控制器负责监控和维护一种资源对象的状态,如 Deployment、ReplicaSet、DaemonSet 等,同时根据用户的需求,自动进行相应的容器调度、扩容、缩容等操作。

4. Scheduler

Scheduler 是 Kubernetes 集群中的另一个重要组件,主要负责根据集群中各个节点的负载情况,以及用户的调度策略,将新创建的 Pod 分配到合适的节点上。Scheduler 会根据 Pod 的资源需求、节点的资源情况、节点之间的网络距离等因素进行智能调度,从而实现负载均衡和资源最大化利用的目标。

Node节点

节点组件会在每个节点上运行,负责维护运行的 Pod 并提供 Kubernetes 运行环境。

1. kubelet

kubelet 是运行在每个 Node 节点上的代理程序,它负责与 Master 节点上的 API Server 进行通信,并根据 Master 节点下发的指令,调度和管理本地节点上的容器。kubelet 可以监控本地节点上的容器状态,如启动、停止、健康状况等,并定期向 Master 节点报告节点状态信息。

2. kube-proxy

kube-proxy 是 Kubernetes 集群中的网络代理组件,它主要负责实现集群内 Service 的负载均衡和访问控制等功能。每个 Node 节点上都会部署一个 kube-proxy 组件来负责处理该节点上所有 Service 的流量转发和路由等操作。

3. 容器运行时

容器运行时是 Kubernetes 中用于运行容器的底层组件,它负责将容器镜像转换为可以运行的进程,并提供容器的隔离、资源管理和网络管理等功能。Kubernetes 支持多种容器运行时,如 Docker、CRI-O、containerd 等,用户可以根据实际需求选择合适的容器运行时。容器运行时通常与 kubelet 紧密集成,在 Kubernetes 集群中发挥着至关重要的作用。

组件与插件

1. Kubernetes DNS

Kubernetes DNS 是 Kubernetes 集群中的域名解析系统,它为集群中所有容器提供了简单而可靠的 DNS 服务。通过 Kubernetes DNS,用户可以使用容器名称或 Service 名称等别名方式,轻松地访问到集群中运行的各种应用程序和服务。

2. Dashboard

Dashboard 是 Kubernetes 集群中的 Web 界面管理工具,它提供了一个易于使用和定制化的界面,让用户可以在不熟悉命令行操作的情况下,轻松地监控和管理集群中的资源对象和应用程序。Dashboard 支持多种自定义插件和主题,用户可以根据自己的需要进行定制和扩展。

3. Heapster

Heapster 是 Kubernetes 集群中的监控工具,它可以收集和分析各种容器和节点的性能指标,并将结果汇总和展示给用户。Heapster 支持多种存储后端,如 InfluxDB、ElasticSearch 等,用户可以选择适合自己的存储方式。

4. Ingress Controller

Ingress Controller 是 Kubernetes 集群中的负载均衡和流量路由组件,它可以将外部请求路由到集群内的不同 Service 或 Pod 上,并提供了多种负载均衡算法和路由规则。Ingress Controller 支持多种后端实现,如 Nginx、HAProxy 等,用户可以根据自己的需求进行选择和配置。 以上是 Kubernetes 中一些常用的组件和插件介绍,它们可以帮助用户更加高效地管理和操作 Kubernetes 集群中的容器应用程序。Kubernetes 的丰富生态系统和庞大社区,为用户提供了各种完善的支持和解决方案,让用户可以更加轻松地使用和掌握 Kubernetes。

K8S核心概念

Pod

Pod是Kubernetes的最小部署单元,通常包含一个或多个容器。Pod中的容器共享网络和存储,并在同一个主机上运行。

Serivce

Service 是 Kubernetes 中用于提供内部负载均衡和服务发现的组件,它可以将同一个应用程序的不同副本暴露在集群内部,并为这些副本提供唯一的虚拟 IP 地址和 DNS 域名。Service 可以通过控制器进行创建、更新和删除操作。
Service可以将多个Pod的IP地址和端口号作为一个服务提供给其他应用程序使用,这样即使Pod的IP地址和端口号发生变化,Service的IP地址和端口号也会保持不变,保证了服务的稳定性和可靠性。

在Kubernetes中,Service与Pods一起使用,可以通过标签来选择哪些Pods属于同一个Service。Service可以有不同的类型,包括ClusterIP、NodePort和LoadBalancer。其中,ClusterIP是默认类型,它将Service暴露在集群内部的虚拟IP地址上,只能从集群内部访问。NodePort类型将Service暴露在每个节点的IP地址和一个静态端口上,可以从集群外部访问。LoadBalancer类型使用云提供商的负载均衡器服务,将Service暴露在一个外部IP地址上,可以从公网访问。

Namespace

Namespace 是 Kubernetes 中用于隔离和管理资源对象的逻辑分区,它可以帮助用户将不同的资源对象归类、管理和隔离。Kubernetes 中默认存在一些 Namespace,如 default、kube-system 等,用户也可以根据需要创建自定义的 Namespace。

Deployment

Deployment 是 Kubernetes 中用于管理 Pod 副本集的控制器,它可以控制一组 Pod 的创建、扩缩容和更新等操作。Deployment 支持滚动更新和回滚等功能,可以实现无缝的应用程序版本升级。

StatefulSet

StatefulSet 是 Kubernetes 中用于管理有状态应用程序副本集的控制器,它可以为每个 Pod 分配唯一的标识符和稳定的网络名称,保证每个 Pod 的唯一性和可访问性。StatefulSet 还支持有序部署和扩缩容等功能,可以实现高可靠性的有状态应用程序部署和管理.

DaemonSet

DaemonSet 是 Kubernetes 中用于在每个节点上运行一组 Pod 的控制器,它通常用于运行系统级别的服务或代理程序等,在每个节点上保证资源对象的一致性和状态。

Job

Job 是 Kubernetes 中用于管理一次性任务的控制器,它会创建一个或多个 Pod 来执行某个任务,并在任务完成后自动删除这些 Pod。Job 还支持任务成功和失败的检测和处理等功能。

CronJob

CronJob 是 Kubernetes 中用于周期性执行任务的控制器,它可以根据用户定义的时间表,自动创建和删除相应的 Job 对象。CronJob 还支持任务成功和失败的检测和处理等功能。

ConfigMap

Kubernetes中的ConfigMap是一种用于存储应用程序配置数据的对象,它可以将配置数据与应用程序代码分离,从而提高了应用程序的可移植性和可维护性。ConfigMap可以存储任何形式的配置数据,例如环境变量、命令行参数、配置文件等等。

Secret

Kubernetes中的Secret是一种用于存储敏感信息的对象,例如密码、证书和密钥等

K8S安装和部署(Linux)

安装方式

  • minikube:是一种在本地环境中部署Kubernetes的工具,它可以在单个虚拟机中运行一个Kubernetes集群,一般用于开发、测试环境搭建。
  • kubeadm:是一种在物理机或虚拟机中快速部署Kubernetes集群的工具,已被证明可以应用于生成环境的集群搭建。
  • 二进制包:手工安装,流程复杂。二进制是 k8s 早期部署方式,相比 Kubeadm 更易维护,容易排查问题。

minikube方式安装

1. 查看Linux CPU架构
uname -m
该命令将显示机器硬件名称。如果值为"x86_64",表示系统是x64架构;如果值为"armv7l"、"aarch64"或类似的ARM架构标识,表示系统是ARM架构。
2. 安装crictl
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=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
 
setenforce 0
 
# 安装crictl工具
yum install -y cri-tools
# 生成配置文件
crictl config runtime-endpoint
# 编辑配置文件
cat << EOF | tee /etc/crictl.yaml
runtime-endpoint: "unix:///run/containerd/containerd.sock"
image-endpoint: "unix:///run/containerd/containerd.sock"
timeout: 10
debug: false
pull-image-on-create: false
disable-pull-on-run: false
EOF
 
# 查看是否安装成功,和docker命令差不多
crictl info
crictl images
3. 安装 cri-dockerd

cri-docked安装地址

  • 安装go环境
    使用 1.22的版本(尝试1.15报错)
# 下载Go语言二进制包
wget https://dl.google.com/go/go1.22.1.linux-amd64.tar.gz
 
# 解压缩到/usr/local目录
sudo tar -C /usr/local -xzf go1.22.1.linux-amd64.tar.gz 
# 设置环境变量
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.profile
source ~/.profile
 
# 验证安装
go version
  • 安装cri-dockerd
下载cri-dockerd源码
git clone https://github.com/Mirantis/cri-dockerd.git

进入cri-dockerd目录
cd cri-dockerd/

make cri-dockerd  //编译

接下来执行cri-dockerd命令的安装及环境配置命令
install -o root -g root -m 0755 cri-dockerd /usr/bin/cri-dockerd
cp -a packaging/systemd/* /etc/systemd/system

systemctl daemon-reload
systemctl enable cri-docker.service
systemctl enable --now cri-docker.socket

4. 为无驱动程序安装容器网络插件
CNI_PLUGIN_VERSION="<1.4.1>"
CNI_PLUGIN_TAR="cni-plugins-linux-amd64-$CNI_PLUGIN_VERSION.tgz" # change arch if not on amd64
CNI_PLUGIN_INSTALL_DIR="/opt/cni/bin"

curl -LO "https://github.com/containernetworking/plugins/releases/download/$CNI_PLUGIN_VERSION/$CNI_PLUGIN_TAR"
sudo mkdir -p "$CNI_PLUGIN_INSTALL_DIR"
sudo tar -xf "$CNI_PLUGIN_TAR" -C "$CNI_PLUGIN_INSTALL_DIR"
rm "$CNI_PLUGIN_TAR"
5.安装minikube

minikube安装地址

curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube && rm minikube-linux-amd64

在这里插入图片描述

minikube version

在这里插入图片描述

6. 启动minkube

(默认使用docker驱动)
minikube可以支持多种不同类型的驱动,这里我们使用docker。在命令行中输入以下命令启动minikube,其中–driver=docker指定了使用docker驱动,如果希望默认使用docker驱动,也可以执行命令minikube config set driver docker,–image-mirror-country和–image-repository是非必须的。

minikube start --image-mirror-country=cn 
--image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers 
--driver=docker //在VM中执行需要把--drive=docker 换成--drive=none

Alt
根据报错提示需要安装conntrack:
这个错误信息表明你正在使用的Kubernetes版本1.28.3需要conntrack工具在root用户的PATH环境变量中才能运行。conntrack是一个用来跟踪网络连接的工具,它通常被用于管理iptables的NAT表,确保网络包的正确转发。
CentOS为例

sudo yum install conntrack-tools

如果你已经安装了conntrack但是Kubernetes仍然报错,可能是因为conntrack没有在root用户的PATH中。你可以尝试以root用户运行conntrack --version来确认。如果不在PATH中,你可以将其添加到root用户的.bashrc或.profile文件中
启动完成
Alt

7. 使用Dashboard

kubernetes为了方便集群的维护操作,提供了dashboard功能。dashboard包括了Cluster、Workloads、Service、Config and Storage、setting等多个模块功能,涵盖了kubernetes的方方面面,是个非常不错的管理GUI。

minikube dashboard

启动过程中如果提示添加metrics-server插件扩展,使用以下命令即可

minikube addons enable metrics-server

配置代理

kubectl proxy --port=8100 --address='192.168.2.107' --accept-hosts='^.*' &
Starting to serve on 192.168.2.107:8100

Kubeadm方式安装

敬请期待,还在抓紧创作中。

标签:容器,一文,Kubernetes,手把手,集群,minikube,Pod,节点
From: https://blog.csdn.net/qq_58353992/article/details/136958756

相关文章

  • 一文彻底搞懂MySQL索引
    文章目录1.索引的优缺点2.创建索引准则3.索引的分类4.索引实现5.操作索引1.索引的优缺点MySQL索引是一种数据结构,用于提高数据库查询效率。它可以快速定位到表中符合特定条件的数据行,从而加快查询速度。索引通常是根据表中的一个或多个字段创建的,它们存储了对......
  • Kubernetes客户端认证(三)—— Kubernetes使用CertificateSigningRequest方式签发客户端
    1、概述在《Kubernetes客户端认证(一)——基于CA证书的双向认证方式 》和《Kubernetes客户端认证(二)——基于ServiceAccount的JWTToken认证》两篇博文中详细介绍了Kubernetes客户端认证方式,包括以证书方式访问的普通用户或进程(运维人员及kubectl、kubelet等进程);以Service......
  • 一文带你看懂甘特图,项目进度、资源分配清清楚楚
    带大家看懂一个甘特图,我们打开一个zz-plan的甘特图,左边是任务栏,右边是进度条,上面这个是时间,下面是一个整个项目的一个状态,任务、工时、周期和进度。  这一列颜色灰色的表示是当天,我们从这可以看出现在的进度是57.58%。进度正好在当天,没有超期、也没有延期。像这种像个括号的......
  • Kubernetes之Service
    一、Service的概念与定义1.Service的概念Service是Kubernetes实现微服务架构的核心概念,主要用于提供网络服务。通过Service的定义,可以对客户端应用屏蔽后端Pod实例数量及PodIP地址的变化,通过负载均衡策略实现请求到后端Pod实例的转发,为客户端应用提供一......
  • 一文弄懂Javascript中的深拷贝和浅拷贝
    目录一文弄懂Javascript深拷贝与浅拷贝1Javascript数据存储规则2浅拷贝3部分深拷贝3.1Object.assign3.2slice()3.3concat()3.4拓展运算符4完全深拷贝4.1_.cloneDeep()4.2结构化拷贝4.3json.stringify()4.4循环递归4.5jQuery.extend()5总结一文弄懂J......
  • Kubernetes之Pod调度策略
    一、NodeSelector:定向调度1.基本原理在Kubernetes上部署应用时,有时候可能需要限制Pod的调度范围,将Pod调度到指定的一些Node上。此时,可以为需要调度的这些Node打上标签,同时设置Pod的nodeSelector属性,使二者相匹配来达到定向调度的目的。2.简单实践(1)为目标......
  • 一文彻底搞懂HashMap
    文章目录1.数据结构2.扩容机制3.常问问题3.1HashMap为什么要树化3.2链表中转红黑树的阈值为什么设为81.数据结构JDK7中的HashMap使⽤的是数组+链表的实现⽅式,即拉链法。当发生哈希冲突时,即多个键映射到同一个数组索引位置时,HashMap会将这些键值对存储在......
  • Kubernetes之Pod工作负载
    Pod工作负载,亦称Pod控制器。在Kubernetes平台上,我们很少会直接创建一个Pod,因为直接管理单个Pod的工作量将会非常繁琐。我们可以使用KubernetesAPI创建工作负载对象,这些对象所表达的是比Pod更高级别的抽象概念,Kubernetes 控制平面根据我们定义的工作负载对象规......
  • 一文聊透 Flink 的 Temporal Join
    博主历时三年精心创作的《大数据平台架构与原型实现:数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行,点击《重磅推荐:建大数据平台太难了!给我发个工程原型吧!》了解图书详情,京东购书链接:https://item.jd.com/12677623.html,扫描左侧二维码进入京东手......
  • [Container] Introduction to Kubernetes
    DefineKubernetesAlsoknowasK8S,isanopen-sourcesystemforautomatingdeployment,scaling,andmanagementofcontainerizedapplications.Anopensourcecontainerizationorchestrationpaltform.Easolyportableacrosscloudsandon-premisesIncludes......