前言
最近在研究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ò)容等等州丹,這個時(shí)候就需要一個大管家來管所有的東西醋安;
這個大管家就是 - Kubernetes
初學(xué)會遇到的問題
因?yàn)閗8s的東西太多了,所以學(xué)習(xí)成本現(xiàn)在越來越高墓毒,好在k8s已經(jīng)很多教程吓揪。我說一下現(xiàn)在學(xué)的時(shí)候肯定會遇到的大問題:
- 國內(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 minikube
brew install docker-machine-driver-vmware
minikube 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ù)量時(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)行版本回退的時(shí)候鲫骗,就可以使用
kubectl rollout undo deployments/mini-go
進(jìn)行版本回退,下面是版本回退過程中
讓minikube的dashboard能外網(wǎng)訪問
當(dāng)我們使用minikube搭建一個k8s的環(huán)境時(shí)踩晶,如何使用的時(shí)候服務(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啟動時(shí)顯示的地址
如果上述測試沒有問題使用 nohup 后臺啟動就可以了
總結(jié)
- 使用minikube可以快速讓新手感受到k8s到底是如何使用的
- 環(huán)境配置過程中會有很多問題排苍,需要你耐心解決
- k8s在服務(wù)編排上面除了以上提到的用法以外還有很多牛逼的功能等著你去發(fā)現(xiàn)
- 學(xué)習(xí)過程中需要保持一個原則,先用著看看 -> 搞清楚架構(gòu) -> 嘗試各種功能 -> 學(xué)習(xí)各個模塊的實(shí)現(xiàn) -> 最終實(shí)踐