Minikube 快速入門手冊

一仗阅、Minikube 簡介

minikube logo.jpeg

Minikube官網(wǎng)

Minikube官方github

Kubernetes教程

1泛释、什么是Minikube?

Minikube是一種輕量化的Kubernetes集群,是Kubernetes社區(qū)為了幫助開發(fā)者和學(xué)習(xí)者能夠更好學(xué)習(xí)和體驗(yàn)k8s功能而推出的谤绳,借助個(gè)人PC的虛擬化環(huán)境就可以實(shí)現(xiàn)Kubernetes的快速構(gòu)建啟動拧簸。目前已支持在macOS、Linux巫延、Windows平臺上利用各類本地虛擬化環(huán)境作為驅(qū)動運(yùn)行励两。

1)配置需求

2)常用驅(qū)動

Minikube在不同操作系統(tǒng)上支持不同的驅(qū)動饼疙,具體如下:

  • macOS
  • Linux
  • Windows

?? 注意:

  • 由于minikube復(fù)用了docker-machine,在其軟件包中已經(jīng)支持了相應(yīng)的VirtualBox, VMware Fusion驅(qū)動

  • VT-x/AMD-v 虛擬化必須在 BIOS 中開啟

  • 在Windows環(huán)境下慕爬,如果開啟了Hyper-V窑眯,不支持VirtualBox方式


2、Minikube 和 Kubernetes 的區(qū)別

1)Kubernetes 集群的架構(gòu):

通常情況下医窿,一套完整的Kubernetes集群至少需要包括master節(jié)點(diǎn)和node節(jié)點(diǎn)磅甩,下圖是常規(guī)k8s的集群架構(gòu),master節(jié)點(diǎn)一般是獨(dú)立的姥卢,用于協(xié)調(diào)調(diào)試其它節(jié)點(diǎn)之用卷要,而容器實(shí)際運(yùn)行都是在node節(jié)點(diǎn)上,kubectl位于 master節(jié)點(diǎn)独榴。

kubernetes cluster.png

2)Minikube 的架構(gòu):

下圖是 Minikube 的架構(gòu)僧叉,可以看出,master 節(jié)點(diǎn)與其它節(jié)點(diǎn)合為一體棺榔,而整體則通過宿主機(jī)上的 kubectl 進(jìn)行管理瓶堕,這樣可以更加節(jié)省資源。

minikube cluster.png

3症歇、Minikube 的基本運(yùn)作原理

簡單來說就是郎笆,用戶使用Minikube CLI管理虛擬機(jī)上的Kubernetes環(huán)境,比如:啟動当船,停止题画,刪除,獲取狀態(tài)等德频。一旦Minikube虛擬機(jī)啟動苍息,用戶就可以使用熟悉的Kubectl CLI在Kubernetes集群上執(zhí)行操作。

Minikube運(yùn)作的基本原理如下所示:

minikube.jpeg
  • A: Minikube 在PC本地生成 kubeconfig 配置文件
  • B: Minikube 在虛擬環(huán)境中創(chuàng)建 Minikube 虛擬機(jī)
  • C: Minikube 在虛擬機(jī)中構(gòu)建 Kubernetes
  • D: Kubectl 通過 kubeconfig 對虛機(jī)中的 Kubernetes 進(jìn)行管理


二、各環(huán)境安裝部署

1竞思、macOS

1)環(huán)境

參數(shù) 版本描述
OS macOS Catalina v10.15.7
docker desktop docker version v19.03.13
kubectl kubectl version v1.18.8
Kubernetes kubernetes version v1.18.8
Virtual Machine Oracle VirtualBox v6.1.22

2)安裝 kubectl

k8s官方文檔 - 安裝 Kubectl

1. 使用二進(jìn)制包安裝

??注意: 由于Apple M1的芯片使用的底層架構(gòu)不同表谊,故在下載二進(jìn)制包時(shí)需要針對性下載適合對應(yīng)架構(gòu)的包,如果使用的 macOS為 2021款 Big Sur的 Mac 都是使用的 M1芯片盖喷,具體可以在左上角?? => 關(guān)于本機(jī) 中查看處理器型號爆办。

1?? 下載二進(jìn)制包

Intel 芯片(amd64):

curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/darwin/amd64/kubectl"

Apple M1 芯片(arm64):

curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/darwin/arm64/kubectl"
2?? 下載校驗(yàn)文件

Intel 芯片(amd64):

curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/darwin/amd64/kubectl.sha256"

Apple M1 芯片(arm64):

curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/darwin/arm64/kubectl.sha256"
3?? md5 校驗(yàn)

??注意: 不要使用與二進(jìn)制包不同版本的校驗(yàn)文件進(jìn)行校驗(yàn),否則校驗(yàn)必定失敗

echo "$(<kubectl.sha256)  kubectl" | shasum -a 256 --check

如果驗(yàn)證通過课梳,返回:

kubectl: OK

如果驗(yàn)證失敗距辆,返回:

kubectl: FAILED
shasum: WARNING: 1 computed checksum did NOT match
4?? 賦予執(zhí)行權(quán)限
chmod +x ./kubectl
5?? 移動到PATH可識別路徑
sudo mv ./kubectl /usr/local/bin/kubectl
6?? 查詢版本(驗(yàn)證)
kubectl version --client

正常返回類型下面:

Client Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.8", GitCommit:"9f2892aab98fe339f3bd70e3c470144299398ace", GitTreeState:"clean", BuildDate:"2020-08-13T16:12:48Z", GoVersion:"go1.13.15", Compiler:"gc", Platform:"darwin/amd64"}

2. 使用Homebrew安裝(推薦)

Homebrew 安裝方法:

1?? 安裝:

/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"

2?? 升級:

git -C /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core fetch --unshallow

git -C /usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask fetch --unshallow

brew update

執(zhí)行以下命令,自動安裝 kubectl 最新穩(wěn)定版:

brew install kubectl 

3)安裝virtualBox(低版本minikube必須)

新版本的Minikube已經(jīng)不需要再依賴于VM做為底層暮刃,也可以通過docker直接作為底層驅(qū)動跨算,并且在起步資源方面需求量更小。但是處于學(xué)習(xí)目的椭懊,這邊還是介紹一下 VM的方便诸蚕。

??注意: 必須在 BIOS 中 開啟 VT-x/AMD-v 虛擬化,否則無法啟用虛擬機(jī)氧猬。這里選用通用性更強(qiáng)的 VirtualBox

下載地址 (當(dāng)前最新版本6.1)

image-20210617161713190.png

下載對應(yīng)版本的dmg背犯,一路安裝即可,要注意的是:安裝過程中盅抚,可能會彈出一個(gè)系統(tǒng)安全相關(guān)的對話框漠魏,一定要允許,并在Security&Privacy 這里泉哈,把VirtualBox勾上蛉幸,否則minikube會無法啟動。

image-20210617161842788.png

4)安裝 minikube

??注意: 官方出品的minikube丛晦,默認(rèn)連接的是google官方站點(diǎn)奕纫,正常情況下國內(nèi)是無法訪問√躺常可以使用阿里版的minikube

阿里云容器服務(wù) ACK

執(zhí)行以下命令匹层,進(jìn)行自動安裝:

curl -Lo minikube https://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/releases/v1.18.1/minikube-darwin-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/

5)創(chuàng)建集群

1. 啟動參數(shù)說明

參數(shù) 說明
**--driver=***** 從1.5.0版本開始,Minikube缺省使用本地最好的驅(qū)動來創(chuàng)建Kubernetes本地環(huán)境锌蓄,測試過的版本 docker, kvm
--image-mirror-country cn 將缺省利用 registry.cn-hangzhou.aliyuncs.com/google_containers 作為安裝Kubernetes的容器鏡像倉庫 (阿里云版本可選)
**--iso-url=***** 利用阿里云的鏡像地址下載相應(yīng)的 .iso 文件 (阿里云版本可選)
**--registry-mirror=***** 為了拉取Docker Hub鏡像升筏,需要為 Docker daemon 配置鏡像加速,參考阿里云鏡像服務(wù)
--cpus=2 為minikube虛擬機(jī)分配CPU核數(shù)
--memory=2048mb 為minikube虛擬機(jī)分配內(nèi)存數(shù)
**--kubernetes-version=***** minikube 虛擬機(jī)將使用的 kubernetes 版本
**--insecure-registry=***** 設(shè)置私有鏡像倉庫地址瘸爽,跟私有倉庫的域名或者IP:Port

2. 啟動minikube

為保持kubernetes的版本和kubectl的版本一致您访,所以這里使用1.18.8 版本,具體選擇可以根據(jù)個(gè)人需要自定剪决,默認(rèn)minikube 1.18.1 已支持 kubernetes 1.20.x

minikube start --registry-mirror=https://registry.docker-cn.com --kubernetes-version=1.18.8 

正常啟動灵汪,結(jié)果如下:

image-20210617181210634.png

??注意: 如果首次失敗了(比如:步驟一中的安全設(shè)置沒勾選檀训,導(dǎo)致無法啟用),可以先嘗試minikute delete 刪除現(xiàn)有虛機(jī)享言,刪除 ~/.minikube 目錄緩存的文件峻凫。然后重新創(chuàng)建 minikube環(huán)境,升級minikube同理览露。

minikube 1.5.0 之后的版本最自動選擇最優(yōu)的驅(qū)動方式啟動minikube荧琼,默認(rèn)會使用 docker 啟動,在 docker desktop dashboard 中可以找到差牛,相較于使用 vm啟動命锄,docker作為驅(qū)動所需的默認(rèn)資源更小。

image-20210617181833745.png

3. 啟動minikube dashboard

minikube dashboard

正常啟動多糠,結(jié)果如下:

image-20210617181547293.png

瀏覽器會自動打開 dashboard Overview:

image-20210617181531965.png

4. kubectl測試

1?? 查看集群信息
kubectl cluster-info

集群啟動正常累舷,返回如下:

image-20210617181342037.png
2?? 查看節(jié)點(diǎn)信息
kubectl get node -A

正常返回如下:

image-20210617181441072.png

2、Linux

1)環(huán)境

參數(shù) 版本描述
OS CentOS Linux release 7.9.2009 (Core)
docker docker version v 20.10.7
kubectl kubectl version v1.18.8
Kubernetes kubernetes version v1.18.8

2)安裝 kubectl

1.使用二進(jìn)制包安裝

1?? 下載二進(jìn)制包
wget -c "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"

