当前位置: 首页 > news >正文

Kubernetes 入门指南

Kubernetes 入门指南:从概念到实战部署

  • 前言
  • 一、Kubernetes 概述
      • 1.1. 什么是 Kubernetes?
      • 1.2. 为什么需要 Kubernetes?
      • 1.3. Kubernetes 的目标与功能
      • 1.4. Kubernetes 的特性
  • 二、Kubernetes 集群架构与组件
      • 2.1. 核心组件
        • 2.1.1. Master 组件
        • 2.1.2. 配置存储中心
        • 2.1.3. Node 组件
      • 2.2. Kubernetes 核心概念
  • 三、Kubernetes 实战部署
      • 3.1. 环境准备
      • 2. 安装 Containerd、ipset、ipvsadm
      • 3. 部署Kubernetes集群
  • 结语

前言

  在当今云原生技术飞速发展的时代,容器化技术已成为现代应用开发和部署的核心。而在众多容器编排工具中,Kubernetes(简称 K8s) 无疑是最耀眼的明星。它不仅能够简化容器的部署与管理,还能实现应用的自动化伸缩、负载均衡和故障恢复,极大地提升了应用的可扩展性与可靠性。
  本文将从 Kubernetes 的基本概念与架构 出发,深入解析其核心组件与功能,随后通过 详细的实战步骤,指导您如何在本地环境中搭建一套完整的 Kubernetes 集群,并部署 Dashboard 与 Harbor 私有仓库,实现应用的可视化管理与镜像的高效存储。无论您是初学者还是有一定经验的开发者,希望这篇文章都能为您理解和应用 Kubernetes 提供有力的支持与参考。

一、Kubernetes 概述

1.1. 什么是 Kubernetes?

  Kubernetes(K8s) 是一个用于自动部署、扩展和管理容器化应用程序的开源系统。简而言之,K8s 是一个强大的容器编排框架,旨在帮助用户高效地管理多个容器化程序(如 Docker 容器),实现集群化运维。

  • 全称与缩写:Kubernetes 的全称是 “Kubernetes”,通常缩写为 “K8s”(将 “ubernete” 的八个字母以数字 8 代替)。
  • 起源:K8s 最初由 Google 基于其内部大规模容器编排工具 Borg 开发,后用 Go 语言重写并捐献给 CNCF(云原生计算基金会) 进行开源。
  • 词源:其名称源自希腊语,意为“舵手”或“飞行员”,象征着在复杂容器环境中导航与控制的能力。
  • 官方网站
    • 英文官网:https://kubernetes.io
    • 中文官网:https://kubernetes.io/zh-cn/docs

1.2. 为什么需要 Kubernetes?

  传统的后端部署方式通常涉及手动将程序包部署到服务器上,并通过脚本启动和监控程序。然而,随着服务请求量的增长,传统方法暴露出诸多问题:

  • 手动干预:需要人工介入进行服务的部署、更新和扩容,效率低下。
  • 资源管理困难:难以有效管理大量容器,导致管理成本上升。
  • 缺乏容灾与自愈能力:系统在节点故障时无法自动恢复,影响服务稳定性。
  • 复杂的编排与配置:缺乏统一的配置管理和高效的编排模板,难以实现快速、大规模的容器调度。

  Kubernetes 的出现正是为了解决这些问题,它通过自动化运维管理容器化应用,提供了一系列完整的功能,显著提高了大规模容器集群管理的便捷性与可靠性。

1.3. Kubernetes 的目标与功能

  • 目标:让部署容器化应用变得简单高效
  • 主要功能
    • 容器包装与实例化:使用 Docker 等容器技术对应用程序进行打包、实例化和运行。
    • 集群管理:以集群的方式运行、管理跨多台机器的容器,解决跨机器容器之间的通讯问题。
    • 自我修复机制:确保容器集群始终运行在用户期望的状态,自动重启失败的容器,替换和重新部署,保证预期的副本数量。
    • 服务发现与负载均衡:为多个容器提供统一的访问入口,通过内部 IP 地址和 DNS 名称进行访问,并实现负载均衡。
    • 自动发布与回滚:采用滚动更新策略,确保应用升级过程中的高可用性,支持在出现问题时回滚更改。
    • 集中化配置与密钥管理:安全管理敏感数据与应用程序配置,避免将敏感信息暴露在镜像中。
    • 存储编排:支持挂载外部存储系统,如本地存储、公有云存储(如 AWS)、网络存储(如 NFS、Glusterfs、Ceph),提高存储使用的灵活性。
    • 任务批处理:支持一次性任务和定时任务,满足批量数据处理和分析的需求。

