1、k8s中文文档:http://docs.kubernetes.org.cn/

2、minikube官方文档:https://minikube.sigs.k8s.io/docs/start/?arch=%2Flinux%2Fx86-64%2Fstable%2Fbinary+download

3、在线学习文档:https://kubernetes.io/zh-cn/docs/tutorials/kubernetes-basics/

4、云原生minikube文档(!):https://www.zhaowenyu.com/minikube-doc/ops/minikube.html

5、参考:https://blog.csdn.net/haohaifeng002/article/details/116788698

6、k8s在线环境:https://killercoda.com/playgrounds/scenario/kubernetes

是什么?

Kubernetes是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。

与Docker区别

特性 Docker Kubernetes
核心功能 创建和运行单个容器(容器化) 在集群中管理和调度大量容器(容器编排)
范围 单个节点/主机 跨越多个节点的集群
规模 适合开发、测试和简单的单机应用 专为大规模、高可用的生产环境设计
主要工具 Dockerfile, docker-compose.yml kubectl, YAML 清单文件 (Deployment, Service 等)
核心单元 容器 (Container) Pod (可以包含一个或多个紧密关联的容器)
网络 提供基础的单机网络(桥接、主机模式等) 提供复杂的跨节点集群网络模型、服务发现和负载均衡
自我修复 不具备。容器挂了就挂了,需要手动重启。 核心特性。自动重启、替换失败的容器。
自带的编排工具 Docker Swarm (功能相对简单) Kubernetes 本身就是最主流的编排工具

组件

  • Pod:在容器上加了一层抽象,可以将一个或多个容器组合在一起。一般一个pod只运行一个容器
  • Deployment:部署无状态应用程序,在pod上加一层抽象,可以将一个或多个pod组合在一起,具有副本控制,滚动更新,自动扩容。
  • node:节点,一个服务器或一个虚拟机就是一个节点
  • service:将一组pod封装成一个服务,提供一个统一的入口来访问这个服务。主要集群内部或外部暴露单个服务
  • ingress:将外部的请求路由转发到集群内部Service上,是集群外部访问多个服务的统一入口
  • Config Map:封装配置信息
  • Secret:封装敏感信息
  • Volumes:将集群中的数据挂载到本地磁盘或远程存储上,实现持久化
  • StatefulSet:部署有状态应用程序

安装

安装minikube

Minikube是一个工具,用于在单个节点上部署一个本地的Kubernetes集群。这对于开发者在本地开发环境进行Kubernetes应用测试和调试非常有用。它能够在个人计算机上启动一个轻量级的虚拟机或容器,并在这个环境中部署一个完整的Kubernetes集群,包括API服务器、etcd、kubelet等核心组件。

下载MiniKube

选择正确版本的MiniKube进行下载

curl -LO https://github.com/kubernetes/minikube/releases/latest/download/minikube-linux-arm64
sudo install minikube-linux-arm64 /usr/local/bin/minikube && rm minikube-linux-arm64

查看版本

minikube version

验证安装

Kubernetes 启动

此处要先创建用户赋予权限,和docker通信的权限,参考文末问题2,3

minikube start \
--vm-driver=docker \
--registry-mirror=https://registry.docker-cn.com \
--image-mirror-country=cn \
--cni=flannel \
--kubernetes-version=v1.32.2

该命令能够自动启动一套 Kubernetes 集群(启动一个虚拟机,称为节点),其中的参数是可选的,示例中的参数含义:

  • --kubernetes-version: 指定 Kubernetes 的版本
  • --vm-driver: 指定 VM 驱动类型
  • --registry-mirror: 镜像下载加速的镜像仓库地址
  • --image-mirror-country: 镜像加速的国家,cn 表示中国
  • --cni: 指定集群的网络插件,支持:auto, bridge, calico, cilium, flannel, kindnet, or path to a CNI manifest (default: auto)

安装成功

查看节点ip

zj@linux:~/k8sLearn$  minikube ip
192.168.49.2

查看安装状态

zj@linux:~$  minikube status
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured

清理失败的环境

minikube delete --all

查看安装的插件

minikube addons list

根据需要选择对应的 addon 组件

minikube addons enable xxxx

Dashboard图形界面

Dashboard 是一个基 于web 的 Kubernetes 用户界面。你可以用它来:

  • 将容器化的应用程序部署到 Kubernetes 集群
  • 定位排除容器化应用程序的故障
  • 管理集群资源
  • 了解集群中运行的应用程序的概况
  • 创建或修改指定 Kubernetes 资源(如 Deployments, Jobs, DaemonSets 集等)

