文章目录
本文是k8s学习系列文章,前后串起来是一个完整的课程(学习笔记),本文记录k8s的资源管理方式及五大类资源的具体管理命令,看完本文基本上就能实现k8s的基本操作,可以独立部署小型项目了。
前期文章连接:
从零开始搭建kubernetes集群环境(虚拟机/kubeadm方式)

总结:学习kubernetes的核心,就是学习如何对集群上的Pod、Pod控制器、Label标签、Service、存储等各种资源进行操作。
通过kubectl api-resources命令可以查看系统中所有资源,如下图,注意资源类型缩写一列内容,本文后续kubectl命令操作的资源有的用缩写名,跟用全名一样的。

kubectl命令的语法如下:kubectl [命令] [资源类型] [资源名称] [参数]
如 kubectl run nginx-pod --image=nginx:1.17.1 --port=80
命令有很多,老规矩,查看帮助吧 kubectl--help
kubectl create/patch -f nginx-pod.yamlkubectl apply -f nginx-pod.yaml问题:乍一看好像后两种方式不好区分,同样是创建一个k8s资源,使用 kubectl create 和使用 kubectl apply有什么区别呢?
区别有两点:
(1)kubectl create命令可创建新资源。 因此,如果再次运行该命令,则会抛出错误,因为资源名称在名称空间中是唯一的。
(2)kubectl apply命令将配置应用于资源。 如果资源不在那里,那么它将被创建。 kubectl apply命令可以第二次运行,如果资源存在就执行更新,相当于kubectl patch操作
以上三种资源管理方式,命令式对象管理直接操作资源对象,适用于测试环境,操作简单,但是只能操作活动对象且难以审计、跟踪;命令式对象配置操作对应配置文件,可以审计跟踪,但是项目较大时配置文件管理麻烦;声明式对象配置支持目录操作,但是意外情况下不好调式。
(没关系,这里只是学习原理,生产环境还是界面管理工具的,比如我公司用的kuboard)
k8s系统中Namespace资源是用了实现多套环境的资源隔离或者多租户的资源隔离。默认情况下k8s集群中所有Pod资源都是可以相互访问的,但是实际中如果不想让两个Pod之间相互干扰可以将两个Pod划分到不同的namespace下。
k8s通过将集群内部的资源分配到不用的namespace中,形成逻辑上的“组”,方便不同组的资源可以隔离使用和管理。如果将不同的Namespace交给不同租户进行管理,这样就实现了多租户的资源隔离。此时还能结合kubernetes的资源配额机制,限定不同租户能占用的资源,例如CPU使用量、内存使用量等等,来实现租户可用资源的管理。
kubernetes在集群启动之后,会默认创建几个namespace,查看命令如下图所示:
kubectl get namespace #查看所有的命名空间,同kubectl get ns
kubectl get namespace default #查看指定的命名空间default
kubectl get ns default -o wide #指定命名空间的输出格式,还有-o json,-o yaml格式
kubectl describe namespace default #查看default命名空间的详情
kubectl create namespace dev #创建命名空间
kubectl delete ns dev #删除命名空间
新建ns-dev.yaml配置文件,内容如下:
apiVersion: v1
kind: Namespace
metadata:
name: dev
通过命令式对象配置进行创建和删除
kubectl create -f ns-dev.yaml
kubectl delete -f ns-dev.yaml
Pod是kubernetes集群进行管理的最小单元,可以认为是容器的封装,一个Pod中可以存在一个或者多个容器。kubernetes在集群启动之后,集群中的各个组件也是以Pod方式运行的,可以通过下面的命令查看:

kubectl run (Pod的名称) [参数] #创建并运行Pod,如kubectl run nginx --image=nginx:1.17.1 --port=80 --namespace=dev
# --image 指定Pod的镜像
# --port 指定端口
# --namespace 指定namespace
kubectl get pods -n dev #查询名称为dev的namespace下的所有Pod的基本信息
kubectl describe pod nginx -n dev #查看名称为dev的namespace下的Pod的名称为nginx的详细信息
kubectl get pods [-n dev] -o wide #可以查询到Pod的IP
curl 10.244.2.7:80 #访问Nginx的Pod,ip每次都先查询一下,可能发生变化
kubectl delete pod nginx -n dev #删除Nginx的Pod
Label的作用就是在资源上添加标识,用来对它们进行区分和选择。通过Label可以实现资源的多纬度分组,以便灵活、方便地进行资源分配、调度、配置和部署等管理工作。
Label的特点:
一些常用的Label标签示例如下:
● 版本标签:“version”:”release”,”version”:”stable”。。。
● 环境标签:“environment”:”dev”,“environment”:”test”,“environment”:”pro”
● 架构标签:“tier”:”frontend”,”tier”:”backend”。。。
标签定义完毕之后,还要考虑到如何通过标签选择所需资源,这就要用到Label Selector,当前有两种筛选方式:
注意:
标签等号后面的值加不加引号都行; 标签的选择条件可以使用多个,此时将多个Label Selector进行组合,使用逗号(,)进行分隔即可
语法及应用示例
kubectl label pod nginx version=1.0 -n dev #为名称Nginx的Pod资源打上标签version=1.0
kubectl label pod xxx key=value [-n 命名空间] --overwrite #如果标签key已经存在,加--overwrite参数更新资源的标签
kubectl get pod nginx -n dev --show-labels #显示Nginx的Pod的标签
kubectl get pod -l version=2.0 -n dev --show-labels #筛选版本号是2.0的在名称为dev的namespace下的Pod
kubectl label pod xxx key- [-n 命名空间] #删除标签 key减号
在kubernetes中,Pod是最小的控制单元,但是kubernetes很少直接控制Pod,一般都是通过Pod控制器来完成的。Deployment是一种Pod控制器,用于Pod的管理,确保Pod资源符合预期的状态,当Pod的资源出现故障的时候,会尝试进行重启或重建Pod。
在kubernetes中Pod控制器的种类有很多,本章节只介绍一种:Deployment。
语法及应用示例
kubectl create deployment nginx --image=nginx:1.17.1 -n dev #为e名称Nginx的Pod资源打上标签version=1.0
kubectl scale deployment nginx --replicas=4 -n dev #在名称为test的命名空间下根据名为nginx的deployment创建3个Pod
kubectl get deployment -n dev #查看名称为dev的namespace下的deployment信息
kubectl describe deployment nginx -n dev #查看deployment的详细信息
kubectl delete deployment nginx -n dev #删除名为nginx的deployment
小知识1:kubectl run nginx --image=nginx --replicas=2 --port=80,创建一个名称为nginx的deployment, 新版本可能会反馈Flag --replicas has been deprecated, has no effect and will be removed in the future,并且只会创建一个Nginx容器实例。
小知识2:kubectl run nginx --image=nginx --replicas=2 --port=80,创建一个名称为nginx的deployment这个deployment中默认生成了对应的pod资源,如果删除其中的Pod,这个deployment会尝试创建一个新的Pod,这个特性也在新版本删除了,直接删除Pod就能删除成功了。
kubernetes设计了Service来解决外部环境访问容器资源的问题。Pod资源可以提供具有高可用性的服务,虽然每个Pod都会分配一个单独的IP地址,但Pod的IP会随着Pod的重建产生变化,且Pod的IP仅仅是集群内部可见的虚拟的IP,外部无法访问。
Service可以看做是一组同类的Pod对外的访问接口,借助Service,应用可以方便的实现服务发现和负载均衡。

语法:
kubectl expose deployment xxx --name=服务名 --type=ClusterIP --port=暴露的端口 --target-port=指向集群中的Pod的端口 [-n 命名空间]
#–type=ClusterIP会产生一个CLUSTER-IP,这个就是service的IP,在Service的生命周期内,这个地址是不会变化的
#暴露名为dev的namespace下的名为nginx的deployment,并设置服务名为svc-nginx
kubectl expose deployment nginx --name=svc-nginx --type=ClusterIP --port=80 --target-port=80 -n dev
#访问service的80端口,转发到Pod的80端口
kubectl get service -n dev #查看名为dev的命名空间的所有Service
curl ip:80 #在集群内通过master节点ip可以访问部署的nginx服务
语法:
kubectl expose deployment xxx --name=服务名 --type=NodePort --port=暴露的端口 --target-port=指向集群中的Pod的端口 [-n 命名空间]
#–type=NodePort参数会产生一个外部也可以访问的Service,
#例:暴露名为test的namespace下的名为nginx的deployment,并设置服务名为svc-nginx-1
kubectl expose deploy nginx --name=svc-nginx-1 --type=NodePort --port=80 --target-port=80 -n dev
此时外部环境可以通过master节点IP进行访问了,端口查询方法如下图:

总结:以上就是kubernetes的Namespace/Pod/Deployment/Service资源的基本操作,学会这些操作就可以在集群中实现一个服务的简单部署和访问了。但是如果想更好的使用k8s,接下来需要深入学习这几种资源的细节和原理。
我正在使用i18n从头开始构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在rubyonrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi
当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub
我安装了ruby版本管理器,并将RVM安装的ruby实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby。有没有办法让emacs像shell一样尊重ruby的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el
我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle
是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s
?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称
最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总
深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal
目录第1题连续问题分析:解法:第2题分组问题分析:解法:第3题间隔连续问题分析:解法:第4题打折日期交叉问题分析:解法:第5题同时在线问题分析:解法:第1题连续问题如下数据为蚂蚁森林中用户领取的减少碳排放量iddtlowcarbon10012021-12-1212310022021-12-124510012021-12-134310012021-12-134510012021-12-132310022021-12-144510012021-12-1423010022021-12-154510012021-12-1523.......找出连续3天及以上减少碳排放量在100以上的用户分析:遇到这类