k8s中pod的资源对象(名称空间,获取策略,重启策略,健康检查)

一,k8s的资源对象

Deployment、Service、Pod是k8s最核心的3个资源对象

**Deployment:**最常见的无状态应用的控制器,支持应用的扩缩容、滚动升级等操作。

**Service:**为弹性变动且存在生命周期的Pod对象提供了一个固定的访问接口,用于服务发现和服务访问。

**Pod:**是运行容器以及调度的最小单位。同一个pod可以同时运行多个容器,这些容器共享net、UTS、IPC,除此之外还有USER、PID、MOUNT。

**ReplicationController:**用于确保每个Pod副本在任意时刻都能满足目标数量,简单来说,它用于每个容器或容器组总是运行并且可以访问的:老一代无状态的Pod应用控制器。

**RwplicatSet:**新一代的无状态的Pod应用控制器,它与RC的不同之处在于支持的标签选择器不同,RC只支持等值选择器(键值对),RS还额外支持基于集合的选择器。

**StatefulSet:**用于管理有状态的持久化应用,如database服务程序,它与Deployment不同之处在于,它会为每一个pod创建一个独有的持久性标识符,并确保每个pod之间的顺序性。

**DaemonSet:**用于确保每一个节点都运行了某个pod的一个副本,新增的节点一样会被添加到此类pod,在节点移除时,此pod会被回收。

**Job:**用于管理运行完成后即可终止的应用,例如批量处理做作业任务;

**volume:**pv pvc
ConfigMap:
Secret:
Role:
ClusterRole:
RoleBinding:
cluster RoleBinding:
service account:
Helm:

Pod的生命周期被定义为以下几个阶段。

  • Pending:Pod已经被创建,但是一个或者多个容器还未创建,这包括Pod调度阶段,以及容器镜像的下载过程。
  • Running:Pod已经被调度到Node,所有容器已经创建,并且至少一个容器在运行或者正在重启。
  • Succeeded:Pod中所有容器正常退出。
  • Failed:Pod中所有容器退出,至少有一个容器是一次退出的。

环境介绍

主机 IP地址 服务
master 192.168.1.21 k8s
node01 192.168.1.22 k8s
node02 192.168.1.23 k8s

二,Namespace:名称空间

默认的名称空间:

Namespace(命名空间)是kubernetes系统中的另一个重要的概念,通过将系统内部的对象“分配”到不同的Namespace中,形成逻辑上分组的不同项目、小组或用户组,便于不同的分组在共享使用整个集群的资源的同时还能被分别管理。

Kubernetes集群在启动后,会创建一个名为“default”的Namespace,如果不特别指明Namespace,则用户创建的Pod、RC、Service都被系统创建到“default”的Namespace中。

1.查看名称空间

[root@master ~]# kubectl get namespaces

k8s中pod的资源对象(名称空间,获取策略,重启策略,健康检查)_第1张图片

2.查看名称空间详细信息

[root@master ~]# kubectl describe ns default

k8s中pod的资源对象(名称空间,获取策略,重启策略,健康检查)_第2张图片

3.创建名称空间

[root@master ~]# kubectl create ns bdqn

查看一下

[root@master ~]# kubectl get namespaces

k8s中pod的资源对象(名称空间,获取策略,重启策略,健康检查)_第3张图片

4.创建namespace的yaml文件

(1)查看格式

[root@master ~]# kubectl explain ns
//查看nasespace的yaml文件的格式

(2)创建namespace的yaml文件

[root@master ~]# vim test-ns.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: test

(3)运行namespace的yaml文件

[root@master ~]# kubectl apply -f test-ns.yaml

(4)查看一下

[root@master ~]# kubectl get ns

k8s中pod的资源对象(名称空间,获取策略,重启策略,健康检查)_第4张图片

4.删除名称空间

[root@master ~]# kubectl delete ns test 
[root@master ~]# kubectl delete -f test-ns.yaml

注意:namespace资源对象进用于资源对象的隔离,并不能隔绝不同名称空间的Pod之间的通信。那是网络策略资源的功能。

5.查看指定名称空间

可使用–namespace或-n选项

[root@master ~]# kubectl get pod -n kube-system 
[root@master ~]# kubectl get pod --namespace kube-system

三,Pod

1.编写一个pod的yaml文件

[root@master ~]# vim pod.yaml
kind: Pod
apiVersion: v1
metadata:
  name: test-pod
spec:
  containers:
  - name: test-app
    image: 192.168.1.21:5000/web:v1

pod的yaml文件不支持replicas字段

