从零到一:Kubernetes 基础概念与集群部署详解
- 作者简介:我是团团儿,是一名专注于云计算领域的专业创作者,感谢大家的关注
- 座右铭: 云端筑梦,数据为翼,探索无限可能,引领云计算新纪元
- 个人主页:团儿.-CSDN博客
前言:
在当今瞬息万变的数字时代,应用的需求正推动着基础设施的革新。我们早已告别了将应用monolithic 地部署在单一服务器的时代,转而进入了以容器和微服务为标志的云原生纪元。容器技术带来了环境的一致性与部署的敏捷性,但随之而来的是一个全新的挑战:如何高效、可靠地管理成百上千个在分布式环境中运行的容器?如何确保它们能够无缝协作、快速自愈并轻松扩展?
正是在这样的背景下,Kubernetes(常简称为K8s) 而生,并迅速确立了其作为容器编排领域事实标准的地位。
因此,本文的旅程将从根基开始。我将首先系统地剖析Kubernetes的核心架构与基本概念,带您清晰地认识:
-
控制平面(Control Plane) 的各个组件(如kube-apiserver、etcd、kube-scheduler、kube-controller-manager)如何共同决策,管理集群的全局状态。
-
工作节点(Node) 上的关键守护进程(如kubelet、kube-proxy、容器运行时)如何忠实地执行指令,确保您的应用稳定运行。
-
核心抽象对象 如Pod、Service、ConfigMap等,如何将复杂的运维需求抽象为易于理解和操作的声明式配置。
理论的价值在于指导实践,我将一步步引导您完成一个完整的Kubernetes集群的部署。
现在,请让我们一同开启这段旅程,从理清Kubernetes的基本脉络开始,直至亲手搭建并驾驭您的第一个容器集群,迈出成为云原生实践者的坚实一步。

