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