kubernetes,俗称k8是,用于自动部署,扩缩和管理容器化应用程序的开源系统,它将组成应用程序的容器,组合成逻辑单元,便于管理和服务发现。
k8s的作用
自动化上线和回滚、存储编排、自动装箱、ipv4和ipv6双协议、自我修复、服务发现与负载均衡、secret和配置管理、批量执行、水平扩缩、为扩展性设计
k8s本身是以容器运行在目标机器上,每个k8s节点被称为Node,k8s集群是一组node机器组成的,k8s不直接无操作容器,而是提供了一个pod组件,封装了一组容器,容器都被pod管理。
Pod是 K8s的最小的可部署的计算单元,它是Kubernetes创建和管理的。一个Pod通常包含一个或者多个容器,这些容器会共享存储、网络资源和运行配置
可以通过一个YAML或JSON格式的配置文件定义Pod属性,包括容器镜像、环境变量、存储卷等。然后使用Kubernetes API或命令行工具(如kubectl
)来创建和管理Pods。
YAML语言是一个类似xml、json的标志性语言,以数据为中心。
格式如下:
#yml格式
user:
age: 18
address: zhengzhou
YMAL语法:
数据类型:
纯量:单个的不可再分的值(字符串、布尔、整数、浮点、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链接,+后边是时区
字符串:直接写值,如果有特殊符号,必须使用单/双引号包裹
对象:
#yml格式对象格式1 -- 推荐
user:
age: 18
address: zhengzhou
#yml格式对象格式2
user: {age: 18,address: zhengzhou}
数组
格式1 -- 推荐
address: -zhengzhou
-beijing
--格式2。
address: {zhengzhou,beijing}
一个yml文件如果想写两段yml内容,中间使用 --- 隔开
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]
案例
#创建一个名为 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,内容如下
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 创建资源
kubectl create -f nginxpod.yaml
3.可以使用delete 和配置文件删除 namespace 和 pod
kubectl delete -f nginxpod.yaml
使用声明式对象配置就是使用apply描述一个资源的最终状态(yaml)中定义的状态
kubectl apply -f yaml文件
使用apply操作资源
如果资源不存在就创建,等同于 kubectl create
如果资源已存在,就更新,相当于 kubectl patch
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