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。
- 负载均衡方式:
- Namespace
- iptables(默认)
- 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.61 | master01 | CentOS 7.9.2009 | v1.28.2 | 管理节点 |
192.168.10.62 | node01 | CentOS 7.9.2009 | v1.28.2 | 工作节点 |
192.168.10.63 | node02 | CentOS 7.9.2009 | v1.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 的世界中不断探索、不断进步,构建出更加高效、稳定和可扩展的云原生应用。
祝您在云原生的道路上越走越远,收获满满! 🚀