前言
最近在研究k8s,就來寫一個關(guān)于k8s快速上手,并記錄采坑的點(diǎn)。
需要的前置知識點(diǎn):docker、k8s的一些基本概念,下面這個可能對你有幫助。
https://juejin.im/post/5d1b2a656fb9a07edc0b7058
什么是k8s
我們知道,我們可以將項(xiàng)目制作成docker鏡像,然后利用docker去部署我們的項(xiàng)目,這樣可以解決很多服務(wù)器環(huán)境所帶來的問題;
但是容器多了,容器與容器之間就需要訪問,之間就需要網(wǎng)絡(luò)配置等等,從而就有了docker-compose;
但是當(dāng)我們的服務(wù)進(jìn)行升級,或者服務(wù)需要進(jìn)行調(diào)度,擴(kuò)容等等,這個時候就需要一個大管家來管所有的東西;
這個大管家就是 - Kubernetes
初學(xué)會遇到的問題
因?yàn)閗8s的東西太多了,所以學(xué)習(xí)成本現(xiàn)在越來越高,好在k8s已經(jīng)很多教程。我說一下現(xiàn)在學(xué)的時候肯定會遇到的大問題:
- 國內(nèi)的問題(國內(nèi)環(huán)境很多鏡像拉不到)
- 本地搭建環(huán)境(原來搭建k8s需要一些服務(wù)器)
- 電腦環(huán)境的問題(windows和mac都有坑點(diǎn))
最小實(shí)現(xiàn)
現(xiàn)在我們就來在本機(jī)實(shí)現(xiàn)一個最小的k8s的實(shí)現(xiàn),給出一個hello-world
k8s提供了minikube,這個東西可以讓你本機(jī)一臺機(jī)器就可以搭建起這個環(huán)境。擁有和線上一樣的命令行操作和模式,但是不需要你再去創(chuàng)建很多虛擬機(jī)來搞事情了。超級方便也。
https://minikube.sigs.k8s.io/
我們就利用這個來實(shí)現(xiàn),下面來說說步驟:
我的本機(jī)環(huán)境:
- macOS
- minikube version: v1.5.2
- Docker version 18.03.1-ce
安裝環(huán)境
大致步驟:https://minikube.sigs.k8s.io/docs/start/macos/
brew install minikubebrew install docker-machine-driver-vmwareminikube start --vm-driver=vmware --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers
成功之后:
-
minikube status查看minikube的狀態(tài) -
minikube ip查看minikube的ip -
minikube dashboard打開dashboard展示k8s的狀態(tài)
安裝坑點(diǎn)
- HyperKit最新版本可能存在問題,所以我使用VMware Fusion實(shí)現(xiàn)虛擬化的依賴
- 國內(nèi)
k8s.gcr.io的相關(guān)鏡像國內(nèi)拉取不到,使用mirrorgooglecontainers也無法拉取到,所以使用阿里云的倉庫 https://github.com/kubernetes/minikube/issues/3860 - 如果之前已經(jīng)使用過
minikube start命令,建議先minikube delete,并刪除rm -rf ~/.minikube/,然后重新start
進(jìn)行部署
首先描述一下部署要做的事情:linkinstar/mini-go:v1.0 是我已經(jīng)上傳到 docker-hub 里面的一個已經(jīng)做好的最簡單的項(xiàng)目,會暴露一個8080端口的web服務(wù);
最終的目標(biāo),在k8s創(chuàng)建一個pod,pod中運(yùn)行一個我們的容器,最終我們在外部可以訪問到這個服務(wù)
首先創(chuàng)建兩個文件
# deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mini-go
labels:
app: mini-go
spec:
replicas: 1
selector:
matchLabels:
app: mini-go
template:
metadata:
labels:
app: mini-go
spec:
containers:
- name: mini-go
image: linkinstar/mini-go:v1.0
ports:
- containerPort: 8080
# service.yaml
apiVersion: v1
kind: Service
metadata:
name: mini-go-service
spec:
selector:
app: mini-go
type: NodePort
ports:
- protocol: TCP
port: 80
targetPort: 8080
nodePort: 30008
執(zhí)行
- kubectl create -f service.yaml
- kubectl create -f deploy.yaml
查看
執(zhí)行成功可以再dashboard中查看執(zhí)行狀態(tài)


最終訪問地址查看到服務(wù)是否正常:http://192.168.231.146:30008/
其中的ip是通過 minikube ip 命令查看的
服務(wù)操作
水平伸縮
在現(xiàn)實(shí)的業(yè)務(wù)環(huán)境中,當(dāng)用戶的訪問增多,我們需要擴(kuò)展我們的應(yīng)用,也就是水平的去多部署幾個容器,有了k8s之后這件事就變得非常的容易了。
- 修改 deploy.yaml 文件中的 replicas: 2 改成2個
- 使用命令:
kubectl apply -f deploy.yaml使配置生效
然后我們就可以看到,原來的一個pod變成了兩個,而k8s會將我們的請求負(fù)載均衡到每個pod中。整個過程可以說是非常的優(yōu)雅了。

同樣的,當(dāng)我們需要減少服務(wù)的數(shù)量時也是相同的道理
版本升級
對于應(yīng)用的版本升級也是同樣的道理
- 修改 deploy.yaml 文件中的 image: linkinstar/mini-go:v2.0 改成2.0
- 使用命令:
kubectl apply -f deploy.yaml使配置生效
版本回退
當(dāng)我們發(fā)現(xiàn)發(fā)布的服務(wù)問題,想要進(jìn)行版本回退的時候,就可以使用
kubectl rollout undo deployments/mini-go
進(jìn)行版本回退,下面是版本回退過程中

讓minikube的dashboard能外網(wǎng)訪問
當(dāng)我們使用minikube搭建一個k8s的環(huán)境時,如何使用的時候服務(wù)器并不是使用本機(jī)進(jìn)行搭建,那么會遇到dashboard頁面沒有辦法被外部訪問的問題。解決方式如下:
啟動
首先使用minikube dashboard命令啟動
# minikube dashboard
?? Verifying dashboard health ...
?? Launching proxy ...
?? Verifying proxy health ...
http://127.0.0.1:42968/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/
然后記住最下面的訪問地址:http://127.0.0.1:42968/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/
設(shè)置代理
再打開一個sh窗口
使用 kubectl proxy --port=[需要暴露的端口號] --address='[服務(wù)器IP]' --accept-hosts='^[外部訪問服務(wù)器的IP]$' 添加k8s集群對外的訪問代理。
# kubectl proxy --port=8887 --address='172.31.251.45' --accept-hosts='^.*'
這里的port是你后面通過外網(wǎng)訪問的端口,如果使用云服務(wù)器記得設(shè)置防火墻規(guī)則,其中的address為服務(wù)器ip地址可以使用minikube ip命令獲得,我這里允許的是任意機(jī)器
瀏覽器訪問
- 其中的ip為服務(wù)器的ip
- 端口為代理設(shè)置的端口
- 剩下的地址為dashboard啟動時顯示的地址
如果上述測試沒有問題使用 nohup 后臺啟動就可以了
總結(jié)
- 使用minikube可以快速讓新手感受到k8s到底是如何使用的
- 環(huán)境配置過程中會有很多問題,需要你耐心解決
- k8s在服務(wù)編排上面除了以上提到的用法以外還有很多牛逼的功能等著你去發(fā)現(xiàn)
- 學(xué)習(xí)過程中需要保持一個原則,先用著看看 -> 搞清楚架構(gòu) -> 嘗試各種功能 -> 學(xué)習(xí)各個模塊的實(shí)現(xiàn) -> 最終實(shí)踐