??注意: 使用$(curl -L -s https://dl.k8s.io/release/stable.txt)時(shí)下載的為最新穩(wěn)定版本的發(fā)行版夹孔,如果要下載指定版本的發(fā)行版,可以執(zhí)行如下命令析孽,以下載 v1.21.0為例:

wget -c https://dl.k8s.io/release/v1.21.0/bin/linux/amd64/kubectl
2?? 下載校驗(yàn)文件
wget -c "https://dl.k8s.io/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl.sha256"

??注意: 不要使用與二進(jìn)制包不同版本的校驗(yàn)文件進(jìn)行校驗(yàn)搭伤,否則校驗(yàn)必定失敗,如果要下載指定版本的校驗(yàn)文件袜瞬,可以執(zhí)行如下命令怜俐,以下載 v1.21.0 為例:

wget -c  https://dl.k8s.io/release/v1.21.0/bin/linux/amd64/kubectl.sha256
3?? md5校驗(yàn):
echo "$(<kubectl.sha256) kubectl" | sha256sum --check

如果驗(yàn)證通過,返回:

kubectl: OK

如果驗(yàn)證失敗邓尤,返回:

kubectl: FAILED
shasum: WARNING: 1 computed checksum did NOT match
4?? 安裝kubectl
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl

??注意: 如果沒有root權(quán)限拍鲤,也可以在安裝在對應(yīng)用戶的home目錄~/.local/bin 下:

mkdir -p ~/.local/bin/kubectl
mv ./kubectl ~/.local/bin/kubectl

最后將~/.local/bin/kubectl 添加至 $PATH,使其可被識別汞扎。

5?? 查詢版本(驗(yàn)證)
kubectl version --client

正常返回如下:

Client Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.18", GitCommit:"6f6ce59dc8fefde25a3ba0ef0047f4ec6662ef24", GitTreeState:"clean", BuildDate:"2021-04-15T03:31:30Z", GoVersion:"go1.13.15", Compiler:"gc", Platform:"linux/amd64"}

2.使用包管理器安裝

1?? yum(紅帽系Linux發(fā)行版)

鏡像源制作:

??注意: 官方使用的是google源https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64季稳,國內(nèi)正常情況使用不了,故這里推薦使用阿里云的源 https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

yum安裝kubectl:

yum install -y kubectl
2?? apt(Debian系Linux發(fā)行版)

升級 apt 并安裝依賴:

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

添加認(rèn)證公鑰:

??注意: 官方使用的是google源https://packages.cloud.google.com/apt/doc/apt-key.gpg澈魄,國內(nèi)正常情況使用不了景鼠,故這里推薦使用阿里云的源 https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg

curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -

添加 api 鏡像源:

??注意: 官方使用的是debian官方源,國內(nèi)正常情況使用不了痹扇,故這里推薦使用阿里云的kubeadm

cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF

apt安裝kubectl

apt-get update
apt-get install -y kubectl

3)安裝 minikube

??注意: 官方出品的minikube铛漓,默認(rèn)連接的是google官方站點(diǎn),正常情況下國內(nèi)是無法訪問鲫构∨ǘ瘢可以使用阿里版的minikube

阿里云容器服務(wù) ACK

執(zhí)行以下命令,進(jìn)行自動安裝:

curl -Lo minikube https://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/releases/v1.18.1/minikube-linux-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/

4)創(chuàng)建集群

1. 系統(tǒng)參數(shù)優(yōu)化

默認(rèn)情況下结笨,kubernetes對于系統(tǒng)參數(shù)有一定的預(yù)設(shè)值要求包晰,如果不滿足要求湿镀,就會導(dǎo)致啟動時(shí)出現(xiàn)異常,比如如下情況:

image-20210623204600777.png

由于參數(shù) nf_conntrack_max(系統(tǒng)丟包限制) 未能達(dá)到要求值的 131072杜窄,因此導(dǎo)致 kube-proxy 啟動異常肠骆,并且導(dǎo)致 minikube 內(nèi)部無法與外部通信,因而拉取鏡像時(shí)就會失敗塞耕,服務(wù)就無法正常啟動蚀腿,因此就需要對該參數(shù)進(jìn)行調(diào)整,否則將無法正常使用minikube扫外。

執(zhí)行以下命令莉钙,可以查看當(dāng)前系統(tǒng)丟包限制:

 sysctl  net.netfilter.nf_conntrack_max

執(zhí)行以下命令,則可以查看當(dāng)前是否超限:

sysctl net.netfilter.nf_conntrack_count
0?? k8s內(nèi)核參數(shù)優(yōu)化模版:

新建文件 /etc/sysctl.d/kubernetes.conf筛谚,sysctl 會讀取 /etc/sysctl.d/ 下的子配置文件磁玉。模版內(nèi)容如下:

net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
vm.swappiness=0
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=131072

net.netfilter.nf_conntrack_max 的值根據(jù)具體反饋的值來設(shè)置為準(zhǔn)。

執(zhí)行如下命令加載內(nèi)核參數(shù)配置(立刻生效):

sysctl -p /etc/sysctl.d/kubernetes.conf

??注意: 如果執(zhí)行上述命令出錯(cuò)驾讲,錯(cuò)誤信息如下:

sysctl: cannot stat /proc/sys/net/netfilter/nf_conntrack_max: No such file or directory
image-20210623205837741.png

則可能是 conntrack 沒有被加載蚊伞,執(zhí)行如下命令查看:

lsmod |grep conntrack

如何返回是空,表示沒有加載吮铭,那執(zhí)行如下命令加載即可:

modprobe ip_conntrack

再次執(zhí)行 lsmod |grep conntrack 驗(yàn)證时迫,如果正常,反饋類似下圖:

image-20210623210107481.png

然后再次加載內(nèi)核優(yōu)化配置就可以了谓晌。

2. root用戶沖突解決

??注意: 使用docker作為 minikube的驅(qū)動掠拳,不能使用 root 用戶,否則將會出現(xiàn)如下報(bào)錯(cuò):

image-20210618115513477.png

解決方案如下:


方案一:
1?? 創(chuàng)建普通用戶作為啟動用戶
useradd -g docker -G wheel minikube

-g: 默認(rèn)組(用戶登錄時(shí)就是這個(gè)組) -G: 其他群組 wheel:sudo組(加到這個(gè)組里才會有sudo權(quán)限)

