Init 容器必须在应用程序容器启动之前运行完成,而应用程序容器是并行运行的,所以 Init 容器能够提供了一种简单的阻塞或延迟应用容器的启动的方法。Init 容器与普通的容器非常像,除了以下两点:
init 的容器作用
因为 init 容器具有与应用容器分离的单独镜像,其启动相关代码具有如下优势:
应用容器会在 init 容器完成并退出后并行启动。
参考官网:init容器说明
下面的例子定义了一个具有 2 个 Init 容器的简单 Pod。 第一个等待 myservice 启动, 第二个等待 mydb 启动。 一旦这两个 Init容器 都启动完成,Pod 将启动 spec 节中的应用容器。
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: busybox:1.28
command: ['sh','-c','echo The app is running! && sleep 3600']
initContainers:
- name: init-myservice
image: busybox:1.28
command: ['sh','-c','until nslookup myservice;do echo waiting for myservice; sleep2; done;']
- name: init-mydb
image: busybox:1.28
command: ['sh','-c','until nslookup mydb; do echo waiting for mydb; sleep 2; done;']
kubectl apply -f myapp.yaml
kubectl get pod
kubectl describe pod myapp-pod
发现开启 init-myservice 容器后,创建步骤停滞,查看 init-myservice 日志进一步查明原因。
kubectl logs myapp-pod -c init-myservice
apiVersion: v1
kind: Service
metadata:
name: myservice
spec:
ports:
- protocol: TCP
port: 80
targetPort: 1111
kubectl create -f myservice.yaml
在此我们可以看到init变为了,1/2,但是pod还是没有完全拉起
apiVersion: v1
kind: Service
metadata:
name: mydb
spec:
ports:
- protocol: TCP
port: 80
targetPort: 2222
kubectl create -f mydb.yaml
kubectl get pod,svc
kubectl describe pod myapp-pod
小结
Pod的核心是运行容器,必须指定容器引擎,比如Docker,启动容器时需要拉取镜像,k8s的镜像拉取策略可以由用户指定:
参考官网:镜像拉取策略说明
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: Always
kubectl apply -f test.yaml
查看pod信息
kubectl describe pod mypod
再次修改yaml文件,更改pod名与策略
再次发布,并查看pod2信息
删除本地镜像,并再次修改yaml文件的pod名
在node节点删除镜像
使用harbor私有仓库存储镜像
需要在node节点设置私有仓库地址
在harbor仓库新建一个项目xy,并上传一个镜像文件用于待会测试
查看下载次数
在k8s的所有node节点上修改私有仓库地址
vim /etc/docker/daemon.json
{
"insecure-registries": ["192.168.48.10"]
}
systemctl daemon-reload
systemctl restart docker
#登录私有仓库,随便选择一个node节点进行登录
docker login 192.168.48.10
#查看登录凭据
cat .docker/config.json |base64 -w 0
制作harbor认证
在master节点创建yaml文件
vim registry-pull-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: registry-pull-secret
data:
.dockerconfigjson: ewoJImF1dGhzIjogewoJCSIxOTIuMTY4LjQ4LjEwIjogewoJCQkiYXV0aCI6ICJZV1J0YVc0NlNHRnlZbTl5TVRJek5EVT0iCgkJfQoJfQp9
type: kubernetes.io/dockerconfigjson
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
imagePullSecrets:
- name: registry-pull-secret
containers:
- name: nginx
image: 192.168.48.10/xy/nginx:v1
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
nodePort: 30080
selector:
app: nginx
进行发布
kubectl apply -f nginx-deploy.yaml
kubectl get pod