K8S 概念与安装 【K8S (一)】
目录
4.1 控制平面(Master / Control Plane)组件
1、云原生的基础概述
云原生的定义
1.1 云原生的发展介绍
云原生技术的主要发展历程如下:
- 2004年:Google开始在内部大规模使用容器技术。
- 2008年:Google将Cgroups技术合并进Linux内核,为容器化技术奠定基础。
- 2013年:Docker项目正式发布,推动容器技术进入开源领域。
- 2014年:Kubernetes项目正式发布,成为容器编排的行业标准。
- 2015年:Google、Redhat、微软等共同发起成立CNCF(云原生计算基金会),推进云原生技术
- 的开源生态。
- 2017年:CNCF成员达到170个,基金项目数量为14个。
- 2018年:CNCF迎来三周年,成员数达195个,基金项目19个。
1.2 云原生的定义
云原生技术帮助企业在公有云、私有云和混合云等动态环境中构建和运行可弹性扩展的应用。
- 公有云:公有云是一种云计算服务,其基础设施由云服务提供商在互联网上公开提供。与私有云不同,公有云上的资源是共享的,用户可以按需使用和付费,无需拥有或管理基础设施。公有云服务通常提供存储、计算、网络和应用程序服务等资源。常见的公有云服务提供商包括亚马逊云、微软 Azure、谷歌云等。
- 私有云:私有云是指一种云计算模式,是企业或组织在自己的数据中心中搭建的基于云计算技术的自有云平台。与公有云不同,私有云完全由企业自己拥有和控制,可以提供更高的安全性和灵活性,因为企业可以根据自身需求对云计算环境进行定制和管理,同时也不需要担心基础设施和数据被外部访问。因此,私有云通常被用于托管企业核心应用程序和敏感数据,以满足严格的规定和监管要求
- 混合云:混合云(Hybrid Cloud)是指由多个云计算架构、不同的云服务提供商或多种云计算部署模式组成的一个集成的云计算环境。混合云将公有云、私有云、本地IT基础设施和第三方云服务有机地结合起来,以满足企业不同的应用场景和需求。
混合云由多个云环境组成,使得企业可以根据应用的不同需要选择最合适的云环境,使其最大化利用公有云提供的高度灵活性和弹性,同时也可以保留私有云提供的安全性、控制性和可靠性。
混合云的部署方式比较复杂,但能够提供更加灵活的云计算解决方案。在混合云中,企业可以将敏感数据存储在私有云中,同时运行不太敏感的应用程序和工作负载则可以在公有云中进行部署,这能够使得企业在降低成本的同时保持数据和隐私的安全性。
云原生技术帮助企业在公有云、私有云和混合云等动态环境中构建和运行可弹性扩展的应用。
- 公有云:公有云是一种云计算服务,其基础设施由云服务提供商在互联网上公开提供。与私有云不同,公有云上的资源是共享的,用户可以按需使用和付费,无需拥有或管理基础设施。公有云服务通常提供存储、计算、网络和应用程序服务等资源。常见的公有云服务提供商包括亚马逊云、微软 Azure、谷歌云等。
- 私有云:私有云是指一种云计算模式,是企业或组织在自己的数据中心中搭建的基于云计算技术的自有云平台。与公有云不同,私有云完全由企业自己拥有和控制,可以提供更高的安全性和灵活性,因为企业可以根据自身需求对云计算环境进行定制和管理,同时也不需要担心基础设施和数据被外部访问。因此,私有云通常被用于托管企业核心应用程序和敏感数据,以满足严格的规定和监管要求
- 混合云:混合云(Hybrid Cloud)是指由多个云计算架构、不同的云服务提供商或多种云计算部署模式组成的一个集成的云计算环境。混合云将公有云、私有云、本地IT基础设施和第三方云服务有机地结合起来,以满足企业不同的应用场景和需求。
混合云由多个云环境组成,使得企业可以根据应用的不同需要选择最合适的云环境,使其最大化利用公有云提供的高度灵活性和弹性,同时也可以保留私有云提供的安全性、控制性和可靠性。
混合云的部署方式比较复杂,但能够提供更加灵活的云计算解决方案。在混合云中,企业可以将敏感数据存储在私有云中,同时运行不太敏感的应用程序和工作负载则可以在公有云中进行部署,这能够使得企业在降低成本的同时保持数据和隐私的安全性。
1.3 云原生的技术栈
云原生技术栈包括以下关键技术:
- 容器化:如Docker、containerd,提供应用的轻量级封装和环境一致性。
- 服务网格:例如Istio,管理服务之间的通信、安全性和流量控制。
- 微服务架构:将应用拆解为多个独立的服务,支持灵活扩展和独立部署。
- 不可变基础设施:服务一旦部署,便不再修改,通常使用版本化的镜像来保持一致性。
- 声明式API:通过定义期望的状态,由系统自动管理资源。
云原生 = 容器化(docker+k8s) + 微服务(Microservices)+ 无服务(Serverless) + DevOps +
Service Mesh(服务网格) + 云(Cloud)

