K8S

#deployment会链接一个rs  会有一个随机的哈希值


[root@VM-16-10-centos ~]# kubectl get deployments.apps -n jenkins 
NAME                 READY   UP-TO-DATE   AVAILABLE   AGE
jenkins              1/1     1            1           47d
nfs-client-jenkins   1/1     1            1           47d
[root@VM-16-10-centos ~]# kubectl get rs -n jenkins 
NAME                            DESIRED   CURRENT   READY   AGE
jenkins-7f85985cb7# 随机哈希值              1         1         1       47d
nfs-client-jenkins-588b48577f   1         1         1       47d

资源

# 集群资源分类:
    名称空间级别: default
    集群级别:     role
    元数据型:     HPA

在这里插入图片描述
在这里插入图片描述

yaml字段解释

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

pod生命周期

在这里插入图片描述

开始请求通过api接口调度到kubelet上进行容器的初始化。init c初始化完成会死亡,不会一直伴随着pod的生命周期。
pod一旦建立,就会有pause的容器存在,
init C:容器初始化
可以有多个init c
每一个init c重启完成之后再重启下一个init c的构建
init c正常退出-----》main c   如果init c没有正常退出,pod对应的流程处理(比如重启)
main c 退出  pod就结束了

kubectl----api----kubelet---cri---pause---init c----main c

pod能够具有多个容器,应用运行再容器里面,但是他也有可能有一个或多个先于应用容器启动的init容器。
init容器与普通容器非常像,除了一下两点:
init容器总是运行到成功完成为止。
每一个init容器都必须再下一个init容器启动完之前成功完成。

如果pod的init c容器初始化失败,kubernets会不断的重启pod,直到init c容器成功为止,然而。pod对应的RestartPolicy为Never,他不会被启动。

在这里插入图片描述

在这里插入图片描述

init容器

init模板

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
spec:
  containers:
  - name: myapp-container   #主容器
    image: busybox
    command: ['sh','-c','echo the app is running! && sleep 26000']
  initContainers:   #初始化容器
  - name: init-myservice
    image: busybox
    command: ['sh','-c','until nslookup myservice;do echo waiting for myservice;sleep 2;done;']
  - name: init-mydb
    image: busybox


apiversion: v1
kind: Service
metadata:
  name: myservice
spec:
  ports:
    - portocol: Tcp
      port: 80
      targetPort: 9376
      
      
---
apiversion: v1
kind: Service
metadata:
  name: mydb
spec:
  ports:
    - portocol: Tcp
      port: 80
      targetPort: 9377
      


svc创建成功会被集群内部的dns解析成对应的ip

也就以为这内部的所有容器,把这两个机器的内部ip配置成dns服务器
myapp-pod请求到---dns 询问有没有myservice的名称呀
如果svc创建了myservice 就会写入到dns   dns就会返回数据 

在这里插入图片描述

init特殊说明

在这里插入图片描述

注意:init c再pause之后才能初始化。
在这里插入图片描述
并且:同一组init c的端口可以一致。因为第一个启动起来就会退出。

探针

在这里插入图片描述

在这里插入图片描述

就绪性检测
apiVersion: v1
kind: Pod
metadata:
  name: readiness-httpget-pod
  namespace: default
spec:
  containers:
  - name: readiness-httpget-pod
    image: wangyanglinux/myapp:v1
    imagePullPolicy: IfNotPresent
    readinessProbe:
      httpGet:
        port: 80
        path: /index1.html
      initialDelaySeconds: 1
      periodSeconds: 3

在这里插入图片描述
虽然显示running 但是ready状态为0
查看pod详情

[root@k8s-master-01 mnt]# kubectl describe pods readiness-httpget-pod

在这里插入图片描述

进入容器里面添加index1.html

[root@k8s-master-01 mnt]# kubectl exec -it readiness-httpget-pod -- /bin/sh
/ # cd /usr/share/nginx/html/
/usr/share/nginx/html # ll
/bin/sh: ll: not found
/usr/share/nginx/html # ls
50x.html    index.html
/usr/share/nginx/html # echo "123" >> index1.html
/usr/share/nginx/html # exit
[root@k8s-master-01 mnt]# kubectl get pods 
NAME                    READY   STATUS    RESTARTS   AGE
myapp-pod               1/1     Running   0          4d
readiness-httpget-pod   1/1     Running   0          5m4s

在这里插入图片描述

存活性检测
liveness-exec
apiVersion: v1
kind: Pod
metadata:
  name: liveness-exec-pod
  namespace: default
spec:
  containers:
  - name: liveness-exec-pod
    image: busybox:1.28.3
    imagePullPolicy: IfNotPresent
    command: ["/bin/sh","-c","touch /tmp/live; sleep 60; rm -rf /tmp/live; sleep 3000" ]
    livenessProbe:
      exec:
        command: ["test","-e","/tmp/live"]
      initialDelaySeconds: 1
      periodSeconds: 3

在这里插入图片描述

liveness-httpGet
apiVersion: v1
kind: Pod
metadata:
  name: liveness-httpget-pod
  namespace: default
