赞
踩
Pod 可以包含多个容器,应用运行在这些容器里面,同时 Pod 也可以有一个或多个先于应用容器启动的 Init 容器。
Init容器与普通的容器非常像,除了如下两点:
Init 容器能做什么?
如果 Pod 的 Init 容器失败,Kubernetes 会不断地重启该 Pod,直到 Init 容器成功为止。然而,如果 Pod 对应的 restartPolicy 值为 Never,它不会重新启动。
初始化验证脚本,需要初始化两个service,只有两个service创建成功,pod才会进入下一周期
将service1和service2注释,模拟初始化失败
[root@server1 ~]# cat init.yml apiVersion: v1 kind: Pod metadata: name: myapp-pod labels: app: myapp spec: containers: - name: myapp-container image: busyboxplus command: ['sh', '-c', 'echo The app is running! && sleep 3600'] initContainers: - name: init-myservice image: busyboxplus command: ['sh', '-c', "until nslookup myservice.default.svc.cluster.local; do echo waiting for myservice; sleep 2; done"] - name: init-mydb image: busyboxplus command: ['sh', '-c', "until nslookup mydb.default.svc.cluster.local; do echo waiting for mydb; sleep 2; done"] #--- #apiVersion: v1 #kind: Service #metadata: # name: myservice #spec: # ports: # - protocol: TCP # port: 80 # targetPort: 9376 #--- #apiVersion: v1 #kind: Service #metadata: # name: mydb #spec: # ports: # - protocol: TCP # port: 80 # targetPort: 9377
执行脚本,查看service,nydb与myservice没有创建
[root@server1 ~]# kubectl apply -f init.yml
pod/myapp-pod created
[root@server1 ~]# kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
demo ClusterIP 10.105.217.194 <none> 80/TCP 5h22m
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d21h
查看pod状态,显示init 0/2,说明初始化失败
[root@server1 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 0/1 Init:0/2 0 14s
修改脚本,将注释部分依次还原依次执行脚本,查看变化,发现init初始化成功,pod初始化完成后进入running状态
[root@server1 ~]# vim init.yml [root@server1 ~]# kubectl apply -f init.yml pod/myapp-pod unchanged service/myservice created [root@server1 ~]# kubectl get pod NAME READY STATUS RESTARTS AGE myapp-pod 0/1 Init:0/2 0 90s [root@server1 ~]# kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE demo ClusterIP 10.105.217.194 <none> 80/TCP 5h23m kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d21h myservice ClusterIP 10.100.6.8 <none> 80/TCP 8s [root@server1 ~]# vim init.yml [root@server1 ~]# kubectl apply -f init.yml pod/myapp-pod unchanged service/myservice unchanged service/mydb created [root@server1 ~]# kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE demo ClusterIP 10.105.217.194 <none> 80/TCP 5h24m kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d21h mydb ClusterIP 10.98.3.156 <none> 80/TCP 2s myservice ClusterIP 10.100.6.8 <none> 80/TCP 34s [root@server1 ~]# kubectl get pod NAME READY STATUS RESTARTS AGE myapp-pod 0/1 Init:1/2 0 2m3s [root@server1 ~]# kubectl get pod NAME READY STATUS RESTARTS AGE myapp-pod 0/1 Init:1/2 0 2m5s [root@server1 ~]# kubectl get pod NAME READY STATUS RESTARTS AGE myapp-pod 0/1 Init:1/2 0 2m7s [root@server1 ~]# kubectl get pod NAME READY STATUS RESTARTS AGE myapp-pod 0/1 PodInitializing 0 2m8s [root@server1 ~]# kubectl get pod NAME READY STATUS RESTARTS AGE myapp-pod 1/1 Running 0 2m9s [root@server1 ~]# kubectl get pod NAME READY STATUS RESTARTS AGE myapp-pod 1/1 Running 0 2m10s
探针 是由 kubelet 对容器执行的定期诊断:
每次探测都将获得以下三种结果之一:
Kubelet 可以选择是否执行在容器上运行的三种探针执行和做出反应:
重启策略
Pod 的生命
三种可用的控制器:
yml脚本,设定存活探针,设置寻找80端口,找不到无法确定存活,将会按照默认重启策略,一直重启,直到找到端口
[root@server1 ~]# cat pod.yaml apiVersion: v1 kind: Pod metadata: name: pod-example labels: app: myapp spec: containers: - name: myapp image: myapp:v1 livenessProbe: tcpSocket: port: 80 initialDelaySeconds: 1 periodSeconds: 3 timeoutSeconds: 1
执行脚本,监控pod状态,由于未满足存活探针条件,始终处于重启状态
[root@server1 ~]# kubectl apply -f pod.yaml
pod/pod-example created
[root@server1 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
pod-example 0/1 Running 1 14s
[root@server1 ~]# kubectl get pod -w
NAME READY STATUS RESTARTS AGE
pod-example 0/1 Running 2 21s
pod-example 0/1 CrashLoopBackOff 2 27s
pod-example 0/1 Running 3 43s
pod-example 0/1 Running 4 51s
pod-example 0/1 CrashLoopBackOff 4 60s
就绪探针在脚本的应用是判断80端口访问下,是否能够获取/test.html页面内容,如果能够获取内容,证明服务访问正常,一切准备就绪,可以进入下一周期,反之不满足,失败。
[root@server1 ~]# cat pod.yaml apiVersion: v1 kind: Pod metadata: name: pod-example labels: app: myapp spec: containers: - name: myapp image: myapp:v1 readinessProbe: httpGet: path: /test.html port: 80 initialDelaySeconds: 1 periodSeconds: 3 timeoutSeconds: 1
就绪探针的特点是,未处于就绪的容器,仅可以通过内网访问,不可以开放给外部访问,因此创建service服务脚本,通过查看能否进行外部访问确认是否就绪
svc.yml
[root@server1 ~]# cat svc.yml
apiVersion: v1
kind: Service
metadata:
name: mysvc
spec:
ports:
- protocol: TCP
port: 80
targetPort: 80
selector:
app: myapp
执行脚本,查看pod状态
[root@server1 ~]# kubectl apply -f svc.yml
service/mysvc created
[root@server1 ~]# kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
pod-example 0/1 Running 0 51s app=myapp
查看svc,进行访问,被拒绝 Endpoints
内为空
[root@server1 ~]# kubectl get svc mysvc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE mysvc ClusterIP 10.96.220.88 <none> 80/TCP 45s [root@server1 ~]# curl 10.96.220.88 curl: (7) Failed connect to 10.96.220.88:80; Connection refused [root@server1 ~]# kubectl describe svc mysvc Name: mysvc Namespace: default Labels: <none> Annotations: <none> Selector: app=myapp Type: ClusterIP IP Family Policy: SingleStack IP Families: IPv4 IP: 10.96.220.88 IPs: 10.96.220.88 Port: <unset> 80/TCP TargetPort: 80/TCP Endpoints: Session Affinity: None Events: <none>
进入交互界面,创建默认发布页面test.html
[root@server1 ~]# kubectl exec pod-example -it -- sh
~ # cd /usr/share/nginx/html/
/usr/share/nginx/html # ls
50x.html index.html
/usr/share/nginx/html # echo www.westos.org > test.html
/usr/share/nginx/html # exit
[root@server1 ~]# kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
pod-example 1/1 Running 0 3m53s app=myapp
[root@server1 ~]# curl 10.96.220.88
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[root@server1 ~]# curl 10.96.220.88/test.html
www.westos.org
查看svc,获取内容Endpoints: 10.244.2.25:80
,可以进行外部访问
[root@server1 ~]# kubectl describe svc mysvc Name: mysvc Namespace: default Labels: <none> Annotations: <none> Selector: app=myapp Type: ClusterIP IP Family Policy: SingleStack IP Families: IPv4 IP: 10.96.220.88 IPs: 10.96.220.88 Port: <unset> 80/TCP TargetPort: 80/TCP Endpoints: 10.244.2.25:80 Session Affinity: None Events: <none>
测试
查看pod状态,处于ready
[root@server1 ~]# kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
pod-example 1/1 Running 0 51s app=myapp
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。