一.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: k8s.gcr.io/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