k8s为什么需要Pod作为资源最小单位
容器本身的使用都是基于单进程(包括子进程),也就是命名空间里进程为1的,可以接受并处理信号,所以进程终止容器就退出了
怎么考虑需要把多个容器放到一个Pod中
实践中都应该把应用构建在单个Pod中,便于容器的亲量化设计,尤其是无状态应用
前提条件
Pod 本身并不能自愈,节点故障后也无法实现自动迁移,导致最终Pod被删除,而k8s引入Controller(控制器)的概念来管理 Pod 可以实现众多的功能(水平扩展、故障自愈、版本更新等等)
Kubernetes 中,广泛使用的控制器有:Deployment、StatefulSet、DaemonSet
自动生成Pod yaml文件方式
kubectl create deployment web --image=nginx -o yaml --dry-run > nginx.yaml
#创建一个deployment控制器的Pod,并不直接运行而是生成配置保存
kubectl get deployment nginx -o=yaml --export > ngnix1.yaml
#获取已经运行的deployment控制器的Pod,导出yaml配置
生成基础配置说明
cat nginx.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: web
name: web
spec:
replicas: 1
selector:
matchLabels:
app: web
strategy: {}
#以上为控制层
template:
metadata:
creationTimestamp: null
labels:
app: web
spec:
containers:
- image: nginx
name: nginx
resources: {}
#以上为被控制层
status: {}
yaml结构
k8s系统将一切事物抽象成API资源,而“对象”就是“资源”的实例,是持久化的实体,实体表示整个集群的状态
可以这样理解: 资源控制层就是资源,被控制层就是对象
固定的5个第一层字段(3个嵌套字段)
可以使用命令帮助文档:kubectl explain deployment
apiVersion
kind
metadata(嵌套字段)
spec(嵌套字段)
status(嵌套字段)
spec嵌套字段template的作用
在资源控器中才有template字段,定义对象实例而控制器通过其中配置的 Pod Template 信息来创建 Pod
selector和labels的作用关系
labels是定义资源对象的不同功能标签,为了使selector客户端/用户能够识别一组有共同特征或属性的资源对象(用标签给Pod进行分组,可以实现k8s不同服务的筛选器)
Service中通过selector筛选出Pod对象,Pod创建可以基于nodeSelector选择需要自己的节点等等
replicas:定义Pod副本数,提供Pod的冗余性,系统会尽量满足定义的数量,不排除资源不够用的场景,Pod会被驱逐
Pod对象实例容器(containers字段)
explain查看字段:kubectl explain deployment.spec.template.spec.containers
imagePullPolicy
镜像拉取策略,默认docker是基于标签形式,而k8s存在3种方式
ports(列表)
端口暴露
explain查看字段:kubectl explain deployment.spec.template.spec.containers.ports
ReadinessProbe和LivenessProbe(列表)
用于Pod健康探测
可以看之前写的文章:点击访问
args和command(列表)
指定容器启动时运行的命令和参数,要理解先要理解dockerfile中的CMD和ENTRYPOINT
command和args同时存在:覆盖dockerfile中默认定义,否则相反
command写了,args没有写:覆盖dockerfile中的CMD和ENTRYPOINT(如果都指定的话),自己作为无参数
command没写,args写了:那么Docker默认配置的ENTRYPOINT的命令行会被执行,args作为参数
env和envFrom
给容器注入环境变量,由于容器隔离性,容器的一些初步配置带来不便,而传入环境变量大大可以解决这种不便(系统要支持变量传入)
securityContext
安全上下文定义了Pod或容器的特权和访问控制设置,安全上下文是可以应用到Pod或者是具体哪一个容器中,参数存在一些区别(优先级为容器>Pod)
Linux 特殊权限 SUID,SGID,SBIT 点击访问
Linux capabilities 是基于SUID的安全的思考 点击访问
SELinux 点击访问
allow-privileged=true github
查看安全上下文说明kubectl explain deployment.spec.template.spec.containers.securityContext
例子
apiVersion: apps/v1
kind: Deployment
metadata:
name: centos
namespace: default
labels:
app: centos
version: "7.6"
spec:
replicas: 1
selector:
matchLabels:
app: centos
version: "7.6"
template:
metadata:
labels:
app: centos
version: "7.6"
spec:
containers:
- name: centos
image: centos:7.6.1810
imagePullPolicy: IfNotPresent
command: [ /usr/sbin/init ]
args: [ "echo 1111 > 1.txt","echo 2222 > 2.txt" ]
ports:
- containerPort: 80
name: nginx
protocol: TCP
hostPort: 80
securityContext:
privileged: true
env:
- name: env1
value: "11 22 33"
- name: env2
value: "44 55 66"
1、hostPort
也就是docker run -p 80:80
2、command和args
注意我随意写的args,其实是无效的参数,但是能正常启动,目前不知道什么原理
3、env
环境变量没有问题
4、privileged
普通权限 mount -a是会报错提示没有权限的,包括yum安装等等操作
目前就完成了最基本的简单实用,对于安全上下文理解有点难,暂未测试效果