k8s笔记1- 初步认识k8s

k8s简介:

kubernetes,俗称k8是,用于自动部署,扩缩和管理容器化应用程序的开源系统,它将组成应用程序的容器,组合成逻辑单元,便于管理和服务发现。

k8s的作用

自动化上线和回滚、存储编排、自动装箱、ipv4和ipv6双协议、自我修复、服务发现与负载均衡、secret和配置管理、批量执行、水平扩缩、为扩展性设计

k8s核心组件

  1. etcd:分布式高性能数据库,key-value的形式存储节点上部署的容器信息等
  2. api-server:资源操作入口,提供认证、授权、访问控制、api注册和发现等机制
  3. controller manager:负责维护集群状态、故障检测、自动扩展、滚动更新等
  4. scheduler:负责资源的调度,按照预定的调度策略将pod调度到相应的节点上
  5. kubelet:负责维护容器的生命周期和CVI、CNI的管理
  6. kubectl:在master节点上对k8s集群运行命令

Pod:

k8s本身是以容器运行在目标机器上,每个k8s节点被称为Node,k8s集群是一组node机器组成的,k8s不直接无操作容器,而是提供了一个pod组件,封装了一组容器,容器都被pod管理。

Pod是 K8s的最小的可部署的计算单元,它是Kubernetes创建和管理的。一个Pod通常包含一个或者多个容器,这些容器会共享存储、网络资源和运行配置

可以通过一个YAML或JSON格式的配置文件定义Pod属性,包括容器镜像、环境变量、存储卷等。然后使用Kubernetes API或命令行工具(如kubectl)来创建和管理Pods。

k8s组件创建pod流程

  1. 在master节点写yaml,描述对容器的运行要求,创建pod的要求
  2. 使用kubectl命令创建应用这个资源的描述文件,开始k8s组件交互,把命令发给api-server
  3. api-server 利用本地https证书验证 kubectl请求是否被允许
  4. api-server 将pod创建信息记录到etcd数据库中,如应用的镜像版本、容器名、端口等
  5. api-server通知scheduler准备pod的调度
  6. scheduler调度从etcd中获取pod的部署信息,判断出一个合适的node节点准备部署pod
  7. scheduler告知api-server决定部署pod的node节点
  8. apiserver将部署信息写入etcd中
  9. api-server通知远程具体的机器去读取etcd中的信息,根据这些信息创建pod

YAML语言介绍:

YAML语言是一个类似xml、json的标志性语言,以数据为中心。

格式如下:

bash 复制代码
#yml格式
user:
  age: 18
  address: zhengzhou

YMAL语法:

  1. 大小写敏感
  2. 使用空格缩进表示层级关系,高版本可以使用tab
  3. 缩进空格数不重要,但是同层级的元素需要相同,左对齐
  4. 表示注释

数据类型:

纯量:单个的不可再分的值(字符串、布尔、整数、浮点、null、时间、日期)

对象:键值对的集合,又称为映射(mapping)/哈希(hash)/字典(dictionary)

数组:一组按照次序排列的值,又称为序列(sequence)/列表(list)

纯量

布尔:true 或false

整型:整数,例如123、345等

浮点:小数,例如3.1415926

null:不写值 或者写~,建议~

日期:必须使用iso 8601格式,即yyyy-mm-dd

时间:必须使用iso 8601格式,即2024-01-03T14:47:00+08:00 时间和日期用T链接,+后边是时区

字符串:直接写值,如果有特殊符号,必须使用单/双引号包裹

对象:

bash 复制代码
#yml格式对象格式1 -- 推荐
user:
  age: 18
  address: zhengzhou

#yml格式对象格式2
user: {age: 18,address: zhengzhou}
  

数组

bash 复制代码
格式1 -- 推荐
address: -zhengzhou
         -beijing
--格式2。
address: {zhengzhou,beijing}

一个yml文件如果想写两段yml内容,中间使用 --- 隔开

bash 复制代码
address: -zhengzhou
         -beijing

---

address: -zhengzhou
         -beijing

资源管理方式

1.命令式对象管理:直接使用命令操作Kubernetes资源

例如:kubectl run nginx-pod --image=nginx:1.17.1 --port=80

kubectl 固定写法 ,要执行的指令,--image=nginx:1.17.1 --port=80 要干的事

2.命令式对象配置:通过命令配置和配置文件去操作Kubernetes资源

例如:kubectl create/patch -f nginx-pod.yaml

kubectl固定写法 ,create/patch要执行的指令,nginx-pod.yaml通过配置文件执行

3.声明式对象配置:通过apply命令和配置文件去操作Kubernetes资源

kubectl apply -f nginx-pod.yaml

对比第二条,apply 只能更新或创建资源

