fdead269a95aa0d5fb449d6cee7de1ad.png

作者:潘吉祥


教程没有使用集群模式,可以看做master和worker都是同一节点,因此不对集群相关操作演示。

一:namespace

查看namespace信息:

[root@k8s ~]# kubectl get namespaces
NAME      STATUS    AGE
default       Active    4d
kube-system   Active    4d

所有未指定资源都为default namespa。

使用命令创建namespace:

[root@k8s ~]# kubectl create namespace user-namespace
namespace "user-namespace" created

使用配置文件创建:

[root@k8s k8s]# vim create_namespace_userv2.yml

apiVersion: v1 # api版本号
kind: Namespace # 类型为namespace
metadata: # 定义namespace的元数据属性
 name: userv2-namespace # 定义name的值

[root@k8s k8s]# kubectl apply -f ./create_namespace_userv2.yml 
namespace "userv2-namespace" created

删除namespace:

注意同时会自动删除所有属于该namespace的资源,就好像表和数据库的关系,开发中要谨慎操作;同时系统namespace不可删除。

[root@k8s k8s]# kubectl delete namespace userv2-namespace
namespace "userv2-namespace" deleted

二:workload

workloads(工作负载)可以分为pod与controllers,他们之间的关系:

1-pod通过controllers实现应用的运行,如何伸缩,升级等
2-controllers 在集群中管理pod
3-pod与controllers之间通过label-selector相关联

这说的是一个概念性的东西,pod和controllers协作完成kubernetes的负载工作。

三:Pod

说明:在kubernetes中对运行容器的要求为:容器的主程序需要一直在前台运行,而不是后台运行。应用需要改造成前台运行的方式。如果我们创建的Docker镜像的启动命令是后台执行程序,则在kubelet创建包含这个容器的pod之后运行完该命令,即认为Pod已经结束,将立刻销毁该Pod。

pod分类:

1 可控pod:控制器会按照定义的策略控制pod的数量,发现pod数量少了,会立即自动建立出来新的pod;一旦发现pod多了,也会自动杀死多余的Pod。

2 自主式pod(静态pod):没有副本控制器控制,删除或者失效后不会重新创建。因为我们使用kubernetes的目的就是为了提高应用的高可用性,因此这种pod很少使用。

pod配置的完整定义内容较多,可参照Git地址:

https://github.com/rockit-ba/k8s/blob/master/pod-help

当我们不知道一种资源的配置写法时,可以使用kubectl explain xxx来进行查看,并且支持属性写法。

[root@k8s k8s]# kubectl explain pod
[root@k8s k8s]# kubectl explain pod.spec

创建pod

1 准备配置文件test-pod01.yaml

apiVersion: v1 # api
kind: Pod # 资源类型为Pod
metadata:
name: memory-test # 自定义pod的名称
spec:
containers: # 定义pod里包含的容器
- name: test # 自定义pod中的容器名
image: polinux/stress # 启动容器的镜像名
imagePullPolicy: IfNotPresent  #如果本地存在就直接使用, 不存在才从仓库下载
command: ["stress"] # 自定义启动容器时要执行的命令(类似dockerfile里的CMD)
args: ["--vm", "1", "--vm-bytes", "150M", "--vm-hang","1"] # 自定义启动容器执行命令的参数

2 创建pod

[root@k8s k8s]# kubectl apply -f test-pod01.yaml 
pod "memory-test" created
[root@k8s k8s]# kubectl get pods
NAME          READY     STATUS    RESTARTS   AGE
memory-test   1/1       Running   0          2m

查看pod详细信息:

[root@k8s k8s]# kubectl get pod -o wide
NAME          READY     STATUS    RESTARTS   AGE       IP           NODE
memory-test   1/1       Running   0          4m        172.17.0.4   127.0.0.1

查看pod标签:

[root@k8s k8s]# kubectl get pods --show-labels
NAME          READY     STATUS    RESTARTS   AGE       LABELS
memory-test   1/1       Running   0          5m        

给pod添加标签:kubectl  label  pod  pod名 key=value

[root@k8s k8s]# kubectl label pod memory-test user=pjx
pod "memory-test" labeled
[root@k8s k8s]# kubectl get pods --show-labels
NAME          READY     STATUS    RESTARTS   AGE       LABELS
memory-test   1/1       Running   0          8m        user=pjx