启动服务,得到一个本服务器查看的url

minikube dashboard --url

直接暴露服务(需配置防火墙)

  1. 在服务器上修改代理绑定地址
kubectl proxy --port=38775 --address='0.0.0.0' --accept-hosts='.*' &
  • –address=‘0.0.0.0’:允许所有 IP 访问
  • –accept-hosts=‘.*’:接受所有主机头
  1. 配置服务器防火墙
sudo ufw allow 38775
  1. 在本地浏览器访问:
http://服务器公网IP:38775/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/

基础使用

kubectl是minikube的一个命令行工具,与集群进行交互

有时镜像会拉取失败,利用Minikube能将本地docker镜像推送到minikube自带的docker容器并离线缓存这个特性迂回处理这个问题

  • 下载hello-minikube docker镜像,并打个tag
#找个叫hello-minikube的docker镜像
 docker search hello-minikube
#随便找一个别人做好的docker镜像,如bienbenigno/hello-minikube
docker pull computer99/hello-minikube
#打个叫k8s.gcr.io/echoserver:1.4的tag
 docker tag computer99/hello-minikube:4.0 k8s.gcr.io/echoserver:1.4
  • 生成minikube离线镜像
#将镜像添加到本地镜像
minikube image load  k8s.gcr.io/echoserver:1.4
#查看镜像添加情况
minikube image list

查看镜像列表

创建一个pod

kubectl run hello4 --image=k8s.gcr.io/echoserver:1.4

通常情况下,我们不会自己创建一个pod,而是创建上层资源对象(例如deployment),会自动创建pod。

创建一个deployment:

kubectl create deployment hello-minikube --image=k8s.gcr.io/echoserver:1.4

查看节点/服务/deployment/pod

kubectl get node
kubectl get svc
kubectl get deployment
kubectl get pod
#查看各pod的ip
kubectl get pod -o wide 
kubectl describe pod xxxxxxx


#在deployment与pod之间还有一个中间层对象replicaset,用来管理pod的副本数量
kubectl get replicaset

# 查看所有资源对象
kubectl get all

编辑配置文件

kubectl edit deployment.apps/helloworld

调试命令

#查看pod日志
kubectl logs pod名 
#进入容器
kubectl exec  -it pod名  -- /bin/bash

删除

kubectl delete deployment hello-minikube
  • 需要注意的是使用kubectl delete pod xxx直接删除一个pod,如果该pod被上层deployment管理,deployment会立即创建一个新的pod,确保pod数量与配置文件中副本数量replicas保持一致.

暴露一个服务

创建集群有minikube和k3s两种方式,k3s是登录到节点执行命令,节点属于集群的一部分,所以可以访问到service的ip,而minikube实在宿主机执行命令,要使用NodePort暴露节点端口给宿主机访问

kubectl expose deployment hello2 --type=NodePort --port=8080
  • NodePort:在节点上开一个端口用于外部访问service

查看部署的service

zj@linux:~/k8sLearn$ kubectl get services hello2
NAME     TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
hello2   NodePort   10.110.233.228   <none>        81:30310/TCP   5m11s
  • service服务监听的端口是81,pod暴露的端口是30310
zj@linux:~/k8sLearn$ minikube service hello2 --url
http://192.168.49.2:30310

zj@linux:~/k8sLearn$ curl http://192.168.49.2:30310/
curl: (7) Failed to connect to 192.168.49.2 port 30310 after 0 ms: Connection refused

宿主机访问节点服务url失败,问题核心在于 应用监听端口与服务暴露端口不匹配。见下面问题6。

操作总流程如下:

图示命令

遇到的问题:

2、root用户不能使用minikube start启动,要新建一个用户名并赋予sudo权限

创建用户 adduser promefire

授权 centos:usermod -aG wheel promefire

Debian/Ubuntu :usermod -aG sudo promefire

3、赋予新建用户与docker通信权限

sudo usermod -aG docker promefire
newgrp docker  # 刷新用户组

# 验证权限
docker ps  # 应无报错

4、Docker配置代理

  • 创建 /etc/systemd/system/docker.service.d/http-proxy.conf 文件。
  • 在文件中填入正确的 Environment 代理配置(HTTP_PROXY, HTTPS_PROXY, NO_PROXY)。
  • 执行 sudo systemctl daemon-reload 刷新配置
  • 执行 sudo systemctl restart docker 重启docker

5、报错

-- /stdout --

* Suggestion: Using Kubernetes v1.24+ with the Docker runtime requires cri-docker to be installed

