[TOC]
# Init 容器
## 介绍
简单一句话,就是init容器成功启动,应用Pod才能开始启动 如比:
* 数据库启动完成后,才能开始启动应用
* 在init容器中,根据需要生成配置文件,然后在主应用pod中启动应用
(除非Pod的`restartPolicy`设置为`Never`,就不会被重启)
## 示例
### 创建Init 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;']
~~~
运行yaml文件后,观察Pod,此时正处于`Init`状态

这是因为在Pod的`spec`字段中,定义了`initContainers`部分,在Pod启动中,会首先执行`command`中的命令,监听能不能正常解析`init-myservice`和`init-mydb`这两个服务,之后执行成功返回后,Pod才会正常启动。
查看myapp-pod的log日志 (init容器中的信息用describe是不能打印出来的)
~~~
kubectl log pod myapp-pod --container=init-myservice
kubectl log pod myapp-pod --container=init-mydb
~~~

### 创建init所需要的服务
~~~
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服务后,再次查看Pod运行情况

## 额外回顾
当不同的namespace之前,DNS要相互访问的话,需要使用DNS完整全域名访问 在上面的实例中,Pod中定义的init容易所检测的service服务,
~~~
nslookup myservice
nslookup mydb
# 循环检测DNS解析
~~~
这个DNS名称只能用于用同一个namespaces,如果不在同一个命名空间将不能正常解析服务。
想要不通namespaces之间访问,需要使用全称,改成如下的样子
..svc.
~~~
#如果服务在kube-system命名空间
nslookup myservice.kube-system.svc.cluster.local
nslookup mydb.kube-system.svc.cluster.local
~~~
- 一、K8S的安装
- 1.1 安装环境
- 1.2 问题汇总
- 1.3 事前准备
- 1.4 安装配置负载均衡
- 1.5 安装K8S软件
- 1.6 初始化kubeadm
- 1.7 添加控制节点
- 1.8 添加计算节点
- 1.9 安装故障问题处理
- 1.10 安装管理dashboard
- 1.11 编写测试Pod
- 1.12 从外部访问集群中的Pod
- 1.13 部署metrics-server指标采集
- 二、Pod管理
- 2.1 Pod 资源需求和限制
- 2.2 Init 容器
- 2.3 Pod 健康检查(探针)和重启策略
- 2.4 Pod 生命周期(钩子Hook)
- 2.5 静态Pod
- 2.6 初始化容器(init container)
- 2.7 资源限制
- 三、资源控制器
- 3.1 Deployment
- 3.2 StatefulSet
- 3.3 DaemonSet
- 3.4 Job
- 3.5 定时任务
- 3.6 准入控制器
- 3.7 自动伸缩
- 3.8 ReplicaSet
- 四、存储
- 4.1 Secret 管理敏感信息
- 4.2 ConfigMap 存储配置
- 4.3 Volume
- 4.4 PV
- 4.5 PVC
- 4.6 StorageClass
- 4.7 暴露宿主机信息给Pod
- 五、服务Service
- 5.1 Service 资源
- 5.2 服务发现
- 5.3 服务暴露
- 5.4 Ingress 资源
- 5.5 Ingress 专题
- 5.6 traefik 2.X版本使用
- 六、认证、授权、准入控制
- 6.1 服务账户
- 6.2 LimitRange资源与准入控制器
- 6.3 ResourceQuota 资源与准入控制器
- 七、Helm
- 7.1 Helm 安装
- 八、 istio
- 8.1 istio 介绍
- 8.2 iotis 安装
- 九、calico
- 9.1 两种网络模式
- 9.2 全互联模式 与 路由反射模式
- 9.3 BGP跨网段(大型网络)
- 十、Ingress
- 10.1 安装 LoadBalancer
- 10.2 部署 ingress-nginx
- 10.3 Ingress-nginx 的使用
- 10.4 开启TCP和UDP
- 使用中的问题
- CSI Node问题
