01 master节点
举个栗子:你启动3个nginx 副本,此时你想扩容至5个,输入完对应命令后,kube-apiserver会通通知cm,cm实施具体的容器扩缩容操作。
02 Node节点
查看kube-proxy工作模式
iptables在规则多的时候,性能急剧下降,所以我们一般使用ipvs。eBPY将来可能会取代kube-proxy。
03 Pod
3.0 pod概念
k8s查看pod是通过命名空间隔离的,需指定命名空间,不指定默认是default namespace;
具有命名空间(namespace)隔离性:Pod,RC,RS,Deployment,Setfulset,Service,Ingress,HPA,ConfigMap等
不具有命名空间隔离性的:PV,RPAC,srorageclass,ingressclass等
不同namespace有不同资源,但也可以具有相同名称的资源。
3.1自定义一个pod
[root@k8s-master01 ~]# less pod.yaml
[root@k8s-master01 ~]# pwd
/root
[root@k8s-master01 ~]# cat pod.yaml
apiVersion: v1 # 必选,API的版本号
kind: Pod # 必选,类型Pod
metadata: # 必选,元数据
name: nginx # 必选,符合RFC 1035规范的Pod名称
# namespace: default # 可选,Pod所在的命名空间,不指定默认为default,可以使用-n 指定namespace
labels: # 可选,标签选择器,一般用于过滤和区分Pod
app: nginx
role: frontend # 可以写多个
annotations: # 可选,注释列表,可以写多个
app: nginx
spec: # 必选,用于定义容器的详细信息
# initContainers: # 初始化容器,在容器启动之前执行的一些初始化操作
# - command:
# - sh
# - -c
# - echo "I am InitContainer for init some configuration"
# image: busybox
# imagePullPolicy: IfNotPresent
# name: init-container
containers: # 必选,容器列表
- name: nginx # 必选,符合RFC 1035规范的容器名称
image: nginx:1.15.2 # 必选,容器所用的镜像的地址
imagePullPolicy: IfNotPresent # 可选,镜像拉取策略, IfNotPresent: 如果宿主机有这个镜像,那就不需要拉取了. Always: 总是拉取, Never: 不管是否存储都不拉去
command: # 可选,容器启动执行的命令 ENTRYPOINT, arg --> cmd
- nginx
- -g
- "daemon off;"
workingDir: /usr/share/nginx/html # 可选,容器的工作目录
# volumeMounts: # 可选,存储卷配置,可以配置多个
# - name: webroot # 存储卷名称
# mountPath: /usr/share/nginx/html # 挂载目录
# readOnly: true # 只读
ports: # 可选,容器需要暴露的端口号列表
- name: http # 端口名称
containerPort: 80 # 端口号
protocol: TCP # 端口协议,默认TCP
env: # 可选,环境变量配置列表
- name: TZ # 变量名
value: Asia/Shanghai # 变量的值
- name: LANG
value: en_US.utf8
# resources: # 可选,资源限制和资源请求限制
# limits: # 最大限制设置
# cpu: 1000m
# memory: 1024Mi
# requests: # 启动所需的资源
# cpu: 100m
# memory: 512Mi
# startupProbe: # 可选,检测容器内进程是否完成启动。注意三种检查方式同时只能使用一种。
# httpGet: # httpGet检测方式,生产环境建议使用httpGet实现接口级健康检查,健康检查由应用程序提供。
# path: /api/successStart # 检查路径
# port: 80
# readinessProbe: # 可选,健康检查。注意三种检查方式同时只能使用一种。
# httpGet: # httpGet检测方式,生产环境建议使用httpGet实现接口级健康检查,健康检查由应用程序提供。
# path: / # 检查路径
# port: 80 # 监控端口
# livenessProbe: # 可选,健康检查
#exec: # 执行容器命令检测方式
#command:
#- cat
#- /health
#httpGet: # httpGet检测方式
# path: /_health # 检查路径
# port: 8080
# httpHeaders: # 检查的请求头
# - name: end-user
# value: Jason
# tcpSocket: # 端口检测方式
# port: 80
# initialDelaySeconds: 60 # 初始化时间
# timeoutSeconds: 2 # 超时时间
# periodSeconds: 5 # 检测间隔
# successThreshold: 1 # 检查成功为2次表示就绪
# failureThreshold: 2 # 检测失败1次表示未就绪
# lifecycle:
# postStart: # 容器创建完成后执行的指令, 可以是exec httpGet TCPSocket
# exec:
# command:
# - sh
# - -c
# - 'mkdir /data/ '
# preStop:
# httpGet:
# path: /
# port: 80
# exec:
# command:
# - sh
# - -c
# - sleep 9
restartPolicy: Always # 可选,默认为Always,容器故障或者没有启动成功,那就自动该容器,Onfailure: 容器以不为0的状态终止,自动重启该容器, Never:无论何种状态,都不会重启
#nodeSelector: # 可选,指定Node节点
# region: subnet7
# imagePullSecrets: # 可选,拉取镜像使用的secret,可以配置多个
# - name: default-dockercfg-86258
# hostNetwork: false # 可选,是否为主机模式,如是,会占用主机端口
# volumes: # 共享存储卷列表
# - name: webroot # 名称,与上述对应
# emptyDir: {} # 挂载目录
# #hostPath: # 挂载本机目录
# # path: /etc/hosts
解决vim 黏贴多行乱码问题可使用set paste:vim 使用set paste 解决多行复制粘贴乱序问题_FeelTouch-CSDN博客
1核cpu=1000m
创建pod
kubectl create -f pod.yaml
删除镜像命令:等待30s pod删除。
pod一般是用deployment,statefulset,daeminset管理;
3.2 Pod探针
- StartupProbe(最新):k8s1.16版本后新加的探测方式,用于判断容器内应用程序是否已经启动。如果配置了startupProbe,就会先禁止其他的探测,直到它成功为止,成功后将不在进行探测。
- LivenessProbe:用于探测容器是否运行,如果探测失败,kubelet会根据配置的重启策略进行相应的处理。若没有配置该探针,默认就是success。
- ReadinessProbe:一般用于探测容器内的程序是否健康,它的返回值如果为success,那么久代表这个容器已经完成启动,并且程序已经是可以接受流量的状态。
- 上面三种健康检查方式同时只能使用一种;
3.3 Pod探针的检测方式
- ExecAction:在容器内执行一个命令,如果返回值为0,则认为容器健康。
- TCPSocketAction:通过TCP连接检查容器内的端口是否是通的,如果是通的就认为容器健康。(不可靠,比如应用程序假死,而此时telnet和curl都是正常)
- HTTPGetAction(生产推荐使用):通过应用程序暴露的API地址来检查程序是否是正常的,如果状态码为200~400之间,则认为容器健康。
3.4 k8s引入StartupProbe原因
# initialDelaySeconds: 60 # 初始化时间
# timeoutSeconds: 5 # 超时时间
# periodSeconds: 10 # 检测间隔
# successThreshold: 1 # 检查成功为1次表示就绪
# failureThreshold: 5 # 检测失败5次表示未就绪
是单次检查应该是10 + 5 = 15秒(periodSeconds + timeoutSeconds),最长的重启时间为(10 + 5)* 5
(periodSeconds + timeoutSeconds) * failureThreshold.
如程序有问题,则经过75s+60s(初始化时间)还没起起来,则kubelet则会杀掉重启,然后再经过135s还是没通你通过,kubelet再次重启,进入死循环。为了解决这个问题,k8s引入了StartupProbe探针。如果程序启动特别慢,那就要配置StartupProbe,StartupProbe通过后才依次进行后面的livenessProbe(kubelet不杀应用)和readinessProbe(分配流量)
3.5 探针检查参数配置
# initialDelaySeconds: 60 # 初始化时间,启动后等多久去检查
# timeoutSeconds: 2 # 超时时间
# periodSeconds: 5 # 检测间隔
# successThreshold: 1 # 检查成功为1次表示就绪
# failureThreshold: 2 # 检测失败2次表示未就绪
pod.yaml打开对startupProbe的注释
kubectl create -f pod.yaml
kubectl describe po nginx
pod不可以直接进行replace或apply去替换,就算替换成功也不能滚动发布,所以先删除;
然后修改:vim pod.yaml
验证成功
测试
pod退出流程
pod.yaml配置如下,虽然prestop里sleep 90s,但实际停止nginx这个pod只花费34s左右,显然sleep 90s未生效。原因是pod.yaml里的terminationGracePeriodSeconds是30s。
[root@k8s-master01 ~]# cat pod.yaml
apiVersion: v1 # 必选,API的版本号
kind: Pod # 必选,类型Pod
metadata: # 必选,元数据
name: nginx # 必选,符合RFC 1035规范的Pod名称
# namespace: default # 可选,Pod所在的命名空间,不指定默认为default,可以使用-n 指定namespace
labels: # 可选,标签选择器,一般用于过滤和区分Pod
app: nginx
role: frontend # 可以写多个
annotations: # 可选,注释列表,可以写多个
app: nginx
spec: # 必选,用于定义容器的详细信息
# initContainers: # 初始化容器,在容器启动之前执行的一些初始化操作
# - command:
# - sh
# - -c
# - echo "I am InitContainer for init some configuration"
# image: busybox
# imagePullPolicy: IfNotPresent
# name: init-container
containers: # 必选,容器列表
- name: nginx # 必选,符合RFC 1035规范的容器名称
image: nginx:1.15.2 # 必选,容器所用的镜像的地址
imagePullPolicy: IfNotPresent # 可选,镜像拉取策略, IfNotPresent: 如果宿主机有这个镜像,那就不需要拉取了. Always: 总是拉取, Never: 不管是否存储都不拉去
command: # 可选,容器启动执行的命令 ENTRYPOINT, arg --> cmd
- nginx
- -g
- "daemon off;"
workingDir: /usr/share/nginx/html # 可选,容器的工作目录
# volumeMounts: # 可选,存储卷配置,可以配置多个
# - name: webroot # 存储卷名称
# mountPath: /usr/share/nginx/html # 挂载目录
# readOnly: true # 只读
ports: # 可选,容器需要暴露的端口号列表
- name: http # 端口名称
containerPort: 80 # 端口号
protocol: TCP # 端口协议,默认TCP
env: # 可选,环境变量配置列表
- name: TZ # 变量名
value: Asia/Shanghai # 变量的值
- name: LANG
value: en_US.utf8
# resources: # 可选,资源限制和资源请求限制
# limits: # 最大限制设置
# cpu: 1000m
# memory: 1024Mi
# requests: # 启动所需的资源
# cpu: 100m
# memory: 512Mi
# startupProbe: # 可选,检测容器内进程是否完成启动。注意三种检查方式同时只能使用一种。
# httpGet: # httpGet检测方式,生产环境建议使用httpGet实现接口级健康检查,健康检查由应用程序提供。
# path: /api/successStart # 检查路径
# port: 80
# tcpSocket:
# port: 80
# readinessProbe: # 可选,健康检查。注意三种检查方式同时只能使用一种。
# httpGet: # httpGet检测方式,生产环境建议使用httpGet实现接口级健康检查,健康检查由应用程序提供。
# path: / # 检查路径
# port: 80 # 监控端口
# livenessProbe: # 可选,健康检查
# exec: # 执行容器命令检测方式
# command:
# - ls
# #httpGet: # httpGet检测方式
# # path: /_health # 检查路径
# # port: 8080
# # httpHeaders: # 检查的请求头
# # - name: end-user
# # value: Jason
# tcpSocket: # 端口检测方式
# port: 80
# initialDelaySeconds: 3 # 初始化时间
# timeoutSeconds: 2 # 超时时间
# periodSeconds: 2 # 检测间隔
# successThreshold: 1 # 检查成功为2次表示就绪
# failureThreshold: 1 # 检测失败1次表示未就绪
lifecycle:
# postStart: # 容器创建完成后执行的指令, 可以是exec httpGet TCPSocket
# exec:
# command:
# - sh
# - -c
# - 'mkdir /data/ '
preStop:
# httpGet:
# path: /
# port: 80
exec:
command:
- sh
- -c
- sleep 90
restartPolicy: Always # 可选,默认为Always,容器故障或者没有启动成功,那就自动该容器,Onfailure: 容器以不为0的状态终止,自动重启该容器, Never:无论何种状态,都不会重启
#nodeSelector: # 可选,指定Node节点
# region: subnet7
# imagePullSecrets: # 可选,拉取镜像使用的secret,可以配置多个
# - name: default-dockercfg-86258
# hostNetwork: false # 可选,是否为主机模式,如是,会占用主机端口
# volumes: # 共享存储卷列表
# - name: webroot # 名称,与上述对应
# emptyDir: {} # 挂载目录
# #hostPath: # 挂载本机目录
# # path: /etc/hosts
---------------教程来源:51cto 杜宽老师k8s课程的学习笔记 -------------