k3s部署运行的完整链路案例(从0入门)

📅 2026/8/7 17:24:40
k3s部署运行的完整链路案例(从0入门)
注本文提到的命令行请在root账户下执行以免权限不足。本文提到的k3s使用containerd作为容器运行时。一、k3s安装运行1. k3s服务安装(如已安装可忽略)官方文档快速入门指南 | K3s不想看文档直接执行下面脚本即可安装curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRRORcn sh -2. 确认k3s服务安装运行完成2.1 确认安装完成。使用k3s --version有如下输出就是安装成功k3s --version k3s version v1.33.5k3s1 (fab4a5c3) go version go1.24.62.2 确认k3s服务运行起来。使用systemctl status k3s命令看到有active标志说明已经运行起来如果不是active则使用systemctl start k3s命令启动k3s服务systemctl start k3s二、Docker安装运行1. Docker服务安装(如已安装可忽略)1.1 卸载旧版本yum remove docker docker-common docker-selinux docker-engine1.2 安装依赖工具yum install -y yum-utils1.3 添加Docker官方仓库yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo如果网络不行可添加镜像仓库yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo1.4 安装Docker服务yum install -y docker-ce docker-ce-cli containerd.io2. 确认Docker服务安装运行完成2.1 确认安装完成使用docker --version有如下输出就是安装成功docker --version Docker version 28.5.1, build e180ab82.2 确认Docker服务运行起来。使用systemctl status docker命令看到有active标志说明已经运行起来如果不是active则使用systemctl start docker命令启动k3s服务systemctl start docker三、准备可执行文件、及依赖1. 编写测试程序怎么方便怎么来不一定要按照这里给的方法编写一个简单的服务器测试程序这样既可以测试测试是否运行又可以测试网络是否联通。1.1 下载一个超轻量级的库httplib通过下面命令把httplib.h文件下载到当前目录。项目中直接包含它就像因为定义实现都在这个头文件里。curl -O https://raw.githubusercontent.com/yhirose/cpp-httplib/master/httplib.h或wget https://raw.githubusercontent.com/yhirose/cpp-httplib/master/httplib.h1.2 编写测试demo服务器程序demo功能访问http://宿主机ip:10018/test会返回hello world其余url会返回404 Not Found#include httplib.h #include iostream int main() { // 创建 HTTP 服务器并监听端口 10018 httplib::Server svr; // 定义路由 /test返回 Hello World! svr.Get(/test, [](const httplib::Request req, httplib::Response res) { res.set_content(Hello World!, text/plain); }); // 手动处理其他 URL返回 404 svr.Get(.*, [](const httplib::Request req, httplib::Response res) { res.status 404; // 设置状态码为 404 res.set_content(404 Not Found, text/plain); }); std::cout Server is running on port 10018... std::endl; svr.listen(0.0.0.0, 10018); // 监听所有网络接口的 10018 端口 return 0; }1.3 编译出demo可执行程序g -o test httplib.h test.cpp编译完就生成了名为test的测试程序demo。1.4 执行测试程序demo看看是否正常运行运行test./test浏览器访问有如下返回结果说明测试程序没问题1.5 查看依赖通过ldd命令确定测试程序test所需的依赖执行后会有类似下面的内容输出ldd test linux-vdso.so.1 (0x00007f9e836b1000) libstdc.so.6 /lib64/libstdc.so.6 (0x00007f9e83400000) libm.so.6 /lib64/libm.so.6 (0x00007f9e83352000) libgcc_s.so.1 /lib64/libgcc_s.so.1 (0x00007f9e83678000) libc.so.6 /lib64/libc.so.6 (0x00007f9e8317a000) /lib64/ld-linux-x86-64.so.2 (0x00007f9e836b3000)1.6 把可执行文件和依赖放一起可以创建一个文件夹image把可执行文件和依赖按照如图所示放好(依赖的动态库文件就去上面ldd命令输出的位置复制过来即可)四、创建Docker镜像1. 编写Dockerfile文件在images文件夹下创建名为Dockerfile的文件用于生成Docker镜像使用。向Dockerfile文件输入以下内容# 使用轻量级的基础镜像 FROM scratch # 设置工作目录 WORKDIR /app # 复制编译好的可执行文件到容器中 COPY test /app/test COPY libs/libstdc.so.6 /lib64/libstdc.so.6 COPY libs/libm.so.6 /lib64/libm.so.6 COPY libs/libgcc_s.so.1 /lib64/libgcc_s.so.1 COPY libs/libc.so.6 /lib64/libc.so.6 COPY libs/ld-linux-x86-64.so.2 /lib64/ld-linux-x86-64.so.2 # 安装必要的依赖如果需要 # RUN apk add --no-cache libstdc # 暴露端口 EXPOSE 10018 # 启动命令 CMD [./test]2. 通过docker命令来生成Docker镜像在images文件夹目录下执行下列命令生成名为demo-image的Docker镜像docker build -t demo-image .3. 确认镜像是否生成执行命令docker images即可查看Docker服务管理的Docker镜像有哪些确认是否有名为demo-image的镜像docker images REPOSITORY TAG IMAGE ID CREATED SIZE demo-image latest fed70611360f 2 days ago 8.53MB4. 测试镜像是否可用执行下列命令在Docker服务中创建一个名为test-container的容器加载名为demo-image的镜像并运行该容器docker run -d --name test-container -p 10018:10018 demo-image执行下列命令确认容器是否创建成功docker ps -a创建成功后在浏览器验证测试程序demo是否正常5. 确认正常后关闭容器运行根据docker ps -a拿到容器的CONTAINER ID(我这里是2e01b8f8788f你们不一样的话做替换就行)执行下列命令停止该容器的运行docker stop 2e01b8f8788f五、将镜像导入到k3s服务中1. 将Docker镜像打包导出通过下列命令将Docker镜像打包导出以供后面k3s使用。执行后会在当前目录生成名为demo-image.tar的打包文件docker save demo-image -o demo-image.tar2. 将镜像导入到 K3s执行下列命令将镜像导入到 K3s 的 containerd中k3s ctr images import demo-image.tar3. 确认镜像导入成功执行下列命令确认镜像是否导入成功镜像名可能比demo-image多一些前缀可能是Docker服务导出时自己加的k3s ctr images list如我这里是这样的名字六、创建k3s配置文件并设置镜像源(网络可达的话本章可忽略)k3s默认使用的是Docker hub镜像源国内可能访问不到使用要切换镜像源1. 编辑k3s配置文件如果没有/etc/rancher/k3s/config.yaml配置文件则手动创建一下。编辑该文件输入以下内容切换镜像源。这里使用的镜像源是https://docker.m.daocloud.iosystem-default-registry: docker.m.daocloud.io有该项就编辑无该项手动添加。如果是手动创建的空文件只输入上面这一行的内容就行k3s使用的是增量配置无需担心不给出别的配置项会导致k3s服务无法启动成功。2. 重启k3s服务systemctl restart k3s七、创建k3s容器运行镜像1. 编写demo-image.yaml文件创建编写demo-image.yaml文件输入以下内容(记得改image的值为第五章第3点输出的值)apiVersion: apps/v1 kind: Deployment metadata: name: test-deployment spec: replicas: 2 selector: matchLabels: app: test template: metadata: labels: app: test spec: containers: - name: test-container image: docker.io/library/demo-image:latest imagePullPolicy: Never ports: - containerPort: 10018 --- apiVersion: v1 kind: Service metadata: name: test-service spec: type: NodePort selector: app: test ports: - protocol: TCP port: 80 targetPort: 10018 nodePort: 300012. 应用配置文件执行下列命令应用配置文件k3s kubectl apply -f demo-image.yaml3. 确认 Pod 是否正常工作执行下列命令确认对应的 Pod 是否正常工作k3s kubectl get pods状态是status则说明成功否则通过下列命令确认错误信息pod-Name的值从上面k3s kubectl get pod中输出的值的NAME列获取k3s cubectl describe pod pod-Name4. 确认 Service 是否正常工作执行下列命令确认对应的 Service 是否正常工作k3s kubectl get svc5. 在浏览器验证测试程序demo是否正常运行5.1 访问http://宿主机ip:30001/test5.2 访问http://宿主机ip:30001/test/若功能正常则成功在k3s中运行起了容器容器使用给定的镜像并且端口映射也正常(容器的端口30001映射到10018测试程序的端口)八、常用命令汇总1. Docker服务的常用命令-----镜像管理----- docker pull IMAGE ----从远程仓库拉取镜像 docker build -f 指定Dockerfile文件 -t 设置镜像名:标签 ----创建镜像 docker images ----查看本地镜像(只查看由docker服务管理的镜像) docker save -o 导出文件名 ----导出镜像到文件 docker rmi -f ----删除镜像(-f强制删除) -----容器管理----- docker run -d -p 宿主机端口:容器端口 --name 容器名 -it 镜像名:标签 ----创建并运行容器(-d后台运行 -it交互模式) docker create -p 宿主机端口:容器端口 --name 容器名 镜像名:标签 ----创建容器 docker ps -a -q ----显示容器(-a显示所有容器 -q仅显示容器ID) docker start 容器名 ----运行容器 docker stop -t 秒数 容器名 ----停止容器(-t指定秒数后强制停止容器) docker rm -f 容器名 ----删除容器(-f强制删除正在运行的容器) ----其它命令---- docker exec -it CONTAINER_ID bash ----进入容器内部 docker logs CONTAINER_ID ----查看容器日志2. k3s服务的常用命令----k3s服务相关---- sudo systemctl start k3s ----启动k3s服务 sudo systemctl stop k3s ----停止k3s服务 sudo systemctl status k3s ----查看k3s服务状态 ----集群信息---- echo $KUBECONFIG ----查看k3s集群的 kubeconfig 文件路径 k3s kubectl get nodes ----查看集群节点状态 ---镜像资源操作---- k3s ctr images list -n namespace k3s ctr images import 镜像文件包名(一般是tar包) k3s ctr images delete 镜像名 ----资源deployment操作---- k3s kubectl get deployments -A ----查看所有Deployment k3s kubectl apply -f deployment-file.yaml ----通过yaml描述文件创建Deployment k3s kubectl delete deployment deployment-name - n namespace ----删除Deployment ----资源Pod操作---- k3s kubectl get pods -A ----查看所有Pod k3s kubectl get pods -n namespace ----查看指定命名空间的Pod k3s kubectl describe pod pod-name -n namespace ----查看Pod的详细信息 k3s kubectl logs pod-name -n namespace ----查看Pod的日志 k3s kubectl delete pod pod-name -n namespace ----删除Pod ----资源Service操作---- k3s kubectl get services -A ----查看所有Service k3s kubectl describe service service-name -n namespace ----查看Service的详细信息 k3s kubectl delete service service-name -n namespace ----删除Service ----资源replicaset操作---- 基本同上 ----命名空间操作---- k3s kubectl create namespace 名字 ----创建命名空间 k3s kubectl get ns ----查看namespace k3s kubectl delete ns namespace ----删除命名空间会同时删掉下面所有资源 ----其它资源操作---- k3s kubectl get all -A ----查看所有资源 k3s kubectl get configmaps -n namespace ----查看ConfigMap k3s kubectl get secrets -n namespace ----查看Secret ...... ----调试工具---- k3s kubectl port-forward pod-name local-port:pod-port -n namespace ----将本地端口转发到 Pod 的端口 k3s kubectl get endpoints service-name -n namespace ----查看 Service 的 Endpoints k3s kubectl get nodes -o wide ----查看节点的 IP 地址 k3s kubectl -n namespace exec -it pod-name -- /bin/bash ----进入对应容器终端 k3s kubectl cp 宿主机中的文件名 -n namespace pod-name:容器内目录 ----将宿主机的文件拷贝到容器内 ----日志/监控---- k3s journalctl -u k3s -f ----查看k3s服务的日志 k3s journalctl -u k3s-agent -f ----查看kubelet的日志 ----高级操作---- cat /var/lib/rancher/k3s/server/node-token ----在Master节点上获取加入命令3.Helm工具常用命令helm list -A ----查看所有release helm list -n namespace ----查看已有release根据namespace helm lint . ----验证chart包是否有问题 helm template release-name . -n namespace ----查看chart包要部署的template原始信息 helm install release-name . -n namespace --create-namespace ----安装部署chart包(--create-namespace会让k3s顺便创建namespace) helm upgrade release-name . -n namespace ----根据新的chart包内容更新release helm uninstall release-name -n namespace ----卸载部署chart包