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组件:
- API Server (kube-apiserver)
- 作用:K8s的控制入口,处理RESTful API请求,协调各组件通信。
- etcd
- 作用:分布式键值存储,保存集群所有配置和状态数据。
- Controller Manager (kube-controller-manager)
- 作用:运行控制器(如Node Controller、Replication Controller),维护集群期望状态。
- Scheduler (kube-scheduler)
- 作用:根据资源和策略将Pod分配到合适节点。
- Kubelet
- 作用:运行在每个节点上,管理Pod和容器,确保容器按预期运行。
- Kube-Proxy
- 作用:运行在每个节点上,负责服务发现和负载均衡,维护网络规则。
- Container Runtime
- 作用:容器运行时(如Docker、containerd),负责容器的创建和销毁。
- 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的存储引擎
- MySQL的存储引擎:常见有InnoDB、MyISAM。InnoDB支持事务和行级锁,MyISAM支持表级锁,适合读密集。
- 主键和外键的作用是什么:主键唯一标识行,外键维护表间关系,确保数据一致性。
- MySQL索引的原理和类型:索引加速查询,基于B+树(InnoDB)或哈希。类型有主键索引、唯一索引、普通索引。
- 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集群
- 安装依赖:
sudo apt install -y iptables ebtables socat
- 下载对应系统sealos包,debian是以deb结尾的:
wget https://github.com/labring/sealos/releases/download/v5.0.1/sealos_5.0.1_linux_amd64.deb
- 下载后使用:
apt install ./sealos_5.0.1_linux_amd64.deb
安装 - 一键安装如下命令:主节点为
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
安装成功如图所示:
其他命令
增加节点
- 增加node节点
192.168.64.21与192.168.64.19
:sealos add --nodes 192.168.64.21,192.168.64.19
- 增加master节点
192.168.64.21与192.168.64.19
:sealos add --masters 192.168.64.21,192.168.64.19
删除节点
- 删除node节点
192.168.64.21与192.168.64.19
:sealos delete --nodes 192.168.64.21,192.168.64.19
- 删除master节点
192.168.64.21与192.168.64.19
:sealos delete --masters 192.168.64.21,192.168.64.19
清理k8s集群
sealos reset
离线安装k8s
离线环境只需要提前导入镜像,其它步骤与在线安装一致。
首先在有网络的环境中导出集群镜像:
- 拉取镜像:
sealos pull registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.29.9
- 保存镜像为压缩包
kubernetes.tar
sealos save -o kubernetes.tar registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.29.9
- 方式1:将kubernetes.tar 拷贝到其他离线环境,使用
load
导入集群镜像
sealos load -i kubernetes.tar
- 查看现有镜像
sealos images
- 离线安装:
- 单机部署方式
sealos run registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.29.9
- 集群部署方式
- 单机部署方式
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]
- 方式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 |