类型 操作对象 适用环境 优点 缺点
命令式对象管理 对象 测试 简单 只能操作对象,无法审计跟踪
命令式对象配置 文件 开发 可以审计跟踪 项目较大时,配置文件会很多,操作麻烦
声明式对象配置 目录 开发 支持目录操作 意外情况下难以调试

命令式对象管理

kubectl是Kubernetes集群的命令行工具,通过它能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署

语法:kubectl [command] [type] [name] [flags]

  • command:指定要对资源的操作,例如:create get delete
  • type:指定资源类型,deployment、pod、service
  • name:指定资源的名称,名称大小写敏感
  • flags:指定额外可选参数

案例

#创建一个名为 dev的namespace 名称为

kubectl create ns dev

#查看已有namespace

kubectl get ns

#在dev中创建一个nginx 的应用(pod)

kubectl run pod --image=nginx:1.17.1 -n dev

#查看 dev中的pod

kubectl get pod -n dev

#查看创建过程

kubectl describe pods pod -n dev


#删除namespace dev

kubectl delete ns dev

命令式对象配置

1.创建一个nginxpod.yaml,内容如下

bash 复制代码
apiVersion: v1 
#创建一个 namespcae
kind: Namespace 
#namespcae 名称为dev
metadata: 
  name: dev 

---

apiVersion: v1 
#创建一个 pod
kind: Pod 
#pod名称为 nginxpod ,在dev的namespace中
metadata: 
  name: nginxpod
  namespace: dev 
# pod 中容器的名字是nginx-containers, 镜像为nginx:1.17.1
spac: 
# 注意containers 是一个数组 name和image是一组数据,注意对齐
  containers:
    - name: nginx-containers
      image: nginx:1.17.1

2.使用create 创建资源

bash 复制代码
kubectl create -f nginxpod.yaml 

3.可以使用delete 和配置文件删除 namespace 和 pod

bash 复制代码
kubectl delete  -f nginxpod.yaml 

声明式对象配置

使用声明式对象配置就是使用apply描述一个资源的最终状态(yaml)中定义的状态

bash 复制代码
kubectl apply -f yaml文件

使用apply操作资源

如果资源不存在就创建,等同于 kubectl create

如果资源已存在,就更新,相当于 kubectl patch

bash 复制代码
root@***:/usr/local/k8code# kubectl delete  -f nginxpod.yaml 
namespace "dev" deleted
pod "nginxpod" deleted
root@***:/usr/local/k8code# kubectl get ns dev
Error from server (NotFound): namespaces "dev" not found
##资源不存在时会直接创建
root@***:/usr/local/k8code# kubectl apply -f nginxpod.yaml 
namespace/dev created
pod/nginxpod created
##资源已存在,但是资源文件没有更新
root@***:/usr/local/k8code# kubectl apply -f nginxpod.yaml 
namespace/dev unchanged
pod/nginxpod unchanged
##做了资源文件更新后可以看到 pod/nginxpod configured 配置有变更
root@***:/usr/local/k8code# vi nginxpod.yaml 
root@***:/usr/local/k8code# kubectl apply -f nginxpod.yaml 
namespace/dev unchanged
pod/nginxpod configured
##使用create 操作已存在资源,会抛出错误
root@***:/usr/local/k8code# kubectl create -f nginxpod.yaml 
Error from server (AlreadyExists): error when creating "nginxpod.yaml": namespaces "dev" already exists
Error from server (AlreadyExists): error when creating "nginxpod.yaml": pods "nginxpod" already exists
相关推荐
容器魔方14 小时前
华为云亮相 KubeCon China 2025,开源生态引领 AI 时代技术跃迁
云原生·容器·云计算
老兵发新帖18 小时前
Kubernetes架构解析
容器·架构·kubernetes
小巫程序Demo日记19 小时前
Spark简介脑图
大数据·笔记·spark
星辰大海的精灵19 小时前
轻松玩转 Kubernetes 集群的工具包
后端·架构·kubernetes
z2014z1 天前
第3章 C#编程概述 笔记
笔记·c#
容器魔方2 天前
Volcano v1.12 正式发布!驱动云原生AI与批量计算向智能高效新阶段演进
云原生·容器·云计算
Johny_Zhao2 天前
CentOS Stream 8 高可用 Kuboard 部署方案
linux·网络·python·网络安全·docker·信息安全·kubernetes·云计算·shell·yum源·系统运维·kuboard
车队老哥记录生活2 天前
【MPC】模型预测控制笔记 (3):无约束输出反馈MPC
笔记·算法
写代码的小阿帆2 天前
LDStega论文阅读笔记
论文阅读·笔记
Cai junhao2 天前
【Qt】Qt控件
开发语言·c++·笔记·qt