2?? 設(shè)置啟動用戶密碼
passwd minikube

方案二:

切換使用普通用戶進(jìn)行操作纸肉,執(zhí)行如下命令:

minikube start --driver=docker

反饋如下:

image-20210618120509901.png

根據(jù)提示溺欧,將用戶添加至docker組,執(zhí)行如下命令(需要root操作或sudo提權(quán)):

usermod -aG docker minikube && newgrp docker

以上兩種方案仍選其一柏肪,執(zhí)行完成后姐刁,再次啟動minikube。

3. 啟動minikube

為保持kubernetes的版本和kubectl的版本一致,所以這里使用1.18.8 版本,具體選擇可以根據(jù)個(gè)人需要自定菊匿,默認(rèn)minikube 1.18.1 已支持 kubernetes 1.20.x

minikube start --registry-mirror=https://registry.docker-cn.com --kubernetes-version=1.18.8 

正常啟動适贸,結(jié)果如下:

image-20210618122349340.png

4. kubectl測試

1?? 查看集群信息
kubectl cluster-info

正常返回如下:

image-20210618131220222.png
2?? 查看節(jié)點(diǎn)信息
kubectl get node 

正常返回如下:

image-20210617181441072.png
3?? 查看內(nèi)部服務(wù)組件
kubectl get pod -A
image-20210623180636431.png

5)啟動 minikube dashboard

1. 用服務(wù)器內(nèi)網(wǎng) IP 訪問 dashboard

??注意:

正常啟動過的情況下,dashboard 默認(rèn)會以本地回環(huán)地址拉起proxy,我們執(zhí)行以下命令:

minikube dashboard --url

由于centos按照最小化安裝是沒有瀏覽器的,也沒有圖形化功能,所以這邊使用了--url 參數(shù)宿礁,這將不掉用瀏覽器,而直接返回可用戶訪問的 endpoint蔬芥,正常啟動成功梆靖,結(jié)果如下:

image-20210623182617904.png

但是控汉,由于我們是部署在服務(wù)器上,從外部訪問又無法訪問服務(wù)器的回環(huán)地址返吻,因此我們需要做代理姑子,來實(shí)現(xiàn)外部訪問,下面介紹具體方法:

1?? 在終端開啟本地IP代理窗口
kubectl proxy --port=45396 --address='0.0.0.0' --disable-filter=true --accept-hosts='^.*' 

這里使用0.0.0.0测僵,旨在可以使公網(wǎng)網(wǎng)卡也監(jiān)聽端口街佑,方便我們外部訪問,如果VPC環(huán)境的話捍靠,需要本地IP段和服務(wù)器IP段打通沐旨,否則就需要做端口映射,將端口暴露出來榨婆,這里的端口可以隨便指定未占用的端口磁携,也可以不使用 --port 參數(shù),這樣會隨機(jī)分配一個(gè)端口 良风。

proxy控制臺啟動成功谊迄,返回如下,開啟本地 45396 端口監(jiān)聽:

image-20210623200947007.png
2?? 獲取k8s api endpoint

再次運(yùn)行 minikube dashboard --url 烟央,將獲取到的 endpoint 的 IP:Port 替換成外部IP:45396 鳞上,再在本地瀏覽器中訪問以下地址:

http://192.168.3.224:45396/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/

一切正常的話,就可以訪問 minikube dashboard 了:

image-20210623201725539.png

2. 安裝圖形化界面吊档,通過服務(wù)器瀏覽器啟動 dashboard

??注意: minikube的 dashboard 默認(rèn)需要默認(rèn)瀏覽器的支持,而一般性如果我們是按照最小化原則安裝的centos系統(tǒng)唾糯,是不包含圖形化組件的怠硼,也不包含瀏覽器,因此直接啟動 minikube dashboard 是無法正常使用的移怯。那么如果要正常使用 minikube dashboard 香璃,就需要安裝GUI包和瀏覽器,下面介紹下下具體方法:

1?? 安裝 GUI組件包
yum groupinstall -y 'X Window System' 'GNOME'

安裝成功舟误,返回如下:

image-20210623111952857.png
2?? 安裝火狐瀏覽器
yum install -y firefox

安裝成功葡秒,返回如下:

image-20210623112238393.png
3?? 升級內(nèi)核(可選項(xiàng))
yum update -y
4?? 啟動圖形化界面
startx

圖形化界面打開后,一路 next(skip)后嵌溢,就可以正常訪問圖形化桌面了:

image-20210623202734625.png

?? 拓展知識: 開機(jī)啟動圖形化界面

1?? 查看當(dāng)前開機(jī)啟動模式:

以 root用戶身份在命令行中執(zhí)行如下命令:

systemctl get-default

graphical.target 代表開機(jī)時(shí)啟動圖形化界面
multi-user.target 代表開機(jī)時(shí)啟動dos界面

2?? 設(shè)置開機(jī)啟動圖形界面:

以 root用戶身份在命令行中執(zhí)行如下命令:

systemctl set-default graphical.target 

同理眯牧,如果想開機(jī)啟動dos界面,就輸入如下命令:

systemctl set-default multi-user.target 

3?? dos界面與圖形化界面切換快捷鍵:

  • 圖形到dos:ctrl+alt+f2

  • dos到圖形:輸入startx

    或者

  • 在命令上輸入 init 3 命令 切換到dos界面

  • 輸入 init 5命令 切換到圖形界面


5?? 重新訪問 dashboard

在左上角 Applications - System Tools 中打開終端:

image-20210623202844093.png

在終端中執(zhí)行如下命令:

minikube dashboard
image-20210623203226621.png

minikube 就會自動調(diào)用默認(rèn)的瀏覽器(之前安裝的火狐)拉起 dashboard:

