k8s部署教程:零基础也能快速掌握kubernetes实践 – wiki基地

K8s 部署教程:零基础也能快速掌握 Kubernetes 实践

前言:为什么选择 Kubernetes?

在云计算时代,容器技术(如 Docker)已经成为应用打包和部署的标准方式。然而,当容器数量增长到一定规模时,手动管理这些容器变得极其繁琐。我们需要一个强大的工具来自动化容器的部署、扩展、网络配置和故障恢复。这就是 Kubernetes(简称 K8s)应运而生的原因。

Kubernetes 是一个开源的容器编排引擎,它可以:

  • 自动化部署和扩展:自动部署指定数量的容器副本,并根据负载自动调整副本数量。
  • 服务发现和负载均衡:自动为容器分配 IP 地址和 DNS 名称,并在多个容器之间进行负载均衡。
  • 存储编排:自动挂载和管理存储卷,支持各种存储类型(本地存储、网络存储等)。
  • 自动滚动更新和回滚:以零停机时间逐步更新应用程序,并在出现问题时自动回滚到之前的版本。
  • 自我修复:自动重启失败的容器,替换和重新调度节点。
  • 配置管理和密钥管理:集中管理应用程序的配置信息和敏感数据(如密码、密钥)。

总而言之,Kubernetes 极大地简化了容器化应用程序的部署和管理,提高了开发和运维效率。

一、 基础概念:Kubernetes 的核心组件

在开始部署之前,我们需要了解 Kubernetes 的一些核心概念和组件:

  1. Master 节点 (Control Plane)

    • kube-apiserver:Kubernetes API 服务器,是集群的入口,所有操作都通过 API Server 进行。
    • kube-scheduler:调度器,负责将 Pod(容器组)调度到合适的 Node 节点上。
    • kube-controller-manager:控制器管理器,运行各种控制器,负责维护集群的状态(如副本数量、节点健康状况等)。
    • etcd:一个高可用的键值存储,用于存储集群的所有配置数据和状态信息。
  2. Node 节点 (Worker Node)

    • kubelet:在每个 Node 节点上运行的代理,负责与 Master 节点通信,管理 Pod 和容器。
    • kube-proxy:网络代理,负责实现 Kubernetes Service 的网络功能(如负载均衡、服务发现)。
    • Container Runtime:容器运行时,负责运行容器(如 Docker、containerd、CRI-O)。
  3. Pod

    • Kubernetes 中最小的部署单元,可以包含一个或多个容器。
    • 同一个 Pod 中的容器共享网络和存储。
    • Pod 通常是短暂的,可能会被销毁和重建。
  4. Service

    • 定义了一组 Pod 的访问方式,提供一个稳定的虚拟 IP 地址和 DNS 名称。
    • 通过标签选择器(Label Selector)将请求转发到对应的 Pod。
    • 常见的 Service 类型有 ClusterIP(集群内部访问)、NodePort(通过节点端口暴露服务)、LoadBalancer(使用云提供商的负载均衡器)。
  5. Deployment

    • 用于管理无状态应用(Stateless Application)的部署和更新。
    • 可以定义 Pod 的副本数量、更新策略等。
    • Deployment 会自动创建和管理 ReplicaSet。
  6. ReplicaSet

    • 确保指定数量的 Pod 副本始终运行。
    • 如果 Pod 失败或被删除,ReplicaSet 会自动创建新的 Pod。
  7. Namespace

    • 用于将集群资源划分为多个虚拟集群。
    • 可以用于隔离不同团队或项目的资源。
    • 默认情况下,Kubernetes 有几个内置的 Namespace(如 default、kube-system)。
  8. ConfigMap 和 Secret

    • ConfigMap:用于存储非敏感的配置数据(如环境变量、配置文件)。
    • Secret:用于存储敏感数据(如密码、密钥、令牌)。
  9. Volume

    • 用于持久化存储数据,可以挂载到 Pod 中。
    • 支持各种存储类型(如 emptyDir、hostPath、NFS、云存储)。
  10. Ingress:

    • Ingress 是用于将外部 HTTP 和 HTTPS 流量路由到集群内 Service 的 API 对象。
    • Ingress Controller 负责实现 Ingress 规则,通常使用负载均衡器(如 Nginx、HAProxy)来实现。

二、 部署方式:选择适合你的方案

有多种方式可以部署 Kubernetes 集群,根据你的需求和环境,可以选择不同的方案:

  1. Minikube

    • 适用场景:本地开发和测试。
    • 优点:简单易用,快速启动一个单节点的 Kubernetes 集群。
    • 缺点:不适合生产环境。
  2. Kind (Kubernetes in Docker)

    • 适用场景:本地开发和测试,CI/CD。
    • 优点:使用 Docker 容器模拟 Kubernetes 节点,可以快速创建多节点集群。
    • 缺点:不适合生产环境。
  3. kubeadm

    • 适用场景:生产环境,需要自定义配置。
    • 优点:Kubernetes 官方提供的部署工具,可以灵活配置集群的各个组件。
    • 缺点:需要一定的 Linux 和网络知识。
  4. 云服务商托管的 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)
  5. 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 : –token –discovery-token-ca-cert-hash sha256:
“`

按照提示,执行以下命令:

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 状态。

六、 常见问题及解决方法

  1. Pod 状态异常

    • 使用 kubectl describe pod <pod-name> 查看 Pod 的详细信息,包括事件和日志。
    • 检查容器镜像是否正确,是否可以拉取。
    • 检查容器的资源限制(CPU、内存)是否足够。
    • 检查容器的健康检查(livenessProbe、readinessProbe)是否配置正确。
  2. Service 无法访问

    • 使用 kubectl describe service <service-name> 查看 Service 的详细信息。
    • 检查 Service 的 selector 是否正确匹配 Pod 的标签。
    • 检查 Service 的端口和 targetPort 是否配置正确。
    • 检查 kube-proxy 是否正常运行。
    • 如果是NodePort类型的Service, 确保防火墙开放了对应的端口.
  3. 网络问题

    • 检查网络插件是否正常运行。
    • 检查 Pod 之间的网络是否连通。
    • 检查 DNS 解析是否正常。
  4. 资源不足

    • 使用 kubectl top nodeskubectl top pods 查看节点和 Pod 的资源使用情况。
    • 增加节点的资源(CPU、内存)。
    • 调整 Pod 的资源限制。
  5. kubectl 命令报错

    • 仔细阅读错误信息. 大部分错误信息都有提示.
    • 检查~/.kube/config 文件的配置是否正确, 尤其是 server 地址和证书.
    • 检查kubectl 版本与集群版本是否兼容.

七、 总结与展望

通过本教程,你应该已经对 Kubernetes 的基本概念和部署方式有了一定的了解,并且能够使用 Minikube 或 Kind 部署一个简单的应用。

当然,Kubernetes 的学习之路还很长,还有很多高级特性和概念需要掌握,例如:

  • Ingress:用于将外部流量路由到集群内部的 Service。
  • StatefulSet:用于管理有状态应用(如数据库)。
  • Helm:Kubernetes 包管理工具。
  • Operator:用于管理复杂应用的自定义控制器。
  • RBAC:基于角色的访问控制。

希望本教程能为你打开 Kubernetes 的大门,祝你在 Kubernetes 的学习和实践中取得成功! 建议多参考 Kubernetes 官方文档 (https://kubernetes.io/docs/home/), 参与社区讨论,不断学习和实践。

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部