K8S了解、资源、init容器
文章目录K8S资源yaml字段解释pod生命周期init容器init模板init特殊说明探针就绪性检测存活性检测liveness-execliveness-httpGetliveness-tcp就绪检查与存活检查合二为一start stopK8S#deployment会链接一个rs会有一个随机的哈希值[root@VM-16-10-centos ~]# kubectl get deployments
文章目录
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
如果我们看到有百度相关的信息那么证明我们上面的初始化的工作就完成了。
更多推荐
所有评论(0)