53 k8s基础与安装

文章目录

前言

本文档系统介绍Kubernetes基础概念与安装流程,涵盖云原生技术演进、K8S核心架构、集群部署步骤及资源管理方法。通过理论与实践结合,详细说明K8S的组件原理、安装配置及日常操作,帮助读者构建完整的云原生知识体系。

  1. 云原生的基础概述
  2. K8S_是什么
  3. 为什么要用_K8S
  4. Kubernetes_集群架构与组件
  5. Kubernetes_核心概念与资源对象
  6. Kubernetes_核心能力与特性
  7. 部署方式_常见部署方案
  8. kubeadm_部署K8S
  9. Kubernetes_操作管理概述
  10. 项目生命周期管理
  11. 发布策略
  12. 声明式资源管理方法

理论部分

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、谷歌云等。

②_私有云

私有云是企业或组织在自己数据中心搭建的自有云平台,完全由企业拥有和控制,提供更高安全性和灵活性,用于托管核心应用程序。

③_混合云

混合云由公有云、私有云、本地IT基础设施和第三方云服务组成,使企业能按需选择云环境。敏感数据存储在私有云,非敏感应用部署在公有云,平衡成本与安全性。

1.3_云原生的技术栈

云原生技术栈包括容器化、服务网格、微服务架构等关键技术:

  • 容器化:如Docker、containerd,提供应用的轻量级封装和环境一致性。
  • 服务网格:例如Istio,管理服务间通信、安全性和流量控制。
  • 微服务架构:将应用拆解为独立服务,支持灵活扩展和部署。
  • 不可变基础设施:服务部署后不再修改,使用版本化镜像保持一致性。
  • 声明式API:通过定义期望状态,由系统自动管理资源。

云原生 = 容器化(docker+k8s) + 微服务 + 无服务 + DevOps + Service Mesh + 云

①_微服务

微服务将应用拆解为多个独立服务,实现解耦和内聚。依据康威定律组织架构,可通过DDD(领域驱动设计)划分服务。

②_容器化

Docker是广泛应用的容器引擎(基于LXC技术),容器化为微服务提供隔离保障。K8S是容器编排系统,用于管理容器间负载均衡。

③_DevOps

DevOps是开发(Dev)与运维(Ops)的融合,倡导敏捷思维和协作文化,支撑云原生的持续交付。

④_持续交付

持续交付支持不停机更新和小步快跑,要求开发版与稳定版并存,需流程和工具支撑。

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的简写,意为"舵手/导航者",是自动化容器化应用部署、扩展和管理的开源平台。

2.1_K8S的起源与定义

源起 :受Google的Borg系统启发,使用Go语言重写并捐赠给CNCF
名称含义 :源自希腊语,意为"舵手/导航者"
官网

  • 英文:https://kubernetes.io
  • 中文:https://kubernetes.io/zh-cn/docs
    版本节奏 :每年约四个发布版本(如1.12、1.15...1.30、1.34)
    关键时间线
  • 2014年:Docker与Kubernetes蜜月期
  • 2015~2016年:Kubernetes与RKT vs Docker竞争(Docker胜出)
  • 2017年:rkt和containerd捐献给CNCF
  • 2020年:Kubernetes宣布废弃dockershim
  • 2022年5月3日:Kubernetes v1.24正式发布(移除dockershim)

2.2_版本特性

Kubernetes 1.24起移除对Docker的内建支持,节点必须使用符合CRI(Container Runtime Interface)的运行时(如containerd、CRI-O)。Docker构建的镜像仍兼容(符合OCI标准),但需使用CRI运行时。

3_为什么要用_K8S

Kubernetes解决传统部署在扩展、管理和容错方面的困难,主要解决以下问题:

3.1_核心优势

  • 自动化运维:通过命令或声明式方式自动完成部署、更新等操作
  • 弹性伸缩:依据CPU、内存等指标自动扩缩Pod副本数
  • 容灾/自愈:自动重建故障Pod,维持副本数量
  • 服务发现与负载均衡:通过Service提供稳定访问入口
  • 滚动升级与回滚:支持渐进式升级和回滚
  • 集中管理配置:通过ConfigMap/Secret统一管理配置与密钥
  • 存储编排:集成NFS、Ceph等外部存储
  • 批处理支持:通过Job/CronJob管理定时任务

4_Kubernetes_集群架构与组件

Kubernetes采用控制平面+工作节点的主从架构,控制平面负责调度管理,节点运行实际负载。

4.1_控制平面组件

