Minikube快速入门
安装
macos 系统使用 brew 安装
brew install minikube启动集群
查看当前集群列表
$ minikube profile list|----------|-----------|---------|--------------|------|---------|---------|-------|----------------|--------------------|| Profile | VM Driver | Runtime | IP | Port | Version | Status | Nodes | Active Profile | Active Kubecontext ||----------|-----------|---------|--------------|------|---------|---------|-------|----------------|--------------------|| minikube | docker | docker | 192.168.49.2 | 8443 | v1.30.0 | Unknown | 1 | * | * ||----------|-----------|---------|--------------|------|---------|---------|-------|----------------|--------------------|创建一个集群
# 启动一个名称为 minikube 集群,命名空间为 defaultminikube start默认情况下,
minikube start创建一个名为“minikube”的集群。如果您想创建不同的集群或更改其名称,可以使用--profile(或-p) 标志:minikube start -p test如果只想使用 docker 而不使用 k8s:
minikube start --container-runtime=docker --no-kubernetes指定资源:
minikube start --cpus 4 --memory 8G也可以调整资源:
minikube config set cpus 2minikube config set memory 2G
k8s 集群创建成功之后,可以通过 kubectl 查看上下文:
$ kubectl config get-contextsCURRENT NAME CLUSTER AUTHINFO NAMESPACE* minikube minikube minikube defaultminikube 内置了 kubectl 工具,可以使用下面命令
minikube kubectl --也可以在 shell 中为上面命令设置一个别名:
alias kubectl="minikube kubectl --"
查询 docker 容器:
$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESf30717c5cfc7 gcr.io/k8s-minikube/kicbase:v0.0.44 "/usr/local/bin/entr…" 11 minutes ago Up 11 minutes 127.0.0.1:32782->22/tcp, 127.0.0.1:32781->2376/tcp, 127.0.0.1:32780->5000/tcp, 127.0.0.1:32779->8443/tcp, 127.0.0.1:32778->32443/tcp minikube登录 minikube 容器:
$ minikube ssh
docker@minikube:~$查询 pod
kubectl get po -A启动 dashboard
$ minikube dashboard --url
# 或者$ minikube dashboard🔌 Enabling dashboard ... ▪ Using image docker.io/kubernetesui/dashboard:v2.7.0 ▪ Using image docker.io/kubernetesui/metrics-scraper:v1.0.8💡 Some dashboard features require the metrics-server addon. To enable all features please run:
minikube addons enable metrics-server
🤔 Verifying dashboard health ...🚀 Launching proxy ...🤔 Verifying proxy health ...🎉 Opening http://127.0.0.1:61663/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard://proxy/ in your default browser...查询 IP:
$ minikube ip192.168.49.2在 macos 系统是无法 ping 该 IP 的:
$ ping 192.168.49.2PING 192.168.49.2 (192.168.49.2): 56 data bytesRequest timeout for icmp_seq 0Request timeout for icmp_seq 1默认使用的是docker driver,但是Mac docker desktop不会创建docker0网桥,所以无法ping通minikube node ip。可以使用vm的方式启动minikube。更多说明,可以参考:
- https://github.com/kubernetes/minikube/issues/11193
- https://stackoverflow.com/questions/63600378/cant-access-minikube-service-using-nodeport-from-host-on-mac
- https://docs.docker.com/desktop/mac/networking/#known-limitations-use-cases-and-workarounds
查看集群状态
$ minikube statusminikubetype: Control Planehost: Runningkubelet: Runningapiserver: Runningkubeconfig: Configured升级集群
minikube start --kubernetes-version=latest停止本地集群:
minikube stop暂停集群
minikube unpause删除本地集群:
minikube delete删除所有本地集群和配置文件
minikube delete --all部署应用
创建 Deployment
使用 kubectl create 命令创建管理 Pod 的 Deployment。该 Pod 根据提供的 Docker 镜像运行容器。
kubectl create deployment web --image=gcr.io/google-samples/hello-app:1.0查看 Deployment:
$ kubectl get deployment webNAME READY UP-TO-DATE AVAILABLE AGEweb 1/1 1 1 14s该 Pod 可能需要一些时间才能变得可用。如果你在输出结果中看到 “0/1”,请在几秒钟后重试。
在 Kubernetes 内运行的 Pod 运行在一个私有的、隔离的网络上。 默认这些 Pod 可以从同一 Kubernetes 集群内的其他 Pod 和服务看到,但超出这个网络后则看不到。 当我们使用 kubectl 时,我们通过 API 端点交互与应用进行通信。
kubectl proxy 命令可以创建一个代理,将通信转发到集群范围的私有网络。
kubectl proxy你可以看到通过代理端点托管的所有 API。 例如,我们可以使用以下 curl 命令直接通过 API 查询版本:
curl http://localhost:8001/versionAPI 服务器将基于也能通过代理访问的 Pod 名称为每个 Pod 自动创建端点。
获取 Pod 名称:
kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}'输出结果如下:
web-56bb54ff6d-stk75你可以运行以下命令通过代理的 API 访问 Pod:
curl http://localhost:8001/api/v1/namespaces/default/pods/web-56bb54ff6d-stk75/创建 Service
默认情况下,Pod 只能通过 Kubernetes 集群中的内部 IP 地址访问。 为了不使用代理也能访问新的 Deployment,你必须将 Pod 通过 Kubernetes Service 公开出来。
使用 kubectl expose 命令将 Pod 暴露给公网:
kubectl expose deployment web --type=LoadBalancer --port=8080这里的 --type=LoadBalancer 参数表明你希望将你的 Service 暴露到集群外部。
测试镜像中的应用程序代码仅监听 TCP 8080 端口。 如果你用 kubectl expose 暴露了其它的端口,客户端将不能访问其它端口。
查看你创建的 Service:
$ kubectl get service webNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEweb NodePort 10.106.178.70 <none> 8080:30954/TCP 8s对于支持负载均衡器的云服务平台而言,平台将提供一个外部 IP 来访问该服务。 在 Minikube 上,LoadBalancer 使得服务可以通过命令 minikube service 访问。
运行下面的命令:
minikube service hello-node这将打开一个浏览器窗口,为你的应用程序提供服务并显示应用的响应。
Hello, world!Version: 1.0.0Hostname: web-56bb54ff6d-wtcxn创建 Ingress
Minikube 有一组内置的插件, 可以在本地 Kubernetes 环境中启用、禁用和打开。
查询插件:
minikube addons list启用入口插件:
minikube addons enable ingress如果要禁用插件:
minikube addons disable ingress对上面的 web 服务创建一个 ingress:
kubectl apply -f https://k8s.io/examples/service/networking/example-ingress.yamlhttps://k8s.io/examples/service/networking/example-ingress.yaml 内容如下:
apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: example-ingressspec: ingressClassName: nginx rules: - host: hello-world.example http: paths: - path: / pathType: Prefix backend: service: name: web port: number: 8080等待入口地址
$ kubectl get ingressNAME CLASS HOSTS ADDRESS PORTS AGEexample-ingress nginx hello-world.example 80 36s在本地 hosts 文件添加:
127.0.0.1 hello-world.example现在验证入口是否正常工作:
$ curl hello-world.examplecurl: (7) Failed to connect to hello-world.example port 80 after 2 ms: Couldn't connect to server在一个终端运行下面命令,开启代理,对 example-ingress 暴露 80 和 443 端口:
$ sudo minikube tunnel✅ Tunnel successfully started
📌 NOTE: Please do not close this terminal as this process must stay alive for the tunnel to be accessible ...
❗ The service/ingress example-ingress requires privileged ports to be exposed: [80 443]🔑 sudo permission will be asked for it.🏃 Starting tunnel for service example-ingress.再次运行,可以看到返回:
$ curl hello-world.exampleHello, world!Version: 1.0.0Hostname: web-56bb54ff6d-stk75清理
现在可以清理你在集群中创建的资源:
kubectl delete service webkubectl delete deployment webkubectl delete ingress example-ingress停止 Minikube 集群:
minikube stop