K8s指南笔记 📅 2026/7/1 4:14:44 上册1 集群安装1.0 基础系统准备所有节点1.1 关闭 swap必须# 临时关闭 swapoff -a # 永久关闭注释 /etc/fstab 中 swap 行 sed -i / swap / s/^/#/ /etc/fstab1.2 内核模块cat EOF | sudo tee /etc/modules-load.d/k8s.conf overlay br_netfilter EOF modprobe overlay modprobe br_netfilter1.3 sysctl 参数cat EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-iptables 1 net.bridge.bridge-nf-call-ip6tables 1 net.ipv4.ip_forward 1 EOF sysctl --system1.4 安装 containerd官方方式1.4.1 安装 containerdapt-get update apt-get install -y containerd1.4.2 生成默认配置mkdir -p /etc/containerd containerd config default | tee /etc/containerd/config.toml1.4.3 修改关键配置必须grep -q SystemdCgroup /etc/containerd/config.toml \ sed -i s/SystemdCgroup false/SystemdCgroup true/ /etc/containerd/config.toml \ || echo SystemdCgroup true /etc/containerd/config.toml也可以手动改为systemdCgroup true # 官方推荐 kubeadm 环境必须开启1.4.5 启动 containerdsystemctl restart containerd systemctl enable containerd验证systemctl status containerd1.5 安装 kubeadm / kubelet / kubectl官方源1.5.1 安装依赖apt-get update apt-get install -y apt-transport-https ca-certificates curl gpg1.5.2 添加 Kubernetes 官方仓库sudo mkdir -p /etc/apt/keyrings curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key \ | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg echo deb [signed-by/etc/apt/keyrings/kubernetes-apt-keyring.gpg] \ https://pkgs.k8s.io/core:/stable:/v1.29/deb/ / \ | sudo tee /etc/apt/sources.list.d/kubernetes.list1.5.3 安装组件apt-get update apt-get install -y kubelet kubeadm kubectl apt-mark hold kubelet kubeadm kubectl1.6 安装 crictlCRI 调试工具官方推荐工具cri-tools1.6.1 下载 crictlVERSIONv1.29.0 curl -LO https://github.com/kubernetes-sigs/cri-tools/releases/download/${VERSION}/crictl-${VERSION}-linux-amd64.tar.gz1.6.2 安装tar -zxvf crictl-${VERSION}-linux-amd64.tar.gz sudo mv crictl /usr/local/bin/1.6.3 配置 crictlcat EOF | sudo tee /etc/crictl.yaml runtime-endpoint: unix:///run/containerd/containerd.sock image-endpoint: unix:///run/containerd/containerd.sock timeout: 10 debug: false EOF1.6.4 验证crictl version crictl info1.7 初始化 Kubernetes Masterkubeadm1.7.1初始化masterkubeadm init \ --apiserver-advertise-addressMASTER_IP \ --pod-network-cidr192.168.0.0/16参数说明apiserver-advertise-addressMaster 节点 IP内网 IPpod-network-cidrPod 网络网段必须与 CNI 匹配例如 Calico 默认 192.168.0.0/161.7.2 配置 kubectlmkdir -p $HOME/.kube cp /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config验证kubectl get nodes1.8 安装 CNI 网络插件官方 Calico1.8.1 安装CNI网络插件kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/calico.yaml1.8.2 专治重启集群错误mkdir -p $HOME/.kube sudo cp /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config1.9 Node节点加入集群1.9.1在master查看输出kubeadm token create --print-join-command1.9.2在 master 初始化后会输出kubeadm join master-ip:6443 --token ... --discovery-token-ca-cert-hash sha256:...在 worker 节点执行即可。常用排查工具官方推荐crictl ps -a # 查看容器 crictl pods # 查看 Pod sandbox crictl logs id # 查看日志常见问题官方高频❗ kubelet 起不来journalctl -u kubelet -f❗ containerd socket 问题ls /run/containerd/containerd.sock systemctl status containerd❗ 最重要cgroup 必须一致官方要求containerdsystemdkubeletsystemd否则 kube-apiserver / etcd 会起不来3.1 ConfigMap3.11创建ConfigMap创建文件vimnginx-configmap.yaml内容apiVersion: v1 kind: ConfigMap metadata: name: nginx-index data: index.html: | html body h1Hello ConfigMap V1/h1 /body /html应用kubectl apply-fnginx-configmap.yaml3.12 创建Pod创建vim nginx-pod.yaml内容apiVersion: v1 kind: Pod metadata: name: nginx-config-demo spec: containers: - name: nginx image: nginx volumeMounts: - name: html-volume mountPath: /usr/share/nginx/html volumes: - name: html-volume configMap: name: nginx-index应用kubectl apply -f nginx-pod.yaml3.13验证为了简单测试kubectl port-forward pod/nginx-config-demo 8080:80另外开一个终端curl http://localhost:8080结果html body h1Hello ConfigMap V1/h1 /body /html浏览器访问http://localhost:8080也能看到Hello ConfigMap V1创建ConfigMap的方法直接写入yaml文件apiVersion:v1kind:ConfigMapmetadata:name:app-configdata:DB_HOST:mysqlDB_PORT:3306DEBUG:Falsefrom-filenginx.confserver{listen80;location/{proxy_pass http://django:8000;}}ConfigMap:kubectl create configmap nginx-config\--from-filenginx.conf等价yamldata:nginx.conf:|server { listen 80; }from-literal总结记住配置来源手动输入和来自文件。方法命令是否推荐场景YAMLapply -f⭐⭐⭐⭐⭐生产 / GitOpsliteralcreate --from-literal⭐⭐临时测试file–from-file file⭐⭐⭐⭐nginx / configdir–from-file dir⭐⭐⭐⭐多配置文件Helm/Kustomize模板化⭐⭐⭐⭐⭐企业级ConfigMap注入Pod方式1环境变量最常见。ConfigMapapiVersion: v1 kind: ConfigMap metadata: name: django-config data: DEBUG: False DB_HOST: mysql-service DB_PORT: 3306PodapiVersion: v1 kind: Pod metadata: name: django spec: containers: - name: django image: django:v1 env: - name: DEBUG valueFrom: configMapKeyRef: name: django-config key: DEBUG - name: DB_HOST valueFrom: configMapKeyRef: name: django-config key: DB_HOST进入容器env | grep DB结果DB_HOSTmysql-service方式2envFrom刚刚你问过。这是批量导入。ConfigMapdata: DEBUG: False DB_HOST: mysql-service DB_PORT: 3306Podcontainers: - name: django image: django:v1 envFrom: - configMapRef: name: django-config效果env自动出现DEBUGFalse DB_HOSTmysql-service DB_PORT3306env和envFrom区别envenv: - name: DB_HOST精准导入。envFromenvFrom: - configMapRef:全部导入。实际工作配置少用env:配置很多用envFrom:Django项目实战很多人第一次接触都会问settings.py这么复杂怎么办例如DATABASES { default: { ENGINE: django.db.backends.mysql, HOST: mysql-service, PORT: 3306, NAME: mydb, USER: admin, PASSWORD: 123456 } }不要把整个字典塞进 ConfigMap。推荐data: DB_HOST: mysql-service DB_PORT: 3306 DB_NAME: mydbSecretdata: DB_USER: xxx DB_PASSWORD: xxxsettings.pyimport os DATABASES { default: { ENGINE: django.db.backends.mysql, HOST: os.getenv(DB_HOST), PORT: os.getenv(DB_PORT), NAME: os.getenv(DB_NAME), USER: os.getenv(DB_USER), PASSWORD: os.getenv(DB_PASSWORD), } }这是生产环境最常见方式。ConfigMap更新会怎样修改data: DEBUG: True执行kubectl apply -f configmap.yamlConfigMap更新成功。但是Pod不会自动重启这是很多新人踩坑的地方。环境变量方式env: envFrom:需要kubectl rollout restart deployment django才能生效。For Example:通过volume的形式挂载configmapconfig的配置apiVersion:v1kind:ConfigMapmetadata:name:web-htmldata:index.html:|!DOCTYPE html html head titleHello K8s/title /head body h1Hello from Kubernetes ConfigMap/h1 /body /htmldeployment的配置apiVersion:apps/v1kind:Deploymentmetadata:name:web-nginxspec:replicas:1selector:matchLabels:app:web-nginxtemplate:metadata:labels:app:web-nginxspec:containers:-name:nginximage:nginx:latestvolumeMounts:-name:html-volumemountPath:/usr/share/nginx/html/index.htmlsubPath:index.html# ⭐关键点volumes:-name:html-volumeconfigMap:name:web-html3.2 Pod的探针探针类型作用失败后会发生什么Liveness Probe存活探针判断容器是否还活着失败达到阈值后Kubelet会重启容器Readiness Probe就绪探针判断容器是否可以对外提供服务Pod会从Service后端列表中移除不接收流量Startup Probe启动探针判断应用是否启动完成启动成功前Liveness和Readiness不会执行探针顺序Startup Probe Readiness Probe Liveness Probe三者在container的不同阶段探针的配置重点readiness prob用于不需要本身重启的问题可依赖外部资源。livenessprob用于需要自身重启才能解决的问题只看自己的状态。3.3 init容器一般用于一次行执行任务执行完之后就会停止并且在container之前运行4 Pod工作负载详解4.1 工作负载的种类Deployment, ReplicaSet, ReplicationController, DaemonSet, StatefulSet, Job, CronJob4.2 Deployment面向无状态应用的Pod副本集管理kubectl rollout status# 查看更新过程kubectl rollout restart deployment...# 重启更新需要了解deployment的更新过程 只在template发生变化时deployment的回滚过程 只在template发生变化时4.3 DaemonSet: 每个node只有一个4.4 StatefulSet: 面向有状态应用的pod副本集管理4.5 Pod水平扩容机制4.6 job的主要配置和工作机制5. 深入掌握Serviceservice可以创建一个ip映射到不同pod中映射方式可能是轮循之类的。service创建的ip是固定的后端pod的ip则是可以浮动的。5.1 service的typeclusterIP集群内部访问NodePort通过node的port访问LoadBalancer云厂商的负载均衡器ExternalName 集群内部已域名方式访问集群外资源5.2 headless service一种没有cluster ip的pod只对外暴露pod的ip。一般配合stateful使用类似mysql主从redis之类的不需要负载均衡的服务kube-proxy的主要职责负责service到pod的流量转发和负载均衡CNI的主要职责全称 Container Network Interface负责pod到pod的网络通讯etcd的作用etcd是k8s集群的唯一事实来源5.3 ingress5.3.1 ingress的配置安装ingress-nginxkubectl apply-fhttps://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml配置my_nginx_ingress.yamlapiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: web-nginx-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: ingressClassName: nginx rules: - host: web.example.com# 绑定域名http: paths: - path: / pathType: Prefix backend: service:# 已经创建的servicename: web-nginx port: number:80验证获取ip# 获取loadbalance的ip kubectl get svc -n ingress-nginx设置/etc/hosts/ ip web.example.comcurl http://web.example.comps: 建议一个集群只配置一个默认的ingressclass。6. master核心组件的机制7 . Node核心组件的运行机制7.1 kubelet的作用Deployment定义期望 ↓ ReplicaSet维持副本 ↓ Scheduler决定放哪 ↓ kubelet在Node上执行 ↓ containerd真正启动容器7.2 kubernets的资源cpu是可压缩资源。内存磁盘和pid是不可压缩资源。kubernetes会监控不可压缩资源来驱逐pod8. 基础集群运维8.1 在集群打污点或者清空node时PodDisruptionBudget: 保持pod的副本数minAvailable: pod副本最小数maxUnavailable: 最大允许pod超过几个副本数8.2 Metrics Serverk8s默认只支持metrics server所以hpa依赖于metric server而Prometheus负责监控和告警安装metricskubectl apply-fhttps://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml查看集群基础信息kubectltopnodes8.3 dashboard的安装1. 添加备用稳定 Helm 仓库由于官方新源迁移至 Vercel 导致国内直接访问触发EOF此处使用官方保留的 GitHub Pages 备用稳定源# 1. 添加备用仓库源helm repoaddkubernetes-dashboard https://kubernetes-retired.github.io/dashboard/# 2. 更新仓库索引helm repo update2. 清理环境并使用 Helm 安装为防止之前安装留下的残留密钥导致 Helm 报错罢工先执行清理再进行安装。安装时开启cert-manager.installtrue以自动管理新版所需的证书。# 1. 强制清理可能冲突的残留 Secretkubectl delete secret kubernetes-dashboard-csrf-nkubernetes-dashboard --ignore-not-found kubectl delete secret kubernetes-dashboard-key-holder-nkubernetes-dashboard --ignore-not-found# 2. 执行 Helm 安装helm upgrade--installkubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard\--create-namespace\--namespacekubernetes-dashboard\--setcert-manager.installtrue3. 创建管理员账号RBAC与获取token# 1. 一键创建 ServiceAccount 和 ClusterRoleBindingcatEOF|kubectl apply-f-apiVersion: v1 kind: ServiceAccount metadata: name: admin-user namespace: kubernetes-dashboard --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: admin-user roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: admin-user namespace: kubernetes-dashboard EOF# 2. 生成登录 Token复制终端输出的那段长字符串即为密码kubectl-nkubernetes-dashboard create token admin-user4. 开启转发端口# 开启端口转发注意新版网关服务名为 kubernetes-dashboard-kong-proxy# 执行后终端会保持前台运行请勿关闭kubectl-nkubernetes-dashboard port-forward svc/kubernetes-dashboard-kong-proxy9443:443--address0.0.0.09. 高级运维9.1 预留资源systemctl-reserved 为操作系统进程预留的资源。kube-reserved 为kubelet kube-proxy container runtime 等核心系统进程预留的资源。eviction-hard 触发驱逐pod进行资源回收的资源低水位警戒线。9.2 多租户资源管理实践9.3 QOS优先级limitsrequests时为 Guaranteed(最高)只定义了requests值小于limits为burstable(中等)什么都不写为bestEffort(最低)下册1 常规认证机制1.1 service account用来限制资源类型的行为通常用最小权限原则比如 frontend ,backend database都设置各自的sa通过rolebinding实现权限管理audiences字段是限制使用范围。1.2 授权模式ABAC 基于属性的授权模式需要重启apiRBAC 基于角色的授权模式不需要重启api运用较多webhook授权模式Node授权模式2. 安全机制2.1网络安全有3层保护nodepodcontainer2.2 veth设备对用于连接linux不同namespace详情见下册P135页3. 存储3.1 临时卷configmapsecretpv和pvc绑定时可以用标签制定pv一个pv只能绑定一个pvc。ps: 处于安全原因尽量避免使用hostPath3.2 持久卷csi快照一般配合cronjob使用小集群使用大集群一般用velero等专业备份如阿健csi克隆利用动态存储创建pv4. 开发指南HPA控制副本数来实现扩缩容VPA控制pod的资源来实现扩缩容cluster autoscaler通过node数量来实现扩缩容