组件 角色 职责
kube-apiserver 核心大脑 集群API接口入口,处理资源操作请求
kube-controller-manager 控制器 运行控制器(Node/ReplicaSet等),确保状态符合期望
kube-scheduler 调度器 为Pod选择合适节点,基于预选和优选策略
etcd 核心存储 分布式键值存储,用于持久化保存所有资源状态

高可用建议:生产环境部署多实例避免单点故障

4.2_工作节点组件

组件 职责
kubelet 节点代理,执行Pod任务并汇报状态
kube-proxy 实现Service网络规则与负载转发
container runtime 负责容器镜像拉取、容器生命周期管理(CRI运行时)
①_Docker_dockershim_与_containerd
  • Kubernetes 1.20起弃用Docker支持,1.24正式移除dockershim
  • 节点必须使用CRI兼容运行时(containerd、CRI-O等)
  • containerd是主流轻量级CRI运行时(K8S 1.28默认推荐)

5_Kubernetes_核心概念与资源对象

Kubernetes通过多种资源对象管理容器化应用。

5.1_核心概念

资源 含义与用途
Pod 最小可调度单位,共享网络/存储的容器组
控制器 确保Pod数量/状态的控制器(Deployment/ReplicaSet/StatefulSet等)
Service 4层网络 为Pod提供稳定访问入口,带负载均衡功能
Ingress 7层网络 管理HTTP/HTTPS层外部流量路由
Label/Annotation Label标识资源,Annotation存储元数据
Namespace 逻辑隔离集群资源

5.2_资源定义结构

Kubernetes资源通过YAML/JSON定义,包含字段:

  • apiVersion:API版本
  • kind:资源类型
  • metadata:对象元数据
  • spec:期望状态
  • status:当前状态(只读)

5.3_部署方式对比

部署方式 适用场景
Minikube 本地单节点体验
kubeadm 官方推荐的中小型集群部署
二进制/源码 高可控生产环境
云托管服务 企业级生产环境(如GKE/EKS/AKS)

6_Kubernetes_核心能力与特性

Kubernetes提供七项关键能力:

  1. 自动伸缩:Horizontal/Vertical Pod Autoscaler
  2. 服务发现与负载均衡:DNS服务发现,Service负载均衡
  3. 滚动更新/回滚:声明式更新与回溯
  4. 容错/自愈:节点/Pod故障自动迁移
  5. 集中配置/密钥管理:ConfigMap/Secret机制
  6. 存储编排与持久化:PV/PVC/StorageClass
  7. 安全管理:RBAC/NetworkPolicy等

7_部署方式_常见部署方案

7.1_典型集群环境

节点 角色 IP 主机名
node13 管理节点 192.168.100.13 k8s-master01
node14 工作节点 192.168.100.14 k8s-node01
node15 工作节点 192.168.100.15 k8s-node02

kubeadm + containerd 或 二进制部署 + containerd 兼顾灵活性与稳定性

故障日志 :k8s不能使用有下划线的主机名,例如k8s-node01

操作系统 :CentOS 7.9.2009
Kubelet版本:v1.28.2

实验部分

8_kubeadm_部署K8S

8.1_集群部署环境准备

所有节点

①_配置主机名
shell 复制代码
hostnamectl set-hostname k8s-master01

hostnamectl:系统主机名管理工具
set-hostname:设置主机名的子命令
k8s-master01:指定新主机名,另外两个节点为k8s-node01、k8s-node02

②_配置主机映射
shell 复制代码
cat >>/etc/hosts <<EOF
192.168.100.13 k8s-master01
192.168.100.14 k8s-node01
192.168.100.15 k8s-node02
EOF

/etc/hosts:本地DNS解析文件
cat >>:追加内容到文件
EOF:文件结束符标记

③_关闭防火墙和selinux
shell 复制代码
systemctl stop firewalld.service
systemctl disable firewalld.service
setenforce 0 
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

systemctl stop:临时停止服务
systemctl disable:禁用开机自启
setenforce 0:临时关闭SELinux
sed -i:文件内编辑替换

④_关闭swap分区
shell 复制代码
swapoff -a
sed -i '/swap/s/^/#/g' /etc/fstab

swapoff -a:关闭所有swap分区
sed -i:注释/etc/fstab中swap条目

⑤_配置内核参数和优化
shell 复制代码
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
sysctl --system

/etc/sysctl.d/k8s.conf:K8S专用内核参数文件
sysctl --system:加载所有配置

⑥_安装ipset和ipvsadm
shell 复制代码
yum -y install conntrack ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git

ipvsadm:IPVS管理工具(提供L4负载均衡)
ipset:IP集合工具(提升iptables效率)

⑦_加载IPVS内核模块
shell 复制代码
cat >/etc/modules-load.d/ipvs.conf <<EOF
# Load IPVS at boot
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
nf_conntrack_ipv4
EOF
systemctl enable --now systemd-modules-load.service
  • 验证模块加载状态