1.4. Kubernetes 的特性

  • 弹性伸缩:根据 CPU 使用情况或其他指标,自动快速扩容和缩容应用程序实例,保障高并发时的高可用性,同时在低峰期回收资源,降低成本。
  • 自我修复:在节点或容器故障时,自动重启或替换容器,确保服务的连续性和预期的副本数量。
  • 服务发现和负载均衡:通过统一的访问入口和负载均衡机制,简化服务间的通信与流量管理。
  • 自动发布与回滚:通过滚动更新策略,确保应用升级过程平稳,支持快速回滚以应对升级失败。
  • 集中化配置管理与密钥管理:安全管理配置与密钥,提升应用的安全性。
  • 存储编排:灵活挂载和管理多种存储资源,满足不同应用场景的需求。
  • 任务批处理运行:支持批处理任务,适用于大规模数据处理和分析。

二、Kubernetes 集群架构与组件

  Kubernetes 采用主从设备模型(Master-Slave 架构),包括 Master 节点Worker Node 节点

  • Master 节点:负责集群的调度、管理和运维,是整个集群的“大脑”。如果 Master 节点宕机,控制命令将失效。
  • Worker Node 节点:集群中的工作负载节点,负责运行具体的容器化应用。当某个 Node 宕机时,其上的工作负载会被 Master 自动转移到其他节点。

2.1. 核心组件

2.1.1. Master 组件
  • Kube-apiserver
    • 功能:暴露 Kubernetes API,作为所有资源请求和调用的入口。通过 HTTP Restful API 提供服务,处理对象资源的增删改查和监听操作,最终将数据存储到 Etcd 中。
    • 比喻:可以理解为 K8s 的请求入口服务,类似于集群的“大脑”,负责接收并分发所有请求。
  • Kube-controller-manager
    • 功能:运行一系列控制器,作为集群中处理常规任务的后台线程,负责管理集群内所有资源对象的自动化控制。
    • 主要控制器
      • Node Controller:管理节点状态,处理节点故障。
      • Replication Controller:确保集群中 Pod 的副本数符合预期。
      • Endpoints Controller:管理 Service 和 Pod 的连接。
      • Service Account & Token Controllers:管理命名空间的默认账户和 API 访问令牌。
      • ResourceQuota Controller:管理资源配额,防止资源超量使用。
      • Namespace Controller:管理命名空间的生命周期。
      • Service Controller:管理集群与外部云平台的接口。
  • Kube-scheduler
    • 功能:负责为新创建的 Pod 选择合适的 Node 节点,基于调度算法进行资源分配。
    • 调度策略
      • 预选策略(Predicate):过滤不符合条件的 Node。
      • 优选策略(Priorities):对通过预选的 Node 进行打分,选择最优节点。
2.1.2. 配置存储中心
  • Etcd
    • 功能:分布式键值存储系统,用于存储 Kubernetes 的关键配置和用户配置。只有 API Server 具备读写权限,其他组件需通过 API Server 访问数据。
2.1.3. Node 组件
  • Kubelet
    • 功能:Node 节点的监视器与 Master 节点的通讯器,负责管理 Pod 及其容器的生命周期,与 Master 节点通信,汇报节点状态,执行容器的创建、删除和监控等任务。
    • 比喻:Kubelet 可以看作是节点上的“管家”,负责照顾容器,确保它们健康运行。
  • Kube-Proxy
    • 功能:在每个 Node 节点上实现 Pod 网络代理,负责维护网络规则和四层负载均衡,确保 Service 的流量正确转发到后端 Pod。
    • 负载均衡方式
      1. Namespace
      2. iptables(默认)
      3. ipvs(推荐,性能更优)
  • 容器引擎(如 Docker 或 Rocket)
    • 功能:负责在本机创建和管理容器。

