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

**Deployment: ** 最常见的无状态应用的控制器,支持应用的扩缩容、滚动 更新等操作 。 **Servcie: **为弹性变动且存在生命周期的Pod对象提供了一个固定的访问接 口,用于服务发现和服务访问。

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

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

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

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

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

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

1、Namespace:名称空间

默认的名称空间: Default

#查看名称空间
[root@docker-k8s01 ~]# kubectl get ns
#查看名称空间详细信息
[root@docker-k8s01 ~]# kubectl describe ns default 
#创建名称空间
[root@docker-k8s01 ~]# cat test1.yaml 

apiVersion: v1
kind: Namespace
metadata:
  name: test1
	
[root@docker-k8s01 ~]# kubectl create ns test1.yaml

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

查看指定名称空间的资源可以使用--namespace 或者简写 -n 选项也可以

#删除名称空间
[root@docker-k8s01 ~]# kubectl delete ns test1 

2、Pod

#编写例子yaml文件
[root@docker-k8s01 pod]# cat test-pod.yaml 
kind: pod
apiVersion: v1
metadata: 
  name: test-pod
spec: 
  containers: 
  - name: test-pod
    image: httpd

Pod中镜像获取策略

//将上述Pod资源的镜像下载策略改为IfNotPresent
[root@docker-k8s01 pod]# cat test-pod.yaml 
kind: pod
apiVersion: v1
metadata: 
  name: test-pod
spec: 
  containers: 
  - name: test-pod
    image: httpd
    imagepullpolicy: IfNotPresent               # 添加此行

# imagepullpolicy后可选参数如下:
Always:镜像标签为"latest"或镜像标签不存在时,总是从指定的仓库中获取镜像。
IfNotPresent:仅当本地镜像不存在时才从目标仓库中下载。也就意味 着,如果本地存在,直接使用本地镜像,无需再联网下载。
Never: 禁止从仓库中下载镜像,即只使用本地镜像。

注: 上述语句中提到的"本地"是指: docker images命令能够给查看到的镜像。

容器重启策略

//将上述Pod资源添加重启策略为OnFailure
[root@docker-k8s01 pod]# cat test-pod.yaml 
kind: pod
apiVersion: v1
metadata: 
  name: test-pod
spec: 
  restartpolicy: OnFailure            # 添加此行
  containers: 
  - name: test-pod
    image: httpd
    imagepullpolicy: IfNotPresent

#可选参数如下:
Always: 但凡Pod对象终止就将其重启,此为默认设定;
OnFailure:仅在Pod对象出现错误时才将其重启;
Never:从不重启;

附:同一个yaml文件内,可以同时存在多种资源对象,但最好是同一个服务相关的资源。并且在写的时候,不同的资源需要用“---” 将资源隔离。其实默认是一个资源的yaml,最上方也有“---"不过是通常会省略不写。

---
apiVersion: v1
kind: Namespace
metadata:
  name: test1
---
kind: pod
apiVersion: v1
metadata:
  name: test-pod
spec:
  restartpolicy: OnFailure
  containers:
  - name: test-pod
    image: httpd
    imagepullpolicy: IfNotPresent

3、Pod的默认健康检查

LivenessProbe(活跃度)

[root@docker-k8s01 liveness]# cat test-liveness.yaml 
kind: Pod
apiVersion: v1
metadata:
  name: liveness
  labels:
    test: liveness
spec:
  restartPolicy: OnFailure
  containers:
  - name: liveness
    image: busybox
    args:
    - /bin/sh
    - -c
    - touch /tmp/test; sleep 60; rm -rf /tmp/test; sleep 300
    livenessProbe:
        exec:
            command:
            - cat
            - /tmp/test
        initialDelaySeconds: 10              // pod运行10秒后开始探测
        periodSeconds: 5               // 每5秒探测一次

**注: Liveness活跃度探测,根据探测某个文件是否存在,来确认某个服务 是否正常运行,如果存在则正常,否则,它会根据你设置的Pod的重启策略操作Pod。 **

Readiness(敏捷探测、就绪性探测)

[root@docker-k8s01 readiness]# cat test-readiness.yaml 
kind: Pod
apiVersion: v1
metadata: 
  name: readiness
  labels: 
    test: readiness
spec: 
  restartPolicy: OnFailure
  containers: 
  - name: readiness
    image: busybox 
    args: 
    - /bin/sh
    - -c
    - touch /tmp/test;  sleep 60; rm -rf /tmp/test; sleep 300
    readinessProbe: 
      exec: 
        command: 
        - cat 
        - /tmp/test
      initialDelaySeconds: 10
      periodSeconds: 5

总结liveness和 readiness探测 1、liveness和readiness是两种健康检查机制,如果不特意配置,k8s将两 种探测采取相同的默认行为,即通过判断容器启动进程的返回值是否为零,来判断探测是否成功。 2、两种探测配置方法完全一样,不同之处在于探测失败后的行为:liveness探测是根据Pod重启策略操作容器,大多数是重启容器。 readiness则是将容器设置为不可用,不接收Service转发的请求。 3、两种探测方法可以独立存在,也可以同时使用。用liveness判断容器是 否需要重启实现自愈;用readiness判断容器是否已经准备好对外提供服务。

4、健康检测的应用

在扩容中的应用:

[root@docker-k8s01 web]# cat test-web.yaml 
---
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: web
spec: 
  replicas: 3
  template: 
    metadata: 
      labels: 
        run: web
    spec: 
      containers: 
      - name: web 
        image: httpd
        ports:
        - containerPort: 80
        readinessProbe: 
          httpGet: 
            scheme: HTTP
            path: /healthy
            port: 80
          initialDelaySeconds: 10
          periodSeconds: 5
---
kind: Service
apiVersion: v1
metadata: 
  name: web-svc
spec: 
  type: NodePort
  selector: 
    run: web
  ports: 
  - protocol: TCP
    port: 90
    targetPort: 80
    nodePort: 30321

在更新过程中的使用

[root@docker-k8s01 web]# cat app-v1.yaml 
apiVersion: extensions/v1beta1
kind: Deployment
metadata: 
  name: app
spec: 
  replicas: 10
  template: 
    metadata: 
      labels: 
        run: app
    spec: 
      containers: 
      - name: app
        image: busybox
        args: 
        - /bin/sh
        - -c 
        - sleep 10; touch /tmp/healthy; sleep 3000
        readinessProbe:
          exec: 
            command: 
            - cat
            - /tmp/healthy
          initialDelaySeconds: 10
          periodSeconds: 5

**maxSurge: 此参数控制滚动更新过程中,副本总数超过预期数的值。可以是整数,也可以是百分比,默认是1 ** maxUnavailable: 不可用Pod的值。默认为1.可以是整数,也可以是百分比。