您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
19、Kubernetes - 资源清单 - initC(reset)
发布时间:2022-12-13 23:31:20编辑:雪饮阅读()
Step1
下载busybox,在两个节点上都下载
因为等下要在master节点做实验用到,但是这个东西下载容易失败,且默认分配到那个节点我们是不知道的
[root@k8s-node01 ~]# docker pull busybox
Using default tag: latest
latest: Pulling from library/busybox
45a0cdc5c8d3: Pull complete
Digest: sha256:3b3128d9df6bbbcc92e2358e596c9fbd722a437a62bafbc51607970e9e3b8869
Status: Downloaded newer image for busybox:latest
docker.io/library/busybox:latest
Step2
先删除掉昨天部署的nginx-deployment,为了防止期望值原因,死灰复燃,所以全部干掉
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 1/1 Running 1 24h
nginx-deployment-85756b779-dljnk 1/1 Running 3 2d1h
nginx-deployment-85756b779-f45wk 1/1 Running 2 2d1h
nginx-deployment-85756b779-hgr9q 1/1 Running 4 3d23h
[root@k8s-master01 ~]# kubectl delete deployment --all
deployment.extensions "nginx-deployment" deleted
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 1/1 Running 1 24h
nginx-deployment-85756b779-dljnk 0/1 Terminating 3 2d1h
nginx-deployment-85756b779-hgr9q 0/1 Terminating 4 3d23h
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 1/1 Running 1 24h
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 1/1 Running 1 24h
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 1/1 Running 1 24h
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 1/1 Running 1 24h
剩下的这个myapp-pod也干掉吧
[root@k8s-master01 ~]# kubectl delete pod --all
pod "myapp-pod" deleted
虽然—all参数貌似有点多余哈
对应的svc也清理下
[root@k8s-master01 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 8d
nginx-deployment NodePort 10.97.227.239 <none> 30000:32046/TCP 2d1h
[root@k8s-master01 ~]# kubectl delete svc nginx-deployment
service "nginx-deployment" deleted
[root@k8s-master01 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 8d
Step3
使用初始化模板创建pod
模板内容
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 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 ;']
[root@k8s-master01 ~]# kubectl create -f init-pod.yaml
pod/myapp-pod created
这里稍微解释下,这个新建的pod叫做myapp,对应的容器是myapp-container,依赖于init-myservice和init-mydb
而这两个被依赖的容器都加载镜像busybox(这就是为什么要提前下载的原因了)
然后这两个容器实际上并没有创建,只是检测,检测脚本都是until反向循环条件。都是通过nslookup发现服务,若发现了就停止后面的循环。
这两个初始化容器检测的脚本都done了,然后该pod模板才算完成任务。
Step4
实际上刚才你创建了pod后你会发现刚开始状态能看到init总共有多少步骤的
[root@k8s-master01 ~]# kubectl create -f init-pod.yaml
pod/myapp-pod created
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 0/1 Init:0/2 0 2s
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 0/1 Init:0/2 0 5s
这里可以看到ready是总共一个,但是status是两个步骤
如果你相关依赖的容器一直没有运行,则过了一会儿就出现了init状态错误了
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 0/1 Init:CrashLoopBackOff 3 82s
使用describe也可以看到创建的这个pod所依赖的检测脚本
[root@k8s-master01 ~]# kubectl describe pod myapp-pod
Name: myapp-pod
Namespace: default
Priority: 0
Node: k8s-node02/192.168.66.21
Start Time: Mon, 12 Dec 2022 22:28:23 +0800
Labels: app=myapp
Annotations: <none>
Status: Pending
IP: 10.224.2.10
Init Containers:
init-myservice:
Container ID: docker://c7e230e4e0b098fbb8d98027f31fdd2130496a48549a350d992693d09b6f6614
Image: busybox
Image ID: docker-pullable://busybox@sha256:3b3128d9df6bbbcc92e2358e596c9fbd722a437a62bafbc51607970e9e3b8869
Port: <none>
Host Port: <none>
Command:
sh
-c
until nslookup myservice; do echo waiting for myservice; sleep 2;done;
这里只是节选了一部分,另外一个依赖的脚本也可以看到的
Step5
查看这个init-myservice的日志
[root@k8s-master01 ~]# kubectl log myapp-pod -c init-myservice
log is DEPRECATED and will be removed in a future version. Use logs instead.
sh: illegal option –
。。。老师哪里都可以,我这里却不可以。。。
不过这里有个提示,貌似log会要被logs代替了,所以暂时先不纠结了,可能是兼容这个“-”字符问题
那么接下来我们就创建上面myapp-pod的第一个依赖,myservice
[root@k8s-master01 ~]# cat myservice.yaml
kind: Service
apiVersion: v1
metadata:
name: myservice
spec:
ports:
- protocol: TCP
port: 80
targetPort: 9376
[root@k8s-master01 ~]# kubectl create -f myservice.yaml
service/myservice created
那么实际上,现在你创建,基本早都嗝屁了
可能是达到最大重启次数了吧
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 0/1 Init:CrashLoopBackOff 8 18m
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 0/1 Init:CrashLoopBackOff 8 18m
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 0/1 Init:CrashLoopBackOff 8 18m
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 0/1 Init:CrashLoopBackOff 8 18m
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 0/1 Init:CrashLoopBackOff 8 18m
[root@k8s-master01 ~]#
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 0/1 Init:CrashLoopBackOff 8 19m
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 0/1 Init:CrashLoopBackOff 8 19m
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 0/1 Init:CrashLoopBackOff 8 19m
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 0/1 Init:CrashLoopBackOff 8 19m
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 0/1 Init:CrashLoopBackOff 8 19m
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 0/1 Init:CrashLoopBackOff 8 19m
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 0/1 Init:CrashLoopBackOff 8 19m
应该是要在所有重试次数未完之前就要创建依赖出来才行吧。
那么删除刚才创建的myapp-pod,再次重新创建myapp-pod应该就会不同了。
Step6
这种做法实际上打脸了,第一阶段排查出点问题是:
[root@k8s-master01 ~]# cat init-pod.yaml
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 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;']
这个模板中-c参数前后两个逗号之间不要有空格,否则如
kubectl log myap-pod –c init-myservice命令就会报错如:
sh: illegal option –
所以实际上不会出现步骤5那样的Init:CrashLoopBackOff错误的,应该是一直处于这种状态的
Init:0/2
然后我们才能使用命令如
kubectl log myapp-pod -c init-myservice
查看我们的子依赖的日志
Step7
Init:CrashLoopBackOff问题的解决
步骤6的问题ok后你发现还是init:0/2
我们用kubectl get pod -n kube-system命令查看到coredns状态大多数是CrashLoopBackOff
解决办法(网上找的)
Master和各节点都kubeadm reset
然后master重新初始化
13、Kubernetes - 集群安装 (gaojiupan.cn)
然后各节点重新加入
然后你会再次遇到init:0/2问题,只是这次不同的是coredns不出现CrashLoopBackOff问题了。
那么这次是什么问题呢?原因是init-pod.yaml模板中的busybox的版本号导致的。
默认没有版本号就是使用的lastest最新版。
那么网传用这个1.28.3可以
[root@k8s-master01 ~]# cat init-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: busybox:1.28.3
command: ['sh','-c','echo The app is running! && sleep 3600']
initContainers:
- name: init-myservice
image: busybox:1.28.3
command: ['sh','-c','until nslookup myservice; do echo waiting for myservice; sleep 2;done;']
- name: init-mydb
image: busybox:1.28.3
command: ['sh','-c','until nslookup mydb; do echo waiting for mydb; sleep 2; done;']
于是乎删除这个pod并重新创建
kubectl delete pod myapp-pod
kubectl create -f init-pod.yaml
这次状态总算进入了1/2,算是进步了一小步
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 0/1 Init:1/2 0 5m8s
Step8
那么同上面myservice一样,那个mydb也是被依赖的,接下来我们创建mydb
[root@k8s-master01 ~]# cat mydb.yaml
kind: Service
apiVersion: v1
metadata:
name: mydb
spec:
ports:
- protocol: TCP
port: 80
targetPort: 9377
然后创建
[root@k8s-master01 ~]# kubectl create -f mydb.yaml
service/mydb created
不断观察之下,慢慢的就变成了running状态了。
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 0/1 Init:1/2 0 10m
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 0/1 Init:1/2 0 10m
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 0/1 Init:1/2 0 10m
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 0/1 Init:1/2 0 10m
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 0/1 Init:1/2 0 10m
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 0/1 PodInitializing 0 10m
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 1/1 Running 0 10m
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 1/1 Running 0 10m
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 1/1 Running 0 10m
这就是所谓的pod依赖了,所有pod依赖都处理了就能运行起来了。
关键字词:Kubernetes,资源,清单,initC