删除pod:

[root@k8s k8s]# kubectl delete pod memory-test
pod "memory-test" deleted
也可以直接删除配置文件
[root@k8s k8s]# kubectl delete -f test-pod01.yaml 
pod "memory-test" deleted

pod资源限制:包括资源的上限和下限。

……
- name: memory-demo-ctr
image: polinux/stress
imagePullPolicy: IfNotPresent
resources:
limits:  #该资源最大允许使用的量,不能突破,当容器试图使用超过这个量的资源时,可能会被Kubernete Kill并重启
memory: ""
cpu: ""
requests:    #该资源最小申请数量,系统必须满足要求
memory: ""
cpu: ""
……

一个pod内创建多个容器:

只需重复container.-name下的配置即可(包括-name)。

进入容器:

[root@k8s k8s]# kubectl exec -it pod名字 –c 容器名 /bin/bash

如果pod内只有一个容器,不必指定-c默认会进入第一个容器。

pod生命周期:

  • Pending:API Server已经创建了该Pod,但Pod中的一个或多个容器的镜像还没有创建,包括镜像下载过程

  • Running:Pod内所有容器已创建,且至少一个容器处于运行状态、正在启动状态或正在重启状态

  • Completed:Pod内所有容器均成功执行退出,且不会再重启

  • Failed :Pod内所有容器均已退出,但至少一个容器退出失败

  • Unknown:由于某种原因无法获取Pod状态,例如网络通信不畅

生命周期行为:postStart and  preStop

……
containers:
- name: poststart
image: nginx:1.15-alpine
imagePullPolicy: IfNotPresent
lifecycle: # 生命周期事件
postStart:  #容器执行成功后
exec:
command:[]
preStop:  #容器终止前执行的命令
exec:
command:[]

pod失效时的重启策略:

  • Always:当容器失效时,立马由kubelet自动重启该容器

  • OnFailure:当容器终止运行且退出码不为0时,由kubelet自动重启该容器

  • Never:不论容器运行状态如何,kubelet都不会重启该容器

*对于Always这种策略,容器只要挂了,就会立即重启,这样是很耗费资源的。所以Always重启策略会这么做:第一次容器挂了立即重启,如果再挂了就要延时10s重启,第三次挂了就等20s重启...... 依次类推

pod调度:

我们为了实现容器主机资源平衡使用, 可以使用约束把pod调度到指定的worker(node)节点,这需要集群环境。

其中可用的方法有两种:

1-nodeName :使用nodeName将pod调度到指定的node名称上

[root@k8s ~]# vim pod-nodename.yml
apiVersion: v1
kind: Pod
metadata:
name: pod-nodename
spec:
nodeName: node1 # 通过nodeName调度到node1节点
containers:
- name: nginx
image: nginx:1.8

2-nodeSelector :使用nodeSelector将pod调度到匹配Label的node上

用法同上,只需修改nodeName: node1为:

nodeSelector:
  key:  value    #创建并存在于kubernetes中的label键值对。

作为kubernetes最基本的组成概念,pod的使用非常重要,这里介绍了它的基本常用操作和配置,有关更加详细的了解阅读相关文档深入学习。

下期我们进入pod controller(kubernetes不建议开发者直接定义pod,而是通过controller来创建,以达到更好的容器编排效果)的相关学习,关注不迷路哈!

ps:这里我习惯把kubernetes的集群分为master和worker,中文文档翻译为master和node,因此,阅读过程中可以将这里的worker与node等同。但是在我看来,master和node都属于node,这可能是理解上的偏差,大可不必纠结于此。

7a7484a2af129fa9cc91f3c95c198fcb.png


【推荐阅读 7个IntelliJ IDEA必备插件,提高编码效率

再见,Navicat!同事安利的这个IDEA的兄弟,真香!

fastjson到底做错了什么?为什么会被频繁爆出漏洞?

这款轻量级的数据库中间件完美解决了SpringBoot中分库分表问题

Spring Boot自定义Annotation实现接口自动幂

一套简单通用的Java后台管理系统,拿来即用,非常方便(附项目地址)

8dc8af2447d28bfbaa8bab3494a7219d.png

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