一、Namespace
顾名思义,Namespace是命名空间的意思,在 Kubernetes 中,“命名空间(Namespace)” 提供一种机制,将同一集群中的资源划分为相互隔离的组。 同一命名空间内的资源名称要唯一,但跨命名空间时没有这个要求。 命名空间作用域仅针对带有命名空间的对象,例如 Deployment、Service、Pod 等, 这种作用域对集群访问的对象不适用,例如 StorageClass、Node、PersistentVolume 等。
1、查看Namespace
# 使用以下命令可以列出集群中所有现存的命名空间
kubectl get namespace
Kubernetes 会创建四个初始命名空间:
-
default:
没有指明使用其它命名空间的对象所使用的默认命名空间 -
kube-system:
Kubernetes 系统创建对象所使用的命名空间 -
kube-public:
这个命名空间是自动创建的,所有用户(包括未经过身份验证的用户)都可以读取它。 这个命名空间主要用于集群使用,以防某些资源在整个集群中应该是可见和可读的。 这个命名空间的公共方面只是一种约定,而不是要求。 -
kube-node-lease:
此命名空间用于与各个节点相关的 租约(Lease)对象。 节点租期允许 kubelet 发送心跳,由此控制面能够检测到节点故障。
2、基本使用语法
# 创建命名空间 ns等价于namespace
kubectl create ns pangtaiyi
# 删除命名空间
kubectl delete ns pangtaiyi
# 更改默认命名空间名称(系统默认是default命名空间)
# 我们可以改成其他的命名空间
kubectl config set-context $(kubectl config current-context) --namespace=<新的命名空间>
3、使用请求参数
启动pod,指定pod 的命名空间,可以使用 --namespace
参数, 例如:
# 解释:在PangTaiYi命名空间下,运行一个Pod,Pod运行的镜像是Nginx
kubectl run nginx --image=nginx --namespace=PangTaiYi
# 解释:查询在PangTaiYi命名空间下,所有的Pod
kubectl get pods --namespace=PangTaiYi
# 也可以使用简写方式, --namespace = -n, 例如:
kubectl get pods -n=PangTaiYi
# 或者
kubectl get pods -n PangTaiYi
二、Pod
Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。Pod 是一组(一个或多个)容器; 这些容器共享存储、网络、以及怎样运行这些容器的声明。 Pod 所建模的是特定于应用的“逻辑主机”,其中包含一个或多个应用容器, 这些容器是相对紧密的耦合在一起的。 在非云环境中,在相同的物理机或虚拟机上运行的应用类似于在同一逻辑主机上运行的云应用。除了应用容器,Pod 还可以包含在 Pod 启动期间运行的 Init 容器。 你也可以在集群中支持临时性容器 的情况下,为调试的目的注入临时性容器。(注:通常工作中不需要直接创建 Pod,甚至单个实例的 Pod。因为会使用如 Deployment 或 Job 这类工作负载资源来创建 Pod。)
1、获取Pod
# 1、获取Pod,默认获取default命名空间下的Pod
kubectl get pod
# 2、获取所有命名空间下的Pod(-A 区分大小写)
kubectl get pod -A
# 3、获取Pod的更加详细的信息,如下:
[root@master ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
my-dep-5b7868d854-6f9mz 1/1 Running 1 27h 10.244.1.8 node1 <none> <none>
my-dep-5b7868d854-dklnq 1/1 Running 1 27h 10.244.1.7 node1 <none> <none>
my-dep-5b7868d854-j5whk 1/1 Running 1 27h 10.244.1.10 node1 <none> <none>
my-dep-5b7868d854-lx8nh 1/1 Running 1 23h 10.244.2.13 node2 <none> <none>
my-dep-5b7868d854-n2gmq 1/1 Running 1 23h 10.244.2.11 node2 <none> <none>
my-dep-5b7868d854-nd6bl 1/1 Running 1 27h 10.244.1.9 node1 <none> <none>
my-dep-5b7868d854-p7nv8 1/1 Running 1 23h 10.244.2.12 node2 <none> <none>
my-dep-5b7868d854-qz658 1/1 Running 1 23h 10.244.2.10 node2 <none> <none>
my-dep-5b7868d854-sq65d 1/1 Running 1 23h 10.244.2.8 node2 <none> <none>
my-dep-5b7868d854-zbbwf 1/1 Running 1 27h 10.244.1.11 node1 <none> <none>
2、 操作Pod
# 1、创建Pod,运行一个nginx容器
kubectl run mynginx --image=nginx
# 2、删除Pod
kubectl delete mynginx
# 3、也可以通过yaml 文件来创建pod
kubectl apply -f <yaml文件地址>
3、查看Pod 的信息
# 1、获得Pod 的描述信息
kubectl describe pod <pod名称>
# 2、如果是其他命名空间下的pod,需要带上相应的命名空间
kubectl describe pod <pod名称> -n <命名空间名称>
# 3、当Pod 运行失败,可以查看pod的日志来查看运行日志
kubectl logs <Pod名称>
# 4、进入pod 的内部
kubectl exec -it mynginx -- /bin/bash
看到这里, 有Docker 基础的同学都发现了, 其实k8s 对于pod 的操作很像是 Docker 对于容器,镜像的操作。几乎没什么区别。由于 Pod 自身不具有自愈能力, 所以在工作中很少直接操作Pod ,所以这里就不过多介绍了。
三、Deployment
Deployment 为 Pod 和 ReplicaSet 提供声明式的更新能力。由用户描述 Deployment 中的 目标状态,而 Deployment 控制器(Controller) 以受控速率更改实际状态, 使其变为期望状态。你可以定义 Deployment 以创建新的 ReplicaSet,或删除现有 Deployment, 并通过新的 Deployment 收养其资源。(说简单点就是, Deployment可以控制Pod,使Pod拥有多副本,自愈,扩缩容等能力)
1、自愈、故障转移
下面就使用基本的创建Pod的方式和Deployment 的方式创建Pod,来测试一下什么叫自愈能力。
# 前置环境:
# 运行一个Pod 和 一个Deploymnet
kubectl run mynginx --image=nginx
kubectl create deployment mynginx-deployment --image=nginx
可以看到, 两个pod 分别运行在Node1 和Node2 节点,下面就来进行测试。
1.1、误删除
同时删除两个pod,看会有什么效果,(注意:使用Deployment 方式创建pod所生成的名称 mynginx-deployment-679dd69446-h59xs)
可以看到, 同时删除两个pod , 普通方式删除之后就没了, Deployment 删除了pod 之后, 有重新拉起一个新的Pod。
1.2、宕机
如上图所示, 在node2 节点运行了两个Pod, 现在测试将node2节点宕机, 会有什么效果。
可以看到, Deployment方式创建的Pod, 在Node2节点宕机之后 ,又在Node1节点上拉起了一个新的Pod。所以就如我之前说的,在工作中使用Deployment方式比较多。
2、多副本
实际上多副本就是在创建 Deployment 的时候,可以指定创建自定义个Pod。例如:下面的语句可以一次性创建10 Pod。(这在部署集群环境的时候非常方便。)
# 创建是个nginx副本 --replicas后面跟副本数量
kubectl create deployment my-dep --image=nginx --replicas=10
3、扩缩容
扩缩容在实际工作中用的很多,例如:现在有1万个Pod(集群环境),双十一的时候,网站访问流量激增, 现有的配置无法维持系统的稳定运行,这个时候就需要对系统进行横向扩容,很简单, 下面的语句就可以让系统的Pod 从1万个扩容到2万个。
# 将Pod my-dep 扩容到2万个副本
kubectl scale --replicas=20000 deployment/my-dep
双十一过了, 需要对系统进行缩容, 让系统继续维持 1万个Pod, 就只需要执行下面的命令, 又可以对系统进行缩容。
# 将Pod my-dep 缩容到1万个副本
kubectl scale --replicas=10000 deployment/my-dep
4、滚动更新
在以往的工作中, 要想对一个系统进行版本更新, 需要将系统先暂停, 然后将发布后的程序更新上去, 一般都是这么搞的。但是这个方式有弊端, 那就是在更新的过程中, 程序不可用。 这在有些场景中是无法容忍的。
例如: 马上618购物狂欢节快到了, 各大电商平台又推出了抢红包的游戏。现有的系统版本是V.1.0,现在需要将系统升级到V.2.0 。那就可以使用滚动更新
# 语法:kubectl set image 工作负载方式/Pod名称 镜像名称=需要调整的镜像 --record
# --record 用作记录滚动更新的信息, 后面方便版本回退
kubectl set image deployment/my-dep nginx=nginx:1.16.1 --record
注意:上面语句的 nginx 是填写镜像的name 属性,可以使用“kubectl get deployment my-dep -oyaml” 来查看,结果如下图
5、版本回退
版本回退这个功能一般是当版本更新上去之后, 发现有问题, 需要将新版本进行回退到指定版本。这个回退也是“滚动”的。
1. 查看系统有哪些版本
我们在滚动更新的时候, 说过一个 “--record” 参数, 只有加了这个参数,更新的版本信息才会被记录下来。
# 查看系统有哪些历史版本
[root@master ~]# kubectl rollout history deployment/my-dep
deployment.apps/my-dep
REVISION CHANGE-CAUSE
1 <none>
2 kubectl set image deployment/my-dep nginx=nginx:1.16.1 --record=true
[root@master ~]#
# 也可以单独查看某个历史详情
[root@master ~]# kubectl rollout history deployment/my-dep --revision=2
deployment.apps/my-dep with revision #2
Pod Template:
Labels: app=my-dep
pod-template-hash=6b48cbf4f9
Annotations: kubernetes.io/change-cause: kubectl set image deployment/my-dep nginx=nginx:1.16.1 --record=true
Containers:
nginx:
Image: nginx:1.16.1
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
2. 回滚
#回滚(回到上次)
kubectl rollout undo deployment/my-dep
#回滚(回到指定版本)
kubectl rollout undo deployment/my-dep --to-revision=2
文章来源地址https://www.toymoban.com/news/detail-482948.html
文章来源:https://www.toymoban.com/news/detail-482948.html
到了这里,关于四、Kubernetes(k8s) 工作中的常用命令的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!