(1)运行一下

[root@master ~]# kubectl apply -f pod.yaml

(2)查看一下

[root@master ~]# kubectl get pod

image-20200109100836911

ps:这个pod因为是自己创建的,所以删除之后k8s并不会自动生成,相当于docker中创建

2.指定pod的namespace名称空间

(1)修改pod的yaml文件

[root@master ~]# vim pod.yaml
kind: Pod        #资源类型
apiVersion: v1   #api版本
metadata:
  name: test-pod    #指定控制器名称
  namespace: bdqn   #指定namespace(名称空间)
spec:
  containers:      #容器
  - name: test-app  #容器名称
    image: 192.168.1.21:5000/web:v1  #镜像
执行一下
[root@master ~]# kubectl apply -f pod.yaml

(2)查看一下

[root@master ~]#  kubectl get pod -n bdqn 
//根据namespace名称查看

image-20200109101521992

3.pod中镜像获取策略

**Always:**镜像标签为“laster”或镜像不存在时,总是从指定的仓库中获取镜像。

**IfNotPresent:**仅当本地镜像不存在时才从目标仓库下载。

**Never:**禁止从仓库中下载镜像,即只使用本地镜像。

注意:对于标签为“laster”或者标签不存在,其默认的镜像下载策略为“Always”,而对于其他的标签镜像,默认策略为“IfNotPresent”。

4.观察pod和service的不同并关联

(1)pod的yaml文件(指定端口)

[root@master ~]# vim pod.yaml 
kind: Pod          #资源类型
apiVersion: v1      #api版本
metadata:
  name: test-pod       #指定控制器名称
  namespace: bdqn   #指定namespace(名称空间)
spec:
  containers:                          #容器
  - name: test-app                    #容器名称
    image: 192.168.1.21:5000/web:v1   #镜像
    imagePullPolicy: IfNotPresent   #获取的策略
    ports:
    - protocol: TCP
      containerPort: 80

<1>删除之前的pod

[root@master ~]# kubectl delete pod -n bdqn test-pod

<2>执行一下

[root@master ~]# kubectl apply -f pod.yaml

<3>查看一下

[root@master ~]# kubectl get pod -n bdqn

k8s中pod的资源对象(名称空间,获取策略,重启策略,健康检查)_第5张图片

(2)pod的yaml文件(修改端口)

[root@master ~]# vim pod.yaml 
kind: Pod
apiVersion: v1
metadata:
  name: test-pod
  namespace: bdqn
spec:
  containers:
  - name: test-app
    image: 192.168.1.21:5000/web:v1
    imagePullPolicy: IfNotPresent
    ports:
    - protocol: TCP
      containerPort: 90   #改一下端口

<1>删除之前的pod

[root@master ~]# kubectl delete pod -n bdqn test-pod

<2>执行一下

[root@master ~]# kubectl apply -f pod.yaml

<3>查看一下

[root@master ~]# kubectl get pod -n bdqn -o wide

k8s中pod的资源对象(名称空间,获取策略,重启策略,健康检查)_第6张图片

<4>访问一下

k8s中pod的资源对象(名称空间,获取策略,重启策略,健康检查)_第7张图片

会发现修改的90端口并不生效,他只是一个提示字段并不生效。

(3)pod的yaml文件(添加标签)

[root@master ~]# vim pod.yaml 
kind: Pod
apiVersion: v1
metadata:
  name: test-pod
  namespace: bdqn
  labels:                 #标签
    app: test-web          #标签名称
spec:
  containers:
  - name: test-app
    image: 192.168.1.21:5000/web:v1
    imagePullPolicy: IfNotPresent
    ports:
    - protocol: TCP
      containerPort: 90   #改一下端口

--------------------------------------pod---------------------------------------------

(4)编写一个service的yaml文件

[root@master ~]# vim test-svc.yaml 
apiVersion: v1      #api版本
kind: Service          #资源类型
metadata:
  name: test-svc       #指定控制器名称
  namespace: bdqn   #指定namespace(名称空间)
spec:
  selector:          #标签
    app: test-web    #标签名称(须和pod的标签名称一致)
  ports:              
  - port: 80          #宿主机端口
    targetPort: 80    #容器端口

会发现添加的80端口生效了,所以不能乱改。

<1>执行一下

[root@master ~]# kubectl apply -f test-svc.yaml

<2>查看一下

[root@master ~]# kubectl get svc -n bdqn

k8s中pod的资源对象(名称空间,获取策略,重启策略,健康检查)_第8张图片