1.4 云原生的特征
云原生系统具备以下特征,确保其适应现代云计算环境的需求:
1.符合12因素应用:应用遵循12因素开发原则,确保可扩展性、无状态性、易维护等。
2. 面向微服务架构:应用拆解为独立的、松耦合的服务。
3. 自服务敏捷架构:开发人员可以自主创建和管理云资源,减少对运维的依赖。
4. 基于API的协作:通过API进行服务间的通信。
5. 抗脆弱性:系统具有自愈能力,能够应对不稳定的环境因素。
12因素应用的具体原则:
1. 基准代码:使用同一代码库进行版本控制,并支持多次部署。
2. 依赖管理:显式声明和隔离各依赖项,确保环境一致性。
3. 配置管理:配置项存储在环境中,避免硬编码。
4. 后端服务:外部服务作为附加资源使用。
5. 构建、发布、运行分离:清晰区分应用构建和运行阶段。
6. 无状态进程:应用以无状态进程运行,便于水平扩展。
7. 端口绑定:通过端口提供服务,确保应用独立性。
8. 并发处理:通过进程模型进行扩展。
9. 快速启动与优雅终止:应用启动迅速,并在终止时确保数据一致性。
10. 开发环境与生产环境一致:确保开发、预发布和生产环境尽量一致。
11. 日志管理:统一收集并展示日志信息,确保可追溯性。
12. 管理进程:管理性任务(如数据备份)应使用与常驻进程相同的运行环境。
通过遵循这些原则,云原生应用能够在云环境中灵活、安全且高效地运行。
2. K8S 是什么?
- K8S 是 Kubernetes 的简写(K + “ubernetes” 中的 8 个字母 + S)
- Kubernetes 是一个开源平台,用于 自动部署、扩展和管理容器化(containerized)应用程序
- 它可以看作一个负责自动化运维、编排多个容器(如由 containerd 驱动的容器)的集群管理系统
- 源起:Kubernetes 受 Google 的 Borg 系统启发,后使用 Go 语言重写并捐赠给 CNCF
- 名称含义:源自希腊语,意为 “舵手 / 导航者”
3. 为什么要用 K8S?
Kubernetes 的设计初衷是解决传统部署方式在扩展、管理、容错等方面的困难。
以下是它主要解决的问题和带来的好处:
- 自动化运维:无须人工干预,实现一条命令或声明式方式完成部署、更新、扩容、缩容、删除等
- 弹性伸缩:依据指标(CPU、内存、自定义指标等)自动扩展或缩减 Pod 副本数
- 容灾 / 自愈:当某个节点或容器失败时,K8S 会自动重建或迁移 Pod,保证副本数量和期望状态
- 服务发现与负载均衡:通过 Service 为 Pod 提供稳定的访问入口,并自动分发请求
- 滚动升级与回滚:支持渐进式升级,一旦出错可以回滚到之前版本
- 集中配置与密钥管理:通过 ConfigMap、Secret 等资源集中管理配置与敏感数据
- 存储编排:支持将外部存储(NFS、Ceph、云存储等)纳入集群资源管理
- 批处理 / 定时任务:支持 Job、CronJob 用于一次性或定时任务
4. Kubernetes 集群架构与组件
Kubernetes 采用 控制平面 + 工作节点 的主从架构,控制平面负责调度与管理,节点负责运行实际的应用负载。