image-20210623203208183.png

3赖草、Windows

作為個(gè)人開發(fā)者学少,個(gè)人并不推薦使用 windows 系統(tǒng)作為kubernetes的運(yùn)行環(huán)境,究其原因有很多秧骑,最主要的原因在于 windows 要安裝docker 需要依賴Hyper-V(微軟開發(fā)的虛擬機(jī))版确,一旦開啟了就無法再使用 VirtualBox 或 Vmware 等VM扣囊,且本身和docker的相性就比較一般,而docker目前已基本為識別為 Minikube 的最佳驅(qū)動绒疗,因此侵歇,綜上所述在此僅做簡單介紹。

1)環(huán)境

參數(shù) 版本描述
OS Windows 10
docker desktop docker version v19.03.13
kubectl kubectl version v1.18.8
Kubernetes kubernetes version v1.18.8
Virtual Machine Hypervisor

參考文檔:

Windows Docker 安裝

windows安裝minikube



三吓蘑、Minikube 基礎(chǔ)操作

1惕虑、基礎(chǔ)命令行

啟動并運(yùn)行一個(gè)集群:

minikube start

訪問 minikube中的 k8s dashboard

minikube dashboard

當(dāng)你啟動了 minikube 后,你可以像操作其他k8s集群一樣士修,通過kubectl 進(jìn)行集群管理枷遂,比如創(chuàng)建一個(gè)服務(wù):

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

NodePort 的形式暴露一個(gè)服務(wù):

kubectl expose deployment hello-minikube --type=NodePort --port=8080

使用minikube在瀏覽器中快速打開服務(wù)放出的endpoint

minikube service hello-minikube

升級集群:

minikube start --kubernetes-version=latest

啟動另一個(gè)本地集群:

??注意: 如果 minikube 運(yùn)作在 裸金屬/none 驅(qū)動時(shí),將不生效

minikube start -p cluster2

停止一個(gè)集群:

minikube stop
image-20210621115031347.png

刪除一個(gè)集群:

minikube delete

刪除本地所有集群和配置:

minikube delete --all

2棋嘲、發(fā)布應(yīng)用

1)通過 kubectl 發(fā)布服務(wù)

1. 創(chuàng)建服務(wù):

kubectl create deployment hello-minikube1 --image=registry.cn-hangzhou.aliyuncs.com/google_containers/echoserver:1.10

2. 暴露端口:

kubectl expose deployment hello-minikube1 --type=LoadBalancer --port=8080

3. 查看映射端口

export PORT=$(kubectl get svc hello-minikube1 -o go-template='{{range.spec.ports}}{{if .nodePort}}{{.nodePort}}{{"\n"}}{{end}}{{end}}')

# 查看端口
echo $PORT

4. 訪問端口

minikube service hello-minikube1
image-20210618171957253.png

5. 刪除服務(wù)

kubectl delete deployment -n default hello-minikube1 --force --grace-period=0

2)通過 Addons 管理插件

Minikube 自帶了一個(gè)內(nèi)置應(yīng)用列表酒唉,包括諸如 Istio、Ingress 等沸移,可以方便快速部署插件痪伦。

1. 查詢插件列表

minikube addons list

輸出如下:

|-----------------------------|----------|--------------|
|         ADDON NAME          | PROFILE  |    STATUS    |
|-----------------------------|----------|--------------|
| ambassador                  | minikube | disabled     |
| auto-pause                  | minikube | disabled     |
| csi-hostpath-driver         | minikube | disabled     |
| dashboard                   | minikube | enabled ?   |
| default-storageclass        | minikube | enabled ?   |
| efk                         | minikube | disabled     |
| freshpod                    | minikube | disabled     |
| gcp-auth                    | minikube | disabled     |
| gvisor                      | minikube | disabled     |
| helm-tiller                 | minikube | disabled     |
| ingress                     | minikube | disabled     |
| ingress-dns                 | minikube | disabled     |
| istio                       | minikube | disabled     |
| istio-provisioner           | minikube | disabled     |
| kubevirt                    | minikube | disabled     |
| logviewer                   | minikube | disabled     |
| metallb                     | minikube | disabled     |
| metrics-server              | minikube | disabled     |
| nvidia-driver-installer     | minikube | disabled     |
| nvidia-gpu-device-plugin    | minikube | disabled     |
| olm                         | minikube | disabled     |
| pod-security-policy         | minikube | disabled     |
| registry                    | minikube | disabled     |
| registry-aliases            | minikube | disabled     |
| registry-creds              | minikube | disabled     |
| storage-provisioner         | minikube | enabled ?   |
| storage-provisioner-gluster | minikube | disabled     |
| volumesnapshots             | minikube | disabled     |
|-----------------------------|----------|--------------|

2. 啟用指定插件

minikube addons enable <name>

3. 同時(shí)啟用多個(gè)插件

minikube start --addons <name1> --addons <name2>

4. 在瀏覽器打開插件暴露出的endpoint

minikube addons open <name>

5. 停用指定插件

minikube addons disable <name>

3、訪問應(yīng)用

1)NodePort 方式訪問

NodePort 方式是訪問服務(wù)最基礎(chǔ)的方式雹锣,顧名思義网沾,就是將端口映射到本地,并通過本地的 IP + 映射的端口訪問服務(wù)放出的 endpoint蕊爵,這種方式下辉哥,服務(wù)會共用 VM 的 IP。

1. 使用service命令訪問 endpoint

minikube 內(nèi)置的 service 命令可以快速訪問服務(wù)放出的endpoint攒射,并在瀏覽器中打開

minikube service --url <service-name>

2. 使用 kubectl 獲取 nodePort 端口

通過minikube ip 命令可以獲取到虛擬機(jī)的IP地址醋旦,執(zhí)行以下命令,可以獲取到服務(wù)映射的 nodePort 端口

kubectl get service <service-name> --output='jsonpath="{.spec.ports[0].nodePort}"'

3. 擴(kuò)展 NodePort 的范圍

一般來說会放,minikube 包括的端口范圍為 30000-32767饲齐,如果不夠的話,可以通過如下命令進(jìn)行擴(kuò)展

minikube start --extra-config=apiserver.service-node-port-range=1-65535

2)LoadBalancer 方式訪問

LoadBalancer 方式咧最,是將服務(wù)暴露到公網(wǎng)中的標(biāo)準(zhǔn)方法捂人,使用這種方法,每一個(gè)服務(wù)都有其獨(dú)立的IP矢沿。

LoadBalancer 方式暴露的服務(wù)需要通過 minikube tunnel 命令訪問滥搭,并且必須在一個(gè)獨(dú)立的終端窗口保持 LoadBalancer 運(yùn)行,使用 Ctrl-C 可以退出進(jìn)程咨察,但是相關(guān)的路由信息將會被情況

1. 使用 minikube tunnel

在獨(dú)立的終端運(yùn)行 tunnel论熙,它會在k8s的CIDR中新增路由規(guī)則,將集群的IP地址作為網(wǎng)關(guān)摄狱,tunnel 命令會將服務(wù)的外部訪問IP直接暴露給主機(jī)操作系統(tǒng)上運(yùn)行的所有程序脓诡。

minikube tunnel
image-20210621095923915.png

2. 創(chuàng)建一個(gè)deployment

kubectl create deployment hello-minikube1 --image=registry.cn-hangzhou.aliyuncs.com/google_containers/echoserver:1.10
檢查服務(wù):
kubectl get pod

NAME                              READY   STATUS    RESTARTS   AGE
hello-minikube1-7587585f9-pn6l2   1/1     Running   0          37s

3. 創(chuàng)建LB服務(wù)无午,將服務(wù)暴露出來

kubectl expose deployment hello-minikube1 --type=LoadBalancer --port=8080

tunnel 終端窗口會彈出:

??  Starting tunnel for service hello-minikube1.

4. 查看外部訪問IP

kubectl get svc

正常返回如下:

NAME              TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
hello-minikube1   LoadBalancer   10.97.227.83   127.0.0.1     8080:31546/TCP   72s

??注意: 如果沒有開啟minikube tunnel 窗口的話,服務(wù)的 EXTERNAL-IP 將會顯示 pending

5. 在瀏覽器中訪問服務(wù)(通過IP:Port)

打開瀏覽器祝谚,訪問http://127.0.0.1:8080宪迟,(確保服務(wù)沒有proxy設(shè)置)

image-20210621102111013.png

4、Minikube Dashboard

1)基礎(chǔ)使用

執(zhí)行以下命令交惯,訪問 dashboard:

minikube dashboard
image-20210621103951020.png

這將會開啟 dashboard 插件次泽,,并自動在默認(rèn)瀏覽器中開啟代理的 endpoint席爽,同樣意荤,這也需要在終端中保持進(jìn)程運(yùn)行,使用Ctrl + C 結(jié)束代理只锻,之后 dashboard 將不能使用玖像。

??注意: 默認(rèn)瀏覽器是不能以 root 用戶的身份開啟的,minikube 同樣默認(rèn)不能以 root 用戶身份啟動齐饮。

2)獲取 dashboard 的URL

如果你不想直接在瀏覽器中打開代理捐寥,也可以執(zhí)行以下命令,這會只返回可訪問的URL地址:

minikube dashboard --url
image-20210621104058380.png

3)界面使用

minikube 的 dashboard祖驱,即 Kubernetes 默認(rèn)的 dashboard握恳,具體可見: dashboard官方文檔


5、Minikube 的配置項(xiàng)

minikube 的大多戶配置已做成了參數(shù)接口捺僻,具體可以查看乡洼,可以執(zhí)行以下命令:

minikube start --help

這里使用的是阿里云版本的 minikube,已基本全部漢化匕坯,具體參數(shù)選項(xiàng)如下:

Starts a local Kubernetes cluster

Options:
      --addons=[]: 啟用插件就珠。執(zhí)行 `minikube addons list` 查看可用插件名稱列表
      --apiserver-ips=[]: 一組在為 kubernetes 生成的證書中使用的 apiserver IP
地址。如果您希望將此 apiserver 設(shè)置為可從機(jī)器外部訪問醒颖,則可以使用這組
apiserver IP 地址
      --apiserver-name='minikubeCA': The authoritative apiserver hostname for apiserver certificates
and connectivity. This can be used if you want to make the apiserver available from outside the
machine
      --apiserver-names=[]: 一組在為 kubernetes 生成的證書中使用的 apiserver
名稱。如果您希望將此 apiserver 設(shè)置為可從機(jī)器外部訪問壳炎,則可以使用這組
apiserver 名稱
      --apiserver-port=8443: apiserver 偵聽端口
      --auto-update-drivers=true: 如果設(shè)置了泞歉,將自動更新驅(qū)動到最新版本。默認(rèn)為
true匿辩。

--base-image='registry.cn-hangzhou.aliyuncs.com/google_containers/kicbase:v0.0.18@sha256:ddd0c02d289e3a6fb4bba9a94435840666f4eb81484ff3e707b69c1c484aa45e':
The base image to use for docker/podman drivers. Intended for local development.
      --cache-images=true: If true, cache docker images for the current bootstrapper and load them
