笔记摘自视频章节:第四章
主题
时间init container
操作
创建
- 创建一个剧本,init container等待很久那种,剧本如下。该剧本会因为myservice和mydb一直没有创建service,无法再coredns中注册dns,所以
nslookup命令return code非0,导致一直卡住
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: mapp-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; ']
- 应用,创建Pod:
kubectl create -f p19_init_contianer.yaml
pod/myapp-pod created
- 查看pod状态,发现pod一直在init
root@jjh-k8s-demo-master:~/k8s_yaml/bzhan_shangguigu# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 0/1 Init:0/2 0 11m
- 描述pod,查看错误信息
kubectl describe pod myapp-pod
Name: myapp-pod
Namespace: default
Priority: 0
Node: jjh-k8s-demo-node1/172.16.13.127
Start Time: Thu, 17 Mar 2022 14:02:37 +0000
Labels: app=myapp
Annotations: <none>
Status: Pending
IP: 10.244.1.7
IPs:
IP: 10.244.1.7
Init Containers:
init-myservice:
Container ID: docker://286f28a34066c935905dc855c13301602565c02284179719411edddf2ce8e07d
Image: busybox
Image ID: docker-pullable://busybox@sha256:caa382c432891547782ce7140fb3b7304613d3b0438834dce1cad68896ab110a
Port: <none>
Host Port: <none>
Command:
sh
-c
until nslookup myservice; do echo waiting for myservice; sleep 2; done;
State: Running
Started: Thu, 17 Mar 2022 14:03:08 +0000
Ready: False
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-c2c4l (ro)
init-mydb:
Container ID:
Image: busybox
Image ID:
Port: <none>
Host Port: <none>
Command:
sh
-c
until nslookup mydb; do echo waiting for mydb; sleep 2; done;
State: Waiting
Reason: PodInitializing
Ready: False
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-c2c4l (ro)
Containers:
mapp-container:
Container ID:
Image: busybox
Image ID:
Port: <none>
Host Port: <none>
Command:
sh
-c
echo The app is running! && sleep 3600
State: Waiting
Reason: PodInitializing
Ready: False
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-c2c4l (ro)
Conditions:
Type Status
Initialized False
Ready False
ContainersReady False
PodScheduled True
Volumes:
kube-api-access-c2c4l:
Type: Projected (a volume that contains injected data from multiple sources)
TokenExpirationSeconds: 3607
ConfigMapName: kube-root-ca.crt
ConfigMapOptional: <nil>
DownwardAPI: true
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 12m default-scheduler Successfully assigned default/myapp-pod to jjh-k8s-demo-node1
Normal Pulling 12m kubelet Pulling image "busybox"
Normal Pulled 12m kubelet Successfully pulled image "busybox" in 29.463699609s
Normal Created 12m kubelet Created container init-myservice
Normal Started 12m kubelet Started container init-myservice
- 查看创建日志
root@jjh-k8s-demo-master:~# kubectl logs myapp-pod -f
Error from server (BadRequest): container "mapp-container" in pod "myapp-pod" is waiting to start: PodInitializing
失败,pod初始化waiting to start
- 查看pod中的容器的创建日志
kubectl logs myapp-pod -c init-myservice
会发现容器一直卡在上面的nslookup中,因为myservice永远查不到,所以一直无法走下去
- 让卡住的init container继续走下去:创建一个myservice的service,yaml如下
kind: Service
apiVersion: v1
metadata:
name: myservice
spec:
ports:
- protocol: TCP
port: 88
targetPort: 9376
○ 创建service:
kubectl create -f p19_init_contianer_2.yaml
service/myservice created
- 查看之前卡住的pod的状态,分析现象
○kubectl get pods
NAME READY STATUS RESTARTS AGE
myapp-pod 0/1 Init:1/2 0 34m
发现pod状态往前走了一步,init变成了1/2
- 上述现象原因是创建了个myservice服务,dns能够查到了
kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.1.0.1 <none> 443/TCP 4d1h
myservice ClusterIP 10.1.85.53 <none> 88/TCP 11m
nginx NodePort 10.1.176.1 <none> 80:32025/TCP 4d
- 之前的myservice,会在让kube-system命名空间内的coredns感知到这个服务,所以dns就能查到了
kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-65c54cc984-smdtc 1/1 Running 0 7d7h
coredns-65c54cc984-tcbfb 1/1 Running 0 7d7h
- 再创建一个mydb,让第二个init走过去, yaml文件
- kind: Service
apiVersion: v1
metadata:
name: mydb
spec:
ports:
- protocol: TCP
port: 89
targetPort: 9377
- 创建
kubectl create -f p19_init_contianer_mydb.yaml
service/mydb created
- 查看两个服务创建完成后,看pod的状态,发现已经running起来了
kubectl get pods
NAME READY STATUS RESTARTS AGE
myapp-pod 1/1 Running 0 47m
kubectl logs myapp-pod
The app is running!