Kubernetes v1.24+ 的版本与docker通信需要 cri-docker,移除了原来直接与Docker通信的功能,

  • 安装
# 下载最新的 cri-dockerd deb 包 (适用于 amd64 架构)
curl -Lo cri-dockerd.deb https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.15/cri-dockerd_0.3.15.3-0.ubuntu-jammy_amd64.deb
# 安装
sudo dpkg -i cri-dockerd.deb
#启动服务
sudo systemctl daemon-reload
sudo systemctl enable --now cri-docker.service
sudo systemctl enable --now cri-docker.socket
#验证
systemctl status cri-docker.socket

5、一直下载中断,查看本机v2ray日志,发现因为vpn开了绕过大陆而不是全局,在访问阿里云镜像站走的是直连,因此下载失败。错误信息[socks -> direct]表示直连。修改成全局解决。

from 192.168.1.xxx:39014 accepted //registry.cn-hangzhou.aliyuncs.com:443 [socks -> direct]
from 192.168.1.xxx:39888 accepted //kubernetes.oss-cn-hangzhou.aliyuncs.com:443 [socks -> direct]

6、宿主机无法通过节点ip+NodePort访问service

通过kubectl logs hello2-788ffdfd55-p65qz查看日志可以发现,这个pod容器运行在8080端口。

zj@linux:~$ kubectl logs hello2-788ffdfd55-p65qz

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/

 :: Spring Boot ::       (v3.4.0-SNAPSHOT)

2025-07-04T06:56:31.816Z  INFO 1 --- [hello-minikube] [           main] c.e.h.HelloMinikubeApplicationKt         : Starting HelloMinikubeApplicationK t v0.0.4-SNAPSHOT using Java 17.0.2 with PID 1 (/app.jar started by root in /)
2025-07-04T06:56:31.820Z  INFO 1 --- [hello-minikube] [           main] c.e.h.HelloMinikubeApplicationKt         : No active profile set, falling bac k to 1 default profile: "default"
2025-07-04T06:56:33.115Z  INFO 1 --- [hello-minikube] [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port 8080  (http)
2025-07-04T06:56:33.135Z  INFO 1 --- [hello-minikube] [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2025-07-04T06:56:33.136Z  INFO 1 --- [hello-minikube] [           main] o.apache.catalina.core.StandardEngine    : Starting Servlet engine: [Apache T omcat/10.1.28]
2025-07-04T06:56:33.321Z  INFO 1 --- [hello-minikube] [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebAp plicationContext
2025-07-04T06:56:33.322Z  INFO 1 --- [hello-minikube] [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initia lization completed in 1421 ms
2025-07-04T06:56:34.515Z  INFO 1 --- [hello-minikube] [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port 8080 (http)  with context path '/'
2025-07-04T06:56:34.541Z  INFO 1 --- [hello-minikube] [           main] c.e.h.HelloMinikubeApplicationKt         : Started HelloMinikubeApplicationKt  in 3.306 seconds (process running for 4.08)

重建服务

kubectl delete svc hello2
kubectl expose deployment hello2 --type=NodePort --port=80  --target-port=8080

查看服务信息

zj@linux:~$ kubectl describe service hello2
Warning: v1 Endpoints is deprecated in v1.33+; use discovery.k8s.io/v1 EndpointSlice
Name:                     hello2
Namespace:                default
Labels:                   app=hello2
Annotations:              <none>
Selector:                 app=hello2
Type:                     NodePort
IP Family Policy:         SingleStack
IP Families:              IPv4
IP:                       10.99.54.223
IPs:                      10.99.54.223
Port:                     <unset>  80/TCP
TargetPort:               8080/TCP
NodePort:                 <unset>  30367/TCP
Endpoints:                10.244.0.6:8080
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

查看service hello2暴露的url,成功访问

zj@linux:~$ minikube service hello2 --url
http://192.168.49.2:30367
zj@linux:~$ curl http://192.168.49.2:30367
{healthy: true}

此处涉及三个端口80,8080和30367。

端口类型 示例值 作用域 功能 使用者
NodePort 30367/TCP 集群外部访问 节点上开放的端口,允许外部用户通过 节点IP:NodePort
访问服务
外部用户(如浏览器、curl)
Port (Service Port) 80/TCP 集群内部访问 Service 的虚拟端口,集群内其他组件通过 ClusterIP:Port
访问服务
集群内 Pod、Service 间通信
TargetPort 8080/TCP Pod 内容器 容器实际监听的端口,Service 将流量转发到此端口 容器内应用(如 Spring Boot)

端口关系