1. Kubernetes 簡介
k8s即Kubernetes。
其為google開發(fā)來被用于容器管理的開源應(yīng)用程序,可幫助創(chuàng)建和管理應(yīng)用程序的容器化。
用一個的例子來描述:"當(dāng)虛擬化容器Docker有太多要管理的時候,手動管理就會很麻煩,于是我們便可以通過k8s來簡化我們的管理"
2. 安裝 Kubernetes 集群
2.1 裸機搭建
https://k8s.easydoc.net/docs/dRiQjyTY/28366845/6GiNOzyZ/nd7yOvdY#nav_3
2.1.1 憑證問題
用 kubeadm 初始化集群(僅在主節(jié)點跑),
# 初始化集群控制臺 Control plane
# 失敗了可以用 kubeadm reset 重置
kubeadm init --image-repository=registry.aliyuncs.com/google_containers
# 記得把 kubeadm join xxx 保存起來
# 忘記了重新獲?。簁ubeadm token create --print-join-command
# 復(fù)制授權(quán)文件,以便 kubectl 可以有權(quán)限訪問集群
# 如果你其他節(jié)點需要訪問集群,需要從主節(jié)點復(fù)制這個文件過去其他節(jié)點
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
# 在其他機器上創(chuàng)建 ~/.kube/config 文件也能通過 kubectl 訪問到集群
2.1.2 踩坑
問題1:初始化集群控制臺 Control plane
[root@master ~]# kubeadm init --image-repository=registry.aliyuncs.com/google_containers
I1102 21:38:18.266955 2675 version.go:255] remote version is much newer: v1.25.3; falling back to: stable-1.22
[init] Using Kubernetes version: v1.22.15
[preflight] Running pre-flight checks
error execution phase preflight: [preflight] Some fatal errors occurred:
[ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1
[ERROR Swap]: running with swap on is not supported. Please disable swap
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
To see the stack trace of this error execute with --v=5 or higher
[root@master ~]#
解決:
[root@master ~]# echo "1" >/proc/sys/net/bridge/bridge-nf-call-iptables
From:https://blog.csdn.net/qq_30019911/article/details/111415970
問題2:把工作節(jié)點加入集群(只在工作節(jié)點跑)
關(guān)閉 swap
#臨時關(guān)閉
swapoff -a
# 永久關(guān)閉
vi /etc/fstab
注釋以下代碼
/dev/mapper/centos-swap swap ...
2.2 把工作節(jié)點接入集群命令
kubeadm join 192.168.3.128:6443 --token i3k3bg.7zveiqaweidk9ene \
--discovery-token-ca-cert-hash sha256:e7f23aa05741073a57e4bcd2e0a43d717fc3d25778348b930c786f67c66de4eb
2.3 minikube 模擬環(huán)境搭建
只是一個 K8S 集群模擬器,只有一個節(jié)點的集群,只為測試用,master 和 worker 都在一起。
2.3.1 安裝(在hk vps安裝成功)
下載地址:https://minikube.sigs.k8s.io/docs/start/
Linux安裝kubernetes(minikube):https://blog.csdn.net/weixin_44379605/article/details/123240857
minikube和kubectl安裝:https://blog.csdn.net/weixin_44379605/article/details/123124172?spm=1001.2014.3001.5502
啟動minikube。
minikube start --force
安裝好kubectl后,可以正常訪問minikube。
3. 部署應(yīng)用到集群
3.1 部署應(yīng)用 YAML 文件
3.1.1 直接命令運行創(chuàng)建pod
kubectl run testapp --image=ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v1
kubectl get pods
3.1.2 yaml創(chuàng)建pod
apiVersion: v1
kind: Pod
metadata:
name: test-pod
spec:
# 定義容器,可以多個
containers:
- name: test-k8s # 容器名字
image: ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v1 # 鏡像
---
kubectl apply -f podcreate.yaml
kubectl get pod
3.1.3 Deployment(批量創(chuàng)建pod)
批量創(chuàng)建2個pod。
apiVersion: apps/v1
kind: Deployment
metadata:
# 部署名字
name: test-k8s
spec:
replicas: 2
# 用來查找關(guān)聯(lián)的 Pod,所有標(biāo)簽都匹配才行
selector:
matchLabels:
app: test-k8s ### 標(biāo)簽
# 定義 Pod 相關(guān)數(shù)據(jù)
template:
metadata:
labels:
app: test-k8s
spec:
# 定義容器,可以多個
containers:
- name: test-k8s # 容器名字
image: ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v1 # 鏡像
查看部署:
kubectl get deployment
查看節(jié)點詳細(xì)信息:
kubectl get pod -o wide
Deployment 通過 label 關(guān)聯(lián)起來 Pods,這些pod可以屬于不同節(jié)點。
★3.2 常用命令
- 查看pod狀態(tài)、詳細(xì)數(shù)據(jù):
kubectl describe pod podname
Events(事件),這個比較重要,如圖,創(chuàng)建pod,拉取鏡像,創(chuàng)建鏡像。
- 查看pod運行日志:
kubectl logs podname
kubectl logs podname -f //持續(xù)查看某個pod日志。
- 進(jìn)入pod容器交互式:
kubectl exec -it podname -- bash //進(jìn)入Pod的第1 個容器
kubectl exec -it podname -c containername -- bash //如果一個pod有多個容器,使用-c指定要進(jìn)入的容器名。
- 查看指定pod中有哪些容器:
kubectl get pods podname -o jsonpath={.spec.containers[*].name} -n namespace
kubectl get pods kube-scheduler-superboy-virtual-machine -o jsonpath={.spec.containers[*].name} -n kube-system
- 增加副本pod數(shù)量:
方式一:
直接在yaml配置文件中修改replicas字段。
spec:
replicas: 2
方式二(命令創(chuàng)建):
kubectl scale deployment test-k8s --replicas=5
注意:
如果之前有2個,修改為5個后,會新增3個pod,不是5個。
- 減少副本pod數(shù)量:
kubectl scale deployment test-k8s --replicas=2
- 把集群內(nèi)端口映射到節(jié)點:
kubectl port-forward pod-name 8090:8080 //外部端口:內(nèi)部端口
看運行日志(每訪問一次web會產(chǎn)生一條日志):
- 刪除部署:
kubectl delete deployment test-k8s(部署名字)
- 在同時創(chuàng)建多個副本的情況下,多個pod會隨機跑到多個節(jié)點,master節(jié)點不跑pod。
- 歷史回退
更換錯誤鏡像版本,重新部署鏡像,會先創(chuàng)建新的鏡像,再刪除老鏡像
重新部署。
查看歷史。
kubectl rollout history deployment test-k8s
模擬場景這里新版本出錯了,需要回退上一個版本。
kubectl rollout undo deployment test-k8s(部署名字)
回退到指定版本:
這里可以先查看有哪些版本[ kubectl rollout history deployment test-k8s ],再回退。
kubectl rollout undo deployment test-k8s --to-revision=2
- 查看全部
列出所有信息。
kubectl get all
- 重新部署
刪掉老的,創(chuàng)建新的。
kubectl rollout restart deployment test-k8s
- 命令修改鏡像,–record 表示把這個命令記錄到操作歷史中
kubectl set image deployment test-k8s test-k8s=ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v2-with-error --record
- 把deployment輸出到一個文件信息
kubectl get deployment test-k8s -o yaml >> app2.yaml
也可以用json格式顯示(-o json)。
- 刪除全部pod、deployment。
kubectl delete all --all
- 將pod指定到某個節(jié)點運行
將 Pod 指定到某個節(jié)點運行:nodeselector
限定 CPU、內(nèi)存總量:文檔
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
env: test
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
nodeSelector:
disktype: ssd ###這里指定節(jié)點名字。
- 其他命令
# 暫停運行,暫停后,對 deployment 的修改不會立刻生效,恢復(fù)后才應(yīng)用設(shè)置
kubectl rollout pause deployment test-k8s
# 恢復(fù)
kubectl rollout resume deployment test-k8s
3.3 工作負(fù)載分類
- Deployment
適合無狀態(tài)應(yīng)用,所有pod等價,可替代。 - StatefulSet
有狀態(tài)的應(yīng)用,適合數(shù)據(jù)庫這種類型。 - DaemonSet
在每個節(jié)點上跑一個 Pod,可以用來做節(jié)點監(jiān)控、節(jié)點日志收集等。 - Job & CronJob
Job 用來表達(dá)的是一次性的任務(wù),而 CronJob 會根據(jù)其時間規(guī)劃反復(fù)運行。
3.4 現(xiàn)存問題
- 每次只能訪問一個 pod,沒有負(fù)載均衡自動轉(zhuǎn)發(fā)到不同 pod
- 訪問還需要端口轉(zhuǎn)發(fā)
- Pod 重創(chuàng)后 IP 變了,名字也變了
4. Service
4.1 特性
- Service 通過 label 關(guān)聯(lián)對應(yīng)的 Pod
- Servcie 生命周期不跟 Pod 綁定,不會因為 Pod 重創(chuàng)改變 IP
- 提供了負(fù)載均衡功能,自動轉(zhuǎn)發(fā)流量到不同 Pod
- 可對集群外部提供訪問端口
- 集群內(nèi)部可通過服務(wù)名字訪問
4.2 創(chuàng)建Service(ClusterIP 集群內(nèi))
創(chuàng)建一個 Service,通過標(biāo)簽test-k8s跟對應(yīng)的 Pod 關(guān)聯(lián)上。
service.yaml
應(yīng)用配置 kubectl apply -f service.yaml
查看服務(wù) kubectl get svc
- 默認(rèn)ClusterIP 集群內(nèi)(進(jìn)入一個pod訪問)可以訪問:
apiVersion: v1
kind: Service
metadata:
name: test-k8s ## 服務(wù)名字!
spec:
selector:
app: test-k8s ## 標(biāo)簽關(guān)聯(lián)pod
# 默認(rèn)ClusterIP 集群內(nèi)可以訪問,NodePort 節(jié)點可訪問,LoadBalancer 負(fù)載均衡模式(需要負(fù)載均衡器才可用)
type: ClusterIP
ports:
- port: 8080 # 本 Service 的端口
targetPort: 8080 # 容器端口
#nodePort: 31000 # 節(jié)點端口,范圍固定 30000 ~ 32767 ,在集群內(nèi)訪問需要注釋掉此條目。
服務(wù)的默認(rèn)類型是ClusterIP,只能在集群內(nèi)部訪問,我們可以進(jìn)入到 Pod 里面訪問:
kubectl exec -it pod-name -- bash
curl http://test-k8s:8080 //服務(wù)名稱訪問
curl http://10.109.106.61:8080 //服務(wù)IP訪問
如果要在集群外部訪問,可以通過端口轉(zhuǎn)發(fā)實現(xiàn)(只適合臨時測試用):
kubectl port-forward service/test-k8s 8888:8080
4.3 對外暴露服務(wù),NodePort 節(jié)點可訪問
apiVersion: v1
kind: Service
metadata:
name: test-k8s ## 服務(wù)名字!
spec:
selector:
app: test-k8s ## 標(biāo)簽關(guān)聯(lián)pod
# 默認(rèn)ClusterIP 集群內(nèi)可以訪問,NodePort 節(jié)點可訪問,LoadBalancer 負(fù)載均衡模式(需要負(fù)載均衡器才可用)
type: NodePort
ports:
- port: 8080 # 本 Service 的端口
targetPort: 8080 # 容器端口
nodePort: 31000 # 節(jié)點端口,范圍固定 30000 ~ 32767 ,在集群內(nèi)訪問需要注釋掉此條目。
對外暴露到端口31000。
這個對外暴露的端口是暴露在docker里,minikube所在的容器,還存在負(fù)載均衡轉(zhuǎn)發(fā)。
其他:
Loadbalancer 也可以對外提供服務(wù),這需要一個負(fù)載均衡器的支持,因為它需要生成一個新的 IP 對外服務(wù),否則狀態(tài)就一直是 pendding,這個很少用了,后面我們會講更高端的 Ingress 來代替它。
4.4 多端口
多端口時必須配置 name, 文檔。
apiVersion: v1
kind: Service
metadata:
name: test-k8s
spec:
selector:
app: test-k8s
type: NodePort
ports:
- port: 8080 # 本 Service 的端口
name: test-k8s # 必須配置
targetPort: 8080 # 容器端口
nodePort: 31000 # 節(jié)點端口,范圍固定 30000 ~ 32767
- port: 8090
name: test-other
targetPort: 8090
nodePort: 32000
4.5 總結(jié)
ClusterIP
默認(rèn)的,僅在集群內(nèi)可用
NodePort
暴露端口到節(jié)點,提供了集群外部訪問的入口
端口范圍固定 30000 ~ 32767
LoadBalancer
需要負(fù)載均衡器(通常都需要云服務(wù)商提供,裸機可以安裝 METALLB 測試)
會額外生成一個 IP 對外服務(wù)
K8S 支持的負(fù)載均衡器:負(fù)載均衡器。
Headless
適合數(shù)據(jù)庫
clusterIp 設(shè)置為 None 就變成 Headless 了,不會再分配 IP,后面會再講到具體用法:官網(wǎng)文檔。
5. Statefulset
5.1 什么是Statefulset
StatefulSet 是用來管理有狀態(tài)的應(yīng)用,例如數(shù)據(jù)庫。
前面我們部署的應(yīng)用,都是不需要存儲數(shù)據(jù),不需要記住狀態(tài)的,可以隨意擴充副本,每個副本都是一樣的,可替代的。
而像數(shù)據(jù)庫、Redis 這類有狀態(tài)的,則不能隨意擴充副本。
StatefulSet 會固定每個 Pod 的名字
5.2 部署Statefulset類型的Mongodb
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mongodb
spec:
serviceName: mongodb
replicas: 3
selector:
matchLabels:
app: mongodb
template:
metadata:
labels:
app: mongodb
spec:
containers:
- name: mongo
image: mongo:4.4
# IfNotPresent 僅本地沒有鏡像時才遠(yuǎn)程拉,Always 永遠(yuǎn)都是從遠(yuǎn)程拉,Never 永遠(yuǎn)只用本地鏡像,本地沒有則報錯
imagePullPolicy: IfNotPresent
---
apiVersion: v1
kind: Service
metadata:
name: mongodb
spec:
selector:
app: mongodb
type: ClusterIP
# HeadLess
clusterIP: None ###不設(shè)置ip,僅通過服務(wù)名訪問。
ports:
- port: 27017
targetPort: 27017
5.3 StatefulSet 特性
- Service 的 CLUSTER-IP 是空的,Pod 名字也是固定的。
- Pod 創(chuàng)建和銷毀是有序的,創(chuàng)建是順序的,銷毀是逆序的。
- Pod 重建不會改變名字,IP會改變,所以不要用IP直連。
訪問時,如果直接使用 Service 名字連接,會隨機轉(zhuǎn)發(fā)請求
要連接指定 Pod,可以這樣pod-name.service-name
運行一個臨時 Pod 連接數(shù)據(jù)測試下
kubectl run mongodb-client --rm --tty -i --restart='Never' --image docker.io/bitnami/mongodb:4.4.10-debian-10-r20 --command -- bash
mongo --host mongodb-0.mongodb
文章來源:http://www.zghlxwxcb.cn/news/detail-800531.html
6. 參考
視頻地址:https://www.bilibili.com/video/BV1Tg411P7EB/
課件來源:https://k8s.easydoc.net文章來源地址http://www.zghlxwxcb.cn/news/detail-800531.html
到了這里,關(guān)于Kubernetes (K8S) 3 小時快速上手 + 實踐的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!