k8s学习笔记-P19-生命周期-InitC 测试

237 阅读4分钟

教程: 尚硅谷Kubernetes教程(K8s入门到精通)_哔哩哔哩_bilibili

笔记摘自视频章节:第四章


主题

时间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!