k8s学习整理 - 最小单元 pod
近期通过网课学习了李振良老师kubernetes教程。根据老师的课堂内容笔记做了相关的整理,以便于加深理解和后期自查POD 特征docker容器Container容器运行一个服务或多个每个容器有对应的namespacePOD包含多个共享 IPC、Network 和 UTC namespace 的容器,可直接通过 localhost 通信可以访问共享的 Volume,可以访问共享数据无容错性:直接创
·
近期通过网课学习了李振良老师kubernetes教程。根据老师的课堂内容笔记做了相关的整理,以便于加深理解和后期自查
POD 特征
docker容器Container
- 容器运行一个服务或多个
- 每个容器有对应的namespace
POD
- 包含多个共享 IPC、Network 和 UTC namespace 的容器,可直接通过 localhost 通信
- 可以访问共享的 Volume,可以访问共享数据
- 无容错性:直接创建的 Pod 一旦被调度后就跟 Node 绑定,即使 Node 挂掉也不会被重新调度
POD共享机制
共享网络
- 多个容器在网络命名空间
- linux: network namespace隔离
- Cgroup 资源限制
- 容器创建流程
- infor容器
- 业务容器
- 业务容器加入infor容器
apiVersion: v1
kind: Pod
metadata:
name: nginx-demo
labels:
app: nginx-demo
spec:
containers:
- name: nginx
image: nginx
command:
- /bin/sh
- -c
- sleep 3600
image: busybox:1.28.3
imagePullPolicy: IfNotPresent
name: busybox
共享存储
- 相关数据持久化,如
- 临时数据
- 日志
- 业务数据
- 有状态的业务,如mysql,es等
- 数据漂移
- 相关节点数据相互调用
apiVersion: v1
kind: Pod
metadata:
name: my-demo
spec:
containers:
- name: write
image: centos
command: ["bash","-c","for i in {1..100};do echo $i >> /data/hello;sleep 3;done"]
volumeMounts:
- name: data
mountPath: /data
- name: read
image: centos
command: ["bash","-c","tail -f /data/hello"]
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: data
emptyDir: {}
POD镜像拉取策略(imagePullPolicy)
策略模式
- ifNotPresent: 默认值,镜像不存在则拉取
- Always: 每次创建镜像都重新拉取
- Never: Pod 永远不会主动拉取改镜像
策略拉取凭据
- 创建一个image pull secret。并在yaml显示指定
- kubectl create secret docker-registry --docker-server --docker-username --docker-password
- 使用service account账户拉取。
- 每创建一个pod会创建一个对应的服务账户,该账户下有一个关联的image pull secret,实现该POD下所有的image拉取认证统一
导入secret
1、编排yaml导入
# ***获取私有镜像地址的认证***
# 登录私有镜像Harbor
docker login harbor_ip_addr
# 获取认证,需要base64编码
myregistrykey=$(cat ~/.docker/config.json | base64 -w 0)
apiVersion: v1
kind: Secret
metadata:
# Deployment.spec.template.spec.imagePullSecrets.name: register-pull-secret
name: register-pull-secret
namespace: demo
data:
.dockerconfigjson: $myregistrykey
type: kubernetes.io/dockerconfigjson
2、CLI命令创建
kubectl create secrett register-pull-secret --docker-server --docker-username --docker-password -n namespace
编排案例
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx-pull
name: nginx-pull
spec:
replicas: 3
selector:
matchLabels:
app: nginx-pull
template:
metadata:
labels:
app: nginx-pull
spec:
containers:
- name: nginx
image: harbo/nginx # 需要登录的私有镜像仓库
imagePullPolicy: Always # 总是拉取的策略
ports:
- containerPort: 80
imagePullSecrets: # 拉取认证秘钥
- name: register-pull-secret
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
labels:
app: nginx-pull
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
selector:
app: nginx-pull
资源限制
pod和container的资源限制请求
- limits: 总限制
- requests: 启动时请求资源
- 字段: spec.containers[].resources
- limits
- cpu : 限制CPU资源,单位X为整数(代表X核心)或者XMi(代表X/(1000)xcore_num)
- memory: 限制内存资源,单位为
- requests
- cpu
- memory
- limits
---
# 使用kubectl describe node nodeIP 查看node节点的资源利用率
apiVersion: v1
kind: Pod
metadata:
name: frontend
spec:
containers:
- name: db
image: mysql
env:
- name: MYSQL_ROOT_PASSWORD
value: "password"
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
- name: wp
image: wordpress
resources:
requests:
memory: "64Mi"
cpu: "250m" # 1000 = 1核
limits:
memory: "128Mi"
cpu: "500m"
pod 重启策略(restartPolicy)
- Always: 当容器终止退出后,总是重启。默认策略
- OnFailure: 当容器异常退出(非0状态)时,才重启
- Nerver: 容器终止后不重启
- key: Pod.spec.containers.restartPolicy
apiVersion: v1
kind: Pod
metadata:
name: foo
spec:
containers:
- name: busybox
image: busybox
command:
- /bin/sh
- -c
- touch /tmp/healthy;sleep 10;
restartPolicy: OnFailure
健康检查(Probe)
url: [https://kubernetes.io/zh/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/]
类型
- livenessProbe
- 检查失败,将kill容器,并根据restartPolicy重启策略执行
- readinessProbe
- 检查失败,kubernetes会把pod从service endpoints移除
- service endpoints: 动态感知所有POD的IP
- 查看相关的EP: kubectl get ep
- 常用于容器初始化时候的检查。
- 两者可以同时存在
方式
- httpGet
- 发送http请求,接受200-400的状态码即成功
- exec
- 执行shell返回状态码0即成功
- tcpSock
- 发起tcpSock建立成功
apiVersion: v1
kind: Pod
metadata:
name: foo
labels:
test: liveness
spec:
containers:
- name: busybox
image: busybox
command:
- /bin/sh
- -c
- touch /tmp/healthy;sleep 30; rm -rf /tmp/healthy
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5 # 启动延后5秒执行
periodSeconds: 5 # 每5秒执行一次命令
调度约束
指定节点
- NodeName:指定调度到对应的Node
- nodeSelector: 根据标签调度到对应的node
spec:
nodeName: n1
--
spec:
nodeSelector:
env_role: db
为节点标记标签
ps:labels标签操作适用于绝大部分资源对象
kubectl get node
# 标记标签
kubectl label nodes n1 type=db
# 查看标签
kubectl get node --show-labels
# 根据标签过滤
kubectl get node -l type=db
故障排查
POD状态
状态 | 描述 |
---|---|
pendding | pod创建已提交到kubernetes,但是没有顺利创建。比如调度失败,镜像拉取缓慢 |
running | pod 已经成功绑定在某个节点,创建了所有的容器,并至少有一个运行成功,或重启,或启动中 |
successed | 所有节点都运行成功且成功终止,不会重启 |
Unknown | apiserver无法获取pod状态,通常是master与node之间的kubelet通信错误 |
pod调试命令
- kubectl describe 资源 资源名
- kubectl log 资源 资源名
- kubectl exec POD [-c container – command [agrs…]]
更多推荐
已为社区贡献1条内容
所有评论(0)