Kubernetes-troubleshooting.jpeg

架构原理

image.png

  • CRI(Container Runtime Interface)的远程调用接口
  • CNI(Container Networking Interface)
  • CSI(Container Storage Interface)

image.png

  • weave网络插件
  • calico网络插件
  • Rook持久化存储插件

pod原理

  • Pod 里的所有容器,共享的是同一个 Network Namespace,并且可以声明共享同一个Volume
  • infra容器

image.png
image.png

命令

  • kubectl apply -f nginx-deployment.yaml
  • kubectl get pods -l app=nginx(标签)
  • kubectl describe pod nginx-deployment-67594d6bf6-9gdvr
    • kubectl describe deployment nginx-deployment
  • kubectl exec -it nginx-deployment-5c678cfb6d-lg9lw — /bin/bash
  • kubectl delete -f nginx-deployment.yaml
  • kubectl create secret generic pass —from-file=./password.txt
    • kubectl get secrets
  • kubectl edit deployment/nginx-deployment
  • kubectl rollout undo deployment/nginx-deployment
    • kubectl rollout history deployment/nginx-deployment:查看历史版本
    • kubectl rollout undo deployment/nginx-deployment —to-revision=2:回退
  • kubectl run -i —tty —image busybox dns-test —restart=Never —rm /bin/sh

    资料

    cnych/kubernetes-learning: 《从Docker到Kubernetes进阶课程》在线文档
    01、Kubernetes-基础入门.md

    lifecycle生命周期

    image.png

  • PostStart

  • preStop

image.png

健康检查(liveness与readiness探针)

image.png

liveness与readiness探针区别

  • readiness:是否把进程的服务地址加入Service的负载均衡列表
  • liveness:决定是否去重启这个进程来排除故障

一般来讲,Readiness的执行间隔要比Liveness设置的较长一点比较好。因为当后端进程负载高的时候,我们可以暂时从转发列表里面摘除,但是Liveness决定的是进程是否重启,其实这个时候进程不一定需要重启。【不给pod分流量,但不一定要重启pod】所以Liveness的检测周期可以稍微长一点,另外失败的容忍数量也可以多一点。
你或许理解错了Kubernetes中的Readiness和Livenss探针 - 知乎

初始化容器(init container)

  • init container针对pod来说的,post start针对main container来说的。

image.png
image.png

Pause容器(infra container)

  • Pause容器 全称infrastucture container(又叫infra)基础容器。
  • 业务容器共享Pause容器的网络栈和Volume挂载卷,

k8s - 图11
image.png

Deployment

ReplicaSet

建议使用 Deployment 而不是直接使用 ReplicaSet,除非 你需要自定义更新业务流程或根本不需要更新。 你可能永远不需要操作 ReplicaSet 对象:而是使用 Deployment

Deployment更多的功能

  • 事件和状态查看
  • 回滚
  • 版本记录
  • 暂停和启动

不同版本对应不同的rs
image.png
image.png
describe可以查看rs对应的版本

  • kubectl apply -f xxx.yaml —record=true:记录版本
  • kubectl rollout history deployment/nginx-deployment:查看历史版本
  • kubectl rollout undo deployment/nginx-deployment —to-revision=2:回退

    RollingUpdateStrategy

    默认滚动比例25%
    image.png

    HPA(自动扩容)

  • kubectl autoscale deployment hpa-nginx-deploy —cpu-percent=10 —min=1 —max=10

deployment “hpa-nginx-deploy” autoscaled

  • kubectl get hpa
  • kubectl get hpa hpa-nginx-deploy -o yaml:查看yaml写法

Service

image.png
image.png
原理:
每一个node都有一个kube-proxy,负责监听master命令,对本node的iptables进行修改。从而将访问本node的请求路由到其他node(pod)上。

Service类型

  • ClusterIP: 通过集群的内部 IP 暴露服务。(默认)【集群内部使用】
  • NodePort: 通过每个 Node 节点上的 IP 和静态端⼝(NodePort) 暴露服务。【暴露service】
  • LoadBalancer:云厂商
  • ExternalName

image.png

endpoints

