K8s基础知识

目录

K8s中文文档地址

K8s基础概念

什么是K8s?

K8s核心概念

K8s整体架构与核心组件

K8s常用命令

K8s 网络

同一个Pod中的容器通信

集群内Pod之间的通信

外部服务访问集群中的Pods

什么是Ingress?

ClusterIP与headless

StatefulSet有状态服务管理

什么是有状态服务?

StatefulSet的作用

K8s 配置管理

ConfigMap与Secret

K8s Volume持久化存储

Volume管理

PV的静态供给(Static Provision)

基于StorageClass实现PV的动态供给(Dynamical Provision)

Volume Plugin

Pod 水平自动伸缩

K8s如何进行Pod的自动扩缩容?

K8s上线部署方案

金丝雀发布

滚动更新

蓝绿部署


K8s中文文档地址

http://docs.kubernetes.org.cn/

K8s基础概念

什么是K8s?

  • K8s全称Kubernetes,是一个能够实现自动部署、自动扩缩容、自动编排的容器管理系统。

K8s核心概念

  • Pod:K8s操作的最小操作单元,包含一个或多个container,共享存储和网络;
  • ReplicaSet:管理Pod的组件,实现集群中Pods的高可用;
  • Deployment:管理ReplicaSet与Pod。正常情况下是使用Deployment而不是ReplicaSet,可以随时了解Pod的部署进度;
  • Label:Label是附加在K8s对象(比如Pods)上的键值对;
  • Service:一系列具有相同Label的Pods的集合称为Service,可Pod支持Pods的自动发现与负载均衡;
  • Selector:选择器,某个组件需要选择别的组件需要通过Selector;
  • Node:Pod需要运行在centos机器上,这个机器成为Node。

K8s整体架构与核心组件

  • kubectl:K8s客户端;
  • Master Node:K8s主节点;
    • APIServer:提供了所有内部和外部的 API 请求操作的唯一入口。同时也负责整个集群的认证、授权、访问控制、服务发现等能力;
    • Scheduler:负责监听未调度的 Pod,按照预定的调度策略绑定到满足条件的节点上;
    • Controller Manager:它负责维护整个 Kubernetes 集群的状态,比如多副本创建、滚动更新等;
    • DashBoard:集群监控面板;
    • DNS:负责域名解析;
    • ETCD:集群的配置中心,负责集群配置信息的存储;
  • Worder Node:K8s工作节点;
    • kubelet:是每个Node的节点代理,用于Pods的管理与监控,;
    • kube-proxy:用于代理Pod,实现service到pod的负载均衡;
    • Docker:底层容器技术;
    • fluentd:日志采集技术;

 

K8s常用命令

创建资源

一般创建资源会有两种方式:通过文件或者命令创建。

# 【最常用的方式】基于yaml配置文件创建 
kubectl apply -f deployment.yaml 
# 通过kubectl命令直接创建
kubectl run nginx_app --image=nginx:1.9.1 --replicas=3

查看资源

# 一般命令的格式会如下: 
kubectl get <resource_type> 
# 比如获取K8s集群下pod的信息 kubectl get pod 
# 更加详细的信息 
kubectl get pod -o wide 
# 指定资源的信息,格式:kubectl get <resource_type>/<resource_name>,比如获取deployment nginx_app的信息 
kubectl get deployment/nginx_app -o wide 
# 查看kube-system的pods 
kubectl get pods -n kube-system 
# 查看所有pods 
kubectl get pods --all-namespaces

删除资源

kubectl delete -f pod_nginx_rs.yaml

scale命令

对一个Deployment、RS、StatefulSet进行扩/缩容。

# 调整replicas数值 
kubectl scale deployment/nginx_app --replicas=5

autoscale命令

通过创建一个autoscaler,可以自动选择和设置在K8s集群中Pod的数量。

# 基于CPU的使用率创建3-10个pod 
kubectl autoscale deployment/nginx_app --min=3 --max=10 --cpu_percent=80

 

K8s 网络

同一个Pod中的容器通信

  • 同一个pod中的容器是共享网络ip地址和端口号的,通信显然没问题;

集群内Pod之间的通信

  • 集群中的Pods之间是可以通过IP互相通信的。但是,通过Deployment管理Pod,随时可能对Pod进行扩缩容,这时候Pod的IP地址是变化的;
  • K8s集群会把相同或者具有关联的Pod,打上Label,组成Service,而Service有固定的Cluster IP 或域名,不管Pod怎么创建和销毁,都可以通过Service 进行访问,Service接到请求后会基于负载均衡机制转发到具体的Pod。