正文:
一.基本概念及组件
Kubernetes这个单词来自于希腊语,含义是 舵手 或 领航员;
生产环境级别的容器编排
编排是什么意思:
1. 按照一定的目的依次排列;
2. 调配、安排;
Kubernetes,也称为K8S,其中8是代表中间“ubernete”的8个字符,是Google在2014年开源的一个容器编排引擎,用于自动化容器化应用程序的部署、规划、扩展和管理,它将组成应用程序的容器分组为逻辑单元,以便于管理和发现,用于管理云平台中多个主机上的容器化的应用,Kubernetes 的目标是让部署容器化的应用简单并且高效,很多细节都不需要运维人员去进行复杂的手工配置和处理;
Kubernetes拥有Google在生产环境上borg 15年运行的经验,并结合了社区中最佳实践;
K8S是 CNCF 的项目,本来Kubernetes是Google的内部项目,后来开源出来,又后来为了其茁壮成长,捐给了CNCF;
CNCF全称Cloud Native Computing Foundation(云原生计算基金会)
官网:https://kubernetes.io/
中文社区:https://www.kubernetes.org.cn/k8s
代码:https://github.com/kubernetes/kubernetes
Kubernetes是采用Go语言开发的,Go语言是谷歌2009发布的一款开源编程语言;
二.k8s整体结构
Master:
k8s集群控制节点,对集群进行调度管理,接受集群外用户去集群操作请求;
Master Node 由 API Server、Scheduler、ClusterState Store(ETCD 数据库)和 Controller ManagerServer 所组成;
Nodes:
集群工作节点,运行用户业务应用容器;
Nodes节点也叫Worker Node,包含kubelet、kube proxy 和 Pod(Container Runtime);
k8s网络通讯模式---flannel---pod---etcd
k8s组件及流程架构:
┌─────────────────────────────────────────────────────────────────┐
│ CLIENTS │
│ kubectl | Dashboard | API调用 | 其他工具 │
└───────────────────────────┬─────────────────────────────────────┘
│
┌───────────────────────────▼─────────────────────────────────────┐
│ MASTER NODE │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ API Server │ │
│ │ ● 统一RESTful API入口 │ │
│ │ ● 认证、授权、验证 │ │
│ │ ● 所有组件通信枢纽 │ │
│ └─────────────┬───────────────────────────────┬───────────────┘ │
│ │ │ │
│ ┌─────────────▼─────────────┐ ┌───────────────▼─────────────┐ │
│ │ Controller Manager │ │ Scheduler │ │
│ │ ● Node Controller │ │ ● 监听未调度Pod │ │
│ │ ● Replication Controller │ │ ● 选择最优Node │ │
│ │ ● Endpoints Controller │ │ ● 考虑负载、亲和性等 │ │
│ │ ● Namespace Controller │ │ │ │
│ └───────────────────────────┘ └───────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ Etcd │ │
│ │ ● 集群状态存储 │ │
│ │ ● 配置信息持久化 │ │
│ │ ● 数据变更通知 │ │
│ └─────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
│
│ 调度指令、状态上报
│
┌─────────────────────────────────────▼─────────────────────────────┐
│ WORKER NODES │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ Node 1 │ │
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────┐ │ │
│ │ │ Kubelet │ │ kube-proxy │ │ Pod │ │ │
│ │ │ ● 管理Pod生命周期│ │ ● Service代理 │ │ ┌─────────┐ │ │ │
│ │ │ ● 状态上报 │ │ ● 负载均衡 │ │ │ Container│ │ │ │
│ │ │ ● 容器健康检查 │ │ ● 网络规则 │ │ └─────────┘ │ │ │
│ │ └─────────────────┘ └─────────────────┘ └─────────────┘ │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ Node 2 │ │
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────┐ │ │
│ │ │ Kubelet │ │ kube-proxy │ │ Pod │ │ │
│ │ │ ● 管理Pod生命周期│ │ ● Service代理 │ │ ┌─────────┐ │ │ │
│ │ │ ● 状态上报 │ │ ● 负载均衡 │ │ │ Container│ │ │ │
│ │ │ ● 容器健康检查 │ │ ● 网络规则 │ │ └─────────┘ │ │ │
│ │ └─────────────────┘ └─────────────────┘ └─────────────┘ │ │
│ └─────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
核心网络与服务发现:
┌─────────────────────────────────────────────────────────────────┐
│ NETWORK & SERVICE LAYER │
│ │
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────┐ │
│ │ Flannel │ │ CoreDNS │ │ Ingress │ │
│ │ ● Pod网络 overlay │ │ ● 服务发现 │ │ ● 7层负载均衡 │ │
│ │ ● 跨主机通信 │ │ ● DNS解析 │ │ ● HTTP路由 │ │
│ │ ● CNI插件 │ │ ● 集群内部域名 │ │ ● SSL终止 │ │
│ └─────────────────┘ └─────────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────────────────┘
例:
创建pod流程:
用户(kubectl) → API Server → Etcd(存储)
→ Scheduler(监听) → API Server → Etcd(更新调度信息)
→ 目标Node的Kubelet(监听) → Docker → 创建容器
→ Kubelet → API Server → Etcd(状态更新)
Service访问流程:
客户端 → Service VIP → kube-proxy → iptables/ipvs规则
→ 后端Pod(负载均衡) → 容器应用
服务发现流程:
Pod应用 → CoreDNS → 解析Service域名 → Service IP
→ kube-proxy → 后端Pod
组件:
kubectl: k8s是命令行端,用来发送客户的操作指令。
API server: 是k8s 集群的前端接口,各种客户端工具以及k8s的其他组件可以通过它管理k8s集群的各种资源。它提供了HTTP/HTTPS RESTful API,即K8S API。是所有服务访问的统一入口。
Scheduler: 负责决定将Pod放在哪个Node上运行。在调度时,会充分考虑集群的拓扑结构,当前各个节点的负载情况,以及应对高可用、性能、数据亲和性和需求。负责介绍任务,选择合适的节点进行分配任务。
Controller Manager: 负责管理集群的各种资源,保证资源处于预期的状态,用来维持副本期望数量。它由多种Controller 组成,包括Replication Controller维护副本数量即期望值,创建删除pod、Endpoints Controller、Namespace Controller、Serviceaccounts Controller等等。
Etcd: 键值对数据库 存储k8s集群所有重要信息(持久化),负责保存k8s集群的配置信息和各种资源的状态信息。当数据发生变化时,etcd会快速的通知k8s相关组件。第三方组件,它有可替换方案 Consul、zookeeper。
Etcd的官方将它定位成一个**可信赖**(天生支持集群化)的**分布式键值存储服务**(k-v结构),能够为整个分布式集群存储一些关键数据,协助分布式集群的正常运转。
V2版本会把所有数据写入到内存中,关机后数据丢失
V3版本会做本地持久化,写入到本地存储。
Kubelet: 它是Node的agent(代理),当Scheduler确定某个Node上运行Pod之后,会将Pod的具体配置信息发送给该节点的kubelet,kubelet会根据这些信息创建和运行容器,并向Master报告运行状态。管理(增删改查)Pod.
kube-proxy: 负责将访问service的TCP/UDP数据流转发到后端的容器。如果有多个副本,kube-proxy会实现负载均衡。
COREDNS: 可以为集群中的SVC创建一个域名IP的对应关系解析
DASEBORD: 给k8s提供一个B/S结构的UI界面。
INGRESS Crontroller:官方只能实现4层负载均衡,它可以实现7层负载均衡。
Pod:k8s集群的最小组成单位。一个Pod内,可以运行一个或多个容器。大多数情况下,一个Pod内只有一个Container容器。
Flannel: 是k8s集群网路方案,可以保证Pod的跨主机通信。第三方解决方案,也有替换方案。
服务分类:
有状态服务:DBMS数据库管理系统(MYSQL)从pod中剔除后,再恢复就会造成数据丢失。
无状态服务:LVS APACHE NGINX
对docker来说更适合运行无状态服务,对k8s来说目标就是可以运行好有状态服务
三.架构:
从borg到k8s
BorgMaster专门负责请求分发类似大脑,而工作节点是由Borglet负责提供(容器,计算,服务等等),上述都有多个副本3,5,7,9可以防止选举出现双数导致的问题。
提供了多种访问方式,浏览器,命令行,文件------->BrogMaster-------->scheduler(调度器)写入paxos数据库存储,并进行监听,如果发现请求就进入消费环节。
k8s特点:
轻量级:消耗资源小 开源 弹性伸缩 负载均衡:iptables ipvs
部署 Kubernetes 环境(集群)主要有多种方式:
(1)minikube
minikube可以在本地运行Kubernetes的工具,minikube可以在个人计算机(包括Windows,macOS和Linux PC)上运行一个单节点Kubernetes集群,以便您可以试用Kubernetes或进行日常开发工作;
https://kubernetes.io/docs/tutorials/hello-minikube/
(2)kind
Kind和minikube类似的工具,让你在本地计算机上运行Kubernetes,此工具需要安装并配置Docker;
https://kind.sigs.k8s.io/
(3)kubeadm
Kubeadm是一个K8s部署工具,提供kubeadm init 和 kubeadm join两个操作命令,可以快速部署一个Kubernetes集群;
官方地址:
https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
(4)二进制包
从Github下载发行版的二进制包,手动部署安装每个组件,组成Kubernetes集群,步骤比较繁琐,但是能让你对各个组件有更清晰的认识;
(5)yum安装
通过yum安装Kubernetes的每个组件,组成Kubernetes集群,不过yum源里面的k8s版本已经比较老了,所以这种方式用得也比较少了;
(6)第三方工具
有一些大神封装了一些工具,利用这些工具进行k8s环境的安装;
(7)花钱购买
直接购买类似阿里云这样的公有云平台k8s,一键搞定;
四.环境部署
切记 docker与k8s版本必须一致!!!
1.基本环境准备
Centos7.8 双核 4G/node
2.更改主机名
hostnamectl set-hostname masterhostnamectl set-hostname node01hostnamectl set-hostname node02
3.添加对应域名解析
cat >> /etc/hosts << EOF192.168.8.20 master192.168.8.30 node01192.168.8.40 node02EOF
4.禁用防火墙、SElinux
systemctl stop firewalldsystemctl disable firewalldsetenforce 0sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
5.时间同步
timedatectl set-timezone Asia/Shanghai;timedatectl set-local-rtc 0
6.禁用swap
swapoff -a && sed -i '/swap/s/^/#/' /etc/fstab free -h
查看禁用效果
7.配置集群无密登录 master到node01,node02无密码
ssh-keygen -t rsassh-copy-id root@node01ssh-copy-id root@node02
8.优化内核参数
Master:
modprobe br_netfiltercat > /etc/sysctl.d/kubernetes.conf << EOFnet.bridge.bridge-nf-call-iptables = 1net.bridge.bridge-nf-call-ip6tables = 1net.ipv4.ip_forward = 1net.ipv4.tcp_tw_recycle = 0vm.swappiness = 0vm.overcommit_memory = 1vm.panic_on_oom = 0fs.inotify.max_user_instances = 8192fs.inotify.max_user_watches = 1048576fs.file-max = 52706963fs.nr_open = 52706963net.ipv6.conf.all.disable_ipv6 = 1net.netfilter.nf_conntrack_max = 2310720EOF
sysctl -p /etc/sysctl.d/kubernetes.conf
Master:
scp /etc/sysctl.d/kubernetes.conf node01:/etc/sysctl.d/scp /etc/sysctl.d/kubernetes.conf node02:/etc/sysctl.d/
Node01:
sysctl -p /etc/sysctl.d/kubernetes.conf
Node02:
sysctl -p /etc/sysctl.d/kubernetes.conf
9.基本环境完成,需要在各节点准备k8s的yum源 (推荐阿里云yum源)
Master:
cat <<EOF > /etc/yum.repos.d/kubernetes.repo[kubernetes]name=Kubernetesbaseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/enabled=1gpgcheck=1repo_gpgcheck=1gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpgEOF
10.部署k8s组件
** master节点部署了kubectl、kubelet、kubeadm三个组件,当然在部署前要指定和k8s版本一致的组件版本。
yum install kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0 -y --nogpgchecksystemctl start kubeletsystemctl enable kubelet
注:阿里源安装时,需要添加--nogpgcheck参数
//node节点只需部署kubelet-1.18.0 kubeadm-1.18.0即可
### 更改docker默认Cgroup驱动
在/etc/docker/daemon.json文件中,添加一句话即可,当然这个和我们的设置加速器写在一起了。
cat > /etc/docker/daemon.json << EOF{"registry-mirrors": ["https://docker.m.daocloud.io","https://luzxy6tp.mirror.aliyuncs.com","https://hub.uuuadc.top","https://docker.anyhub.us.kg","https://dockerhub.jobcher.com","https://dockerhub.icu","https://docker.ckyl.me","https://docker.awsl9527.cn"],"exec-opts": ["native.cgroupdriver=systemd"]}EOFsystemctl daemon-reloadsystemctl restart docker
> PS: 不要忘了重新加载以及重启doker
11.Kubeadm初始化:
至此,准备工作做完,可以开始初始化,可是由于国内网络环境限制,我们不能直接从谷歌的镜像站下载镜像,有两种方法可以解决,第一种:需要我们手动从docker镜像站下载镜像,然后重新命名,也可以用脚本来实现。这里我们采用第二种:在初始化k8s的时候,指定镜像源为阿里云。
初始化时指定镜像仓库为阿里云
kubeadm init --kubernetes-version=v1.18.0 --image-repository registry.aliyuncs.com/google_containers --apiserver-advertise-address 192.168.8.20 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12
或者还有其他方案将k8s集群状态配置问一个yaml文件,然后从yaml文件初始化
kubeadm config print init-defaults > kubeadm-config.yamlvim kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta2bootstrapTokens:- groups:- system:bootstrappers:kubeadm:default-node-tokentoken: abcdef.0123456789abcdefttl: 24h0m0susages:- signing- authenticationkind: InitConfigurationlocalAPIEndpoint:advertiseAddress: 192.168.8.20bindPort: 6443nodeRegistration:criSocket: /var/run/dockershim.sockname: mastertaints:- effect: NoSchedulekey: node-role.kubernetes.io/master
apiServer:timeoutForControlPlane: 4m0sapiVersion: kubeadm.k8s.io/v1beta2certificatesDir: /etc/kubernetes/pkiclusterName: kubernetescontrollerManager: {}dns:type: CoreDNSetcd:local:dataDir: /var/lib/etcdimageRepository: registry.cn-hangzhou.aliyuncs.com/google_containerskind: ClusterConfigurationkubernetesVersion: v1.18.0networking:dnsDomain: cluster.localserviceSubnet: 10.96.0.0/12podSubnet: 10.244.0.0/16scheduler: {}
apiVersion: kubeproxy.config.k8s.io/v1alpha1kind: KubeProxyConfigurationmode: "ipvs"
//初始化集群
注:可以提前导入镜像
master节点:
docker load -i etcd.tardocker load -i quay.io-flannel.tardocker load -i kube-apiserver.tardocker load -i kube-controller-manager.tardocker load -i kube-proxy.tardocker load -i kube-scheduler.tardocker load -i kube-webhook.tardocker load -i coredns.tardocker load -i pause.tardocker load -i flannel-plugin.tar
node节点:
docker load -i pause.tardocker load -i kube-proxy.tardocker load -i quay.io-flannel.tardocker load -i flannel-plugin.tar
kubeadm init --config=kubeadm-config.yaml
成功后会有提示:
mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/configkubeadm join 192.168.8.90:6443 --token abcdef.0123456789abcdef \--discovery-token-ca-cert-hash sha256:a2ec410cea22ef589a7af6072008fbace244a9106bde030e771e9d933124ceec
> PS: 结果做一个保存
systemctl enable kubelet
查看节点:
Kubectl get nodes
此时查看master状态是未就绪(NotReady**),之所以是这种状态是因为还缺少一个附件**flannel**,没有网络各Pod是无法通信的
//添加网络组件(flannel),组件flannel可以通过https://github.com/coreos/flannel中获取
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
再次查看