十分钟了解k8s service到pod转发机制_程冯冯的博客-CSDN博客
k8s - 图19
我们在创建service的时候如果我们设置了selector选中了需要关联的pod,那么就会创建一个与service同名的endpoints。他是用来记录service对应pod的访问地址。

ConfigMap

创建、查看ConfigMap

  • kubectl create configmap cm-demo1 —from-file=testcm:从文件创建configmap
  • kubectl get configmap
  • kubectl get configmap cm-demo1 -o yaml:查看配置

    使用ConfigMap

  1. 使用ConfigMap来填充环境变量

image.png

  1. 通过volumes来使用ConfigMap(ConfigMap作为文件放入volume中)

image.png
image.png

Secret

Opaque Secret

image.png
使用:

  1. 将secret放入env

image.png

  1. 使用volume保存secrets

image.png

kubernetes.io/dockerconfigjson

拉取私有仓库时用到的密钥
image.png

kubernetes.io/service-account-token

DaemonSet

每个node都有

StatefulSet

貌似少使用

  • StatefulSet 其实就是一种特殊的Deployment
  • StatefulSet 不同于 ReplicaSet,每个pod hostname和名字都不同。
  • 按顺序依次启动

    Headless Service

  1. Service的VIP方式:clusterIP方式
  2. Service的DNS方式:HeadLess Service

Headless Service的cluterIP是None,即没有一个VIP作为头。
所有pod的ip地址都绑定一个DNS:
**..
K8S容器编排之Headless浅谈 - 知乎

PV & PVC

pv回收策略
image.png
pv:
image.png
image.png
pvc:
image.png
pvc自动匹配pv
Deployment中使用pvc
image.png

StorageClass

创建pvc自动根据storageClass创建出对应的pv。

KubeDNS

环境变量:每个 Pod 启动的时候,会通过环境变量设置所有服务的 IP 和 port 信息,依赖的服务必须在 Pod启动之前就存在。【麻烦】
两个DNS插件,通过ServiceName直接访问Service:kube-dns & CoreDNS

dnsPolicy

image.png

域名格式

  • 普通的 Service :servicename.namespace.svc.cluster.local或servicename.namespace,同⼀个命名空间下⾯, 甚⾄可以只写成 servicename 即可访问
  • HeadLess Service:podname.servicename.namespace.svc.cluster.local

    ingress:从外部访问入口

    配置Traefik ```yaml

kind: Deployment apiVersion: apps/v1 metadata: name: traefik-ingress-controller namespace: kube-system labels: k8s-app: traefik-ingress-lb spec: replicas: 1 selector: matchLabels: k8s-app: traefik-ingress-lb template: metadata: labels: k8s-app: traefik-ingress-lb name: traefik-ingress-lb spec: serviceAccountName: traefik-ingress-controller terminationGracePeriodSeconds: 60 tolerations:

  1. - operator: "Exists"
  2. nodeSelector:
  3. kubernetes.io/hostname: master
  4. containers:
  5. - image: traefik:v1.7.17
  6. name: traefik-ingress-lb
  7. ports:
  8. - name: http
  9. containerPort: 80
  10. - name: admin
  11. containerPort: 8080
  12. args:
  13. - --api
  14. - --kubernetes
  15. - --logLevel=INFO

kind: Service apiVersion: v1 metadata: name: traefik-ingress-service namespace: kube-system spec: selector: k8s-app: traefik-ingress-lb ports:

  1. - protocol: TCP
  2. port: 80
  3. name: web
  4. - protocol: TCP
  5. port: 8080
  6. name: admin

type: NodePort ``` 配置ingress
image.png

helm

  • Helm 就相当于 kubernetes 环境下的 yum 包管理⼯具。
  • 将ingress、deployment、pod打包,一键安装。

image.png
image.png
打包
image.png
我们就可以将打包的 tgz ⽂件分发到任意的服务器上, 通过 helm fetch 就可以获取到该 Chart
了。

操作:

  • helm install -f config.yaml stable/mysql —name mydb:config.yaml是自定义配置,覆盖helm默认配置。
  • helm get manifest quoting-zebra:查看最终的yaml
  • helm install . —dry-run —debug ./mychart:提前查看生成的yaml