一、Pod是个什么东西?
在K8S中,Pod是创建或部署的最小/最简单的基本单位,一个Pod是由多个Docker容器组成的容器组成的。pod中包含了业务容器和pause容器。其中pause容器是负责监控pod整体状态和保证pod和pod之前进行通信的“根容器”。如图:
关于pod后面我们会详细学习,所以大概在这里只需了解一下pod的组成即可。
二、k8s pod yaml文件参数详述(可略)
apiVersion: v1 //版本
kind: Pod //类型,pod
metdata: //元数据
name: string //元数据,pod的名字
namespace: string //元数据,pod的命名空间
labels: //元数据,标签列表
- name: string //元数据,标签的名字
annotations: //元数据,自定义注解列表
- name: string //元数据,自定义注解名字
spec: //pod中容器的详细定义
containers: //pod中的容器列表,可以有多个容器
- name: string //容器的名称
images: string //容器中的镜像
imagesPullPolicy: [ Always | Never | IfNotPresent ] //获取镜像的策略,默认值为Always,每次都尝试重新下载镜像
command: [ string ] //容器的启动命令列表(不配置的话使用镜像内部的命令)
args: [ string ] //容器参数列表
workingDir: string //容器的工作目录
volumeMounts: //挂载到容器内部的存储卷设置
- name: string
mountPath: string //存储卷在容器内部Mount的绝对路径
readOnly: boolean //默认值为读写
ports: //容器需要暴露的端口号列表
- name: string
containerPort: int //容器要暴露的端口
hostPort: int //容器所在主机监听的端口 (容器暴漏端口映射到宿主机的端口,设置hostPort时同一台宿主机将不能再启动该容器的第2份副本)
protocol: string //TCP和UDP,默认值为TCP
env: //容器运行前要设置的环境列表
- name: string
value: string
resources:
limits: //资源限制,容器的最大可用资源数量
cpu: string
memory: string
requeste: //资源限制,容器启动的初始化资源数量
cpu: string
memory: string
livenessProbe: //pod内容器健康检查的设置
exec:
command: [ string ] //exec方式需要指定的命令或脚本
httpGet: //通过httpget检查健康
path: string
port: number
host: string
scheme: string
httpHeaders:
- name: string
value: string
tcpSocket: //通过tcpSocket检查健康
port: number
initialDelaySeconds: 0 //首次检查时间
timeoutSeconds: 0 //检查超时时间
periodSeconds: 0 //检查间隔时间
successThreshold: 0
faillureThreshold: 0
securityCountext: //安全配置
privileged: false
restartPolicy: [ Always | Never | OnFailure ] //重启策略,默认值为Always
nodeSelector: object //节点选择,表示将该pod调到包含这些label的Node上,以key:value格式指定
imagesPullSecrets:
- name: string
hostNetwork: false //是否使用主机网络模式,启用Docker网桥,默认false
volumes: //在该pod上定义共享存储卷列表
- name: string
emptyDir: {} //是一种与pod同生命周期的存储卷,是一个临时的目录,内容为空
hostPath: //pod所在主机上的目录,将被用于容器中mount的目录
path: string
secret: //类型为secret的存储卷
secretName: string
item:
- key: string
path: string
configMap: //类型为configMap的存储卷
name: string
三、通过yaml创建一个pod对象
再创建yaml之前,我们引入一个新概念(kubectl expose):
kubectl expose
将资源暴露为新的Kubernetes Service。
指定deployment、service、replica set、replication controller或pod ,并使用该资源的选择器作为指定端口上新服务的选择器。deployment 或 replica set只有当其选择器可转换为service支持的选择器时,即当选择器仅包含matchLabels组件时才会作为暴露新的Service。
资源包括(不区分大小写):
pod(po),service(svc),replication controller(rc),deployment(deploy),replica set(rs)
语法
$ expose (-f FILENAME | TYPE NAME) [--port=port] [--protocol=TCP|UDP] [--target-port=number-or-name] [--name=name] [--external-ip=external-ip-of-service] [--type=type]
示例
为RC的nginx创建service,并通过Service的80端口转发至容器的8000端口上。
kubectl expose rc nginx --port=80 --target-port=8000
由“nginx-controller.yaml”中指定的type和name标识的RC创建Service,并通过Service的80端口转发至容器的8000端口上。
kubectl expose -f nginx-controller.yaml --port=80 --target-port=8000
我们可以看到通过expose 我们可以将内部端口暴露到外部端口。与下面的配置文件其实是一样的意思:
1.配置文件
vim nginx-rc.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 1
selector:
matchLabels:
name: nginx
template:
metadata:
labels:
name: nginx
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service-nodeport
spec:
ports:
- port: 80
targetPort: 80
protocol: TCP
type: NodePort
selector:
name: nginx
2.创建
kubectl create -f nginx-rc.yaml
3.访问
输入kubectl get svc 查看映射的端口
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 4d4h
nginx-service-nodeport NodePort 10.97.108.102 <none> 80:30812/TCP 57s
其中30812就是我们要访问的端口
输入[nodeIP]或[masterIP]:30812即可访问,成功后如图: