Skip to content

Docker中,不同主机容器网络通信:

推荐使用Weave

  • Flannel
    • 特点:简单易用,基于VXLAN或UDP封装,适合中小型集群。
    • 适用场景:初学者或资源有限的环境。
    • 默认配置:子网10.244.0.0/16,通过kubeadm或手动安装。
  • Calico
    • 特点:基于BGP,支持网络策略(Network Policy),性能优异。
    • 适用场景:需要细粒度访问控制或大型生产环境。
    • 默认配置:无需overlay,可用IPIP或VXLAN,安装通过kubectl apply -f
  • Weave Net
    • 特点:内置加密和服务发现,适合跨主机通信。
    • 适用场景:需要安全性和动态扩展的中小型集群。
    • 默认配置:子网10.32.0.0/12,安装脚本见Weave官网。
  • Cilium
    • 特点:基于eBPF,高效支持网络策略和负载均衡。
    • 适用场景:高性能或云原生应用,适合未来架构。
    • 默认配置:安装通过Helm,需启用eBPF模式。

K8S组件:

  1. API Server (kube-apiserver)
    • 作用:K8s的控制入口,处理RESTful API请求,协调各组件通信。
  2. etcd
    • 作用:分布式键值存储,保存集群所有配置和状态数据。
  3. Controller Manager (kube-controller-manager)
    • 作用:运行控制器(如Node Controller、Replication Controller),维护集群期望状态。
  4. Scheduler (kube-scheduler)
    • 作用:根据资源和策略将Pod分配到合适节点。
  5. Kubelet
    • 作用:运行在每个节点上,管理Pod和容器,确保容器按预期运行。
  6. Kube-Proxy
    • 作用:运行在每个节点上,负责服务发现和负载均衡,维护网络规则。
  7. Container Runtime
    • 作用:容器运行时(如Docker、containerd),负责容器的创建和销毁。
  8. DNS (CoreDNS)
    • 作用:提供集群内部的DNS服务,解析Service和Pod域名。

扩展组件

  • Ingress Controller:管理外部访问流量(如Nginx Ingress)。
  • Storage Provisioner:动态提供存储(如CSI插件)。

创建pod的过程

k8s中,最小的数据单元是pod,可能包含一个,或者多个pod

创建流程是:pod(定义yaml文件)——kubectl(将定义发送给k8s集群)——kube-apiserver(验证yaml并授权)——Scheduler调度(协调资源和策略,若无资源则pending)——kubelet(接收调度指令)——CRI创建容器(拉取镜像创建启动容器)

控制器工作原理

  • Replication Controller/Deployment
    • 作用:确保Pod副本数满足需求,Deployment支持滚动更新。
    • 原理:监控Pod标签选择器,调整副本。
  • Node Controller
    • 作用:管理节点生命周期,标记不可用节点。
    • 原理:定期检查节点健康状态。
  • Endpoint Controller
    • 作用:维护Service的Endpoint,关联Pod IP。
    • 原理:监听Service和Pod变化,更新映射。
  • Job Controller
    • 作用:管理一次性任务,监控完成状态。
    • 原理:创建Pod并跟踪成功/失败次数。

k8s中服务发现原理

  • Service资源
    • 作用:Service为一组Pod提供固定虚拟IP(Cluster IP)和端口。
    • 机制:通过标签选择器(Selector)关联Pod,kube-proxy维护IPVS/iptables规则。
  • Endpoint管理
    • 作用:Endpoint Controller监控Service和Pod,生成对应Endpoint对象,记录Pod IP。
    • 机制:当Pod创建/删除时,Endpoint自动更新。
  • DNS解析(CoreDNS)
    • 作用:提供域名服务,将Service名称解析为Cluster IP。
    • 机制
      • CoreDNS部署为Pod,监听/etc/resolv.conf。
      • 示例:my-service.namespace.svc.cluster.local解析为10.96.0.10。
    • 配置:默认启用,需确保Pod使用集群DNS。
  • kube-proxy
    • 作用:在节点上实现服务负载均衡。
    • 机制:根据Endpoint更新iptables或IPVS规则,将流量分发到后端Pod。

监控方面:

  • Node Exporter
    • 作用:收集节点(如Linux服务器)的硬件和操作系统指标(如CPU、内存、磁盘I/O)。
    • 机制:以Prometheus格式暴露指标,监听默认端口9100(如/metrics端点)。
  • Prometheus
    • 作用:定时拉取(scrape)Node Exporter的指标,存储为时间序列数据。
    • 机制:通过prometheus.yml 配置目标(如localhost:9100),支持查询和告警。
  • Grafana
    • 作用:可视化Prometheus数据,提供仪表盘和实时监控。
    • 机制:连接Prometheus作为数据源,导入预设仪表盘。

Python与Go

Python:解释型语言,多进程 (并发使用线程池,async,threading)

Go:编译型语言,goroutine(并发使用 "go 函数名")

MySQL的存储引擎

  1. MySQL的存储引擎:常见有InnoDB、MyISAM。InnoDB支持事务和行级锁,MyISAM支持表级锁,适合读密集。
  2. 主键和外键的作用是什么:主键唯一标识行,外键维护表间关系,确保数据一致性。
  3. MySQL索引的原理和类型:索引加速查询,基于B+树(InnoDB)或哈希。类型有主键索引、唯一索引、普通索引。
  4. MySQL主从复制原理:基于Binlog,主库记录变更,从库通过I/O线程读取并重放(Relay Log)。

sealos私有化部署Kubernetes

以debian为例

首先修改虚拟主机IP获取方式为静态IP地址:

示例:修改 vim /etc/network/interfaces为以下内容(所有节点都需修改):

source /etc/network/interfaces.d/*

auto lo
iface lo inet loopback

auto ens33
iface ens33 inet static
    address 192.168.62.131 #当前主机IP地址
    netmask 255.255.255.0 #当前子网掩码
    gateway 192.168.62.2 #当前网关IP地址
    dns-nameservers 192.168.62.2 当前DNS服务器IP地址

修改各个主机名:

查看主机名 hostname,修改主机名文件 vim /etc/hostname如:k8s-master(所有节点都需修改)

修改各个主机host映射

示例:修改 vim /etc/hosts

192.168.62.131    k8s-master
192.168.62.132    k8s-worker1
192.168.62.133    k8s-worker2

使用sealos一键安装k8s集群

  1. 安装依赖:sudo apt install -y iptables ebtables socat
  2. 下载对应系统sealos包,debian是以deb结尾的:
wget https://github.com/labring/sealos/releases/download/v5.0.1/sealos_5.0.1_linux_amd64.deb
  1. 下载后使用:apt install ./sealos_5.0.1_linux_amd64.deb 安装
  2. 一键安装如下命令:主节点为 192.168.62.131,从节点为 192.168.62.132 192.168.62.133,从节点ssh密码为 password-root
sealos run registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.29.9 registry.cn-shanghai.aliyuncs.com/labring/helm:v3.9.4 registry.cn-shanghai.aliyuncs.com/labring/cilium:v1.13.4 \
     --masters 192.168.62.131\
     --nodes 192.168.62.132,192.168.62.133 -p password-root

安装成功如图所示:

其他命令

增加节点

  1. 增加node节点 192.168.64.21与192.168.64.19sealos add --nodes 192.168.64.21,192.168.64.19
  2. 增加master节点 192.168.64.21与192.168.64.19sealos add --masters 192.168.64.21,192.168.64.19

删除节点

  1. 删除node节点 192.168.64.21与192.168.64.19sealos delete --nodes 192.168.64.21,192.168.64.19
  2. 删除master节点 192.168.64.21与192.168.64.19sealos delete --masters 192.168.64.21,192.168.64.19

清理k8s集群

sealos reset

离线安装k8s

离线环境只需要提前导入镜像,其它步骤与在线安装一致。

首先在有网络的环境中导出集群镜像:

  1. 拉取镜像:
sealos pull registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.29.9
  1. 保存镜像为压缩包 kubernetes.tar
sealos save -o kubernetes.tar registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.29.9
  1. 方式1:将kubernetes.tar 拷贝到其他离线环境,使用 load导入集群镜像
sealos load -i kubernetes.tar
  1. 查看现有镜像 sealos images
  2. 离线安装:
    1. 单机部署方式 sealos run registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.29.9
    2. 集群部署方式
sealos run registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.29.9 registry.cn-shanghai.aliyuncs.com/labring/helm:v3.9.4 registry.cn-shanghai.aliyuncs.com/labring/cilium:v1.13.4 \
     --masters 192.168.64.2,192.168.64.22,192.168.64.20 \
     --nodes 192.168.64.21,192.168.64.19 -p [your-ssh-passwd]
  1. 方式2:
  2. 快速启动 K8s 单节点:sealos run kubernetes.tar 集群同理

创建Pod

bash
apiVersion: v1  # 指定 Kubernetes API 版本,v1 是核心 API 组,用于 Pod 等基础资源
kind: Pod  # 定义资源类型为 Pod,表示一个独立运行的 Pod
metadata:  # 元数据部分,定义 Pod 的名称、标签和命名空间
  name: nginx-demo  # Pod 的名称,唯一标识此 Pod
  labels:  # 标签,用于筛选或管理 Pod(如 kubectl get pods -l type=app)
    type: app  # 标签键值对,type=app 可用于选择器
    version: 1.0.0  # 标签键值对,version=1.0.0 表示版本
  namespace: 'default'  # 指定 Pod 所在的命名空间,default 为默认命名空间
spec:  # Pod 的规格,定义其运行行为
  containers:  # 容器列表,Pod 中可以运行多个容器
  - name: nginx  # 容器名称,唯一标识容器
    image: nginx:1.7.9  # 容器镜像,指定使用 nginx 1.7.9 版本(较旧,建议更新到最新版如 nginx:latest)
    imagePullPolicy: IfNotPresent  # 镜像拉取策略,IfNotPresent 表示本地有镜像时不重新拉取
    resources:  # 资源配额,定义容器对 CPU 和内存的需求
      requests:  # 最低资源需求,保证容器分配的最小资源
        cpu: "100m"  # 请求 100 毫核(0.1 CPU),注意单位应为 "100m" 而非 "100Mi"
        memory: "128Mi"  # 请求 128MiB 内存
      limits:  # 最大资源限制,防止容器超出此范围
        cpu: "200m"  # 限制最大 200 毫核(0.2 CPU)
        memory: "256Mi"  # 限制最大 256MiB 内存
    command:  # 覆盖镜像的默认启动命令
    - nginx  # 运行 nginx 命令
    - -g  # 指定 nginx 的全局配置参数
    - 'daemon off;'  # 使 nginx 以前台进程运行,避免容器退出
    workingDir: /usr/share/nginx/html  # 设置容器工作目录为 nginx 默认的 HTML 文件路径
    ports:  # 定义容器暴露的端口
    - name: http  # 端口名称,标识为 HTTP
      containerPort: 80  # 容器内监听的端口(nginx 默认 HTTP 端口)
      protocol: TCP  # 端口协议,指定为 TCP
    env:  # 环境变量列表
    - name: JVM_OPTS  # 环境变量名称,JVM_OPTS 用于 Java 虚拟机配置
      value: '-Xms128m -Xmx128m'  # 设置 JVM 初始和最大堆内存为 128MB(但 nginx 非 Java 应用,此变量可能无用)
    args: ["--vm", "1", "--vm-bytes", "150M", "--vm-hang", "1"]  # 传递给 command 的参数,可能是测试用途,但与 nginx 不相关(见问题分析)
  restartPolicy: OnFailure  # Pod 重启策略,OnFailure 表示仅在容器失败时重启(修正了原文件的拼写错误 "restartPollcy")

常见命令

bash
kubectl get pods #列出当前命名空间中的所有 Pod。
kubectl get deploy #列出当前命名空间中的所有 Deployment。
kubectl delete deploy deploy名 #删除指定名称的 Deployment
kubectl get services #列出当前命名空间中的所有 Service
kubectl delete services services名 #删除指定名称的 Service

使用kubectl管理k8s集群

类别命令功能描述示例
基本命令
create创建资源根据文件、目录或URL创建资源,支持单个或多个文件。kubectl create -f ./nginx.yaml kubectl create -f ./dir kubectl create -f xxx.git.io/vxxzso.yaml
run运行镜像在集群中运行指定镜像,支持终端交互、多个副本等。kubectl run -i --tty busybox --image=busybox kubectl run nginx --image=nginx kubectl run mybusybox --image=busybox --replicas=5
explain获取资源文档查看指定资源的文档说明,如pod、service等。kubectl explain pods,svc
get查询资源获取资源信息(如node、pod、service等),支持多种格式和过滤。kubectl get nodes kubectl get pods -o wide --all-namespaces kubectl get namespaces kube-system -o yaml
edit编辑资源在服务端直接编辑资源配置。kubectl edit svc/docker-registry
delete删除资源根据文件、名称或标签删除资源,支持强制删除和包含未初始化资源。kubectl delete -f ./pod.json kubectl delete pod,service baz foo kubectl delete pods prometheus-7fcfcb9f89-qkkf7 --grace-period=0 --force
cp文件拷贝在容器与宿主机之间拷贝文件或目录。kubectl cp default/venus-registry-web-8cd94fc99-fws4b:demo.txt demo.txt kubectl cp demo.txt default/venus-registry-web-8cd94fc99-fws4b:demo.txt
部署命令
rollout查看/回退修订版本查看部署的历史修订版本或回退到指定版本。kubectl rollout history deployment nginx-deployment kubectl rollout undo deployment nginx-deployment --to-revision=1
scale调整副本数手动扩展或缩减副本数量。kubectl scale rc rc-nginx-3 --replicas=4
autoscale自动调整副本数根据负载自动调整副本数,指定最小和最大范围。kubectl autoscale rc rc-nginx-3 --min=1 --max=4
集群管理命令
cluster-info查看集群信息显示集群的详细信息。kubectl cluster-info kubectl cluster-info dump
top查看资源使用情况显示节点或pod的CPU、内存等资源使用情况。kubectl top node k8s-node kubectl top pod -n logging
cordon标记节点不可调度将节点标记为不可调度状态。kubectl cordon k8s-node
uncordon标记节点可调度将节点标记为可调度状态。kubectl uncordon k8s-node
drain排除节点排除节点上的pod,准备维护。kubectl drain k8s-node
故障排查和诊断
describe显示资源详细信息查看资源(如pod、node)的详细状态和事件。kubectl describe pod xxx kubectl describe nodes
logs查看容器日志查看pod中容器的日志,支持指定容器、行数和实时输出。kubectl logs -f kube-dns-699984412-vz1q6 -n kube-system kubectl logs --tail=10 nginx
exec执行容器命令在容器中执行shell命令,支持交互模式和多容器指定。kubectl exec -it codeleak-github-cron-1567581840-zsqpc /bin/bash kubectl exec nginx-pod -c my-container -- ls /
高级命令
apply应用配置根据文件或标准输入更新资源配置。kubectl apply -f rc-nginx.yaml`cat pod.json
设置命令
label管理资源标签添加、修改或删除资源的标签,支持覆盖和批量操作。kubectl label nodes node01 disk=ssd kubectl label pods tomcat app=tomcat kubectl label pods tomcat app-
annotate管理Annotations更新资源的Annotations信息。kubectl annotate pods foo description='my frontend'
其他命令
version查看版本信息显示客户端和服务端的版本信息。kubectl version
api-versions查看API版本显示服务端支持的API版本。kubectl api-versions
api-resources查看资源类型显示服务端支持的资源类型。kubectl api-resources