into the machine. Always false with --driver=none.
      --cni='': CNI plug-in to use. Valid options: auto, bridge, calico, cilium, flannel, kindnet,
or path to a CNI manifest (default: auto)
      --container-runtime='docker': The container runtime to be used (docker, cri-o, containerd).
      --cpus=2: Number of CPUs allocated to Kubernetes.
      --cri-socket='': The cri socket path to be used.
      --delete-on-failure=false: If set, delete the current cluster if start fails and try again.
Defaults to false.
      --disable-driver-mounts=false: 停用由管理程序提供的文件系統(tǒng)裝載
      --disk-size='20000mb': 分配給 minikube
虛擬機(jī)的磁盤大醒摇(格式:<數(shù)字>[<單位>],其中單位 = b铲球、k挺庞、m 或 g)。
      --dns-domain='cluster.local': The cluster dns domain name used in the Kubernetes cluster
      --dns-proxy=false: 為 NAT DNS 請求啟用代理(僅限 virtualbox 驅(qū)動程序)
      --docker-env=[]: 傳遞給 Docker 守護(hù)進(jìn)程的環(huán)境變量稼病。(格式:鍵值對)
      --docker-opt=[]: 指定要傳遞給 Docker
守護(hù)進(jìn)程的任意標(biāo)志选侨。(格式:key=value)
      --download-only=false: 如果為 true掖鱼,僅會下載和緩存文件以備后用 -
不會安裝或啟動任何項(xiàng)。
      --driver='': Driver is one of: virtualbox, parallels, vmwarefusion, hyperkit, vmware, docker,
ssh (defaults to auto-detect)
      --dry-run=false: dry-run mode. Validates configuration, but does not mutate system state
      --embed-certs=false: if true, will embed the certs in kubeconfig.
      --enable-default-cni=false: DEPRECATED: Replaced by --cni=bridge
      --extra-config=: A set of key=value pairs that describe configuration that may be passed to
different components.
        The key should be '.' separated, and the first part before the dot is the component to apply the
configuration to.
        Valid components are: kubelet, kubeadm, apiserver, controller-manager, etcd, proxy, scheduler
        Valid kubeadm parameters: ignore-preflight-errors, dry-run, kubeconfig, kubeconfig-dir, node-name,
cri-socket, experimental-upload-certs, certificate-key, rootfs, skip-phases, pod-network-cidr
      --feature-gates='': 一組用于描述 alpha
版功能/實(shí)驗(yàn)性功能的功能限制的鍵值對援制。
      --force=false: 強(qiáng)制 minikube 執(zhí)行可能有風(fēng)險(xiǎn)的操作
      --force-systemd=false: If set, force the container runtime to use sytemd as cgroup manager.
Defaults to false.
      --host-dns-resolver=true: 為 NAT DNS 請求啟用主機(jī)解析器(僅限 virtualbox
驅(qū)動程序)
      --host-only-cidr='192.168.99.1/24': 需要用于 minikube 虛擬機(jī)的 CIDR(僅限
virtualbox 驅(qū)動程序)
      --host-only-nic-type='virtio': 網(wǎng)卡類型僅用于主機(jī)網(wǎng)絡(luò)戏挡。Am79C970A, Am79C973,
82540EM, 82543GC, 82545EM 之一,或 virtio(僅限 VirtualBox 驅(qū)動程序)
      --hyperkit-vpnkit-sock='': 用于網(wǎng)絡(luò)連接的 VPNKit
套接字的位置晨仑。如果為空褐墅,則停用 Hyperkit VPNKitSock;如果為“auto”洪己,則將
Docker 用于 Mac VPNKit 連接妥凳;否則使用指定的 VSock(僅限 hyperkit 驅(qū)動程序)
      --hyperkit-vsock-ports=[]: 應(yīng)在主機(jī)上公開為套接字的訪客 VSock
端口列表(僅限 hyperkit 驅(qū)動程序)
      --hyperv-external-adapter='': External Adapter on which external switch will be created if no
external switch is found. (hyperv driver only)
      --hyperv-use-external-switch=false: Whether to use external switch over Default Switch if
virtual switch not explicitly specified. (hyperv driver only)
      --hyperv-virtual-switch='': hyperv 虛擬交換機(jī)名稱。默認(rèn)為找到的第一個(gè) hyperv
虛擬交換機(jī)答捕。(僅限 hyperv 驅(qū)動程序)
      --image-mirror-country='cn':
需要使用的鏡像鏡像的國家/地區(qū)代碼逝钥。留空以使用全球代碼。對于中國大陸用戶噪珊,請將其設(shè)置為
cn晌缘。
      --image-repository='': Alternative image repository to pull docker images from. This can be
used when you have limited access to gcr.io. Set it to "auto" to let minikube decide one for you.
For Chinese mainland users, you may use local gcr.io mirrors such as
registry.cn-hangzhou.aliyuncs.com/google_containers
      --insecure-registry=[]: Insecure Docker registries to pass to the Docker daemon.  The default
