最近在做服務(wù)私有化建設(shè)這塊刀森,對于物理機能輕量化進行容器資源管理和對服務(wù)運維舌胶,k3s還是比較合適的昧识。對于新鮮事物,作為非運維的我還是迫切想解并搞個demo出來嘗嘗鮮焕数。
提示
本文是在沒有K8S的基礎(chǔ)上去了解和使用K3S,很多點都不會講到纱昧,只是通過自己用到的demo來去理解K3S、K3D及K8S堡赔。我會將一些比較好的鏈接貼在恰當處识脆,方便后續(xù)深入了解和使用。
什么是K3S
官網(wǎng):https://k3s.io/
指南:https://rancher.com/docs/k3s/latest/en/
中文版指南:https://docs.rancher.cn/docs/k3s/_index/
K3s 是一個輕量級的 Kubernetes 發(fā)行版加匈,它針對邊緣計算存璃、物聯(lián)網(wǎng)等場景進行了高度優(yōu)化,易于安裝雕拼,全部在不到100MB的二進制文件中;非常適合
- Edge
- IoT
- CI
- Development (用的就是這個)
- ARM
- Embedding K8s
- Situations where a PhD in K8s clusterology is infeasible
可以理解為是K8SLite版啥寇,單詞比K8S一半還少偎球,所以叫K3S
什么是K3D
官網(wǎng):https://k3d.io/v5.3.0/
指南:https://k3d.io/v5.3.0/usage/configfile/
k3d 是一個輕量級的包裝器,用于在 docker 中運行k3s(Rancher Lab 的最小 Kubernetes 發(fā)行版)辑甜。
k3d 使得在 docker 中創(chuàng)建單節(jié)點和多節(jié)點k3s集群變得非常容易衰絮,例如在 Kubernetes 上進行本地開發(fā)。
對于我們研發(fā)人員磷醋,我們不希望花太多精力和時間去搭建和維護K8S猫牡,那么我們使用K3D就能通過類似docker的方式來快速的構(gòu)建K3S集群,所以兩者加起來就相當于一個K8S了邓线。
安裝
我的是mac淌友,直接使用brew安裝,K3D官網(wǎng)首頁有各種系統(tǒng)的安裝方式
brew install k3d
附:brew切換國內(nèi)鏡像
如下代表安裝成功
NodePort和Ingress的示例
到這里可能還是一臉懵逼的,因為涉及的點太多骇陈,也不知道從何下手震庭,那就直接用一個demo來學(xué)習(xí):使用集群部署一個可訪問的服務(wù),并在宿主機可以訪問你雌。
1器联、首先我們要知道使用k3d創(chuàng)建集群后,宿主機、k3d拨拓、k3s是怎樣的關(guān)系肴颊,如下圖
就把k3d理解為“docker”
2、使用k3d創(chuàng)建單節(jié)點集群架構(gòu)
為了方便管理千元,這里使用yaml文件來創(chuàng)建集群苫昌,內(nèi)容如下:
創(chuàng)建一個 server節(jié)點為1,agents節(jié)點為2的集群幸海,且集群的30080端口映射宿主機的8087端口
附:非常詳細的說明
接著我們使用命令k3d cluster create --config cluster.yaml
等待執(zhí)行完成即可。
我們可以使用k3d cluster list
來查看集群的狀態(tài)奥务,也可以通過kubectl get all --all-namespaces
來查看k3s集群中已經(jīng)部署了資源
3物独、區(qū)別
nodeport和ingress分別屬于k8s中供外部訪問的兩種方式,nodeport又是service資源的一種類型氯葬,其中service分為以下幾種類型:
- ClusterIp:默認類型挡篓,自動分配一個僅Cluster內(nèi)部可以訪問的虛擬IP
- NodePort:在ClusterlP基礎(chǔ)上為Service在每臺機器上綁定一個端口,這樣就可以通過<NodeIP>:NodePort 來訪問該服務(wù)
- LoadBalancer:在NodePort的基礎(chǔ)上帚称,借助云廠商創(chuàng)建一個外部負載均衡器官研,并將請求轉(zhuǎn)發(fā)到<NodeIP>:NodePort
- ExternalName:把集群外部的服務(wù)引入到集群內(nèi)部來,在集群內(nèi)部直接使用闯睹。沒有任何類型代理被創(chuàng)建戏羽,這只有kubernetes1.7或更高版本的kube-dns才支持
Ingress 公開了從集群外部到集群內(nèi)服務(wù)的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 資源上定義的規(guī)則控制楼吃。
https://kubernetes.io/zh/docs/concepts/services-networking/ingress/
簡單的理解就是ingress可以使用域名對容器內(nèi)的服務(wù)進行綁定始花,并且ingress controller可以動態(tài)的加載和更新域名與pod之間的映射關(guān)系
附:K8s之NodePort LoadBalancer和Ingress的區(qū)別
這里要多翻翻資料理解一下,剛開始還是比較難理解的孩锡。
4酷宵、NodePod
同樣的,我們使用yaml來編寫deployment和service
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: web
name: web
spec:
replicas: 1
selector:
matchLabels:
app: web
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: web
spec:
containers:
- image: nginx
name: nginx
ports:
- containerPort: 80
resources:
limits:
cpu: 100m
memory: 256Mi
requests:
cpu: 80m
memory: 128Mi
status: {}
重要的解釋一下
- kind:類型躬窜,deployment可以理解應(yīng)用資源浇垦,service為訪問規(guī)則資源,ingress即ingress配置資源
- metadata.name: pod的名稱荣挨,后續(xù)用于service綁定
apiVersion: v1
kind: Service
metadata:
labels:
app: web-service
name: app-service
spec:
ports:
- name:
nodePort: 30080
port: 80
protocol: TCP
targetPort: 80
selector:
app: web
type: NodePort
- spec.selector.app 指定當前service綁定的是哪一個pod
- spec.type 指定當前的service為NodePort類型男韧,默認為ClusterIp
這里有各種port,我畫了個圖幫助理解一下
接著我們使用kubectl apply -f xxx.yaml
分別創(chuàng)建deployment和service
使用kubectl get pods,service -o wide
查看詳細信息
到此我們就可以用宿主機直接訪問localhost:8087了
5垦沉、Ingress
我們需要創(chuàng)建兩組deployment煌抒、service和ingress,并且宿主機的hosts需要配置兩個域名
我們先使用k3d cluster delete mycluster
刪除集群厕倍,再重建一個集群k3d cluster create --config cluster.yaml
deployment的聲明保持不變寡壮,畢竟只是描述應(yīng)用,改變的是service和新增ingress
apiVersion: v1
kind: Service
metadata:
labels:
app: web-service-a
name: app-service-a
spec:
ports:
- name:
port: 80
protocol: TCP
targetPort: 80
selector:
app: web-a
這里的service沒有指定type,因為不需要節(jié)點暴露端口况既,只需要集群內(nèi)訪問ClusterIp
新增ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app-ingress-a
spec:
rules:
- host: localhost # b的內(nèi)容為localhost.k3d.ingress
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: app-service-a # 鏈接的是上面svc的名字
port:
number: 80
重點說明:
- host: 即使用哪一個域名來訪問service
- backend.service.port.number 對應(yīng)的是service的port
注意: 這里要注意一下这溅, ingress默認端口是80,因為所以在整個k3d里棒仍,使用ingress的端口映射如下
所以對應(yīng)的cluster.yaml里的映射也要改為- port: 9001:80
直接用我給的示例運行就行了
.
├── cluster.yaml
├── nginx-a.yaml
├── nginx-b.yaml
├── nginx-ingress-a.yaml
├── nginx-ingress-b.yaml
├── nginx-service-a.yaml
└── nginx-service-b.yaml
分別執(zhí)行a和b
因為用的是同一個鏡像悲靴,我們需要進入a和b的pod中更改nginx默認的html內(nèi)容來區(qū)分
按照同樣的方法莫其,在b的實例中更改
接著需要更改我們的hosts文件乱陡,我用的是mac胳徽,直接在/etc/hosts
更改
127.0.0.1 localhost
127.0.0.1 localhost.k3d.ingress
最后可以訪問驗證了
最后
想快速了解和學(xué)習(xí)某一技術(shù),還是得需要拿示例來學(xué)習(xí),通過以上我可以使用單機快速的來部署kubernetes集群铆铆,并且能編寫yaml腳本去部署應(yīng)用和訪問薄货,后續(xù)還需要繼續(xù)了解kubernetes谅猾,最終能做到熟練使用吧。
示例代碼:https://github.com/vector4wang/spring-boot-quick/tree/master/quick-container/src/main/k3s