2、Pod常用操作
1、pause
基础设施容器。为了实现pod内部可以通过localhost通信,每个pod都会启动Infra容器,然后pod内部的其他容器间会共享该容器的网络空间(docker的container模式),此容器只需要维持着网络空间,所以资源消耗很低。
2、查看pod详细信息命令
kubectl get pod -o wide# 查看pod调度的节点及pod ip等信息
kubectl get pod myblog -o yaml|json # 查看完整yaml|json
kubectl describe pod myblog # 查看pod明细信息及事件
kubectl -n test exec -it podName [-c containerName] /bin/sh# 进入容器
kubectl -n test logs -f podName [-c containerName] # 查看日志
kubectl -n test logs -f --tail=111 podName [-c containerName]
3、pod数据持久化
hostPath
定点hostPath挂载,nodeSelector定点。
kubectl get nodes --show-labels # 查看labels
kubectl label node nodeName xx=yy # 给节点打标签
apiVersion: v1
kind: Pod
metadata:
name: myblog
namespace: test
labels:
component: myblog
spec:
volumes: # 本地挂载目录
- name: mysql-data
hostPath:
path: /opt/mysql/data
nodeSelector: # 选择节点挂载
component: mysql
containers:
- name: myblog
image: myblog:v1
env:
- name: MYSQL_HOST
value: '127.0.0.1'
- name: MYSQL_PASSWD
value: '123456'
ports:
- containerPort: 8002
- name: mysql
image: mysql:5.7-utf8
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: '123456'
- name: MYSQL_DATABASE
value: 'myblog'
volumeMounts: # 使用挂载
- name: mysql-data
mountPath: /var/lib/mysql
pv+pvc(待学习)
实现分布式存储。
ceph
glusterfs
nfs
4、服务健康检查
检测容器服务是否健康,不健康会根据重启策略进行操作,2种机制可以分别单独设置。
LivenessProbe探针
存活性探测:判断容器是否存活,即状态是否为running状态。如果状态不健康,kubelet就会kill容器,并根据重启策略是否重启,如果不包含探针,kubelet认为容器探针返回值永远成功。
...
containers:
- name: myblog
image: mysql:5.1
livenessProbe:
httpGet:
path: /blog/index/
port: 8002
schema: HTTP
initialDelaySeconds: 10 # 容器启动后第一次执行探测需要等待多久
periodSeconds: 10 # 执行探测的频率
timeoutSeconds: 2 # 探测超时时间
...
ReadnessProbe探针
可用性探测:判断容器是否正常提供服务。判断容器Ready(1/2)是否为true,为false的话,endpoint controller控制器将此pod的endpoint从对应的svc的endpoint列表中移除,不再将任何请求调度到此pod上,直到下次探测成功。
...
containers:
- name: myblog
image: myblog:v1
readnessProbe:
httpGet:
path: /blog/index/
port: 8002
scheme: HTTP
initialDelaySeconds: 10
timeoutSeconds: 2
periodSeconds: 10
...
探测命令
- exec 通过执行命令来检查服务是否正常,返回为0表示容器健康
- httpGet 通过发送http请求检查是否正常,返回200-399表示容器健康
- tcpSocket 通过容器ip和port执行TCP检查,如果可以建立tcp连接,表示容器健康
其他参数
参数 | 说明 |
---|---|
periodSeconds | 执行探测频率,默认10s,最小1s |
initialDelaySeconds | 容器启动后第一次执行探测时需要等待多少秒 |
timeoutSeconds | 探测超时时间,默认1s,最小1s |
successThreshold | 探测失败后,最少连续探测成功多少次才被认定为成功 |
periodSeconds | 探测成功后,最少连续探测失败多少次才被认定为失败 |
5、重启策略
- Never
无论容器运行状态如何,kubelet都不会重启容器。
- Always 默认
当容器进程退出后,由kebelet自动重启该容器。
- Onfailure
当容器终止运行且退出代码不为0时,由kebelet自动重启该容器。
apiVersion: v1
kind: Pod
metadata:
name: test-restart-policy
spec:
restartPolicy: Always
containers:
- name: busybox
image: busybox
args:
- /bin/sh
- -c
- sleep 10 && exit 1
6、镜像拉取策略
spec:
containers:
- name: myblog
image:myblog
imagePullPolicy: IfNotPresent
- Always 总是从远程仓库拉取
- IfNotPresent 本地有使用本地,本地没有拉取远程仓库
- Never 只使用本地镜像,没有报错
7、资源限制
基础资源:cpu和内存
k8s采用requests和limits两种类型参数对资源进行预分配和使用限制。
...
containers:
- name: myblog
image: myblog:v1
env:
- name: MYSQL_HOST
value: '127.0.0.1'
ports:
- containerPort: 8002
resources:
requests:
memory: 100Mi
cpu: 50m
limit:
memory: 500Mi
cpu: 100m
...
requests
- 容器使用最小资源的需求,作用于scheduler阶段,作为容器调度时资源分配的判断
- 只有当前节点可分配的资源量>=request时才允许将pod调度到此节点
- request参数不限制容器的最大可使用资源
- request.cpu被转换为docker的--cpu-share参数,与cgroup cpu.shares功能相同
- request.memory没有对应的docker参数,仅作为k8s调度依据
limits
- 容器能使用的资源最大值
- 设置为0,资源可无限使用
- pod内存超过limit,会被oom(内存溢出)
- cpu超过limit,不会被kill,但是会限制不超过limit值
- limits.cpu会被转换为docker的-cpu-quato
- limits.memory会被转换为docker的-memory参数,限制容器使用最大内存
1 core = 1000m
8、yaml优化
查看代码
apiVersion: v1
kind: Pod
metadata:
name: myblog
namespace: test
labels:
component: myblog
spec:
volumes:
- name: mysql-data
hostPath:
path: /opt/mysql/data
nodeSelector: # 使用节点选择器将pod调度到指定label的节点
component: mysql
containers:
- name: myblog
image: 172.21.51.67:5000/myblog
env:
- name: MYSQL_HOST
value: '127.0.0.1'
- name: MYSQL_PASSWD
value: '123456'
ports:
- containerPort: 8002
resources:
requests:
memory: 100Mi
cpu: 50m
limits:
memory: 500Mi
cpu: 100m
livenessProbe:
httpGet:
path: /blog/index/
port: 8002
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 15
timeoutSeconds: 2
readnessProbe:
httpGet:
path: /blog/index/
port: 8002
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 15
timeoutSeconds: 2
- name: mysql
image: 172.21.51.67:5000/mysql:5.7-utf8
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: '123456'
- name: MYSQL_DATABASE
value: 'myblog'
resources:
requests:
memory: 100Mi
cpu: 50m
limits:
memory: 500Mi
cpu: 100m
livenessProbe:
tcpSocket:
port: 3306
initialDelaySeconds: 5
periodSeconds: 10
readnessProbe:
tcpSocket:
port: 3306
initialDelaySeconds: 5
periodSeconds: 10
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
1、中间件作为公共资源,需要拆分开。但是myblog调用mysql的ip地址发生了变化,可以将mysql固定到宿主机的NodePort上(因为磁盘挂载在指定机器上),使用hostNetwork。
mysql.yaml
查看代码
apiVersion: v1
Kind: Pod
metadata:
name: mysql
namespace: test
labels:
component: mysql
spec:
hostNetwork: true # 容器占什么端口,就起什么端口
volumes:
- name: mysql-data
hostPath:
path: /opt/mysql/data
nodeSelector: # 使用节点选择器将pod调度到指定label的节点
component: mysql
containers:
- name: mysql
image: 172.21.51.67:5000/mysql:5.7-utf8
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: '123456'
- name: MYSQL_DATABASE
value: 'myblog'
resources:
requests:
memory: 100Mi
cpu: 50m
limits:
memory: 500Mi
cpu: 100m
livenessProbe:
tcpSocket:
port: 3306
initialDelaySeconds: 5
periodSeconds: 10
readnessProbe:
tcpSocket:
port: 3306
initialDelaySeconds: 5
periodSeconds: 10
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
查看代码
apiVersion: v1
kind: Pod
metadata:
name: myblog
namespace: test
labels:
component: myblog
spec:
containers:
- name: myblog
image: 172.21.51.67:5000/myblog
imagePullPolicy: IfNotPresent
env:
- name: MYSQL_HOST
value: 'Node IP' # 使用数据库Node IP
- name: MYSQL_PASSWD
value: '123456'
ports:
- containerPort: 8002
resources:
requests:
memory: 100Mi
cpu: 50m
limits:
memory: 500Mi
cpu: 100m
livenessProbe:
httpGet:
path: /blog/index/
port: 8002
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 15
timeoutSeconds: 2
readnessProbe:
httpGet:
path: /blog/index/
port: 8002
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 15
timeoutSeconds: 2
2、环境变量,敏感信息,安全隐患,使用secret和ConfigMap,实现业务配置统一管理。镜像和配置文件分离开,提高可移植性。
configmap可以管理配置文件或环节变量
configmap
apiVersion: v1
kind: ConfigMap
metadata:
name: myblog
namespace: test
data:
MYSQL_HOST: '192.168.1.1'
MYSQL_PORT: '3306'
# 或者使用命令创建,从文件中创建
kubectl create configmap mysql-cm --from-env-file=configmap.txt
env:
- name: HostName
valueFrom:
configMapKeyRef:
name: mysql-cm # cmName
key: MYSQL_HOST
- name: Password
valueFrom:
configMapKeyRef:
name: mysql-cm
key: MYSQL_PORT
Secret
管理敏感类信息,默认使用base64编码存储,有3种类型:
- Service Account(sa) 用来访问k8s api,由k8s自动创建,并且会自动挂载到Pod的/run/secrets/kubernetes.io/serviceaccount目录中,创建sa后,pod中指定sa,自动创建该sa的Secret。
- Opaque base64编码格式的secret,用来存储密码和密钥文件。
- kubernetes.io/dockerconfigjson 用来存储私有docker registry的认证信息
apiVersion: v1
kind: Secret
metadata:
name: secret-test
namespace: test
type: Opaque
data:
MYSQL_USER: cm9vdA== # echo -n root |base64
MYSQL_PASSWD: MTIzNDU2
# 手动创建secret
cat secret.txt
MYSQL_USER=root
MYSQL_PASSWD=123456
kubectl create secret generic myblog --from-env-file=secret.txt
使用secret
env:
- name: MYSQL_USER
valueFrom:
secretKeyRef:
name: myblog
key: MYSQL_USER
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: myblog
key: MYSQL_PASSWD
- name: MYSQL_DATABASE
value: 'myblog'
9、pod状态和生命周期
状态
Pending API Server已经创建该Pod,等待调度器调度
ContainerCreating 拉取镜像启动容器中
Running Pod内 容器已经创建,且至少有一个容器处于运行状态、正在启动状态或正在重启状态
Succeeded|Completed Pod内所有容器均已成功执行退出,且不再重启
Failed|Error Pod内所有容器均已退出,但至少有一个处于退出失败状态
CrashLoopBackOff Pod内容器启动失败,比如配置文件丢失导致主进程启动失败
Unknown 由于某种原因无法获取Pod状态,可能由于网络通信不畅
生命周期
initContainer(初始化容器)->创建MainContainer过程(创建前hook->livenessProbe->ReadnessProbe->创建完成后hook)
初始化容器功能:
- 验证业务应用依赖的组件是否均已启动
- 修改目录的权限
- 调整系统参数