service CIDR range will automatically be added.
      --install-addons=true: If set, install addons. Defaults to true.
      --interactive=true: 允許用戶提示以獲取更多信息
      --iso-url=[https://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/iso/minikube-v1.18.0.iso]:
Locations to fetch the minikube ISO from.
      --keep-context=false: 這將保留現(xiàn)有 kubectl 上下文并創(chuàng)建 minikube 上下文。
      --kubernetes-version='': The Kubernetes version that the minikube VM will use (ex: v1.2.3,
'stable' for v1.20.2, 'latest' for v1.20.5-rc.0). Defaults to 'stable'.
      --kvm-gpu=false: 在 minikube 中啟用實(shí)驗(yàn)性 NVIDIA GPU 支持
      --kvm-hidden=false: 向 minikube 中的訪客隱藏管理程序簽名(僅限 kvm2
驅(qū)動程序)
      --kvm-network='default': KVM 網(wǎng)絡(luò)名稱痢站。(僅限 kvm2 驅(qū)動程序)
      --kvm-numa-count=1: Simulate numa node count in minikube, supported numa node count range is
1-8 (kvm2 driver only)
      --kvm-qemu-uri='qemu:///system': KVM QEMU 連接 URI磷箕。(僅限 kvm2 驅(qū)動程序)
      --memory='': Amount of RAM to allocate to Kubernetes (format: <number>[<unit>], where unit =
b, k, m or g).
      --mount=false: This will start the mount daemon and automatically mount files into minikube.
      --mount-string='/Users:/minikube-host': The argument to pass the minikube mount command on
start.
      --namespace='default': The named space to activate after start
      --nat-nic-type='virtio': NIC Type used for nat network. One of Am79C970A, Am79C973, 82540EM,
82543GC, 82545EM, or virtio (virtualbox driver only)
      --native-ssh=true: Use native Golang SSH client (default true). Set to 'false' to use the
command line 'ssh' command when accessing the docker machine. Useful for the machine drivers when
they will not start with 'Waiting for SSH'.
      --network='': network to run minikube with. Only available with the docker/podman drivers. If
left empty, minikube will create a new network.
      --network-plugin='': Kubelet network plug-in to use (default: auto)
      --nfs-share=[]: 通過 NFS 裝載與訪客共享的本地文件夾(僅限 hyperkit
驅(qū)動程序)
      --nfs-shares-root='/nfsshares': NFS 共享的根目錄位置,默認(rèn)為 /nfsshares(僅限
hyperkit 驅(qū)動程序)
      --no-vtx-check=false: 禁用在啟動虛擬機(jī)之前檢查硬件虛擬化的可用性(僅限
virtualbox 驅(qū)動程序)
  -n, --nodes=1: The number of nodes to spin up. Defaults to 1.
  -o, --output='text': Format to print stdout in. Options include: [text,json]
      --ports=[]: List of ports that should be exposed (docker and podman driver only)
      --preload=true: If set, download tarball of preloaded images if available to improve start
time. Defaults to true.
      --registry-mirror=[]: 傳遞給 Docker 守護(hù)進(jìn)程的注冊表鏡像
      --service-cluster-ip-range='10.96.0.0/12': 需要用于服務(wù)集群 IP 的 CIDR阵难。
      --ssh-ip-address='': IP address (ssh driver only)
      --ssh-key='': SSH key (ssh driver only)
      --ssh-port=22: SSH port (ssh driver only)
      --ssh-user='root': SSH user (ssh driver only)
      --trace='': Send trace events. Options include: [gcp]
      --uuid='': 提供虛擬機(jī) UUID 以恢復(fù) MAC 地址(僅限 hyperkit 驅(qū)動程序)
      --vm=false: Filter to use only VM Drivers
      --vm-driver='': DEPRECATED, use `driver` instead.
      --wait=[apiserver,system_pods]: comma separated list of Kubernetes components to verify and
wait for after starting a cluster. defaults to "apiserver,system_pods", available options:
"apiserver,system_pods,default_sa,apps_running,node_ready,kubelet" . other acceptable values are
'all' or 'none', 'true' and 'false'
      --wait-timeout=6m0s: max time to wait per Kubernetes or host to be healthy.

Usage:
  minikube start [flags] [options]

Use "minikube options" for a list of global command-line options (applies to all commands).


參考文檔:

https://kubernetes.io/docs/tasks/tools/

https://minikube.sigs.k8s.io/docs/start/

https://developer.aliyun.com/article/221687

https://blog.csdn.net/fly_leopard/article/details/108790217

https://www.cnblogs.com/yjmyzz/p/install-k8s-on-mac-using-minikube.html

https://blog.csdn.net/qq_38340601/article/details/108437017)

https://www.cnblogs.com/zhengchunyuan/p/12598210.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末岳枷,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子呜叫,更是在濱河造成了極大的恐慌空繁,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件朱庆,死亡現(xiàn)場離奇詭異盛泡,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)娱颊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門傲诵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人箱硕,你說我怎么就攤上這事拴竹。” “怎么了剧罩?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵栓拜,是天一觀的道長。 經(jīng)常有香客問我,道長幕与,這世上最難降的妖魔是什么挑势? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮纽门,結(jié)果婚禮上薛耻,老公的妹妹穿的比我還像新娘。我一直安慰自己赏陵,他們只是感情好饼齿,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蝙搔,像睡著了一般缕溉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上吃型,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天证鸥,我揣著相機(jī)與錄音,去河邊找鬼勤晚。 笑死枉层,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的赐写。 我是一名探鬼主播鸟蜡,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼挺邀!你這毒婦竟也來了揉忘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤端铛,失蹤者是張志新(化名)和其女友劉穎泣矛,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體禾蚕,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡您朽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了换淆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片虚倒。...
    茶點(diǎn)故事閱讀 38,018評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖产舞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情菠剩,我是刑警寧澤易猫,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站具壮,受9級特大地震影響准颓,放射性物質(zhì)發(fā)生泄漏哈蝇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一攘已、第九天 我趴在偏房一處隱蔽的房頂上張望炮赦。 院中可真熱鬧,春花似錦样勃、人聲如沸吠勘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽剧防。三九已至,卻和暖如春辫樱,著一層夾襖步出監(jiān)牢的瞬間峭拘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工狮暑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鸡挠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓搬男,卻偏偏與公主長得像拣展,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子止后,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容