2.2. Kubernetes 核心概念

  • Pod
    • 定义:Kubernetes 中最小的部署单元,代表集群上运行的一个进程。一个 Pod 可以包含一个或多个容器,这些容器共享网络、存储和计算资源。
    • 特点:同一 Pod 内的容器可以通过 localhost 互相访问,不同 Pod 之间则不能。
  • Pod 控制器
    • 功能:确保 Pod 按照用户的预期运行,管理副本数、生命周期和健康状态。
    • 常用控制器
      • Deployment:管理无状态应用,确保指定数量的 Pod 副本运行。
      • ReplicaSet:确保预期的 Pod 副本数量,受控于 Deployment。
      • DaemonSet:确保每个节点运行一个特定的 Pod,常用于系统级后台任务。
      • StatefulSet:管理有状态应用。
      • Job:管理一次性任务,任务完成后自动退出。
      • CronJob:管理周期性计划任务。
  • Label
    • 定义:用于对资源对象进行分类和筛选的键值对,便于管理和查询。
  • Label 选择器(Label Selector)
    • 功能:通过标签选择器查询和筛选具有特定标签的资源对象。
  • Service
    • 定义:为提供相同功能的多个 Pod 提供统一的访问入口和负载均衡,屏蔽后端 Pod 的变化,确保服务的高可用性。
    • 作用:通过固定的 Cluster IP 和负载均衡,实现服务发现与流量分发。
  • Ingress
    • 定义:作为 Kubernetes 集群的接入层,负责集群内外的通信,支持 HTTP/HTTPS 访问,提供七层负载均衡。
  • Namespace
    • 定义:用于逻辑上隔离集群内的各种资源,类似于虚拟集群组,便于资源分类管理。
    • 默认 Namespace:default、kube-system、kube-public 等。

三、Kubernetes 实战部署

  接下来,我们将通过详细的步骤,在本地环境中搭建一个包含 Master 节点、两个 Worker Node 节点以及 Harbor 私有仓库 的 Kubernetes 集群,并部署 Dashboard 实现可视化管理。

3.1. 环境准备

  • 节点规划
IP主机名操作系统Kubelet版本用途
192.168.10.61master01CentOS 7.9.2009v1.28.2管理节点
192.168.10.62node01CentOS 7.9.2009v1.28.2工作节点
192.168.10.63node02CentOS 7.9.2009v1.28.2工作节点
  • 基础环境配置(所有节点执行):
#关闭防火墙
systemctl stop firewalld.service
systemctl disable firewalld.service
#关闭增强功能
setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
# 关闭 Swap 分区
swapoff -a
sed -i '/swap/s/^/#/g' /etc/fstab
# 修改主机名
hostnamectl set-hostname master01  # 在 Master 节点执行
hostnamectl set-hostname node01    # 在 Node01 节点执行
hostnamectl set-hostname node02    # 在 Node02 节点执行
# 配置主机映射
cat >>/etc/hosts <<EOF
192.168.10.19 master01
192.168.10.20 node01
192.168.10.21 node02
EOF
#配置内核参数和优化
[root@master ~]# 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
[root@master ~]# sysctl --system
* Applying /usr/lib/sysctl.d/00-system.conf ...
* Applying /usr/lib/sysctl.d/10-default-yama-scope.conf ...
kernel.yama.ptrace_scope = 0
* Applying /usr/lib/sysctl.d/50-default.conf ...
kernel.sysrq = 16
kernel.core_uses_pid = 1
kernel.kptr_restrict = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.promote_secondaries = 1
net.ipv4.conf.all.promote_secondaries = 1
fs.protected_hardlinks = 1
fs.protected_symlinks = 1
* Applying /etc/sysctl.d/99-sysctl.conf ...
* Applying /etc/sysctl.d/k8s.conf ...
net.ipv4.ip_forward = 1
* Applying /etc/sysctl.conf ...

2. 安装 Containerd、ipset、ipvsadm

  • 所有节点执行
# ipset、ipvsadm
yum -y install conntrack ipvsadm ipset jq iptables curl sysstat libseccomp wget
vim net-tools gitcat >/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
# 确认内核模块加载成功
lsmod |egrep "ip_vs|nf_conntrack_ipv4"     #重启或等待一段时间
#Containerd
#安装依赖软件包
yum -y install yum-utils device-mapper-persistent-data lvm2
# 添加阿里Docker源
yum-config-manager --add-repo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#可以通过  https://developer.aliyun.com/mirror/  找到docker 来获取新的源文件
#添加overlay和netfilter模块
cat >>/etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF
modprobe overlay
modprobe br_netfilter
#安装Containerd,这里安装最新版本
yum -y install containerd.io
# 创建Containerd的配置文件
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 containerd
systemctl start containerd
  • 安装 kubeadm、kubelet 和 kubectl
  # 添加 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 --showduplicates list kubelet |grep 1.28
