一.POD 简介
最小部署单元
一组容器的集合
一个Pod中的容器共享网络命名空间
pod是短暂
二.POD容器分类
Infrastructure Container: 基础容器
维护整个Pod网络空间
InitContainers: 初始化容器
先于业务容器开始执行
Containers: 业务员容器
并行启动
三.镜像拉取策略(imagePullPolicy)
ifNotPresent: 默认值,镜像在宿主机上不存在时才拉取
Always: 每次创建Pod都会重新拉取一次镜像
Never: Pod永远都不会拉取这个镜像
kubectl get deploy/nginx-deployment -o yaml | grep imagePull #查看镜像拉取策略
配置拉取私有仓库镜像
一般我们在共有仓库拉取镜像是可以直接拉取,不需要验证,单如果需要拉取的镜像在私有仓库,就需要配置认证了。
# nginx-deployment.yaml
---
#控制器定义
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
# 被控制对象定义
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.15.4
ports:
- containerPort: 80
上面的yaml文件中是默认去共有仓库拉取nginx镜像。
3.1.登录仓库
在一台能访问私有仓库的服务器上使用docker login 登录一次仓库,会产生一个/root/.docker/config.json文件,这个文件就是在本地保存的凭证。
3.2.编写registry-pull-sercrt.yaml
# registry-pull-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: registry-pull-secret
# namespace: web
data:
.dockerconfigjson: ewoJImF1dGhzIjogewoJCSJyZ]XxxxxxxxxxlIjogewoJCQkxxxxxCI6ICJZV1J0YVc0NlNFOxxxxxxxxwKCSJIdHRwSxxxxxxxQkiVXNlci1BZ2VudCI6xxxxxxx2xpZW50LzE
4LjA5LjcgKGxpbnV4KSIKCX0KfQ==
type: kubernetes.io/dockerconfigjson
kubectl create -f registry-pull-secret.yaml
kubectl get secret
3.3.在原有的nginx-deployment.yaml配置imagePullSecrets参数
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
imagePullSecrets:
- name: registry-pull-secret
containers:
- name: nginx
image: registry.dockerhub.live/test/http/nginx:v0.1
ports:
- containerPort: 80
3.4.应用变更
kubectl apply -f nginx-deployment.yaml
四.POD资源限制
limit限制容器能使用的最大资源
spec.containes[].resources.limits.cpu
spec.containes[].resources.limits.memory
requests现在容器服务时需要的最小资源,如果该node节点不满足该要求,则不会将容器分配到该节点
spec.containes[].resources.requests.cpu
spec.containes[].resources.requests.memory
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
# 被控制对象定义
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
resources:
requests:
memory: "100Mi"
cpu: "300m"
limits:
memory: "500Mi"
cpu: "1000m"
image: nginx:1.15.4
ports:
- containerPort: 80
kubectl describe node 192.168.244.227 查看node详细信息
kubectl get ns 获取当前所有的命名空间
五.重启策略
Always: 当容器终止退出后,总是重启容器,默认策略。
OnFailure: 当容器异常退出(退出状态码非0)时,才重启容器。
Never: 当容器终止退出,从不重启容器。
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- port: 80
targetPort: 80
restartPolicy: Always
六.健康检查
Probe有以下两种类型:
livenessProbe:
如果检查失败,将容器杀死,根据Pod的restartPolicy来操作
readinessProbe:
如果检查失败,Kubernetes会把Pod从service endpoints中剔除
Probe支持以下三种检查方法:
httpGet:
发起HTTP请求,返回200-400访问状态码为成功
exec:
执行Shell命令返回状态码是0为成功
tcpSocket:
发起TCP Socket建立成功
apiVersion: v1
kind: Pod
metadata:
name: goproxy
labels:
app: goproxy
spec:
containers:
- name: goproxy
image: /goproxy:0.1
ports:
- containerPort: 8080
readinessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
livenessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 30
periodSeconds: 20
七.调度约束
给node打标签
kubectl label nodes 192.168.244.226 platform=yalla
查看node标签
kubectl get nodes --show-labels
#将pod根据标签分配到指定node下面
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
nodeSelector:
platform: yalla
- name: nginx
image: nginx
ports:
- port: 80
targetPort: 80
restartPolicy: Always
八.故障排查
Pending Pod创建已经提交到Kubernetes。但是,因为某种原因不能顺利创建。例如下载镜像慢,调度不成功
Running Pod已经绑定到一个节点,并且已经创建了所有容器。至少有一个容器正在运行中,或正在启动或重新启动。
Succeeded Pod中的所有容器都成功终止,不会重新启动
Failed Pod中的所有容器都已成功终止,不会重新启动。
UnKnown 由于某种原因apiserver无法获取Pod的状态,通常是由于Master与Pod所在的主机通信出错。
kubectl describe TYPE/NAME
kubectl logs pod