Kubernetes 自定义服务的启动顺序

一、Init Container简介

    Pod中能够包含多个容器,也可能包含一个或多个先于应用容器启动的init容器。init容器和普通容器非常像,除了以下四点:

  • 它们只运行到完成
  • 每个init容器都必须在下一个启动之前成功完成
  • init容器不支持Readiness Probe,因为它们必须在pod启动之前完成
  • 如果一个pod指定了多个init容器,则init容器会按顺序启动,每个init容器运行成功,下一个才能运行,当所有init容器完成后,应用容器才能正常初始化
    如果pod中的init容器失败,kubernetes会不断的重启该pod,直到init容器成功为止,如果pod对应的restartPolicyNever,则pod不会重启。

二、Init Container作用

    init容器具有和应用容器分离的独立镜像,能够完成以下功能:

  • init容器可以包含运行的实用工具,处于安全考虑,不建议在应用容器中包含这些工具
  • 为应用镜像分离出创建和部署的角色
  • Init容器提供了一种简单的方式来阻塞或延迟应用容器的启动,直到满足了一组先决条件

三、通过Init Container自定义服务启动顺序

    创建包含init容器的deployment

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: init-test
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: init
    spec:
      containers:
      - name: nginx-init
        image: nginx:1.7.9
        ports:
        - containerPort: 80
      initContainers:
      - name: init-mydb
        image: busybox
        command: ['sh', '-c', 'until nslookup mysql; do echo waiting for mysql; sleep 2; done;']
      restartPolicy: Always

    其中spec.template.spec.initContainers.command中通过查询后端mysql服务名是否可以解析来判定mysql服务是否可用,如果可以解析则init容器退出码为0,应用容器正常初始化;如果不可以解析则init容器无法完成,直到init容器可以解析出mysql服务名。
    查看pod/init-test状态:

$ kubectl get pod |grep init
init-test-945901923-wfdtz                       0/1       Init:0/1   0          1m

    查看具体状态:

$ kubectl describe pod/init-test-945901923-wfdtz
Name:        init-test-945901923-wfdtz
Namespace:    default
Node:        dce-m/192.168.2.7
Start Time:    Mon, 02 Apr 2018 13:37:29 +0800
Labels:        app=init
        pod-template-hash=945901923
Annotations:    kubernetes.io/created-by={"kind":"SerializedReference","apiVersion":"v1","reference":{"kind":"ReplicaSet","namespace":"default","name":"init-test-945901923","uid":"ef20c9e0-3637-11e8-9763-0242ac130003...
Status:        Pending
IP:        172.28.203.157

Init Containers:
  init-mydb:
    Image:        busybox
    Command:
      sh
      -c
      nslookup mysql
    State:        Runing
    Ready:        False
    Restart Count:    0
    Environment:    <none>
Containers:
  nginx-init:
    Image:        nginx:1.7.9
    Port:        80/TCP
    State:        Waiting
      Reason:        PodInitializing
    Ready:        False
    Restart Count:    0
    Environment:    <none>

    可以看到init容器的状态一直是waiting,mysql服务名解析失败,mysql服务没有启动,导致应用容器nginx-init无法初始化。
    查看init容器logs

$ kubectl logs init-test-4101941772-6w358 -c init-mydb
Server:    10.96.0.2
Address 1: 10.96.0.2 kube-dns.kube-system.svc.cluster.local
waiting for mysql
nslookup: can't resolve 'mysql'
nslookup: can't resolve 'mysql'
Server:    10.96.0.2
Address 1: 10.96.0.2 kube-dns.kube-system.svc.cluster.local
waiting for mysql
nslookup: can't resolve 'mysql'
Server:    10.96.0.2
Address 1: 10.96.0.2 kube-dns.kube-system.svc.cluster.local
waiting for mysql

    创建mysql服务

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: mysql-deployment
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql
        ports:
        - containerPort: 3306
        env:
          - name: MYSQL_ROOT_PASSWORD
            value: root

---

kind: Service
apiVersion: v1
metadata:
  name: mysql
spec:
  selector:
    app: mysql
  ports:
  - protocol: TCP
    port: 3306
    targetPort: 3306

    查看mysql服务状态:

$ kubectl get svc |grep mysql
mysql                          10.109.188.162   <none>        3306/TCP                                                       27s

    mysql服务已经正常,再查看pod/test-init的状态:

$ kubectl get pod |grep init
init-test-4101941772-6w358                      1/1       Running   0          7m

    应用容器已经能正常运行,说明init容器已经完成mysql服务名解析。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值