公司动态
kubernetes(k8s)基础理论与集群部署
摘要本文系统讲解 Kubernetes 的核心理论与集群部署实操。理论部分涵盖容器化演进、Master‑Node 集群架构、Pod 核心概念、正向与反向代理、有状态与无状态服务以及 K8s 资源与对象体系资源分类、资源清单五大顶级字段、API 详解与常用命令对照表实操部分基于 CentOS7 与 k8s‑1.23.6从修复 yum 源、关闭防火墙与 Swap、安装 Docker 与集群三件套等前置准备到 kubeadm 初始化 Master、Worker 节点加入集群、部署 Flannel 网络插件完整演示一套可复现的 K8s 集群搭建流程。一、K8s 理论知识一容器化基础及基础设施变革在容器化技术里面每一个运行的容器就是一个封装集合。 部署应用程序的方式主要经历物理机 → 虚拟机 → 容器三个时代。①传统部署物理机环境不隔离②虚拟化部署虚拟机占用资源过多③容器化部署容器二集群架构 Master‑Node一台 Linux 服务器就是 1 个 Node可以是虚拟机、物理机、云服务器。k8s‑master控制平面管控全部 node所有业务负载全部跑在 node 之上。层级关系一台 Node 上可以有多个 Pod一个 Pod 里面可以有多个容器类比pod 豌豆荚容器 豌豆交互入口所有节点依赖api‑server来进行交互kubectl命令调用 api‑server再执行对应的集群操作。三Pod 核心概念Pod是kubernetes里的最小封装集合最小管理单位一个pod内部可以封装一个或多个容器。同一个Pod内所有容器共享资源共享IP、主机名、存储设备、网络命名空间。Pause根容器每个Pod都会自动生成一个Pause基础设施容器依托pause容器共享网络命名空间实现Pod内部容器通信。net 命名空间 一套独立完整的网络环境四Node、Pod、容器三者关系物理服务器 / 虚拟机 Node工作节点一台 Node 上可以运行很多个 Pod一个 Pod 内可以放置一个或多个业务容器五正向代理 反向代理反向代理Nginx类比小区门卫。外面访客客户端只找门卫门卫清楚每一户地址帮忙把请求转给住户 (Java 商城服务)。访客永远不知道住户真实房间号。外面客户端只访问Nginx中转地址Nginx将请求转发给后端服务后端业务真实地址对外隐藏起到保护后端程序的作用。正向代理VPN、上网代理类比专属跑腿。你客户端不能直接上网你委托代理服务器代替你去访问外网资源。代替客户端去访问外网资源外网服务器只能看见代理IP看不到客户端本机IP。总结正向代理帮客户端访问外网反向代理帮后端服务接收外部请求六有状态服务 / 无状态服务无状态服务重启服务时不需要额外执行数据迁移、数据恢复操作。例如Nginx、Demo测试Pod。有状态服务重启服务时需要迁移、恢复持久化数据。例如MySQL数据库。七K8s 资源与对象在k8s中一切皆资源1、定义pod、service、node等全部抽象为资源对象就是资源持久化后的实例。2、资源分类①命名空间级资源Namespace‑scoped资源只在某一个命名空间内生效、隔离。必须指定‑n 命名空间名才可以访问到它。常见资源Pod、Deployment、Service、ConfigMap、Secret、Ingress、StatefulSet、Job示例命令kubectl get pods -n kube-system kubectl get deploy -n default②集群型资源Cluster‑scoped 集群范围没有命名空间的概念作用于整个K8s集群所有节点、所有namespace都生效不能加-n参数。常见资源Node节点、PersistentVolume(PV)、ClusterRole、ClusterRoleBinding示例命令kubectl get nodes kubectl get pv③元数据型资源Metadata‑scoped集群元数据最顶层用来管控集群本身、命名空间对象。Namespace本身就是元数据资源还有 CRD、APIService大白话就是小区规划文档用来定义“小区”本身。示例命令kubectl get namespaces3、总结类型生效范围能不能‑n指定命名空间典型例子命名空间级仅当前namespace✅可以Pod、Deployment、Service集群型整个集群所有namespace❌不可以Node、PV、ClusterRole元数据型集群顶层管理namespace对象❌不可以Namespace、CRD4、资源清单资源清单Manifest就是YAML 配置文件用来告诉K8s想要创建什么资源、长什么样子。K8s是声明式管理你写清单说明‘想要什么样子’集群自动把实际状态调成想要的样子。①五大顶级字段必背apiVersion: apps/v1 #1.API版本 kind: Deployment #2.资源类型 metadata: #3.元数据 name: demo namespace: default labels: app: demo spec: #4.期望状态自己写 replicas: 3 selector: matchLabels: app: demo template: metadata: labels: app: demo spec: containers: - name: demo image: nginx status: {} #5.实际状态集群自动生成不用写②apiVersionAPI版本告诉apiserver用哪一套规则解析这份文件核心资源(Pod、Service、Namespace)v1工作负载(Deployment、StatefulSet)apps/v1查询命令kubectl api-resources版本成熟度alpha(测试) → beta(公测) → stable稳定版③kind资源类型要创建什么Pod、Deployment、Service、ConfigMap、Secret、Ingress、Node、PV④metadata 元数据资源的身份证信息metadata: name: demo‑deploy #名字同命名空间内唯一 namespace: default #命名空间集群资源不用写 labels: #标签筛选资源用键值对 app: demo annotations: #注解附加描述信息不用于筛选 author: zhangsan标签(label)用来匹配注解(annotation)纯备注⑤spec 期望状态最重要手动写自己定义希望资源变成什么配置不同kindspec里面内容完全不一样Podspec里面写容器镜像、端口、资源限制Deploymentspec里面写副本数replicas、Pod模板templateServicespec里面写端口、标签选择器selector⑥status 实际状态用户永远不要手动写这个字段由K8s集群自动填充、实时更新记录当前资源真实运行状态Pod Running/Error等5、实操命令1.根据清单创建资源kubectl apply -f demo.yaml2.查看已经生成完整清单包含statuskubectl get deploy demo -o yaml3.删除资源kubectl delete -f demo.yaml6、资源清单下发给集群的手段①命令式kubectl create deployment demo --imagenginx直接执行动作不保存配置文件②声明式资源清单yaml文件永久保存可放到git版本管理生产环境主流方式7、最简Pod完整示例apiVersion: v1 kind: Pod metadata: name: nginx-pod namespace: default labels: app: nginx spec: containers: - name: nginx image: nginx:1.21 ports: - containerPort: 808、对象两大核心属性spec规约 / 期望状态创建资源时手动填写描述你希望资源最终变成什么样子是必选字段。status实际状态由 Kubernetes 控制器自动维护k8s不断调整资源让实际状态无限趋近期望状态。八K8s API 详解1、API‑Server集群唯一入口网关kubectl、yaml部署、web控制台本质都是发送HTTP请求调用Api‑Server的REST‑API接口。注意etcd只存储集群数据读写etcd必须经过Api‑Server禁止直接访问etcd。2、API 成熟度三阶段①Alpha(v1alpha1)实验版本随时修改删除禁止生产使用②Beta(v1beta1)公测版本功能基本定型不建议长期生产使用③Stable(v1)稳定正式版长期兼容生产环境首选生命周期路线Alpha → Beta → Stable3、API访问控制两道关卡顺序固定①认证 Authentication你是谁校验访问者身份证书、Token、账号密码失败返回401拒绝访问。②授权 Authorization你可以干什么校验账号权限控制增删改查操作。完整请求链路kubectl客户端 → Api‑Server → 认证 → 授权 → etcd读写集群数据4、废弃API老旧接口逐步淘汰先标记告警后续新版本彻底移除。5、查询集群API资源命令kubectl api-resources九K8s资源名称与简写对照表全称简写别名含义查询示例podspo最小运行单元封装容器kubectl get podeploymentsdeploy无状态控制器管理Pod副本数量kubectl get deployservicessvc服务负载均衡入口(NodePort/ClusterIP)kubectl get svcnamespacens命名空间项目环境隔离kubectl get nsnodesno集群服务器节点kubectl get no二、K8s 集群部署实操CentOS7 k8s‑1.23.6集群规划 master192.168.193.140 node1192.168.193.141 node2192.168.193.142一前置环境准备master、node所有节点全部执行1、修复失效CentOS‑7 yum源mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo yum clean all yum makecache2、关闭防火墙、SELinux、禁用Swap分区systemctl stop firewalld.service systemctl disable firewalld.service systemctl status firewalld.service sed -i s/^SELINUX.*/SELINUXdisabled/ /etc/selinux/config setenforce 0 swapoff -a sed -ri s/.*swap.*/#/ /etc/fstab3、主机域名解析hostscat /etc/hosts EOF 192.168.193.140 k8s-master 192.168.193.141 k8s-node1 192.168.193.142 k8s-node2 EOF4、开启内核网桥转发参数k8s网络必备cat /etc/sysctl.d/k8s.conf EOF net.bridge.bridge-nf-call-ip6tables 1 net.bridge.bridge-nf-call-iptables 1 net.ipv4.ip_forward 1 EOF modprobe br_netfilter sysctl --system5、安装Docker‑CE 20.10.24适配k8s1.23yum install -y yum-utils yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum install -y docker-ce-20.10.24 docker-ce-cli-20.10.24 containerd.io systemctl daemon-reload systemctl enable --now docker docker -v mkdir -p /etc/docker cat /etc/docker/daemon.json EOF { registry-mirrors: [https://docker.mirrors.ustc.edu.cn], exec-opts: [native.cgroupdriversystemd] } EOF systemctl daemon-reload systemctl restart docker6、配置 Kubernetes 阿里云yum源cat /etc/yum.repos.d/kubernetes.repo EOF [kubernetes] nameKubernetes baseurlhttps://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled1 gpgcheck0 repo_gpgcheck0 gpgkeyhttps://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF7、安装集群三件套kubelet、kubeadm、kubectl①kubelet节点代理运行在所有 master、node 节点上的核心服务。负责跟 k8s 集群通信管理本机上面的 Pod 容器容器启停都由它管控必须开机自启。②kubeadm集群部署工具集群初始化命令工具kubeadm init初始化主节点kubeadm join让 worker‑node 加入集群。只装它就能快速搭建 k8s不用手动配置一堆证书。③kubectl集群命令行客户端k8s 的管理命令工具集群的增删查改都靠它例如 kubectl get pods。一般只建议主节点安装worker 节点可以不装yum clean all yum makecache yum install -y kubelet-1.23.6 kubeadm-1.23.6 kubectl-1.23.6 systemctl enable kubelet8、时间同步chrony及重启yum install chrony -y systemctl enable --now chronyd chronyc -a makestep chronyc sources date reboot二初始化并创建集群步骤1Master节点初始化集群仅master执行kubeadm init \ --apiserver-advertise-address192.168.193.140 \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.23.6 \ --service-cidr10.96.0.0/12 \ --pod-network-cidr10.244.0.0/16参数注解--apiserver-advertise-addressmaster对外广播IP必须填这台虚拟机真实网卡 IP后面node节点通过该IP找到主服务器、加入集群--image-repository阿里云镜像仓库解决国内镜像拉取失败--kubernetes-version指定集群版本master/node版本必须完全一致--service-cidr10.96.0.0/12--pod-network-cidrPod网段必须和flannel插件网段保持一致10.244.0.0/16kubeadm init 开始初始化 K8s 控制节点会自动下载、启动集群四大核心组件kube‑apiserver集群入口、etcd集群数据库、kube‑controller‑manager、kube‑scheduler步骤2授权kubectl管理员权限仅mastermkdir -p $HOME/.kube // 在当前 root 用户家目录新建隐藏文件夹 .kube用来存放 kubectl 连接集群的授权配置文件。 sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config // 把 k8s‑master 生成好的管理员证书文件复制到上面新建的文夹。/etc/kubernetes/admin.conf 就是集群管理员权限凭证。 sudo chown $(id -u):$(id -g) $HOME/.kube/config // 修改文件所有者让当前用户有权读取这个配置文件。如果跳过这条后面执行kubectl会报权限拒绝。 kubectl get nodes // 验证命令查看当前集群节点列表。步骤3Worker节点加入集群node1、node2master节点上获取加入凭证# master主机上运行 查看当前集群所有可用的、且能让新主机node加入集群的令牌 (token) [rootk8s-master ~]# kubeadm token list TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS hllut4.xn0fmq9jbgb6npp1 22h 2026-08-20T09:00:17Z authentication,signing The default bootstrap token generated by kubeadm init. system:bootstrappers:kubeadm:default-node-token 获取ca证书hash指纹 [rootk8s-master ~]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2/dev/null | openssl dgst -sha256 -hex | sed s/^.* // 14324ae440b423f0d0a526798cc8a420b091b524b82374c2c8123bc4919a8f39Token临时通行证sha256‑hashmaster防伪指纹二者缺一不可node节点执行join命令加入集群# node1主机上运行 [rootk8s-node1 ~]# kubeadm join 192.168.193.140:6443 --token hllut4.xn0fmq9jbgb6npp1 --discovery-token-ca-cert-hash sha256:14324ae440b423f0d0a526798cc8a420b091b524b82374c2c8123bc4919a8f39# master主机上运行查看加入节点 [rootk8s-master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master NotReady control-plane,master 101m v1.23.6 k8s-node1 NotReady none 2m31s v1.23.6步骤4部署CNI网络插件 Flannelmaster执行节点状态为NotReady就是缺少网络插件kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml #查看flannel运行状态 kubectl get pods -n kube-flannel #查看全部节点状态Ready即集群就绪 kubectl get nodes可选拓展给node节点开通kubectl管理员权限1、master传输证书文件scp admin.conf rootk8s-node1:/etc/kubernetes scp admin.conf rootk8s-node2:/etc/kubernetes2、node节点配置环境变量echo export KUBECONFIG/etc/kubernetes/admin.conf ~/.bash_profile source ~/.bash_profile #验证 kubectl get nodesPA理论部分的图片源自于网络博主少许本人加工编辑