[root@master ~]# kubectl describe svc -n bdqn test-svc

k8s中pod的资源对象(名称空间,获取策略,重启策略,健康检查)_第9张图片

<4>访问一下

[root@master ~]# curl 10.98.57.97

image-20200109121205607

--------------------------------------service---------------------------------------------

四,容器的重启策略

Pod的重启策略(RestartPolicy)应用与Pod内所有容器,并且仅在Pod所处的Node上由kubelet进行判断和重启操作。当某个容器异常退出或者健康检查失败时,kubelet将根据RestartPolicy的设置来进行相应的操作。

Always:(默认情况下使用)但凡Pod对象终止就将其重启;
**OnFailure:**仅在Pod对象出现错误时才将其重启;
**Never:**从不重启;

五,pod的默认健康检查

每个容器启动时都会执行一个进程,此进程由 Dockerfile 的 CMD 或 ENTRYPOINT 指定。如果进程退出时返回码非零,则认为容器发生故障,Kubernetes 就会根据 restartPolicy 重启容器。

(1)编写健康检查的yaml文件

下面我们模拟一个容器发生故障的场景,Pod 配置文件如下:

[root@master ~]# vim healcheck.yaml 
apiVersion: v1
kind: Pod
metadata:
  labels:
    test: healcheck
  name:  healcheck
spec:
  restartPolicy: OnFailure  #指定重启策略
  containers:
  - name:  healcheck
    image: busybox:latest
    args:                   #生成pod时运行的命令
    - /bin/sh
    - -c
    - sleep 20; exit 1

<1>执行一下

[root@master ~]# kubectl apply -f  healcheck.yaml

<2>查看一下

[root@master ~]# kubectl get pod -o wide

image-20200109121809350

[root@master ~]# kubectl get pod -w | grep healcheck

k8s中pod的资源对象(名称空间,获取策略,重启策略,健康检查)_第10张图片

在上面的例子中,容器进程返回值非零,Kubernetes 则认为容器发生故障,需要重启。但有不少情况是发生了故障,但进程并不会退出。

六,小实验

1)以自己的名称创建一个k8s名称空间,以下所有操作都在此名称空间中。

(1)创建名称空间

[root@master ~]# kubectl create ns xgp

(2)查看一下

[root@master ~]# kubectl get ns xgp

image-20200109133106300

2)创建一个Pod资源对象,使用的是私有仓库中私有镜像,其镜像的下载策略为:NEVER。 Pod的重启策略为: Never.

[root@master ~]# vim pod.yaml
kind: Pod
apiVersion: v1
metadata:
  name: test-pod
  namespace: xgp
  labels:
    app: test-web
spec:
  restartPolicy: Never
  containers:
  - name: www
    image: 192.168.1.21:5000/web:v1
    imagePullPolicy: Never
    args:                   
    - /bin/sh
    - -c
    - sleep 90; exit 1
    ports:
    - protocol: TCP
      containerPort: 80

3)创建出容器之后,执行非正常退出,查看Pod的最终状态。

(1)执行一下上面pod的yaml文件

[root@master ~]# kubectl apply -f pod.yaml

(2)动态查看ns中test-pod的信息

[root@master ~]# kubectl get pod -n xgp  -w | grep test-pod

image-20200109135543482

删除test-pod

[root@master ~]# kubectl delete pod -n xgp test-pod 

4) 创建一个Service资源对象,与上述Pod对象关联,验证他们的关联性。

(1)修改pod的yaml文件

[root@master ~]# vim pod.yaml
kind: Pod
apiVersion: v1
metadata:
  name: test-pod
  namespace: xgp
  labels:
    app: test-web
spec:
  restartPolicy: Never
  containers:
  - name: www
    image: 192.168.1.21:5000/web:v1
    imagePullPolicy: Never
    ports:
    - protocol: TCP
      containerPort: 80

(1)编写service的yaml文件

[root@master ~]# vim svc.yaml 
apiVersion: v1
kind: Service
metadata:
  name: test-svc
  namespace: xgp
spec:
  selector:
    app: test-web
  ports:
  - port: 80
    targetPort: 80

(2)执行一下

[root@master ~]# kubectl apply -f svc.yaml

(3)查看一下

[root@master ~]# kubectl get  pod -o wide -n xgp

k8s中pod的资源对象(名称空间,获取策略,重启策略,健康检查)_第11张图片

(4)访问一下

[root@master ~]# curl 10.244.1.21

image-20200109141749352

你可能感兴趣的:(k8s中pod的资源对象(名称空间,获取策略,重启策略,健康检查))