以上是主节点的安装部署,然后个node节点的安装,和加入集群,这里注意,验证,node节点已经准备好了相关的镜像。
kubeadm join 192.168.8.20:6443 --token njus35.kw3hxkys3urmnuob --discovery-token-ca-cert-hash sha256:05761b73b571c18eebd6972fb70323cd3c4d8e0aa7514efa2680411310424184
node节点需要几个镜像,可以手动先下载一下,或者从master节点同步
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.18.0docker pull quay.io/coreos/flannel:v0.15.1docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2
等待一会去master节点验证。等待的是同步flannel网络。

设置kubectl命令行工具自动补全功能
yum install -y bash-completionsource /usr/share/bash-completion/bash_completionsource <(kubectl completion bash)echo "source <(kubectl completion bash)" >> ~/.bashrc
为了以后我们写yaml文件方便些,这里设置tab键空格个数
Master:
vim .vimrcset tabstop=2
source .vimrc
在master验证k8s组件 如下所示代表安装组件完整且是running状态

**记得三台节点最后要执行systemctl enable kubelet 忘记的集群就启动不了
五.Kubernetes部署“容器化应用”
在Kubernetes集群中部署一个Nginx :
kubectl create deployment nginx --image=nginx:1.17kubectl expose deployment nginx --port=80 --type=NodePortkubectl get pod,svc -o widekubectl get deploymentkubectl scale deployment nginx --replicas=3kubectl describe deployment nginx (查看)kubectl describe pod nginx-

访问地址:
http://NodeIP:Port
在Kubernetes集群中部署一个Tomcat :
kubectl create deployment tomcat --image=tomcatkubectl expose deployment tomcat --port=8080 --type=NodePort
访问地址:
http://NodeIP:Port
K8s部署微服务(springboot程序):
1、项目打包(jar、war)-->可以采用一些工具git、maven、jenkins
2、制作Dockerfile文件,生成镜像;
3、kubectl create deployment nginx --image= 你的镜像
4、你的springboot就部署好了,是以docker容器的方式运行在pod里面的
六.kuboard:
k8s图形化管理工具
网站:
https://kuboard.cn
安装:使用华为源
kubectl apply -f https://addons.kuboard.cn/kuboard/kuboard-v3-swr.yaml
查看部署情况:
kubectl get pod -n kuboard
(-n命名空间 就是namespace)
部署后访问:
http://192.168.8.20:30080
用户名: admin
密码: Kuboard123
添加k8s集群
期待您的关注~
