企业数字化底座-k8s企业实践系列第一篇初识

复制代码
本篇约3000字,阅读10分钟, 动手2小时

Kubernetes(K8s)作为云原生生态的基石,已被广泛视为现代分布式系统的"操作系统"。云原生强调‌容器化、微服务、 DevOps 与持续交付‌,而 Kubernetes 正是实现这些理念的技术枢纽。K8s 与 DevOps 深度融合,推动 CI/CD 流程自动化。实现从代码提交到生产部署的分钟级响应。同时,其自愈、滚动更新等特性,提升了发布稳定性,助力企业实现高频、高质量交付。它不仅实现了容器化应用的自动化部署、扩缩容与运维管理,更通过强大的编排能力,将计算、存储、网络资源统一调度,为微服务、AI、大数据和DevOps等复杂工作负载提供稳定高效的运行平台,也成为了事实上企业数字化基座重要一环。

我们将在一系列的文章里讲解k8s的企业实践及使用思考。本篇是系列的第一篇,目的在于用最小篇幅创建一个可动手实践的路径, 让读者边做边验证边了解,尽快入门了解k8s及其主要使用场景. 实验是基于Windows Hyper-V 上创建 Ubuntu 24.04 虚机,并搭建 1 Master / 2 Worker Kubernetes 测试集群( kubeadm + containerd 。按步骤执行即可完成集群安装与基本功能验证。

一、总体架构

|------------|---------------|---------|--------|----------------|
| 节点 | 角色 | CPU | 内存 | IP 示例 |
| Vm01master | Control Plane | 4C | 8G | 10.113.214.115 |
| Vm02node | Worker | 4C | 8G | 10.113.214.116 |
| Vm03node | Worker | 4C | 8G | 10.113.214.117 |

网络要求:

|-------|--------|
| | 要求 |
| VM网络 | 同一子网 |
| DNS | 可解析 |
| 节点互通 | ping互通 |
| SSH | 可访问 |

二、Step 1 --- Hyper-V 创建虚拟机

下载系统:Ubuntu Server 24.04 LTS ISO

Hyperv上创建3 台虚机并加载 Ubuntu ISO安装ubuntu系统

VM配置:

|------------|---------|--------|--------|
| VM | CPU | 内存 | 磁盘 |
| Vm01master | 4 | 8GB | 80GB |
| Vm02node | 4 | 8GB | 80GB |
| Vm03node | 4 | 8GB | 80GB |

VM网络:Hyper-V External Virtual Switch

安装Ubuntu 时安装openssh:

Sudo apt update

Sudo apt install --y openssh-server

三、 Step 2 --- 设置主机名

在每台vm执行:

master : sudo hostnamectl set-hostname vm01master

worker1 : sudo hostnamectl set-hostname vm02node

worker2 : sudo hostnamectl set-hostname vm03node

四、 Step 3 --- hosts 解析

所有节点编辑:

sudo nano /etc/hosts

加入:

10.113.214.115 vm01master

10.113.214.116 vm02node

10.113.214.117 vm03node

测试:ping vm01master, 确保VM之间网络通信正常

五、 Step 4 --- 关闭 swap

Kubernetes必须关闭 swap, 所有节点执行: sudo swapoff -a

永久关闭:sudo nano /etc/fstab

注释swap 行。

六、 Step 5 --- 启用内核参数

所有节点执行:

sudo modprobe overlay

sudo modprobe br_netfilter

配置:

sudo nano /etc/sysctl.d/kubernetes.conf

写入:

net.bridge.bridge-nf-call-iptables = 1

net.bridge.bridge-nf-call-ip6tables = 1

net.ipv4.ip_forward = 1

应用:

sudo sysctl --system

七、 Step 6 --- 安装 containerd

所有节点执行:

sudo apt update

sudo apt install -y containerd

生成配置:

sudo mkdir -p /etc/containerd

sudo containerd config default | sudo tee /etc/containerd/config.toml

编辑:

sudo nano /etc/containerd/config.toml

  1. 启用 systemd cgroup,找到:SystemdCgroup = false改为:

SystemdCgroup = true

2.找到sandbox_image行,改为:

Sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.10"

  1. 找到[plugins."io.containerd.grpc.v1.cri".registry.mirrors],在该行下添加以下两行:

plugins."io.containerd.grpc.v1.cri".registry.mirrors."registry.k8s.io"

Endpoint = ["https://registry.aliyuncs.com/google_containers"]

重启:

sudo systemctl restart containerd

sudo systemctl enable containerd

八、 Step 7 --- 安装 Kubernetes 组件

所有节点执行:

sudo apt-get update

sudo apt-get install -y apt-transport-https ca-certificates curl

添加repo:

curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.34/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.34/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list

安装:

sudo apt update

sudo apt install -y kubelet kubeadm kubectl

锁定版本:

sudo apt-mark hold kubelet kubeadm kubectl

九、 Step 8 --- 初始化 Master

只在master 节点执行:

sudo kubeadm init --pod-network-cidr=10.244.0.0/16

成功后会出现:

kubeadm join ...

保存该命令(Worker加入集群要用)。

十、 Step 9 --- 配置 kubectl

在master执行:

mkdir -p $HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown (id -u):(id -g) $HOME/.kube/config

测试:

kubectl get nodes

此时master 状态:NotReady因为还没装网络插件。

十一、 Step 10 --- 安装 CNI 网络

这里推荐Flannel(最简单)。

这里为避免网络问题,下载了flannel/flannel-cni镜像, 手动导入到了3个vm里, 把kube-flannel.yml导入master之后手动执行 kubectl apply -f kube-flannel.yml安装cni网络

注意: 导入镜像可以使用命令:

sudo ctr -n k8s.io images import /tmp/flannel.tar

sudo ctr -n k8s.io images import /tmp/flannel-cni.tar

网络没有问题的可以在 master执行下述命令简化操作:

kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

等待:

kubectl get pods -A

十二、 Step 11 --- Worker 加入集群

在master可以使用命令kubeadm token create --print-join-command 获得可以在worker node上使用的命令, 比如:

Sudo kubeadm join 10.113.214.115:6443 --token 5w6y9x.0omxxxxxxxxxxxx --discovery-token-ca-cert-hash sha256:fe8484xxxxxxx

在vm02node / vm03node 执行以上命令。 命令运行后返回: This node has joined the cluster. 看到这个信息表示加入集群动作完成。之后可以运行kubectl get nodes 查看节点状态是否ready:

十三、 Step 12 --- 功能测试

初步完成k8s集群搭建之后, 计划运行一个部署nginx任务来检测集群功能。注意,因为网络关系,本次测试利用了现有的nginx镜像,再导入到各个node之后进行, 但不影响集群功能测试:

kubectl create deployment nginx --image=docker.xuanyuan.me/library/nginx:latest

扩展副本:

kubectl scale deployment nginx --replicas=2

查看:

kubectl get pods -o wide

可以看到Pod分布在不同 Worker。

十四、 Step 13 --- 暴露服务

kubectl expose deployment nginx --type=NodePort --port=80

通过 NodePort 类型,用户可以通过集群中任意节点的 IP 地址加上分配的 NodePort 端口号来访问部署的应用程序。使用kubectl get svc查看端口:

NodePort 30558

访问:http://workerIP:30558即可看到nginx首页。会发现使用各个vmip都是可以的:

十五、最终集群结构

k8s cluster

├── master

│ ├── kube-apiserver

│ ├── scheduler

│ ├── controller-manager

│ └── etcd

├── worker1

│ └── pods

└── worker2

└── pods

十六、 k8s集群维护常用命令及后续

到这里就完成了基础的k8s集群创建以及POD调度。在后续的系列文章里, 本系列会持续展开对于k8s的监控, 管理等精细化内容.最后k8s集群管理常用的命令做了归类整理方便读者理解使用。关注生产力联盟,在新质生产力时代掌握关键生产力.

1. 集群基础管理命令

|----------------------------------------|--------------------------------|---------------------------|
| 命令 | 示例 | 简要说明 |
| kubectl cluster-info | kubectl cluster-info | 查看集群信息,包括控制平面和关键服务 |
| kubectl get nodes | kubectl get nodes -o wide | 列出所有节点,-o wide 显示详细信息 |
| kubectl describe node <node-name> | kubectl describe node node-1 | 查看节点详细信息,包括资源、状态和事件 |
| kubectl version | kubectl version --short | 查看客户端和服务器端的 Kubernetes 版本 |

2. 资源查看与描述命令

|--------------------------------------|--------------------------------------------------|-----------------------------------------------|
| 命令 | 示例 | 简要说明 |
| kubectl get pods | kubectl get pods -A | 列出所有命名空间中的 Pod,-A--all-namespaces 查看所有 |
| kubectl get services | kubectl get svc -l app=nginx | 列出服务,通过标签筛选 |
| kubectl get deployments | kubectl get deploy | 列出 Deployment 资源 |
| kubectl describe pod <pod-name> | kubectl describe pod nginx-7b5b7c9d8f-xyz12 | 查看 Pod 的详细信息 |
| kubectl get pods -o wide | kubectl get pods -o wide | 获取 Pod 的详细信息,包括 IP 和节点 |

3. 资源创建与删除命令

|-----------------------------|----------------------------------------------------------------|---------------------------------------|
| 命令 | 示例 | 简要说明 |
| kubectl create deployment | kubectl create deployment nginx --image=nginx | 创建一个名为 nginx 的 Deployment |
| kubectl expose | kubectl expose deployment nginx --type=NodePort --port=80 | 将 Deployment 暴露为 NodePort 类型的 Service |
| kubectl delete | kubectl delete deployment nginx | 删除 Deployment 资源 |
| kubectl apply -f | kubectl apply -f deployment.yaml | 从文件中创建或更新资源 |

4. Pod 管理与调试命令

|-------------------|-----------------------------------------------------------|-------------|
| 命令 | 示例 | 简要说明 |
| kubectl exec | kubectl exec -it nginx-7b5b7c9d8f-xyz12 -- /bin/bash | 进入 Pod 的容器 |
| kubectl logs | kubectl logs nginx-7b5b7c9d8f-xyz12 | 查看 Pod 的日志 |
| kubectl logs -f | kubectl logs -f nginx-7b5b7c9d8f-xyz12 | 实时查看 Pod 日志 |

5. 部署管理命令

|---------------------------|--------------------------------------------------|-----------------------|
| 命令 | 示例 | 简要说明 |
| kubectl scale | kubectl scale deployment nginx --replicas=2 | 调整 Deployment 的副本数量 |
| kubectl rollout | kubectl rollout status deployment/nginx | 查看 Deployment 的滚动更新状态 |
| kubectl rollout undo | kubectl rollout undo deployment/nginx | 回滚到上一个版本 |
| kubectl rollout history | kubectl rollout history deployment/nginx | 查看 Deployment 的版本历史 |

6. 标签与选择器命令

|----------------------------------------------------|-----------------------------------------------------------|--------------|
| 命令 | 示例 | 简要说明 |
| kubectl label | kubectl label pods nginx-7b5b7c9d8f-xyz12 version=v1 | 为 Pod 添加标签 |
| kubectl get pods -l <label-key>=<label-value> | kubectl get pods -l app=nginx | 根据标签筛选 Pod |
| kubectl get pods --show-labels | kubectl get pods --show-labels | 显示所有 Pod 的标签 |

7. 配置与存储管理命令

|----------------------------|----------------------------------------------------------------------------|--------------|
| 命令 | 示例 | 简要说明 |
| kubectl create configmap | kubectl create configmap nginx-config --from-literal=nginx.conf=... | 创建 ConfigMap |
| kubectl create secret | kubectl create secret generic db-secret --from-literal=username=admin | 创建 Secret |
| kubectl get configmaps | kubectl get configmaps | 列出 ConfigMap |
| kubectl get secrets | kubectl get secrets | 列出 Secret |

8. 高级操作与故障排查命令

|---------------------------------------------------------------------------|---------------------------------------------------------------------------|-------------------------|
| 命令 | 示例 | 简要说明 |
| kubectl top pods | kubectl top pods --sort-by=cpu | 显示 Pod 的资源使用情况,按 CPU 排序 |
| kubectl get pods --sort-by= '.status.containerStatuses.restartCount' | kubectl get pods --sort-by= '.status.containerStatuses.restartCount' | 按重启次数排序 Pod |
| kubectl get pods --field-selector=status.phase=Running | kubectl get pods --field-selector=status.phase=Running | 显示运行中的 Pod |
| kubectl delete pod --grace-period=0 --force | kubectl delete pod nginx-7b5b7c9d8f-xyz12 --grace-period=0 --force | 强制删除 Pod |

9. 命令参数速查

|---------------------------|--------------------------|
| 参数 | 说明 |
| -n <namespace> | 指定命名空间 |
| -o <output-format> | 指定输出格式(如 wide、yaml、json) |
| --all-namespaces-A | 跨所有命名空间查询 |
| -f <filename> | 通过 YAML/JSON 文件操作资源 |
| -l <label-selector> | 按标签筛选资源 |

这些命令涵盖了Kubernetes 日常运维和管理中的主要操作,可以帮助用户高效地管理集群资源。

相关推荐
Wenhao.2 小时前
Docker 安装 neo4j
docker·容器·neo4j
★浅_忆2 小时前
docker入门基础命令
linux·运维·服务器·docker·容器
草木红2 小时前
docker 构建镜像时报 403 Forbidden
docker·容器
Wenhao.2 小时前
Docker 安装 Qdrant
运维·docker·容器
岁岁种桃花儿2 小时前
kubenetes从入门到上天系列第十八篇:Kubernetes七层负载均衡Ingress
容器·kubernetes·负载均衡
匀泪3 小时前
云原生(docker容器技术)
docker·云原生·容器
数据库小组12 小时前
10 分钟搞定!Docker 一键部署 NineData 社区版
数据库·docker·容器·database·数据库管理工具·ninedata·迁移工具
灰阳阳13 小时前
Docker镜像远程(离线)迁移教程
运维·docker·容器
KIHU快狐14 小时前
KIHU快狐|台式液晶监视器桌面摆放药店用药安全宣传小屏幕
容器