外部服务访问集群中的Pods

  • NodePort:将Service地址映射到宿主的一个端口上,然后可以通过宿主机 ip:port 进行访问【不推荐,因为会占用各个宿主机的端口资源】;
  • HostPort:将Pod地址映射到宿主的一个端口上,然后可以通过宿主机 ip:port 进行访问【不推荐,因为会占用各个宿主机的端口资源】;
  • LoadBalance:需要k8s之外的第三方支持【不推荐,每个service一个LB,比较浪费和麻烦】;
  • Ingress:简单的说是一个全局的负载均衡器,可以通过配置的URL访问相关的Service【推荐的方式】。

什么是Ingress?

  • 通常情况下,Service 和 Pod 的 IP 仅可在集群内部访问。集群外部的请求需要通过负载均衡转发到 Service 在 Node 上暴露的 NodePort 上,然后再由 kube-proxy 通过边缘路由器 (edge router) 将其转发给相关的 Pod 或者丢弃。而 Ingress 就是为进入集群的请求提供路由规则的集合;
  • Ingress 可以给 Service 提供集群外部访问的 URL、负载均衡、SSL 终止、HTTP 路由等。为了配置这些 Ingress 规则,集群管理员需要部署一个 Ingress Controller,它监听 Ingress 和 Service 的变化,并根据规则配置负载均衡并提供访问入口;
  • Ingress 是一种反向代理的抽象,相关实现包括Nginx、HAProxy等,实际使用时选择对应的Ingress Controller部署即可。

ClusterIP与headless

  • 一个Service可能有多个Pod,客户端访问时,会基于固定的ClusterIP进行访问,再根据 kube-proxy所配置的 iptables 规则负载均衡到具体Pod;
  • 如果将Service的spec.clusterIP设置为 None,那么创建出来的 Service 并不会分配到一个 Cluster IP,此时它就被称为Headless Service,这时我们在其DNS记录中便可以得到所有Pod的地址,这种方式的好处有:
    • 用户可以自己选择要连接哪个 Pod,通过查询 Service 的 DNS 记录来获取后端真实负载的 IP 地址,自主选择要连接哪个 IP;
    • 可用于部署有状态服务(StatefulSet)。

 

StatefulSet有状态服务管理

什么是有状态服务?

之前接触的Pod的管理对象比如RC、Deployment、DaemonSet(管理守护进程Pod)和Job(管理一次性任务或定时任务Pod)都是面向无状态的服务,但是现实中有很多服务是有状态的,比如MySQL集群、MongoDB集群、ZK集群等,它们都有以下共同的特点:

  • 每个节点都有固定的ID,通过该ID,集群中的成员可以互相发现并且通信;
  • 集群的规模是比较固定的,集群规模不能随意变动;
  • 集群里的每个节点都是有状态的,通常会持久化数据到永久存储中;
  • 如果磁盘损坏,则集群里的某个节点无法正常运行,集群功能受损。

StatefulSet的作用

  • StatefulSet里的每个Pod都有稳定、唯一的网络标识,可以用来发现集群内其他的成员;
  • Pod的启动顺序是受控的,操作第n个Pod时,前n-1个Pod已经是运行且准备好的状态;
  • StatefulSet里的Pod采用稳定的持久化存储卷,通过PV/PVC来实现,删除Pod时默认不会删除与StatefulSet相关的存储卷;
  • StatefulSet需要与Headless Service配合使用。

 

K8s 配置管理

ConfigMap与Secret

  • 在 K8s 中,一般有 ConfigMap 和 Secret 两种对象,可以用来做配置管理,实现配置信息和容器镜像进行解耦;
    • ConfigMap主要用来保存一些非敏感数据,可以用作环境变量、命令行参数或者通过 Volume 方式挂载到 Pod 内的;
    • Secret用法与ConfigMap类似,主要用于保存敏感数据;
  • ConfigMap 和 Secret 是 K8s 常用的保存配置数据的对象,通过 Volume 方式挂载到 Pod 内的,kubelet 都会定期进行更新,但是通过环境变量注入到容器中是无法感知到 ConfigMap 或 Secret 的内容更新。

 

K8s Volume持久化存储

Volume管理

  • K8s 基于 PersistentVolume 和 PersistentVolumeClaim 对Volume进行管理,实现Pod的持久化;
    • PersistentVolume (PV) 是外部存储系统中的一块存储空间,由管理员创建和维护。与 Volume 一样,PV 具有持久性,生命周期独立于 Pod;
    • PersistentVolumeClaim (PVC) 是对 PV 的申请 声明 (Claim)。PVC 通常由普通用户创建和维护。需要为 Pod 分配存储资源时,用户可以创建一个 PVC,指明存储资源的容量大小和访问模式(任意读写、只读等)等信息,Kubernetes 会查找并提供满足条件的 PV,用户无需关注具体实现细节;
  • 持久化存储的使用场景:
    • MySQL、ZooKeeper、ES、MongoDB 等。

