近期通过网课学习了李振良老师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
---
# 使用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状态

状态描述
penddingpod创建已提交到kubernetes,但是没有顺利创建。比如调度失败,镜像拉取缓慢
runningpod 已经成功绑定在某个节点,创建了所有的容器,并至少有一个运行成功,或重启,或启动中
successed所有节点都运行成功且成功终止,不会重启
Unknownapiserver无法获取pod状态,通常是master与node之间的kubelet通信错误

pod调试命令

  • kubectl describe 资源 资源名
  • kubectl log 资源 资源名
  • kubectl exec POD [-c container – command [agrs…]]
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