4.1 控制平面(Master / Control Plane)组件
| 组件 | 主要职责 |
| kube-apiserver | 集群的 API 接口入口,负责接收所有资源操作请求(增删改查、Watch) |
| kube-controller-manager | 运行多种控制器(Node 控制器、ReplicaSet 控制器、Service 控制器 等),确保资源状态符合期望 |
| kube-scheduler | 对尚未调度的 Pod 选择合适的节点,基于预选(predicates)与优选 (priorities / scoring)策略 |
| etcd | 分布式键值存储,用于持久化保存所有 Kubernetes 资源的状态数据 |
4.2 工作节点(Node / Worker)组件
| 组件 | 主要职责 |
| kubelet | 节点上的代理,负责接收控制平面下发的 Pod 任务,监控、执行、汇报节点与 Pod 状态 |
| kube-proxy | 在节点上实现 Service 的网络规则与负载转发,通常通过iptables、ipvs 或其他网络模型 |
| container runtime(containerd 或 CRI-O 等) | 负责容器镜像拉取、容器启动/停止、资源隔离等底层行为(在Kubernetes ≥1.24 中为必选 CRI 运行时) |
关于 Docker / dockershim 与 containerd 的变动
- Kubernetes 从 1.20 开始宣布弃用内建对 Docker 的支持,逐步推动移除 dockershim
- 在 Kubernetes 1.24 中,dockershim 被正式移除,节点必须使用 CRI 兼容的运行时(如 containerd、CRI-O 等)
- 虽然 Docker 的引擎不再被 Kubernetes 直接使用(即不作为 CRI 运行时),但其构建的镜像仍然兼容,因为镜像符合 OCI 标准
- containerd 是当前主流的轻量级 CRI 运行时,性能稳定、社区活跃
在你安装的是 K8S 1.28 的环境中,默认或者推荐的运行时就是 containerd 或 CRI-O,而不是 Docker。
5. Kubernetes 核心概念与资源对象
下面是 Kubernetes 中常见的、你需要掌握的核心概念和资源类型:
| 概念 / 资源 | 含义与用途 |
| Pod | Kubernetes 中最小的可调度单位。可包含一个或多个容器,这些容器共享 网络、存储等资源。 |
| 控制器(Controller) | 用来确保一定数量的 Pod 在运行、自动修复、扩缩、升级等。典型的控制器 有:• Deployment(管理无状态应用),•ReplicaSet(维持 Pod 副本数),• StatefulSet(有状态服务),• DaemonSet(每节点运行一个Pod),• Job / CronJob(批处理 / 定时任务) |
| Service | 为一组 Pod 提供稳定且可达的访问入口,具有负载均衡功能。Service 通过 标签选择器关联 Pod。 |
| Ingress | 在 HTTP/HTTPS 层面上管理外部访问路由,将外部流量导入集群内的 Service。 |
| Label / Annotation / Selector | Label 是资源的键值对标签,用于标识、组织和筛选资源;Annotation 是用 于存放非标识性、较大元数据的字段;Selector 用于根据 Label 选择资源。 |
| Namespace(命名空间) | 用于将一个 Kubernetes 集群逻辑上划分为多个隔离空间,以实现资源隔 离、权限管理等。 |
| 资源定义结构 | Kubernetes 资源通常以 YAML/JSON 定义,具有 apiVersion、kind、metadata、spec、status 等字段结构。 |
6. Kubernetes 核心能力与特性
- 自动伸缩(Horizontal Pod Autoscaler, Vertical Pod Autoscaler 等)
- 服务发现 & 负载均衡
- 滚动更新 / 回滚
- 容错 / 自愈
- 集中配置 / 密钥管理(ConfigMap / Secret)
- 存储编排与持久化存储(PV / PVC / StorageClass)
- 批处理 / 定时任务
- 资源隔离 / 配额 / 限制(ResourceQuota, LimitRange 等)
- 安全管理机制:如 RBAC(基于角色的访问控制)、NetworkPolicy(网络策略)、Pod 安全策略 /
- Pod 安全准入(安全设置)
7. 部署方式 / 常见部署方案
| 部署方式 | 主要适用场景 |
| Minikube | 在本地启动单节点 Kubernetes,适合实验、学习、演示 |
| kubeadm | 官方推荐的快速部署工具,适合中小型集群 |
| 二进制 / 源码部署 | 手动控制所有组件、TLS 证书等细节,适合高可控的生产环境 |
| 云托管服务(如 GKE / EKS / AKS / 阿里 ACK 等) | 云厂商管理控制平面、节点、升级等,适合企业生产环境 |
对于你自己搭建 K8S 1.28 的环境,选择 kubeadm + containerd 或者 二进制部署 + containerd 更能
兼顾灵活性与稳定性。
8、kubeadm 部署k8s
8.1 K8s集群部署环境准备
| IP | 主机名 | 操作系统 | Kubelet版本 | 用途 |
| 192.168.10.13 | master01 | CentOS 7.9.2009 | v1.20.11 | 管理节点 |
| 192.168.10.14 | node01 | CentOS 7.9.2009 | v1.20.11 | 工作节点 |
| 192.168.10.15 | node02 | CentOS 7.9.2009 | v1.20.11 | 工作节点 |
8.1.2环境部署
1.所有节点,关闭防火墙规则,关闭selinux,关闭swap交换
systemctl disable firewalld --now
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
swapoff -a #交换分区必须要关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab #永久关闭swap分区,&符号在sed命令中代表上次匹配的结果
2.加载 ip_vs 模块
for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");do echo $i; /sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i;done
3.所有节点修改hosts文件
vim /etc/hosts
192.168.10.13 master01
192.168.10.14 node01
192.168.10.15 node02
4.调整内核参数
cat > /etc/sysctl.d/kubernetes.conf << EOF
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
net.ipv6.conf.all.disable_ipv6=1
net.ipv4.ip_forward=1
EOF
sysctl --system
8.1.3安装Docker和K8s
-------------------- 安装docker(全机) --------------------
1.安装docker
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce-20.10.18 docker-ce-cli-20.10.18 containerd.io
2.配置镜像拉取加速器及系统管理
mkdir /etc/docker
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://0a40cefd360026b40f39c00627fa6f20.mirror.swr.myhuaweicloud.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
}
}
EOF
systemctl daemon-reload
systemctl restart docker.service
systemctl enable docker.service
//查看docker控制组是否为systemd
docker info | grep "Cgroup Driver"
Cgroup Driver: systemd
-------------------- 安装kubeadm,kubelet和kubectl(全机) --------------------
1.定义kubernetes源
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
yum install -y kubelet-1.20.11 kubeadm-1.20.11 kubectl-1.20.11
//开机自启kubelet
systemctl enable kubelet.service
#K8S通过kubeadm安装出来以后都是以Pod方式存在,即底层是以容器方式运行,所以kubelet必须设置开机自启
-------------------- 部署K8S集群 (全机)--------------------
1.查看初始化需要的镜像
kubeadm config images list
2.在 master 节点上传 v1.20.11.zip 压缩包至 /opt 目录
unzip v1.20.11.zip -d /opt/k8s
cd /opt/k8s/v1.20.11
for i in $(ls *.tar); do docker load -i $i; done
3.复制镜像和脚本到 node 节点,并在 node 节点上执行脚本加载镜像文件
scp -r /opt/k8s root@node01:/opt
scp -r /opt/k8s root@node02:/opt
4.初始化kubeadm(仅master机)
kubeadm config print init-defaults > /opt/kubeadm-config.yaml
cd /opt
vim kubeadm-config.yaml
===============================kubeadm-config.yaml=============================
......
11 localAPIEndpoint:
12 advertiseAddress: 192.168.10.13 #指定master节点的IP地址
13 bindPort: 6443
......
34 kubernetesVersion: v1.20.11 #指定kubernetes版本号
35 networking:
36 dnsDomain: cluster.local
37 podSubnet: "10.244.0.0/16" #指定pod网段,10.244.0.0/16用于匹配flannel默认网段
38 serviceSubnet: 10.96.0.0/16 #指定service网段
39 scheduler: {}
#末尾再添加以下内容
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs #把默认的kube-proxy调度方式改为ipvs模式
================================================================================
kubeadm init --config=kubeadm-config.yaml --upload-certs | tee kubeadm-init.log
#kubeadm-init 日志
less kubeadm-init.log
#kubernetes配置文件目录
ls /etc/kubernetes/
#存放ca等证书和密码的目录
ls /etc/kubernetes/pki
#为当前用户配置 kubectl 的管理员访问权限
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
#修改kube-scheduler.yaml 和 kube-controller-manager.yaml文件使集群节点便健康
vim /etc/kubernetes/manifests/kube-scheduler.yaml
vim /etc/kubernetes/manifests/kube-controller-manager.yaml
--------------------------修改如下-----------------------------
把--bind-address=127.0.0.1变成--bind-address=192.168.10.19 #修改成k8s的控制节点master01的ip
把httpGet:字段下的hosts由127.0.0.1变成192.168.10.19(有两处)
- --port=0 # 搜索port=0,把这一行注释掉
systemctl restart kubelet
8.1.5添加集群测试创建
---------------------所有节点--------------------
1.部署网络插件flannel
所有节点上传flannel镜像 flannel.tar 到 /opt 目录,master节点上传 kube-flannel.yml文件
cd /opt
docker load < flannel.tar
#在 master 节点创建 flannel 资源
kubectl apply -f kube-flannel.yml
2.在 node 节点上执行 kubeadm join 命令加入群集
kubeadm join 192.168.10.19:6443 --token rc0kfs.a1sfe3gl4dvopck5 \
--discovery-token-ca-cert-hash sha256:864fe553c812df2af262b406b707db68b0fd450dc08b34efb73dd5a4771d37a2
初始化生成的token令牌
kubeadm join 192.168.10.19:6443 --token rc0kfs.a1sfe3gl4dvopck5 \
--discovery-token-ca-cert-hash sha256:864fe553c812df2af262b406b707db68b0fd450dc08b34efb73dd5a4771d37a2
在master节点查看节点状态
kubectl get nodes
测试 pod 资源创建
kubectl create deployment nginx --image=nginx
暴露端口提供服务
kubectl expose deployment nginx --port=80 --type=NodePort
测试访问
curl http://node01:32404
8.1.6部署 Dashboard
1.在 master01 节点上操作
上传 recommended.yaml 文件到 /opt/k8s 目录中
cd /opt/k8s
vim recommended.yaml
#默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部:
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
ports:
- port: 443
targetPort: 8443
nodePort: 30001 #添加
type: NodePort #添加
selector:
k8s-app: kubernetes-dashboard
2.应用文件yaml
kubectl apply -f recommended.yaml
3.创建service account并绑定默认cluster-admin管理员集群角色
kubectl create serviceaccount dashboard-admin -n kube-system
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
4.使用输出的token登录Dashboard
https://NodeIP:30001
更多推荐

所有评论(0)