PV的静态供给(Static Provision)

  • 管理员通过手动的方式在后端存储平台上提前创建好对应的 Volume,然后通过 PV 定义到 K8s,开发者通过 PVC 来使用;

基于StorageClass实现PV的动态供给(Dynamical Provision)

  • 如果没有满足 PVC 条件的 PV,会动态创建 PV;
  • 相比静态供给,动态供给有明显的优势:不需要提前创建 PV,减少了管理员的工作量,效率高。

Volume Plugin

  • 为了丰富可以对接的存储后端,Kubernetes 中提供了很多volume plugin可供使用:

    分类

    描述

    plugun

    数据是否随着Pod删除而删除

    临时存储

    用于存储一些临时文件

    EmptyDir

    本地存储

    用于将一些K8s中定义的配置通过volume映射到容器中使用

    ConfigMap

    Secret

    DownwardAPI

    (可基于Etcd存储)

    使用宿主机上的存储资源

    HostPathLocal

    自建存储平台

    客户自己搭建的存储平台

    CephFS

    GlusterFS

    NFS

    RBD

    ...

    云厂商插件

    云厂商提供的插件,供云商K8s使用

    awsElasticBlockStore

    ...

 

Pod 水平自动伸缩

K8s如何进行Pod的自动扩缩容?

  • 像 Deployment 这种支持多副本的工作负载,我们就可以通过调整spec.replicas来增加或减少副本数,从而改变整体的业务水位满足我们的需求,即整体负载高时就增加一些实例,负载低就适当减少一些实例来节省资源。
  • 当然人为不断地调整spec.replicas的数值显然是不太现实的,HPA(Horizontal Pod Autoscaler)可以根据应用的 CPU 利用率等水位信息,动态地增加或者减少 Pod 副本数量。

 

K8s上线部署方案

金丝雀发布

  • 以前旷工下矿前,会先放一只金丝雀进去用于探测洞里是否有有毒气体,看金丝雀能否活下来,金丝雀发布由此得名;
  • 金丝雀发布一般是先发1台或者一个小比例的服务器,主要做流量验证用,国内常称灰度测试。

滚动更新

  • 在金丝雀发布基础上的进一步优化改进,一次滚动式发布一般由若干个发布批次组成,每批的数量一般是可以配置的(可以通过发布模板定义);
  • 例如,第一批1台(金丝雀),第二批10%,第三批 50%,第四批100%。每个批次之间留观察间隔,通过手工验证或监控反馈确保没有问题再发下一批次。

蓝绿部署

  • 一些应用程序上线需要从旧版本立即切到新版本,这时便需要执行蓝绿部署;
  • 在进行蓝绿部署时,应用程序的一个新副本(绿)将与现有版本(蓝)一起部署,然后更新应用程序的入口/路由器以切换到新版本(绿)。

热门文章

暂无图片
编程学习 ·

exe4j详细使用教程(附下载安装链接)

一、exe4j介绍 ​ exe4j是一个帮助你集成Java应用程序到Windows操作环境的java可执行文件生成工具&#xff0c;无论这些应用是用于服务器&#xff0c;还是图形用户界面&#xff08;GUI&#xff09;或命令行的应用程序。如果你想在任务管理器中及Windows XP分组的用户友好任务栏…
暂无图片
编程学习 ·

AUTOSAR从入门到精通100讲(126)-浅谈车载充电系统通信方案

01 引言 本文深入研究车载充电系统策略,设计出一套基于电动汽车电池管理系统与车载充电机的CAN通信协议,可供电动汽车设计人员参考借鉴。 02 电动汽车充电系统通讯网络 电动汽车整车控制系统中采用的是CAN总线通信方式,由一个整车内部高速CAN网络、内部低速CAN网络和一个充电…
暂无图片
编程学习 ·

CMake(九):生成器表达式

当运行CMake时&#xff0c;开发人员倾向于认为它是一个简单的步骤&#xff0c;需要读取项目的CMakeLists.txt文件&#xff0c;并生成相关的特定于生成器的项目文件集(例如Visual Studio解决方案和项目文件&#xff0c;Xcode项目&#xff0c;Unix Makefiles或Ninja输入文件)。然…
暂无图片
编程学习 ·

47.第十章 网络协议和管理配置 -- 网络配置(八)

4.3.3 route 命令 路由表管理命令 路由表主要构成: Destination: 目标网络ID,表示可以到达的目标网络ID,0.0.0.0/0 表示所有未知网络,又称为默认路由,优先级最低Genmask:目标网络对应的netmaskIface: 到达对应网络,应该从当前主机哪个网卡发送出来Gateway: 到达非直连的网络,…
暂无图片
编程学习 ·