#安装1.28版本
# 安装指定版本的 kubeadm、kubelet 和 kubectl
yum -y install kubectl-1.28.2 kubelet-1.28.2 kubeadm-1.28.2# 设置 kubelet 开机自启systemctl enable kubelet.servicesystemctl start kubelet

3. 部署Kubernetes集群

  • 查看k8s v1.28.2初始化所需要的镜像
kubeadm config images list --kubernetes-version=v1.28.2

在这里插入图片描述

  • 初始化 Master 节点

    方法一:使用配置文件初始化

#主节点写入初始化
vim /tmp/kubeadm-init.yaml
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: v1.28.2
controlPlaneEndpoint: 192.168.10.61:6443
imageRepository: registry.aliyuncs.com/google_containers
networking:podSubnet: 10.244.0.0/16 #指定Pod可用的IP范围(CIDR网段),10.244.0.0/16用于匹配 cni网络插件的网段serviceSubnet: 10.96.0.0/16 #指定service网段
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
#执行初始化
kubeadm init --config=/tmp/kubeadm-init.yaml --ignore-preflight-errors=all

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

根据提示创建kubectl

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
#将 node 节点加入
kubeadm join 192.168.10.61:6443 --token lrpbau.0ntkawaw6y8bd0fw \--discovery-token-ca-cert-hash sha256:a0a5d24e9df7168ca8116e1cadb7b59e05c6a61c9715c817d36828098abe5a0b
kubectl get pod -A #查看 Kubernetes 集群中所有命名空间(Namespace)下的 Pod 的命令
kubectl get pod -A -owide

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#kubectl命令补全功能
yum -y install bash-completion
echo "source <(kubectl completion bash)" >> /etc/profile
source /etc/profile
# 安装Nerdctl管理工具(所有节点)
yum -y install wget
wget -q -c https://github.com/containerd/nerdctl/releases/download/v1.7.0/nerdctl-1.7.0-linux-amd64.tar.gz
tar xf nerdctl-1.7.0-linux-amd64.tar.gz -C /usr/local/bin
nerdctl -n k8s.io ps
echo "source <(nerdctl completion bash)" >> ~/.bashrc
source ~/.bashrc
#导入镜像文件
nerdctl -n k8s.io image load -i calico-cni-v3.24.5.tar
nerdctl -n k8s.io image load -i calico-node-v3.24.5.tar
nerdctl -n k8s.io image load -i calico-controllers-v3.24.5.tar 
nerdctl -n k8s.io image load -i metrics-scraper-v1.0.8.tar
nerdctl -n k8s.io image load -i dashboard-v2.7.0.tar 
#
vim calico.yaml
4601 - name: CALICO_IPV4POOL_CIDR #取消注释
4602 value: "10.244.0.0/16" #取消注释,并将ip地址修改为与初始化集群
时--pod-network-cidr指定的IP地址一致
4551 - name: CALICO_IPV4POOL_CIDR
4552 value: "10.244.0.0/16"
kubectl apply -f calico.yaml#
vim recommended.yaml
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
196 imagePullPolicy: IfNotPresent
kubectl apply -f recommended.yaml
kubectl get pod,svc -n kubernetes-dashboard

在这里插入图片描述

vim dashboard-admin.yaml
apiVersion: v1
kind: ServiceAccount
metadata:name: adminnamespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: admin
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: cluster-admin
subjects:
- kind: ServiceAccountname: adminnamespace: kubernetes-dashboard
---
apiVersion: v1
kind: Secret
metadata:name: kubernetes-dashboard-adminnamespace: kubernetes-dashboardannotations:kubernetes.io/service-account.name: "admin"
type: kubernetes.io/service-account-token
kubectl apply -f dashboard-admin.yaml
#创建token
kubectl -n kubernetes-dashboard create token admin
#获取token
kubectl describe secrets -n kubernetes-dashboard ${Token} |grep token |awk 'NR==NF {print $2}'
kubectl create clusterrolebinding serviceaccount-cluster-admin --clusterrole=cluster-admin --user=system:serviceaccount:kubernetesdashboard:kubernetes-dashboard
kubectl create deployment nginx --image=nginx:1.14 --replicas=3

