从零开始Minikube

Minikube 是什么

Minikube是一个可以快速构建一个单节点本地运行Kubernetes环境的一个工具,它专注于让快速创建本地Kubernetes环境,用于学习和开发。
抛去多集群有关的特性,Minukube构建的单节点集群,足以使用户探索和发现Kubernate的绝大多数主要功能。

安装Minikube

Minikube支持安装在OSX, Windows, Linux。

前置条件

资源 说明
CPU 2
内存 2G
硬盘 20G
网络连接
容器 /虚拟机管理器 Docker, Hyperkit, Hyper-V, KVM, Parallels, Podman, VirtualBox, or VMWare

以下就举例在Mac 11.4 上的安装步骤:

安装在本地mac上

brew install minikube

安装docker

目前看只有Docker Desktop for Mac (macOS)可以下载, Docker.dmg

安装hyperkit

brew install hyperkit

安装 kubectl(K8s的CLI工具):

brew install kubectl

运行Minikube

minikube start --driver=hyperkit

你会看到以下信息,表明启动成功。

XXXX % minikube start


😄  minikube v1.21.0 on Darwin 11.4
✨  Using the hyperkit driver based on existing profile
👍  Starting control plane node minikube in cluster minikube
🔄  Restarting existing hyperkit VM for "minikube" ...
🎉  minikube 1.22.0 is available! Download it: https://github.com/kubernetes/minikube/releases/tag/v1.22.0
💡  To disable this notice, run: 'minikube config set WantUpdateNotification false'

❗  This VM is having trouble accessing https://k8s.gcr.io
💡  To pull new external images, you may need to configure a proxy: https://minikube.sigs.k8s.io/docs/reference/networking/proxy/
🐳  Preparing Kubernetes v1.20.7 on Docker 20.10.6 ...
🔎  Verifying Kubernetes components...
    ▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5
    ▪ Using image kubernetesui/dashboard:v2.1.0
    ▪ Using image kubernetesui/metrics-scraper:v1.0.4
🌟  Enabled addons: storage-provisioner, default-storageclass, dashboard
🏄  Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default

可以使用以下命令,查看集群状态:

kubectl get nodes

查看集群状态:

XXXX % kubectl cluster-info
Kubernetes control plane is running at https://192.168.XX.XX:8443
KubeDNS is running at https://192.168.XX.XX:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

启动 Dashboard

minikube dashboard

你可以看到以下信息,并且浏览器会自动打开dashboard页面

 % minikube dashboard
🤔  Verifying dashboard health ...
🚀  Launching proxy ...
🤔  Verifying proxy health ...
🎉  Opening http://127.0.0.1:60595/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/ in your default browser...
minikube-1.png

运行sample

kubectl create deployment hello-minikube --image=docker.io/helloworldcontainers/java-spring-boot-hello-world:latest
kubectl expose deployment hello-minikube --type=NodePort --port=8080

这个可能会需要几分钟, 可以查看Pod状态,来查看进度。

kubectl get pods 

错误排查

在运行中发现pods pull images无法成功pull到。

错误描述

···
NAME READY STATUS RESTARTS AGE
hello-minikube-7687f858f5-6h7d4 0/1 ErrImagePull 0 20s
hello-minikube-7f4c5f87b4-88zhq 0/1 ImagePullBackOff 0 6m27s
···
使用kubectl describe pods:

kubectl describe pods hello-minikube-7f4c5f87b4-88zhq

得到如下信息吧:

Events:
  Type     Reason     Age                From               Message
  ----     ------     ----               ----               -------
  Normal   Scheduled  40s                default-scheduler  Successfully assigned default/hello-minikube-549948974b-xnd5s to minikube
  Warning  Failed     30s                kubelet            Failed to pull image "helloworldcontainers/java-spring-boot-hello-world:latest": rpc error: code = Unknown desc = Error response from daemon: Get https://registry-1.docker.io/v2/: dial tcp: lookup registry-1.docker.io on 192.168.64.1:53: read udp 192.168.64.2:58852->192.168.64.1:53: i/o timeout
  Normal   BackOff    29s                kubelet            Back-off pulling image "helloworldcontainers/java-spring-boot-hello-world:latest"
  Warning  Failed     29s                kubelet            Error: ImagePullBackOff
  Normal   Pulling    19s (x2 over 41s)  kubelet            Pulling image "helloworldcontainers/java-spring-boot-hello-world:latest"
  Warning  Failed     9s (x2 over 30s)   kubelet            Error: ErrImagePull
  Warning  Failed     9s                 kubelet            Failed to pull image "helloworldcontainers/java-spring-boot-hello-world:latest": rpc error: code = Unknown desc = Error response from daemon: Get https://registry-1.docker.io/v2/: dial tcp: lookup registry-1.docker.io on 192.168.64.1:53: read udp 192.168.64.2:54170->192.168.64.1:53: i/o timeout

尝试了把images 先用docker pull本地,然后修改deployment的imagePullPolicy:IfNotPresent。

docker pull helloworldcontainers/java-spring-boot-hello-world:latest

kubectl edit  deployment hello-minikube  


spec:
      containers:
      - image: helloworldcontainers/java-spring-boot-hello-world:latest
        imagePullPolicy: IfNotPresent
        name: java-spring-boot-hello-world

是种不行, 感觉应该是minukebe和docker之间的网络问题, google了一下,发现了个解决方法,具体可以参考:

检查运行状态

XXX % kubectl get pods
NAME                              READY   STATUS    RESTARTS   AGE
hello-minikube-6c8744f68d-bttlx   1/1     Running   0          9m11s
XXX % kubectl get svc
NAME             TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
hello-minikube   NodePort    XX.XX.XX.XXX  <none>        8080:30086/TCP   34s
kubernetes       ClusterIP   10.XX.0.1       <none>        443/TCP          11d

访问pod里的应用

得到host node的IP

kubectl get node -owide

如下

NAME       STATUS   ROLES                  AGE   VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE               KERNEL-VERSION   CONTAINER-RUNTIME
minikube   Ready    control-plane,master   11d   v1.20.7   192.168.64.2   <none>        Buildroot 2020.02.12   4.19.182         docker://20.10.6
lizhenjun@192 issues-2 % kubectl get svc
NAME             TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
hello-minikube   NodePort    10.97.242.173   <none>        8080:30086/TCP   15m
kubernetes       ClusterIP   10.96.0.1       <none>        443/TCP          11d

curl 服务:

curl http://192.168.64.2:30086

得到如下结果

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Hello, World</title>
</head>
<body>

<h1>Hello, World!</h1>

</body>
</html>%                         

总结

Minikube是个非常方便的工具用于初学者的k8s学习,对于开发者,可以快速进行本地开发和测试k8s应用。总而言之,Minikube是个k8s从业者的启航船。

export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')

echo Name of the Pod: $POD_NAME

curl http://localhost:8001/api/v1/namespaces/default/pods/$POD_NAME:8080/proxy/

参考

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容