shell 复制代码
lsmod |egrep "ip_vs|nf_conntrack_ipv4"
ini 复制代码
nf_conntrack_ipv4      15053  0 
nf_defrag_ipv4         12729  1 nf_conntrack_ipv4
ip_vs_sh               12688  0 
ip_vs_wrr              12697  0 
ip_vs_rr               12600  0 
ip_vs                 145458  6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
nf_conntrack          139264  2 ip_vs,nf_conntrack_ipv4
libcrc32c              12644  3 xfs,ip_vs,nf_conntrack
⑧_安装Containerd运行时
shell 复制代码
yum -y install yum-utils device-mapper-persistent-data lvm2

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

cat >>/etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF

modprobe overlay
modprobe br_netfilter

yum -y install containerd.io
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
sed -i '/SystemdCgroup/s/false/true/g' /etc/containerd/config.toml
sed -i '/sandbox_image/s/registry.k8s.io/registry.aliyuncs.com\/google_containers/g' /etc/containerd/config.toml

systemctl enable --now containerd

containerd config default:生成默认配置
SystemdCgroup=true:使用systemd作为cgroup驱动
registry.aliyuncs.com/google_containers:阿里镜像加速源

8.2_安装kubectl_kubelet_kubeadm

①_添加阿里Kubernetes源
shell 复制代码
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

阿里K8S镜像仓库:https://mirrors.aliyun.com/kubernetes/yum/

②_安装核心组件
shell 复制代码
yum -y install kubectl-1.28.2 kubelet-1.28.2 kubeadm-1.28.2
systemctl enable --now kubelet

kubeadm:集群初始化工具
kubelet:节点代理进程
kubectl:命令行管理工具

8.3_部署Kubernetes集群

node13 管理节点 192.168.100.13 k8s-master01

①_初始化集群配置
shell 复制代码
cat >/tmp/kubeadm-init.yaml <<EOF
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: v1.28.2
controlPlaneEndpoint: 192.168.100.13:6443
imageRepository: registry.aliyuncs.com/google_containers
networking:
  podSubnet: 10.244.0.0/16
  serviceSubnet: 10.96.0.0/16
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
EOF

controlPlaneEndpoint: 192.168.100.13:6443:API服务器端点
podSubnet: 10.244.0.0/16:Pod网络CIDR(需与CNI一致)
serviceSubnet: 10.96.0.0/16:Service网络CIDR
mode: ipvs:启用IPVS负载均衡

②_初始化集群
shell 复制代码
kubeadm init --config=/tmp/kubeadm-init.yaml --ignore-preflight-errors=all

--ignore-preflight-errors=all:忽略所有预检错误(仅测试环境用)

输出关键信息:kubeadm join ... 用于节点加入

ini 复制代码
Your Kubernetes control-plane has initialized successfully!
# 根据以下提示创建kubectl
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

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

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/

You can now join any number of control-plane nodes by copying certificate authorities
and service account keys on each node and then running the following as root:
# 加入其他控制平面节点
  kubeadm join 192.168.100.13:6443 --token lt5k3r.7wz0mwhyc65635by \
	--discovery-token-ca-cert-hash sha256:ce4424ab492a2a635b96e0b3b04ab6c907eb4d1b2c31d4671a6c32bc0322fd27 \
	--control-plane 

Then you can join any number of worker nodes by running the following on each as root:
# 加入工作节点
kubeadm join 192.168.100.13:6443 --token lt5k3r.7wz0mwhyc65635by \
	--discovery-token-ca-cert-hash sha256:ce4424ab492a2a635b96e0b3b04ab6c907eb4d1b2c31d4671a6c32bc0322fd27  
③_根据提示配置kubectl
shell 复制代码
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf

admin.conf:集群管理配置文件路径

非root用户需执行此操作

  • 查看node节点和pod
shell 复制代码
kubectl get node
kubectl get pod -A

注:Node节点为NotReady,因为corednspod没有启动,缺少网络pod

④_安装CNI网络插件Calico
shell 复制代码
wget https://docs.tigera.io/archive/v3.25/manifests/calico.yaml
vim calico.yaml  # 修改第4551行
conf 复制代码
4551             - name: CALICO_IPV4POOL_CIDR
4552               value: "10.244.0.0/16"

CALICO_IPV4POOL_CIDR改为与podSubnet一致(10.244.0.0/16)

shell 复制代码
kubectl apply -f calico.yaml

Calico官网:https://docs.tigera.io/archive/v3.25/manifests/calico.yaml

⑤_添加工作节点

k8s-node节点