在这里插入图片描述
在这里插入图片描述

结语

  通过本文的详细介绍,我们从 ​Kubernetes 的基本概念与架构​ 出发,逐步深入到其 ​核心组件与功能,并通过 ​实战部署步骤,在本地环境中成功搭建了一个包含 ​Master 节点、Worker Node 节点以及 Harbor 私有仓库​ 的 Kubernetes 集群。同时,我们还部署了 ​Dashboard,实现了对集群资源的可视化管理和监控。
  Kubernetes 作为一个功能强大且灵活的容器编排平台,不仅能够简化应用的部署与管理,还能实现自动化伸缩、负载均衡、故障恢复等关键功能,极大地提升了应用的可扩展性与可靠性。然而,Kubernetes 的学习和实践之路并非一帆风顺,它涉及到众多的概念、组件和配置细节,需要我们不断探索与积累经验。
  在实际的生产环境中,Kubernetes 的部署与管理可能会更加复杂,涉及更多的安全、网络、存储和监控等方面的考量。因此,建议读者在掌握基础知识后,进一步深入学习 Kubernetes 的高级功能,如 ​Helm 包管理器、Ingress 控制器、持久化存储解决方案(如 Ceph、Rook)​、CI/CD 集成​ 以及 ​安全策略与权限管理​ 等,以更好地应对各种挑战与需求。
  此外,社区资源也是学习 Kubernetes 的重要途径。​Kubernetes 官方文档、GitHub 项目、技术博客​ 以及 ​在线课程​ 都提供了丰富的学习资料和实践案例。参与社区讨论、阅读优秀的开源项目、动手实践各种场景,都是提升 Kubernetes 技能的有效方法。
  最后,希望本文能够为您的 Kubernetes 学习与实践之旅提供有力的支持与启发。无论您是初学者还是有一定经验的开发者,都希望您能在 Kubernetes 的世界中不断探索、不断进步,构建出更加高效、稳定和可扩展的云原生应用。
  ​祝您在云原生的道路上越走越远,收获满满!​​ 🚀

http://www.dtcms.com/a/461399.html

相关文章:

  • SuperMap iClient3D for WebGL 调用GPA服务实现地质体模型裁剪封边
  • HarmonyOS布局利器:RelativeContainer实现灵活相对定位
  • 钦州房产网站建设wordpress完全卸载教程
  • 【ARM 嵌入式 编译系列 10.9.1 -- llvm-size -B 与 llvm-readelf -S 区别】
  • 必应搜索引擎网站最快新闻资讯在哪看
  • 企业可以在哪些网站做免费宣传沈阳市网站制作
  • 技术解析:TENGJUN JA05-BPD035-A防水耳机插座——IPX7防护与高可靠性的音频连接标杆
  • 红队APT组织利用泄露的IAM密钥劫持AWS账户实施数据窃取
  • 做汽车团购网站聊城网站建设包括哪些
  • java 开发常用框架的高级注解使用汇总及对应demo演示
  • 盲盒小程序抽赏玩法拆解:六大核心模式 + 从获客到变现的增长路径
  • 支付网站开发怎么做账网站被墙了怎么办
  • ip获取城市省份信息
  • 基于pth模型文件,使用flask库将服务端部署到开发者电脑
  • 【调度器】DolphinScheduler任务钉钉告警
  • 软考-系统架构设计师 软件架构风格详细讲解
  • zookeeper:架构原理和使用场景
  • 东莞网站建设的方案网站的建设及发布步骤
  • mac下Docker安装nacos
  • Spring Boot事务详解与实战应用
  • 【Spring Boot JAR 解压修改配置后重新打包全流程(避坑指南)】
  • 聚焦生活照护能力培育:老年生活照护实训室建设清单的模块设计与资源整合
  • 1、pycharm相关知识
  • 专门做画册封面的网站网络维护是什么工作
  • 网站排名优化效果国内flash网站
  • [特殊字符] IDEA 性能优化实战(32G 内存电脑专用篇)
  • Python OCR 技术实践:从图片中提取文本和坐标
  • 深入理解 Goroutine 调度策略:Go 语言并发的核心机制
  • 泰安哪里可以做网站软件开发怎么学
  • CAD随机多边形插件2D专业版