Pod创建多个容器并访问指定容器
本文章案例是采用helm提供的模板来管理kubernates,如果您想了解helm,您可以访问
helm docs进行了解。
文章目录
- Pod创建多个容器并访问指定容器
- 一、创建Deployment模板
- 二、运行并查看Pod信息
- 三、访问指定Pod中的某一个容器
一、创建Deployment模板
如果您对Kubernates还没有了解的话,建议您可以先访问
kubernates中文文档, 否者以下内容可能让您觉得难以理解。
#版本号
apiVersion: apps/v1
#资源类型
kind: Deployment
# 源数据
metadata:
name: {{ .Values.componentName }}
## 命名空间
namespace: {{ .Values.namespace }}
## 标签
labels:
{{- include "seeker-file-server.labels" . | nindent 4 }}
spec:
## 副本数
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
{{- include "seeker-file-server.selectorLabels" . | nindent 6 }}
template:
metadata:
{{- with .Values.podAnnotations }}
annotations:
{{- toYaml . | nindent 8 }}
{{- end }}
labels:
{{- include "seeker-file-server.selectorLabels" . | nindent 8 }}
spec:
{{- with .Values.imagePullSecrets }}
## 镜像拉取时的认证
imagePullSecrets:
{{- toYaml . | nindent 8 }}
{{- end }}
serviceAccountName: default
securityContext:
{{- toYaml .Values.podSecurityContext | nindent 8 }}
##Pod要运行的镜像,这里可以是多个。如果您以前的没有看懂也没关系,这里才是重点。
containers:
#容器名字
- name: "file-server"
## file-server容器的镜像地址
image: "{{ .Values.image.repository }}:{{ .Values.image.tag}}
## 镜像拉取策略(IfNotPresent 默认值,表示宿主机上没有该镜像时才拉取。Always 表示每次创建pod时都会重新拉取镜像。Never 表示只使用本地镜像,从不主动拉取镜像。)
imagePullPolicy: "IfNotPresent"
## 启动容器时的命令
command: [ "/bin/sh","-c","/bin/sh /opt/fileServer/startup.sh"]
## 容器启动时的一些挂载信息
resources:
volumeMounts:
- name: localtime
mountPath: /etc/localtime
省略......
## 容器启动时一些环境变量的设置
env:
- name: SERVER_PORT
value: "80"
- name: TZ
value: "Asia/Shanghai"
- name: LANG
value: "en_US.UTF-8"
省略....
ports:
- name: http
# 容器启动时的端口
containerPort: "80"
# 采用的协议
protocol: TCP
## 创建第二个容器
- name: nginx
image: "{{ .Values.image.nginxRepository }}:{{ .Values.image.nginxTag }}"
imagePullPolicy: "IfNotPresent"
ports:
- name: nginx
containerPort: {{ .Values.containerPort.nginx }}
protocol: TCP
env:
- name: TZ
value: "Asia/Shanghai"
- name: LANG
value: "en_US.UTF-8"
resources:
command: [ "/bin/sh", "-c", "nginx && tail -f /dev/null" ]
volumes:
- name: localtime
hostPath:
path: /etc/localtime
- name: timezone
hostPath:
path: /etc/timezone
省略...
{{- with .Values.nodeSelector }}
nodeSelector:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with .Values.affinity }}
affinity:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with .Values.tolerations }}
tolerations:
{{- toYaml . | nindent 8 }}
{{- end }}
以上模板其实就是创建一个deployment控制器,在containers有两个容器,一个是file-server,另一个是nginx。分别给它们挂载了一些信息和初始化一些环境变量。然后指定启动容器时的指令。
二、运行并查看Pod信息
如果只是使用k8s运行,那么就只需要使用命令kubectl create 文件名
即可,如果采用helm指令,那么采用helm install 文件名
。
(1)查看Pod信息
kubectl get pod -n nameSpace,可以看到此时Pod在REDAY状态的已经有两个,也就是file-server和nginx容器。

(2)查看指定pod详细信息
kubectl describe pod podName -n nameSpace,比如我要查看rtm-dashboard-file-server-5c89974c9c-2mlrj的信息,我可以使用指令:kubectl describe pod rtm-dashboard-file-server-5c89974c9c-2mlrj -n shared

三、访问指定Pod中的某一个容器
绝大数情况下,一个pod应该只创建一个类型的容器,但是也有偶然情况。就好上面模板在一个pod中创建了两种容器,一个叫file-server,一个叫nginx,
如果使用 kubectl exec -it podName -n nameSpace bash`命令进入容器,那么k8s会默认进入第一个容器。但是如果我想进入第二个容器怎么办呢?
使用指令:kubectl exec -it pod/podName -c containerName -n nameSpace bash
以刚刚创建的Pod为例,创建了两个容器,分别叫file-server和nginx。
(1)通过kubectl get pod -n nameSpace查看pod名字,看到Pod的名字叫rtm-dashboard-file-server-5c89974c9c-2mlrj

(2) 进入nginx容器
kubectl exec -it pod/rtm-dashboard-file-server-5c89974c9c-2mlrj -c nginx -n shared bash,可以查到已经进入了nginx这个容器。

(3) 进入file-server容器
kubectl exec -it pod/rtm-dashboard-file-server-5c89974c9c-2mlrj -c file-server -n shared bash