shell 复制代码
kubeadm join 192.168.100.13:6443 --token lt5k3r.7wz0mwhyc65635by \
	--discovery-token-ca-cert-hash sha256:ce4424ab492a2a635b96e0b3b04ab6c907eb4d1b2c31d4671a6c32bc0322fd27 

该命令在master节点初始化输出中获取
192.168.100.13:6443:控制平面接口端口

8.4_部署Kubernetes_Dashboard

①_下载配置文件
shell 复制代码
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
②_修改Service类型
shell 复制代码
vim recommended.yaml
conf 复制代码
32 kind: Service
33 apiVersion: v1
34 metadata:
35   labels:
36     k8s-app: kubernetes-dashboard
37   name: kubernetes-dashboard
38   namespace: kubernetes-dashboard
39 spec:
40   type: NodePort
41   ports:
42     - port: 443
43       targetPort: 8443
44       nodePort: 30000
45   selector:
46     k8s-app: kubernetes-dashboard

type: NodePort:启用节点端口访问
nodePort: 30000:固定访问端口

③_创建Dashboard资源
shell 复制代码
kubectl apply -f recommended.yaml
④_创建管理员账户
shell 复制代码
cat >dashboard-admin.yaml <<EOF
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin
  namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin
  namespace: kubernetes-dashboard
---
apiVersion: v1
kind: Secret
metadata:
  name: kubernetes-dashboard-admin
  namespace: kubernetes-dashboard
  annotations:
    kubernetes.io/service-account.name: "admin"
type: kubernetes.io/service-account-token
EOF
kubectl apply -f dashboard-admin.yaml

cluster-admin:K8S最高权限角色

⑤_获取访问Token
shell 复制代码
Token=$(kubectl -n kubernetes-dashboard get secret |awk '/kubernetes-dashboard-admin/ {print $1}')
kubectl describe secrets -n kubernetes-dashboard ${Token} |grep token |awk 'NR==NF {print $2}'

输出的长字符串即为登录Token

访问地址:https://192.168.100.13:30000

结语

K8S核心组件:控制平面(apiserver/controller/scheduler/etcd)与工作节点(kubelet/kube-proxy)构成分布式架构,1.24+版本依赖CRI运行时(如containerd)。

部署关键点:需关闭防火墙/SELinux/Swap,配置内核参数,Calico网络CIDR必须与kubeadm配置一致,serviceSubnet固定为10.96.0.0/16。

服务暴露方式:NodePort端口范围30000-32767,Service中port为集群内部端口,nodePort为外部访问端口。

发布策略:滚动更新(默认)、蓝绿发布(通过Service切换)、金丝雀发布(通过pratition控制)。

!question\] 请问Kubernetes移除Dockershim后如何处理容器运行时? 官方要求使用CRI兼容运行时(如containerd、CRI-O),Docker镜像仍兼容但需通过CRI接口调用。 \[!question\] 请问K8S网络如何实现跨节点通信? Calico方案:通过BGP路由协议构建全互联网络;Flannel方案:VXLAN/VLAN封装实现overlay网络。 \[!question\] 请问Service的三种关键端口区别? port:ClusterIP访问端口;nodePort:节点外部访问端口;targetPort:Pod容器实际端口。 \[!question\] 金丝雀发布如何操作? 通过`kubectl set image`更新镜像后立即`rollout pause`,观察部分流量验证,确认后`rollout resume`继续更新。

相关推荐
ZIXEL子虔科技1 天前
重绘赛道:AI将如何定义国产CAD的下一代?
ai·云原生
x70x801 天前
# Docker 搭建 MySQL 8 主从复制(踩坑实录 + 完整验证)
mysql·docker·容器
qq_316837751 天前
docker 运行 cn_clip
运维·docker·容器
江湖有缘1 天前
轻量级知识协作平台搭建:Docker + MediaWiki入门教程
docker·容器·eureka
Genie cloud1 天前
在 Mac 上使用 Docker 安装宝塔并部署 LNMP 环境
macos·docker·容器·云计算
Suchadar1 天前
Docker常用命令
运维·docker·容器
你才是臭弟弟1 天前
MinIo开发环境配置方案(Docker版本)
运维·docker·容器
七夜zippoe1 天前
Docker容器化Python应用最佳实践:从镜像优化到安全防护
python·docker·云原生·eureka·容器化
卓码软件测评1 天前
第三方软件课题验收测试【使用Docker容器部署LoadRunner负载生成器以实现弹性压测 】
测试工具·docker·容器·性能优化·单元测试·测试用例
Knight_AL1 天前
Dockerfile 的 EXPOSE 和 Docker Compose 的 ports 有什么区别?
docker·容器·eureka