Docker$Kubernetes笔记---03
2023-11-17 15:40:04 0 举报
Docker$Kubernetes笔记---03---Kubernetes资源管理及五大资源
作者其他创作
大纲/内容
资源管理
资源管理介绍
在kubernetes中,所有的内容都抽象为资源,用户需要通过操作资源来管理kubernetes
kubernetes的本质就是一个集群系统,用户可以在集群中部署各种服务,所谓部署服务就是在kubernetes集群中运行一个一个的容器,并将指定的程序跑在容器中
kubernetes的最小管理单元是pod而不是容器,所以只能将容器放在pod中,而kubernetes一般也不会直接管理pod,而是通过pod控制器来管理pod
pod可以提供服务之后,就要考虑如何访问pod中的服务,kubernetes提供的service资源实现这个功能,如果pod中程序的数据需要持久化,kubernetes还提供了各种存储系统
学习kubernetes的核心就是学习如何对集群上的Pod、Pod控制器、Service、存储等各种资源进行操作
资源管理之YAML语言
YAML是一个类似于XML、JSON的标记性语言,它强调以数据为中心,并不是以标识语言为重点,因为YAML本身的定义比较简单,号称“一种人性化的数据格式语言”。
YAML的语法特点:
严格区分大小写
使用缩进表示层级关系
缩进不允许使用tab键,只允许使用空格,缩进的空格数量没有严格要求,只要相同层级的元素左对齐即可
#号表示注释
书写YAML切记 : 后边要加一个空格
如果需要将多段YAML配置放在同一个文件中,中间需要用 --- 作为分格
下面是YAML转JSON语法网站,可用于验证yaml语法是否正确
http://json2yaml.com/convert-yaml-to-json
http://json2yaml.com/convert-yaml-to-json
资源管理方式介绍
在kubernetes中,所有内容都被抽象为资源对象,学习kubernetes主要学习如何管理资源对象
类型 操作对象 试用环境 优点 缺点
命令式对象管理 对象 测试 简单 只能操作活动对象,无法审计、跟踪
命令式对象配置 文件 开发 可以审计、跟踪 项目大时,配置文件多,操作麻烦
声明式对象配置 目录 开发 支持目录操作 意外情况下难以调试
类型 操作对象 试用环境 优点 缺点
命令式对象管理 对象 测试 简单 只能操作活动对象,无法审计、跟踪
命令式对象配置 文件 开发 可以审计、跟踪 项目大时,配置文件多,操作麻烦
声明式对象配置 目录 开发 支持目录操作 意外情况下难以调试
资源管理方式1---命令式对象管理---直接使用命令去操作kubernetes资源
kubectl run nginx-pod --image=nginx:1.17.4 --port=80
资源管理方式2---命令式对象配置---通过命令配置和配置文件去操作kubernetes资源
kubectl create/patch -f nginx-pod.yaml
资源管理方式3---声明式对象配置---通过apply命令和配置文件去创建和更新kubernetes资源
kubectl apply -f nginx-pod.yaml
命令式对象管理
命令式对象管理:直接使用命令去操作kubernetes资源
kubectl命令介绍:kubectl是kubernetes集群的命令行工具,通过它能过够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署
命令格式:kubectl [command] [type] [name] [flags]
command:指定要对资源执行的操作,例如:create、get、delete
type:指定资源类型,例如:deployment、pod、service
name:指定资源名称,名称区分大小写
flags:指定额外的可选参数
ubenetes允许对资源进行多种操作,可以通过--help查看详细的操作指令
kubectl --help
kubectl --help
查看所有pod
kubectl get pod
kubectl get pod
查看指定的pod(根据pod名字查找)
kubectl get pod nginx-696649f6f9-g5nds
kubectl get pod nginx-696649f6f9-g5nds
查看指定pod,通过额外参数显示pod详细信息,包括pod的IP地址,pod运行的节点等
kubectl get pod nginx-696649f6f9-g5nds -o wide
kubectl get pod nginx-696649f6f9-g5nds -o wide
查看指定pod,通过额外参数显示pod信息,以json格式显示
kubectl get pod nginx-696649f6f9-g5nds -o json
kubectl get pod nginx-696649f6f9-g5nds -o json
查看指定pod,通过额外参数显示pod信息,以yaml格式显示
kubectl get pod nginx-696649f6f9-g5nds -o yaml
kubectl get pod nginx-696649f6f9-g5nds -o yaml
显示指定pod资源内部信息
kubectl describe pod nginx-696649f6f9-g5nds
kubectl describe pod nginx-696649f6f9-g5nds
显示当前Server和Client版本信息
kubectl version
kubectl version
显示集群信息
kubectl cluster-info
kubectl cluster-info
案例:以一个 namespace的创建和删除简单演示命令用法
在namespace下创建dev空间
kubectl create ns dev
kubectl create ns dev
获取namespace信息
kubectl get ns
kubectl get ns
在dev空间下创建并运行一个nginx的pod
kubectl run pod --image=nginx:1.17.1 -n dev
kubectl run pod --image=nginx:1.17.1 -n dev
在dev空间下创建并运行一个nginx的pod并显示详细的创建过程
kubectl run pod --image=nginx:1.19.0 -n dev --v=9
kubectl run pod --image=nginx:1.19.0 -n dev --v=9
获取dev空间下pod信息
kubectl get pods -n dev
kubectl get pods -n dev
显示dev空间下nginx资源内部信息
kubectl describe pods pod -n dev
kubectl describe pods pod -n dev
删除dev空间下nginx的pod
kubectl delete pods pod -n dev
kubectl delete pods pod -n dev
上面的创建方式删除pod后不会自动拉起一个新的,必须使用如下命令才会删除后自动拉起新的pod
kubectl create deployment nginx-dev --image=nginx:1.17.1 -n dev
kubectl create deployment nginx-dev --image=nginx:1.17.1 -n dev
删除namespace下的dev空间,这里会连同删除ns中的pod一起删除
kubectl delete ns dev
kubectl delete ns dev
命令式对象配置
命令式对象配置:通过命令配置和配置文件去操作kubernetes资源
案例:通过yaml文件演示一个namespace的创建
创建一个yaml文件
vim nginx-dev.yaml
vim nginx-dev.yaml
执行create命令创建资源
kubectl create -f nginx-dev.yaml
kubectl create -f nginx-dev.yaml
查看namespace信息
kubectl get ns
kubectl get ns
查看namespace下的dev空间
kubectl get pods -n dev
kubectl get pods -n dev
通过yaml文件查看资源
kubectl get -f nginx-dev.yaml
kubectl get -f nginx-dev.yaml
通过yaml文件删除资源
kubectl delete -f nginx-dev.yaml
kubectl delete -f nginx-dev.yaml
声明式对象配置
声明式对象配置:通过apply命令和配置文件去创建和更新kubernetes资源
案例:声明式对象配置与命令式对象配置类似,但是它只有一个apply
执行kubernetes apply yaml文件创建资源
kubectl apply -f nginx-dev.yaml
kubectl apply -f nginx-dev.yaml
获取namespace信息
kubectl get ns
kubectl get ns
查看dev空间下的pod信息
kubectl get pods -n dev
kubectl get pods -n dev
可以通过修改yaml文件内容更新pod中的资源
vim nginx-dev.yaml
vim nginx-dev.yaml
执行yaml文件更新pod中的资源
kubectl apply -f nginx-dev.yaml
kubectl apply -f nginx-dev.yaml
显示资源内部信息
kubectl describe pods nginx-dev -n dev
kubectl describe pods nginx-dev -n dev
总结:
声明式对象配置就是使用apply描述一个资源最终的状态(在yaml中定义)
使用apply操作资源,如果资源不存在就创建资源,相当于 kubectl create
使用apply操作资源,如果资源已经存在就更新资源,相当于 kubectl patch
资源管理总结:三种资源管理方式的命令使用建议
创建/更新资源建议使用声明式对象配置:kubectl apply -f xx.yaml
删除资源建议使用命令式对象配置:kubectl delete -f xx.yaml
查询资源建议使用命令式对象管理:kubectl get(describe) 资源名称
五大资源之Namespace
Namespace介绍
Namespace是kubernetes系统中的一种非常重要的资源,它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离
默认情况下kubenetes集群中的所有Pod都是可以相互访问的,但是实际环境中可能需要隔离不同的Pod,那此时就可以将不同的Pod划分到不同的Namespace下,kubernetes通过将集群内部的资源分配到不同的Namespace中,可以形成逻辑上的“组”,以方便不同的组资源进行隔离使用和管理
可以通过kubernetes的授权机制,将不同的Namespace交给不同的租户进行管理,这样就实现了多租户的资源隔离,此时还能结合kubernetes的资源配额机制,限定不同的租户能占用的资源,例如CPU使用量、内存使用量等来实现租户可用资源的管理
kubernetes在集群启动以后会默认创建几个Namespace
default
所有未指定的Namespace的对象都会被分配在default名称空间
所有未指定的Namespace的对象都会被分配在default名称空间
kube-node-lease
集群节点之间的心跳维护,v1.13开始引入
集群节点之间的心跳维护,v1.13开始引入
kube-public
该命名空间下的资源可以被所有人访问,包括未认证的用户
该命名空间下的资源可以被所有人访问,包括未认证的用户
kube-system
所有由kubernetes系统创建的资源都处于这个命名空间
所有由kubernetes系统创建的资源都处于这个命名空间
Namespace资源操作指令命令
查看命令
查看所有Namespace信息
kubectl get ns
kubectl get ns
查看指定Namespace信息
kubectl get ns default
kubectl get ns default
查看指定Namespace详细信息
kubectl describe ns default
kubectl describe ns default
Status: Active Active表示命名空间正在使用,Terminatind表示正在删除命名空间
No resource quota. 针对于Namespace做的资源限制
No LimitRange resource. 针对于Namespace中的每个组件做的资源限制
创建命令
创建Namespace
kubectl create ns dev
kubectl create ns dev
查看指定Namespace
kubectl get ns dev
kubectl get ns dev
删除命令
删除指定Namespace
kubectl delete ns qa
kubectl delete ns qa
配置文件形式创建Namespace
通过yml文件创建Namespace
vim ns_qa.yml
vim ns_qa.yml
创建Namspace
kubectl create -f ns_qa.yml
kubectl create -f ns_qa.yml
查看Namespace
kubectl get ns
kubectl get ns
删除Namespace
kubectl delete -f ns_qa.yml
kubectl delete -f ns_qa.yml
五大资源之Pod
Pod介绍
Pod是kubernetes集群进行管理的最小单元,程序运行必须部署在容器中,而容器必须存在于Pod中。
Pod可以认为是容器的封装,一个Pod中可以存在一个或多个容器。
kubernetes集群启动以后,集群中的各个组件也都是以Pod方式运行,可以通过命令查看。
查看指定kube-system名称空间中的Pod
kubectl get pod -n kube-system
kubectl get pod -n kube-system
Pod操作指令命令
创建并运行Pod命令(kubernetes没有提供单独运行Pod的命令,都是通过Pod控制器来实现)
命令格式:kubectl run (pod控制器名称) [参数]
- --image 指定Pod的镜像
- --port 指定端口
- --namespace 指定Namespace
- --image 指定Pod的镜像
- --port 指定端口
- --namespace 指定Namespace
创建Namespace,并将Pod运行在指定的Namespace中
kubectl create ns dev
kubectl create ns dev
指定Pod运行在dev名称空间中
kubectl run nginx --image=nginx:1.17.1 --port=80 --namespace dev
kubectl create deployment nginx --image=nginx:1.17.1 --port=80 --namespace dev
kubectl run nginx --image=nginx:1.17.1 --port=80 --namespace dev
kubectl create deployment nginx --image=nginx:1.17.1 --port=80 --namespace dev
查看Pod命令
查看Namespace中Pod基本信息,默认为default名称空间Pod信息
kubectl get pods
kubectl get pods
查看dev名称空间中的Pod信息
kubectl get pod -n dev
kubectl get pod -n dev
查看Pod详细信息(-o wide)
kubectl get pod -n dev -o wide
kubectl get pod -n dev -o wide
查看Pod详细描述信息
kubectl describe pods nginx -n dev
kubectl describe pods nginx -n dev
访问Pod命令
可通过Pod的IP与端口访问Pod中运行的程序
curl http://10.244.196.141:80
curl http://10.244.196.141:80
删除Pod命令(可根据Pod的NAME删除指定Pod)
查看Pod名称
kubectl get pod -n dev
kubectl get pod -n dev
删除Pod
kubectl delete pods nginx-765d7cffb-t2rd2 -n dev
kubectl delete pods nginx-765d7cffb-t2rd2 -n dev
查看pod信息---可以发现刚刚的pod被删除以后,新的pod又自动生成了,该原因是应为pod控制器又自动创建一个新pod,如果想永久删除可以将pod控制器删除
kubectl get pod -n dev
kubectl get pod -n dev
查看pod控制器信息
kubectl get deployment -n dev
kubectl get deployment -n dev
删除pod控制器
kubectl delete deployment nginx -n dev
kubectl delete deployment nginx -n dev
查看pod信息
kubectl get pod -n dev
kubectl get pod -n dev
配置文件形式创建pod
创建配置文件
vim pod_nginx.yml
vim pod_nginx.yml
通过配置文件创建Pod
kubectl create -f pod_nginx.yml
kubectl create -f pod_nginx.yml
查看dev名称空间下pod信息
kubectl get pods -n dev
kubectl get pods -n dev
查看pod详细信息
kubectl get pod -n dev -o wide
kubectl get pod -n dev -o wide
访问pod中nginx程序
curl http://10.244.140.70:80
curl http://10.244.140.70:80
删除pod
kubectl delete -f pod_nginx.yml
kubectl delete -f pod_nginx.yml
查看pod信息
kubectl get pod -n dev
kubectl get pod -n dev
五大资源之Label
Label介绍
Label是kubernetes中在资源上添加标识,用来对他们进行区分和选择
Label特点:
一个Label会以key/value键值对的形式附加到各种对象上,如Node、Pod、Service等等
一个资源对象可以定义任意数量的Label,同一个Label也可以被添加到任意数量的资源对象上
Label通常在资源对象定义时确定,也可以在对象创建后动态添加或者删除
通过Label实现资源的多维度分组,以便灵活方便的进行资源分配、调度、配置、部署等管理工作
常用的Label示例如下:
版本标签:"version":"1.0"
环境标签:"environment":"dev","environment":"test","environment":"pord"
架构标签:"tier":"frontend","tier":"backend"
标签定义完毕以后还要考虑标签的选择,这就要用到Label Selector,既:
Label用于给某个资源对象定义标识
Label Selector用于查询和筛选拥有某些标签的资源对象
定义标签的方式
基于等式的定义方式
version=1.0 等于
version!=1.0 不等于
基于集合的定义方式
version in (1.0,2.0) 在这里
version in (1.0,2.0) 不在这里
Label常用命令
创建Pod并为Pod资源打标签
kubectl create -f pod_nginx.yml
kubectl create -f pod_nginx.yml
查看pod
kubectl get pod -n dev
kubectl get pod -n dev
查看pod标签:--show-labels
kubectl get pod -n dev --show-labels
kubectl get pod -n dev --show-labels
为nginx的pod打version标签
kubectl label pod nginx-file -n dev version=1.0
kubectl label pod nginx-file -n dev version=1.0
查看pod标签
kubectl get pods -n dev --show-labels
kubectl get pods -n dev --show-labels
为nginx的pod打标签(一个资源对象可以定义任意数量的Label)
kubectl label pod nginx-file -n dev tier=frontend
kubectl label pod nginx-file -n dev tier=frontend
查看pod标签
kubectl get pods -n dev --show-labels
kubectl get pods -n dev --show-labels
更新version标签:--overwrite
kubectl label pod nginx-file -n dev version=2.0 --overwrite
kubectl label pod nginx-file -n dev version=2.0 --overwrite
查看pod标签
kubectl get pods -n dev --show-labels
kubectl get pods -n dev --show-labels
基于等式的标签筛选(在创建一个nginx的pod并为其打标签进行筛选)
创建pod
vim pod_nginx.yml
kubectl create -f pod_nginx.yml
查看pod
kubectl get pods -n dev
kubectl get pods -n dev
查看pod标签(nginx2默认没有标签)
kubectl get pods -n dev --show-labels
kubectl get pods -n dev --show-labels
为nginx2的pod打标签
kubectl label pods nginx2 -n dev version=1.0
kubectl label pods nginx2 -n dev version=1.0
查看pod标签
kubectl get pods -n dev --show-labels
kubectl get pods -n dev --show-labels
根据标签选择器进行标签筛选:-l "标签"
kubectl get pods -l "version=1.0" -n dev --show-labels
kubectl get pods -l "version=1.0" -n dev --show-labels
筛选不等于"version=1.0"的标签:"version!=1.0"
kubectl get pods -l "version!=1.0" -n dev --show-labels
kubectl get pods -l "version!=1.0" -n dev --show-labels
基于集合的标签筛选:in(筛选)
kubectl get pods -l "version in (1.0)" -n dev --show-labels
kubectl get pods -l "version in (1.0)" -n dev --show-labels
基于集合的标签筛选:notin(不筛选)
kubectl get pods -l "version notin (1.0)" -n dev --show-labels
kubectl get pods -l "version notin (1.0)" -n dev --show-labels
删除标签:标签名-
kubectl label pod nginx-file -n dev tier-
kubectl label pod nginx-file -n dev version-
kubectl label pod nginx-file -n dev tier-
kubectl label pod nginx-file -n dev version-
查看标签
kubectl get pods -n dev --show-labels
kubectl get pods -n dev --show-labels
配置文件形式更新标签
修改yaml文件
vim pod_nginx.yml
vim pod_nginx.yml
执行文件(apply通过配置文件对资源进行配置)
kubectl apply -f pod_nginx.yml
kubectl apply -f pod_nginx.yml
查看标签
kubectl get pods nginx3 -n dev --show-labels -o wide
kubectl get pods nginx3 -n dev --show-labels -o wide
PS:这里通过kubectl apply -f pod_nginx.yml更新标签的前提是这个pod创建时也是通过kubectl apply -f进行创建的 不然会提示报错,还有就是不能更改配置文件中的端口等不允许更改字段
五大资源之Deployment
Deployment介绍
在kubernetes中,pod是最小的控制单元,但是kubernetes很少直接控制pod,一般都是通过控制器来完成,pod控制器用于pod的管理,确保pod资源符合预期的状态,当pod资源出现故障时,会尝试进行重启或重建pod
在kubernetes中pod控制器的种类有很多,这里介绍常用的控制器:Deployment控制器,其他控制器还有ReplicaSet、Job、CronJob、StatefulSet控制器和HPA控制器。
Deploment常用命令
命令格式:kubectl run deployment名称 [参数]
--image 指定pod镜像
--port 指定端口
--replicas 指定创建pod数量
--namespace 指定namespace
创建pod(将前边创建好的pod先删除)
kubectl delete pod nginx -n dev
kubectl get pod -n dev
kubectl delete pod nginx -n dev
kubectl get pod -n dev
创建pod
kubectl create deployment nginx --image=nginx:1.17.1 --port=80 --replicas=3 --namespace=dev
kubectl create deployment nginx --image=nginx:1.17.1 --port=80 --replicas=3 --namespace=dev
查看pod控制器与pod信息
kubectl get deployment,pod -n dev
kubectl get deployment,pod -n dev
查看pod控制器详细信息
kubectl describe deployment nginx -n dev
kubectl describe deployment nginx -n dev
查看pod标签信息
kubectl get pods -n dev --show-labels
kubectl get pods -n dev --show-labels
删除pod控制器(同时pod也会随着删除)
kubectl delete deployment nginx -n dev
kubectl delete deployment nginx -n dev
查看pod控制器与pod信息
kubectl get deployment,pod -n dev
kubectl get deployment,pod -n dev
配置文件形式创建Deployment
创建配置文件
vim deployment_nginx.yml
vim deployment_nginx.yml
创建Deployment
kubectl create -f deployment_nginx.yml
kubectl create -f deployment_nginx.yml
查看pod控制器与pod信息
kubectl get deployment,pod -n dev
kubectl get deployment,pod -n dev
删除pod控制器
kubectl delete -f deployment_nginx.yml
kubectl delete -f deployment_nginx.yml
查看信息
kubectl get deployment,pod -n dev
kubectl get deployment,pod -n dev
在通过配置文件创建一组pod并实现客户端访问
kubectl create -f deployment_nginx.yml
kubectl create -f deployment_nginx.yml
查看pod详细信息
kubectl get pods -n dev -o wide
kubectl get pods -n dev -o wide
访问nginx程序
curl http://10.244.140.82:80
curl http://10.244.140.82:80
总结:通过对Deployment创建一组pod集群可以提高集群的高可用性
五大资源之Service
Service介绍
Service可以看作是一组同类Pod对外访问接口,借助Service应用可以方便的实现服务发现与负载均衡
创建集群内部可以访问Service
暴露Service
kubectl expose deployment nginx --name=svc-nginx1 --type=ClusterIP --port=80 --target-port=80 -n dev
kubectl expose deployment nginx --name=svc-nginx1 --type=ClusterIP --port=80 --target-port=80 -n dev
查看Service信息
kubectl get svc -n dev
kubectl get svc -n dev
客户端可通过Service的IP访问Pod中的程序
curl http://10.254.144.21:80
curl http://10.254.144.21:80
PS:CLUSTER-IP是Servece的IP,在Service的生命周期中,这个地址永远不会改变
PS:上面创建的Service的type类型为ClusterIP,这个IP地址只能用于集群内部访问,如果需要创建外部可以访问的Service,需要修改type为NodePort
创建集群外部可以访问Service
暴露Service
kubectl expose deployment nginx --name=svc-nginx2 --type=NodePort --port=80 --target-port=80 -n dev
kubectl expose deployment nginx --name=svc-nginx2 --type=NodePort --port=80 --target-port=80 -n dev
查看Service信息;可以看到svc-nginx2的TYPE类型为NodePort的Service
kubectl get svc -n dev
kubectl get svc -n dev
现在集群外部主机可以访问NodePort的端口
浏览器访问http://192.168.1.197:32525/
直接curl命令访问
curl http://192.168.1.198:32525
curl http://192.168.1.198:32525
删除Service
查看Service
kubectl get svc -n dev
kubectl get svc -n dev
按照Service的名称删除,删除svc-nginx1
kubectl delete svc svc-nginx1 -n dev
kubectl delete svc svc-nginx1 -n dev
新建配置文件
vim svc_nginx.yml
vim svc_nginx.yml
配置文件形式创建Service
配置文件创建Service
kubectl create -f svc_nginx.yml
kubectl create -f svc_nginx.yml
查看Service信息
kubectl get svc -n dev
kubectl get svc -n dev
配置文件删除Service
kubectl delete -f svc_nginx.yml
kubectl delete -f svc_nginx.yml
0 条评论
下一页