K8s 部署教程:零基础也能快速掌握 Kubernetes 实践
前言:为什么选择 Kubernetes?
在云计算时代,容器技术(如 Docker)已经成为应用打包和部署的标准方式。然而,当容器数量增长到一定规模时,手动管理这些容器变得极其繁琐。我们需要一个强大的工具来自动化容器的部署、扩展、网络配置和故障恢复。这就是 Kubernetes(简称 K8s)应运而生的原因。
Kubernetes 是一个开源的容器编排引擎,它可以:
- 自动化部署和扩展:自动部署指定数量的容器副本,并根据负载自动调整副本数量。
- 服务发现和负载均衡:自动为容器分配 IP 地址和 DNS 名称,并在多个容器之间进行负载均衡。
- 存储编排:自动挂载和管理存储卷,支持各种存储类型(本地存储、网络存储等)。
- 自动滚动更新和回滚:以零停机时间逐步更新应用程序,并在出现问题时自动回滚到之前的版本。
- 自我修复:自动重启失败的容器,替换和重新调度节点。
- 配置管理和密钥管理:集中管理应用程序的配置信息和敏感数据(如密码、密钥)。
总而言之,Kubernetes 极大地简化了容器化应用程序的部署和管理,提高了开发和运维效率。
一、 基础概念:Kubernetes 的核心组件
在开始部署之前,我们需要了解 Kubernetes 的一些核心概念和组件:
-
Master 节点 (Control Plane):
- kube-apiserver:Kubernetes API 服务器,是集群的入口,所有操作都通过 API Server 进行。
- kube-scheduler:调度器,负责将 Pod(容器组)调度到合适的 Node 节点上。
- kube-controller-manager:控制器管理器,运行各种控制器,负责维护集群的状态(如副本数量、节点健康状况等)。
- etcd:一个高可用的键值存储,用于存储集群的所有配置数据和状态信息。
-
Node 节点 (Worker Node):
- kubelet:在每个 Node 节点上运行的代理,负责与 Master 节点通信,管理 Pod 和容器。
- kube-proxy:网络代理,负责实现 Kubernetes Service 的网络功能(如负载均衡、服务发现)。
- Container Runtime:容器运行时,负责运行容器(如 Docker、containerd、CRI-O)。
-
Pod:
- Kubernetes 中最小的部署单元,可以包含一个或多个容器。
- 同一个 Pod 中的容器共享网络和存储。
- Pod 通常是短暂的,可能会被销毁和重建。
-
Service:
- 定义了一组 Pod 的访问方式,提供一个稳定的虚拟 IP 地址和 DNS 名称。
- 通过标签选择器(Label Selector)将请求转发到对应的 Pod。
- 常见的 Service 类型有 ClusterIP(集群内部访问)、NodePort(通过节点端口暴露服务)、LoadBalancer(使用云提供商的负载均衡器)。
-
Deployment:
- 用于管理无状态应用(Stateless Application)的部署和更新。
- 可以定义 Pod 的副本数量、更新策略等。
- Deployment 会自动创建和管理 ReplicaSet。
-
ReplicaSet:
- 确保指定数量的 Pod 副本始终运行。
- 如果 Pod 失败或被删除,ReplicaSet 会自动创建新的 Pod。
-
Namespace:
- 用于将集群资源划分为多个虚拟集群。
- 可以用于隔离不同团队或项目的资源。
- 默认情况下,Kubernetes 有几个内置的 Namespace(如 default、kube-system)。
-
ConfigMap 和 Secret:
- ConfigMap:用于存储非敏感的配置数据(如环境变量、配置文件)。
- Secret:用于存储敏感数据(如密码、密钥、令牌)。
-
Volume:
- 用于持久化存储数据,可以挂载到 Pod 中。
- 支持各种存储类型(如 emptyDir、hostPath、NFS、云存储)。
-
Ingress:
- Ingress 是用于将外部 HTTP 和 HTTPS 流量路由到集群内 Service 的 API 对象。
- Ingress Controller 负责实现 Ingress 规则,通常使用负载均衡器(如 Nginx、HAProxy)来实现。
二、 部署方式:选择适合你的方案
有多种方式可以部署 Kubernetes 集群,根据你的需求和环境,可以选择不同的方案:
-
Minikube:
- 适用场景:本地开发和测试。
- 优点:简单易用,快速启动一个单节点的 Kubernetes 集群。
- 缺点:不适合生产环境。
-
Kind (Kubernetes in Docker):
- 适用场景:本地开发和测试,CI/CD。
- 优点:使用 Docker 容器模拟 Kubernetes 节点,可以快速创建多节点集群。
- 缺点:不适合生产环境。
-
kubeadm:
- 适用场景:生产环境,需要自定义配置。
- 优点:Kubernetes 官方提供的部署工具,可以灵活配置集群的各个组件。
- 缺点:需要一定的 Linux 和网络知识。
-
云服务商托管的 Kubernetes 服务:
- 适用场景:生产环境,希望简化运维。
- 优点:云服务商负责管理 Kubernetes Master 节点,提供高可用性和自动扩展功能。
- 缺点:需要支付一定的费用。
- 常见服务:
- Amazon EKS (Elastic Kubernetes Service)
- Google GKE (Google Kubernetes Engine)
- Azure AKS (Azure Kubernetes Service)
- 阿里云 ACK (Alibaba Cloud Container Service for Kubernetes)
- 腾讯云 TKE (Tencent Kubernetes Engine)
-
K3s
- 适用场景: 轻量级环境,边缘计算,物联网,开发和测试.
- 优点: 资源占用少,安装简单,二进制文件部署,易于维护.
- 缺点: 功能相对精简,不适合大型生产环境.
对于初学者,建议先使用 Minikube 或 Kind 在本地搭建一个 Kubernetes 集群进行学习和实践。
三、 实践操作:使用 Minikube 部署你的第一个应用
这里以 Minikube 为例,演示如何部署一个简单的 Nginx 应用:
1. 安装 Minikube
首先,你需要安装 Minikube 和 kubectl:
- Minikube:用于创建和管理本地 Kubernetes 集群。
- kubectl:Kubernetes 命令行工具,用于与集群交互。
安装方法可以参考 Minikube 官方文档:https://minikube.sigs.k8s.io/docs/start/
根据你的操作系统,选择合适的安装方式。
2. 启动 Minikube 集群
安装完成后,使用以下命令启动 Minikube 集群:
bash
minikube start
Minikube 会自动下载所需的镜像,并启动一个单节点的 Kubernetes 集群。这个过程可能需要几分钟时间。
3. 验证集群状态
使用以下命令验证集群状态:
bash
kubectl cluster-info
你应该会看到类似以下的输出:
“`
Kubernetes control plane is running at https://192.168.49.2:8443
CoreDNS is running at https://192.168.49.2:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use ‘kubectl cluster-info dump’.
“`
这表示 Kubernetes 集群已经成功启动。
4. 部署 Nginx 应用
接下来,我们将部署一个简单的 Nginx 应用。创建一个名为 nginx-deployment.yaml
的文件,内容如下:
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
这个 YAML 文件定义了一个名为 nginx-deployment
的 Deployment,它将创建 3 个 Nginx Pod 副本,每个 Pod 运行一个 Nginx 容器,监听 80 端口。
使用以下命令部署应用:
bash
kubectl apply -f nginx-deployment.yaml
5. 查看 Pod 状态
使用以下命令查看 Pod 状态:
bash
kubectl get pods
你应该会看到类似以下的输出:
NAME READY STATUS RESTARTS AGE
nginx-deployment-66b6c48dd5-7x8zj 1/1 Running 0 1m
nginx-deployment-66b6c48dd5-8fqh2 1/1 Running 0 1m
nginx-deployment-66b6c48dd5-h99pb 1/1 Running 0 1m
这表示 3 个 Nginx Pod 都已经成功运行。
6. 创建 Service 暴露应用
为了访问 Nginx 应用,我们需要创建一个 Service。创建一个名为 nginx-service.yaml
的文件,内容如下:
yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: NodePort
这个 YAML 文件定义了一个名为 nginx-service
的 Service,它将流量转发到标签为 app: nginx
的 Pod 的 80 端口。type: NodePort
表示将 Service 暴露在每个节点的特定端口上。
使用以下命令创建 Service:
bash
kubectl apply -f nginx-service.yaml
7. 获取 Service 访问地址
使用以下命令获取 Service 的访问地址:
bash
minikube service nginx-service --url
Minikube 会输出一个 URL,你可以使用浏览器访问这个 URL 来查看 Nginx 的欢迎页面。
8. 扩展应用
我们可以使用以下命令扩展 Nginx Pod 的副本数量:
bash
kubectl scale deployment nginx-deployment --replicas=5
这将把 Nginx Pod 的副本数量扩展到 5 个。
9. 更新应用
我们可以修改 nginx-deployment.yaml
文件中的镜像版本,然后使用 kubectl apply
命令来更新应用。Kubernetes 会自动执行滚动更新,以零停机时间逐步更新 Pod。
10. 删除应用
使用以下命令删除 Deployment 和 Service:
bash
kubectl delete deployment nginx-deployment
kubectl delete service nginx-service
四. 使用 Kind 创建多节点集群 (可选)
如果你想在本地模拟多节点集群,可以使用 Kind。
1. 安装 Kind
参考 Kind 官方文档安装 Kind:https://kind.sigs.k8s.io/docs/user/quick-start/
2. 创建集群
创建一个名为 kind-config.yaml
的文件,内容如下:
yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
这个配置文件定义了一个包含一个 control-plane 节点和两个 worker 节点的集群。
使用以下命令创建集群:
bash
kind create cluster --config kind-config.yaml
3. 验证集群
使用 kubectl get nodes
命令查看节点状态:
bash
kubectl get nodes
你应该会看到三个节点,一个 control-plane 节点和两个 worker 节点。
之后的部署步骤与 Minikube 类似。
五. 使用 kubeadm 部署集群 (可选, 进阶)
kubeadm 是 Kubernetes 官方提供的集群部署工具,适合用于生产环境。
注意:kubeadm 部署需要一定的 Linux 和网络知识,初学者可以先跳过这一部分。
1. 准备环境
- 至少两台 Linux 服务器(建议使用 Ubuntu 或 CentOS)。
- 每台服务器至少 2GB 内存和 2 个 CPU 核心。
- 确保服务器之间可以相互通信。
- 关闭 Swap 分区。
- 安装 Docker 或 containerd。
2. 安装 kubeadm、kubelet 和 kubectl
在所有节点上执行以下命令:
“`bash
更新 apt 包索引
sudo apt-get update
安装必要的软件包
sudo apt-get install -y apt-transport-https ca-certificates curl
添加 Kubernetes apt 仓库密钥
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add –
添加 Kubernetes apt 仓库
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
更新 apt 包索引
sudo apt-get update
安装 kubeadm、kubelet 和 kubectl
sudo apt-get install -y kubelet kubeadm kubectl
禁用 kubelet 的 swap
sudo sed -i ‘/ swap / s/^(.*)$/#\1/g’ /etc/fstab
sudo swapoff -a
“`
CentOS 系统安装步骤类似, 使用 yum
替代 apt-get
.
3. 初始化 Master 节点
在 Master 节点上执行以下命令:
bash
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
--pod-network-cidr
参数指定 Pod 网络的 CIDR,这个值取决于你选择的网络插件(如 Flannel、Calico)。
初始化完成后,会输出类似以下的提示:
“`
Your Kubernetes control-plane has initialized successfully!
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
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/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join
“`
按照提示,执行以下命令:
bash
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
4. 安装网络插件
这里以 Flannel 为例:
bash
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
5. 加入 Worker 节点
在每个 Worker 节点上执行 kubeadm join
命令,命令内容是 Master 节点初始化完成后输出的提示信息中的最后一部分。
6. 验证集群
在 Master 节点上执行以下命令:
bash
kubectl get nodes
你应该会看到所有节点都处于 Ready
状态。
六、 常见问题及解决方法
-
Pod 状态异常:
- 使用
kubectl describe pod <pod-name>
查看 Pod 的详细信息,包括事件和日志。 - 检查容器镜像是否正确,是否可以拉取。
- 检查容器的资源限制(CPU、内存)是否足够。
- 检查容器的健康检查(livenessProbe、readinessProbe)是否配置正确。
- 使用
-
Service 无法访问:
- 使用
kubectl describe service <service-name>
查看 Service 的详细信息。 - 检查 Service 的 selector 是否正确匹配 Pod 的标签。
- 检查 Service 的端口和 targetPort 是否配置正确。
- 检查 kube-proxy 是否正常运行。
- 如果是NodePort类型的Service, 确保防火墙开放了对应的端口.
- 使用
-
网络问题:
- 检查网络插件是否正常运行。
- 检查 Pod 之间的网络是否连通。
- 检查 DNS 解析是否正常。
-
资源不足:
- 使用
kubectl top nodes
和kubectl top pods
查看节点和 Pod 的资源使用情况。 - 增加节点的资源(CPU、内存)。
- 调整 Pod 的资源限制。
- 使用
-
kubectl 命令报错
- 仔细阅读错误信息. 大部分错误信息都有提示.
- 检查
~/.kube/config
文件的配置是否正确, 尤其是 server 地址和证书. - 检查kubectl 版本与集群版本是否兼容.
七、 总结与展望
通过本教程,你应该已经对 Kubernetes 的基本概念和部署方式有了一定的了解,并且能够使用 Minikube 或 Kind 部署一个简单的应用。
当然,Kubernetes 的学习之路还很长,还有很多高级特性和概念需要掌握,例如:
- Ingress:用于将外部流量路由到集群内部的 Service。
- StatefulSet:用于管理有状态应用(如数据库)。
- Helm:Kubernetes 包管理工具。
- Operator:用于管理复杂应用的自定义控制器。
- RBAC:基于角色的访问控制。
- …
希望本教程能为你打开 Kubernetes 的大门,祝你在 Kubernetes 的学习和实践中取得成功! 建议多参考 Kubernetes 官方文档 (https://kubernetes.io/docs/home/), 参与社区讨论,不断学习和实践。