一.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文件,这个文件就是在本地保存的凭证。

使用镜像创建pod pod 镜像_使用镜像创建pod

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