Kubernetes技术入门与实践(一):单Master集群部署
Kubernetes技术入门与实践一单Master集群部署详解欢迎来到Kubernetes技术入门系列的第一部分在本教程中我将详细讲解如何在OpenEuler 24.03 SP3系统上部署一个单Master Kubernetes集群。Kubernetes简称K8S是一个开源的容器编排系统用于自动化容器化应用的部署、扩展和管理。单Master集群是最简单的生产级架构包括一个Master节点负责集群控制和多个Worker节点运行应用负载。基于您提供的配置IP地址192.168.64.128为Master192.168.64.129和192.168.64.130为Worker节点我将结合理论知识和实际操作代码逐步指导您完成部署。整个过程包括准备工作、软件安装、集群初始化、网络插件配置及验证确保您能全面掌握。第一部分Kubernetes核心理论知识在部署前理解Kubernetes的基本概念至关重要。这有助于后续操作的理解和问题排查。1. Kubernetes架构概述Kubernetes采用主从架构Master节点集群的“大脑”包含以下核心组件API Server处理所有REST操作是集群通信的入口。例如当您运行kubectl命令时它会与API Server交互。etcd分布式键值存储存储集群状态如节点信息、Pod定义。它保证数据一致性和高可用性。Controller Manager运行控制器逻辑监控集群状态并确保实际状态匹配期望状态如自动修复失败的Pod。Scheduler将Pod分配到合适的Worker节点基于资源需求和约束。Worker节点运行应用负载的节点包含kubelet节点代理负责启动和停止Pod并与Master通信。kube-proxy管理网络规则实现Service的负载均衡和网络路由。Container Runtime运行容器的引擎如Docker通过CRIContainer Runtime Interface与kubelet集成。在单Master集群中Master节点承担所有控制平面角色Worker节点执行任务。这种架构简单易部署但存在单点故障风险生产环境建议使用多Master高可用方案。2. Kubernetes核心概念Pod最小部署单元包含一个或多个容器如Docker容器。Pod共享网络和存储资源是调度的基础单位。Service抽象层为Pod提供稳定的网络端点。Service使用ClusterIP内部IP或NodePort外部访问通过负载均衡路由流量到后端Pod。IP地址范围由--service-cidr参数定义如您指定的10.96.0.0/12。Deployment声明式管理Pod副本集支持滚动更新和回滚。网络模型Kubernetes要求所有Pod能相互通信。网络插件如Flannel实现Overlay网络为每个Pod分配唯一IP。--pod-network-cidr参数如10.244.0.0/16定义了Pod IP范围确保不冲突。CRIContainer Runtime Interface标准接口允许kubelet与不同容器运行时如Docker、containerd交互。Docker原生不支持CRI因此需要适配器如cri-dockerd。3. 部署准备工作理论系统要求OpenEuler 24.03 SP3基于CentOS兼容性强。节点需满足CPU2核以上内存2GBMaster建议4GB。网络所有节点需互通禁用防火墙和SELinux。存储建议20GB磁盘空间。网络配置集群IP范围需规划Pod网络10.244.0.0/16CIDR表示法可分配65536个IP。Service网络10.96.0.0/12CIDR表示法范围更大。 计算子网掩码对于10.244.0.0/16掩码为255.255.0.0IP范围从10.244.0.1到10.244.255.254。软件版本您指定的版本Kubernetes v1.28.15、Docker CE 28.5.2、cri-dockerd 0.3.8经过测试兼容。Kubeadm是官方部署工具简化集群初始化。接下来我们将进入实操部分。确保所有节点k8s-master, k8s-node1, k8s-node2已完成系统安装并联网。第二部分部署准备工作在开始集群部署前所有节点需进行基础配置包括主机名设置、网络优化和软件安装。本节基于OpenEuler 24.03 SP3系统。1. 配置主机名和hosts文件所有节点需设置主机名并更新/etc/hosts文件确保名称解析。这避免IP变动导致的通信问题。在k8s-master节点192.168.64.128执行# 设置主机名 hostnamectl set-hostname k8s-master # 编辑hosts文件 cat EOF /etc/hosts 192.168.64.128 k8s-master 192.168.64.129 k8s-node1 192.168.64.130 k8s-node2 EOF在k8s-node1节点192.168.64.129执行hostnamectl set-hostname k8s-node1 cat EOF /etc/hosts 192.168.64.128 k8s-master 192.168.64.129 k8s-node1 192.168.64.130 k8s-node2 EOF在k8s-node2节点192.168.64.130执行hostnamectl set-hostname k8s-node2 cat EOF /etc/hosts 192.168.64.128 k8s-master 192.168.64.129 k8s-node1 192.168.64.130 k8s-node2 EOF验证运行hostname和ping k8s-master确保响应正常。2. 系统优化为减少干扰需关闭防火墙、禁用SELinux并配置内核参数。所有节点执行# 关闭防火墙 systemctl stop firewalld systemctl disable firewalld # 禁用SELinux临时生效 setenforce 0 # 永久禁用编辑配置文件 sed -i s/SELINUXenforcing/SELINUXdisabled/g /etc/selinux/config # 配置内核参数避免swap影响性能 swapoff -a sed -i / swap / s/^/#/ /etc/fstab # 加载内核模块用于网络和存储 cat EOF /etc/modules-load.d/k8s.conf overlay br_netfilter EOF modprobe overlay modprobe br_netfilter # 设置sysctl参数启用IP转发 cat EOF /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables 1 net.bridge.bridge-nf-call-iptables 1 net.ipv4.ip_forward 1 EOF sysctl --system3. 安装Docker容器运行时Docker是运行容器的基础。您指定安装docker-ce-28.5.2版本需配置yum源。所有节点执行# 安装依赖 yum install -y yum-utils device-mapper-persistent-data lvm2 # 添加Docker CE仓库OpenEuler兼容CentOS源 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 安装指定版本Docker yum install -y docker-ce-28.5.2 docker-ce-cli-28.5.2 containerd.io # 启动Docker并设置开机自启 systemctl start docker systemctl enable docker # 验证安装 docker --version # 应输出 Docker version 28.5.24. 安装cri-dockerd适配器由于Docker不支持原生CRI需安装cri-dockerd作为桥接。您指定rpm包cri-dockerd-0.3.8-3.el8.x86_64.rpm。所有节点执行# 下载rpm包假设已下载到当前目录 # wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.8/cri-dockerd-0.3.8-3.el8.x86_64.rpm # 安装rpm包 rpm -ivh cri-dockerd-0.3.8-3.el8.x86_64.rpm # 启动cri-dockerd并设置开机自启 systemctl start cri-docker systemctl enable cri-docker # 验证检查socket文件 ls /var/run/cri-dockerd.sock # 应存在5. 安装Kubernetes组件安装kubelet、kubeadm和kubectl。kubeadm用于初始化集群kubelet是节点代理kubectl是命令行工具。所有节点执行# 添加Kubernetes仓库使用阿里云镜像加速 cat EOF /etc/yum.repos.d/kubernetes.repo [kubernetes] nameKubernetes baseurlhttps://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled1 gpgcheck0 EOF # 安装指定版本您指定v1.28.15 yum install -y kubelet-1.28.15 kubeadm-1.28.15 kubectl-1.28.15 # 启动kubelet并设置开机自启 systemctl start kubelet systemctl enable kubelet # 验证版本 kubeadm version # 应输出 v1.28.15 kubectl version --client # 应输出 v1.28.15准备工作完成所有节点现在具备运行集群的基础。接下来在Master节点初始化集群。第三部分Master节点初始化在k8s-master节点192.168.64.128执行kubeadm init命令初始化集群。我将详细解释每个参数并执行。1. kubeadm init命令详解您提供的命令kubeadm init --apiserver-advertise-address192.168.64.128 --image-repositoryregistry.aliyuncs.com/google_containers --kubernetes-versionv1.28.15 --pod-network-cidr10.244.0.0/16 --service-cidr10.96.0.0/12 --cri-socketunix:///var/run/cri-dockerd.sock参数说明值/示例--apiserver-advertise-address指定 API Server 监听的 IP 地址确保 Worker 节点能连接。192.168.64.128--image-repository使用阿里云镜像仓库避免从 Google 官方仓库下载国内访问慢。registry.aliyuncs.com/google_containers--kubernetes-version指定 Kubernetes 版本需与安装的组件版本一致。v1.28.15--pod-network-cidr设置 Pod 网络范围为 Flannel 网络插件的默认 CIDR。10.244.0.0/16--service-cidr设置 Service 网络范围范围较大避免 IP 耗尽。10.96.0.0/12--cri-socket指定 CRI socket 路径指向 cri-dockerd 适配器。unix:///var/run/cri-dockerd.sock2. 执行初始化命令在k8s-master节点运行命令kubeadm init --apiserver-advertise-address192.168.64.128 --image-repositoryregistry.aliyuncs.com/google_containers --kubernetes-versionv1.28.15 --pod-network-cidr10.244.0.0/16 --service-cidr10.96.0.0/12 --cri-socketunix:///var/run/cri-dockerd.sock初始化过程可能持续2-5分钟输出类似[init] Using Kubernetes version: v1.28.15 [preflight] Running pre-flight checks [preflight] Pulling images required for setting up a Kubernetes cluster ... Your Kubernetes control-plane has initialized successfully! To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config You should now deploy a pod network to the cluster. Run kubectl apply -f [podnetwork].yaml with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/ Then you can join any number of worker nodes by running the following on each as root: kubeadm join 192.168.64.128:6443 --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef关键输出解释成功消息表示控制平面已启动。kubeadm join命令用于Worker节点加入包含token和CA证书哈希实际输出会不同。需配置kubectl访问权限。3. 配置kubectl在Master节点执行mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config验证Master状态kubectl get nodes # 输出应显示k8s-master为NotReady因网络插件未装 NAME STATUS ROLES AGE VERSION k8s-master NotReady control-plane 1m v1.28.154. 常见问题解决镜像拉取失败如果卡在Pulling images检查网络或手动拉取kubeadm config images pull --image-repositoryregistry.aliyuncs.com/google_containers --kubernetes-versionv1.28.15端口冲突确保6443、10250等端口空闲。cri-dockerd问题检查服务状态systemctl status cri-docker确保socket存在。Master节点初始化完成现在添加Worker节点。第四部分Worker节点加入集群在k8s-node1和k8s-node2节点执行kubeadm join命令加入集群。基于Master输出的join命令。1. 获取join命令在Master节点如果忘记join命令可重新生成kubeadm token create --print-join-command # 输出类似kubeadm join 192.168.64.128:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:0123456789abcdef...2. 在Worker节点执行join在k8s-node1192.168.64.129和k8s-node2192.168.64.130分别运行kubeadm join 192.168.64.128:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef输出应显示成功加入This node has joined the cluster: * Certificate signing request was sent to apiserver and a response was received. * The Kubelet was informed of the new secure connection details.3. 在Master节点验证节点状态回到Master节点kubectl get nodes # 输出示例所有节点为NotReady因网络插件未装 NAME STATUS ROLES AGE VERSION k8s-master NotReady control-plane 10m v1.28.15 k8s-node1 NotReady none 1m v1.28.15 k8s-node2 NotReady none 1m v1.28.154. 常见问题解决Token过期默认token有效期24小时。过期后在Master节点生成新tokenkubeadm token create --print-join-command网络不通确保Worker节点能ping通Master IP。cri-dockerd问题在Worker节点检查systemctl status cri-docker。Worker节点加入完成现在安装网络插件。第五部分安装网络插件Kubernetes需要网络插件实现Pod间通信。您指定的--pod-network-cidr10.244.0.0/16兼容Flannel我将使用Flannel部署。1. Flannel插件简介Flannel是一个简单Overlay网络方案为每个Pod分配唯一IP。它使用VXLAN或host-gw模式确保跨节点Pod通信。CIDR10.244.0.0/16是Flannel默认范围。2. 安装Flannel在Master节点执行# 下载Flannel配置文件 wget https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml # 应用配置 kubectl apply -f kube-flannel.yml输出podsecuritypolicy.policy/psp.flannel.unprivileged created clusterrole.rbac.authorization.k8s.io/flannel created ... daemonset.apps/kube-flannel-ds created3. 验证网络插件检查Pod状态kubectl get pods -n kube-system # 输出应包含kube-flannel-ds-* Pods状态为Running NAME READY STATUS RESTARTS AGE kube-flannel-ds-abcde 1/1 Running 0 1m ... # 检查节点状态应变为Ready kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master Ready control-plane 15m v1.28.15 k8s-node1 Ready none 6m v1.28.15 k8s-node2 Ready none 6m v1.28.154. 网络测试部署测试应用验证网络# 创建测试Deployment kubectl create deployment nginx-test --imagenginx:alpine --replicas2 # 暴露Service kubectl expose deployment nginx-test --port80 --typeNodePort # 获取Service信息 kubectl get svc nginx-test # 输出示例 NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx-test NodePort 10.96.123.45 none 80:30001/TCP 1m # 测试访问在任意节点curl curl http://10.96.123.45 # 应返回Nginx欢迎页5. 常见问题解决Pod卡在Pending检查网络插件日志kubectl logs -n kube-system kube-flannel-ds-abcde。IP冲突确保--pod-network-cidr不与现有网络重叠。网络插件安装完成集群已就绪。第六部分集群验证与基本操作部署后需全面验证集群功能。1. 核心组件检查在Master节点运行# 检查Master组件状态 kubectl get pods -n kube-system # 输出应包含etcd-k8s-master, kube-apiserver-k8s-master, kube-controller-manager-k8s-master, kube-scheduler-k8s-master状态为Running # 检查kubelet日志所有节点 journalctl -u kubelet -f # 无错误日志2. 部署示例应用部署一个简单应用测试调度cat EOF nginx-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:alpine ports: - containerPort: 80 EOF # 应用配置 kubectl apply -f nginx-deployment.yaml # 查看Pod分布应均匀在Worker节点 kubectl get pods -o wide3. 集群管理命令查看节点资源kubectl top nodes查看事件kubectl get events备份etcd重要# 在Master节点 docker run --rm -v /etc/kubernetes/pki/etcd:/etc/kubernetes/pki/etcd -v /backup:/backup registry.aliyuncs.com/google_containers/etcd:3.5.9 etcdctl snapshot save /backup/etcd-snapshot.db4. 常见问题排查节点NotReady检查网络插件或kubelet日志。Service无法访问验证kube-proxy和网络策略。资源不足使用kubectl describe node查看资源分配。集群已验证可用但单Master架构适合测试环境。