spec:
  containers:
  - name: liveness-httpget-pod
    image: wangyanglinux/myapp:v1
    imagePullPolicy: IfNotPresent
    ports:
    - name: http
      containerPort: 80
    livenessProbe:
      httpGet:
        port: http
        path: /index.html
      initialDelaySeconds: 1
      periodSeconds: 3
      timeoutSeconds: 10

在这里插入图片描述

在这里插入图片描述

liveness-tcp
apiVersion: v1
kind: Pod
metadata:
  name: probe-tcp
  namespace: default
spec:
  containers:
  - name: nginx
    image: wangyanglinux/myapp:v1
    imagePullPolicy: IfNotPresent
    livenessProbe:
      initialDelaySeconds: 1
      timeoutSeconds: 3
      tcpSocket:
        port: 80

在这里插入图片描述

就绪检查与存活检查合二为一
apiVersion: v1
kind: Pod
metadata:
  name: liveness-httpget-pod
  namespace: default
spec:
  containers:
  - name: liveness-httpget-pod
    image: wangyanglinux/myapp:v1
    imagePullPolicy: IfNotPresent
    ports:
    - name: http
      containerPort: 80
    readinessProbe:
      httpGet:
        port: 80
        path: /index1.html
      initialDelaySeconds: 1
      periodSeconds: 3

    livenessProbe:
      httpGet:
        port: http
        path: /index.html
      initialDelaySeconds: 1
      periodSeconds: 3
      timeoutSeconds: 10

在这里插入图片描述

start stop

也就是主容器启动干什么?主容器推出干什么?
相当于钩子函数

apiVersion: v1
kind: Pod
metadata:
  name: lifecycle-demo
  namespace: default
spec:
  containers:
  - name: lifecycle-demo
    image: nginx
    imagePullPolicy: IfNotPresent
    lifecycle:
      postStart:
        exec:
          command: ["/bin/bash","-c","echo hello from the poststart hander > /usr/share/message"]
      preStop:
        exec:
         command: ["/bin/bash","-c","echo hello from the prestop hander > /usr/share/message"]

在这里插入图片描述

init容器补充

apiVersion: v1
kind: Pod
metadata:
  name: init-pod1
  labels:
    app: init
spec:
  containers:
  - name: init-container
    image: busybox
    command: ['sh', '-c', 'echo The app is running! && sleep 3600']
  initContainers:
  - name: init-myservice
    image: busybox
    command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;']
  - name: init-mydb
    image: busybox
    command: ['sh', '-c', 'until nslookup mydb; do echo waiting for mydb; sleep 2; done;']

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

kind: Service
apiVersion: v1
metadata:
  name: myservice
spec:
  ports:
  - protocol: TCP
    port: 80
    targetPort: 6376
---
kind: Service
apiVersion: v1
metadata:
  name: mydb
spec:
  ports:
  - protocol: TCP
    port: 80
    targetPort: 6377

在这里插入图片描述
在这里插入图片描述
我们可以先创建上面的Pod,然后查看下Pod的状态,然后再创建下面的Service,对比下前后状态。

我们在Pod启动过程中,初始化容器会按顺序在网络和数据卷初始化之后启动。每个容器必须在下一个容器启动之前成功退出。如果由于运行时或失败退出,导致容器启动失败,它会根据Pod的restartPolicy指定的策略进行重试。 然而,如果 Pod 的 restartPolicy 设置为 Always,Init 容器失败时会使用 RestartPolicy 策略。

在所有的初始化容器没有成功之前,Pod将不会变成 Ready状态。正在初始化中的Pod处于Pending状态,但应该会将条件Initializing设置为 true。

apiVersion: v1
kind: Pod
metadata:
  name: init-demo
spec:
  containers:
  - name: nginx
    image: nginx
    ports:
    - containerPort: 80
    volumeMounts:
    - name: workdir
      mountPath: /usr/share/nginx/html
  initContainers:
  - name: install
    image: busybox
    command:
    - wget
    - "-O"
    - "/work-dir/index.html"
    - http://www.baidu.com
    volumeMounts:
    - name: workdir
      mountPath: "/work-dir"
  volumes:
  - name: workdir
    emptyDir: {}

我们可以看到这里又出现了volumes,spec.volumes指的是Pod中的卷,spec.containers.volumeMounts,是将指定的卷 mount 到容器指定的位置,相当于docker里面的-v 宿主机目录:容器目录,我们前面用到过hostPath,我们这里使用的是emptyDir{},这个就相当于一个共享卷,是一个临时的目录,生命周期等同于Pod的生命周期。

初始化容器执行完,会下载一个 html 文件映射到emptyDir{},而主容器也是和 spec.volumes 里的emptyDir{} 进行映射,所以nginx容器的/usr/share/nginx/html`目录下会映射 index.html 文件。

我们来创建下该Pod,然后验证nginx容器是否运行:

$ kubectl get pod init-demo

输出显示了nginx容器正在运行:

NAME      READY     STATUS    RESTARTS   AGE
nginx     1/1       Running   0          43m

在 init-demo 容器里的 nginx 容器打开一个 shell:

$ kubectl exec -it init-demo -- /bin/bash

在Shell里,直接查看下 index.html 的内容:

root@nginx:~# cat /usr/share/nginx/html/index.html

如果我们看到有百度相关的信息那么证明我们上面的初始化的工作就完成了。

Logo

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

更多推荐