元宇宙技术基础

请看图&#xff1a; 1、通过AR、VR等交互技术提升游戏的沉浸感 回顾游戏的发展历程&#xff0c;沉浸感的提升一直是技术突破的主要方向。从《愤怒的小鸟》到CSGO,游戏建模方式从2D到3D的提升使游戏中的物体呈现立体感。玩家在游戏中可以只有切换视角&#xff0c;进而提升沉浸…
暂无图片
编程学习 ·

flink的伪分布式搭建

一 flink的伪分布式搭建 1.1 执行架构图 1.Flink程序需要提交给 Job Client2.Job Client将作业提交给 Job Manager3.Job Manager负责协调资源分配和作业执行。 资源分配完成后&#xff0c;任务将提交给相应的 Task Manage。4.Task Manager启动一个线程以开始执行。Task Manage…
暂无图片
编程学习 ·

十进制正整数与二进制字符串的转换(C++)

Function one&#xff1a; //十进制数字转成二进制字符串 string Binary(int x) {string s "";while(x){if(x % 2 0) s 0 s;else s 1 s;x / 2;}return s; } Function two&#xff1a; //二进制字符串变为十进制数字 int Decimal(string s) {int num 0, …
暂无图片
编程学习 ·

[含lw+源码等]微信小程序校园辩论管理平台+后台管理系统[包运行成功]Java毕业设计计算机毕设

项目功能简介: 《微信小程序校园辩论管理平台后台管理系统》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 本系统包含微信小程序做的辩论管理前台和Java做的后台管理系统&#xff1a; 微信小程序——辩论管理前台涉及技术&#xff1a;WXML 和 WXS…
暂无图片
编程学习 ·

树莓派驱动DHT11温湿度传感器

1&#xff0c;直接使用python库 代码如下 import RPi.GPIO as GPIO import dht11 import time import datetimeGPIO.setwarnings(True) GPIO.setmode(GPIO.BCM)instance dht11.DHT11(pin14)try:while True:result instance.read()if result.is_valid():print(ok)print(&quo…
暂无图片
编程学习 ·

ELK简介

ELK简介 ELK是三个开源软件的缩写&#xff0c;Elasticsearch、Logstash、Kibana。它们都是开源软件。不过现在还新增了一个 Beats&#xff0c;它是一个轻量级的日志收集处理工具(Agent)&#xff0c;Beats 占用资源少&#xff0c;适合于在各个服务器上搜集日志后传输给 Logstas…
暂无图片
编程学习 ·

Linux 基础

通常大数据框架都部署在 Linux 服务器上&#xff0c;所以需要具备一定的 Linux 知识。Linux 书籍当中比较著名的是 《鸟哥私房菜》系列&#xff0c;这个系列很全面也很经典。但如果你希望能够快速地入门&#xff0c;这里推荐《Linux 就该这么学》&#xff0c;其网站上有免费的电…
暂无图片
编程学习 ·

Windows2022 无线网卡装不上驱动

想来 Windows2022 和 windows10/11 的驱动应该差不多通用的&#xff0c;但是死活装不上呢&#xff1f; 搜一下&#xff0c;有人提到 “默认安装时‘无线LAN服务’是关闭的&#xff0c;如果需要开启&#xff0c;只需要在“添加角色和功能”中&#xff0c;选择开启“无线LAN服务…
暂无图片
编程学习 ·

【嵌入式面试宝典】版本控制工具Git常用命令总结

目录 创建仓库 查看信息 版本回退 版本检出 远程库 Git 创建仓库 git initgit add <file> 可反复多次使用&#xff0c;添加多个文件git commit -m <message> 查看信息 git status 仓库当前的状态git diff 差异对比git log 历史记录&#xff0c;提交日志--pret…
暂无图片
编程学习 ·

用Postman生成测试报告

newman newman是一款基于nodejs开发的可以运行postman脚本的工具&#xff0c;使用Newman&#xff0c;可以直接从命令运行和测试postman集合。 安装nodejs 下载地址&#xff1a;https://nodejs.org/en/download/ 选择自己系统相对应的版本内容进行下载&#xff0c;然后傻瓜式安…
暂无图片
编程学习 ·

Java面向对象之多态、向上转型和向下转型

文章目录前言一、多态二、引用类型之间的转换Ⅰ.向上转型Ⅱ.向下转型总结前言 今天继续Java面向对象的学习&#xff0c;学习面向对象的第三大特征&#xff1a;多态&#xff0c;了解多态的意义&#xff0c;以及两种引用类型之间的转换&#xff1a;向上转型、向下转型。  希望能…