學(xué)習(xí)日志 21-12-15 k8s入門 擴(kuò)容等
# pod運(yùn)維
## proxy到pod的服務(wù)
- pod 的名字格式 deployment名 + ID
- app標(biāo)簽 - deployment名?
- pod自己的ip 172.17.0.2
- 使用如下方式直接訪問pod的實(shí)際應(yīng)用服務(wù)(80端口)
? ```
? http://localhost:8001/api/v1/namespaces/default/pods/$POD_NAME/proxy/
? ```
? - 參數(shù)解釋
? - api v1 ?
? - namespaces default
? - pods $POD_NAME
? - /proxy 表示代理到pod上的端口
## 看日志
- 看日志 `kubectl logs $POD_NAME`
? - 日志是具體pod哪個目錄的日志 這個是看的應(yīng)用的標(biāo)準(zhǔn)輸出
? - pod默認(rèn)啟動/監(jiān)聽的是哪個進(jìn)程?
## 登錄pod
- bash這個pod
? ```
? .\kubectl.exe exec -ti kubernetes-bootcamp-565f8cdbd6-mh4xt -- bash
? ```
## Q&A
- Q: pod默認(rèn)啟動/監(jiān)聽的是哪個進(jìn)程
- A: ??
- Q: kubectl proxy 形式如何訪問pod的非標(biāo)端口8080
- A: 查API文檔
? - https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/
? - ??
# Service
## 創(chuàng)建service
- 查看當(dāng)前service `kubectl get services`
? - 已有一個minikube創(chuàng)建的默認(rèn)service叫kubernetes 不用管它
- 創(chuàng)建新的
? - `kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080`
? - 操作 - expose
? - 資源類型 - 無
? - 資源名 - deployment/kubernetes-bootcamp
? - 細(xì)節(jié)參數(shù) - --type="NodePort" --port 8080
- 再次 get services 查看結(jié)果
- 查看service細(xì)節(jié)
? - `kubectl describe services/kubernetes-bootcamp`
? - 操作 - describe
? - 資源類型 - 無
? - 資源名 - services/kubernetes-bootcamp
? - expose 用的是 deployment/{部署名}
? - 創(chuàng)建好service后, 做describe時 用的是 services/{部署名}
? - deployment和services 之間 是不是 1:1 的關(guān)系?
? ? - 不一定, 但label是一樣的, 通過label一樣可以查service外部端口
? ? - 比如同一個pod, 可以暴露一個443服務(wù)端口 + 一個java debug調(diào)試端口
? - 目的是找service的外部端口, 我們指定了內(nèi)部端口是8080
? - 但是外部端口是隨機(jī)的
? - 根據(jù) NodePort 一行 (我們這個服務(wù)的類型就是NodePort)
? - 這個就是服務(wù)的外部暴露端口
? - IP用的是minikube的IP (不是kubectl proxy的localhost)
- service用minikube的ip, 但kubectl proxy用localhost 原因?
? - 因?yàn)閟ervice最終是要開發(fā)給用戶的, 它是公開的
? - 但是kubectl proxy是管理面, 是管理員自己用的, 是不公開的
? - 所以無法用minikube ip去訪問管理面, 必須用kubectl proxy
? - kubectl proxy用了 .kube 下的配置, 這些配置里包括一個密鑰
? - 這個密鑰是最終外部用戶不知道的
? - kubectl proxy只能從本機(jī)訪問
## labels
- 查看 deployment
? - `kubectl describe deployment`
? - 得到label是 `app=kubernetes-bootcamp`
- 根據(jù)label查pods (根據(jù)deployment查pods)
? - `kubectl get pods -l app=kubernetes-bootcamp`
- 根據(jù)label查service (根據(jù)deployment查service)
? - `kubectl get services -l app=kubernetes-bootcamp`
- 給pod打個新的label
? - `kubectl label pods $POD_NAME version=v1`
? - 根據(jù)新label `version=v1` 查pods
? - `kubectl get pods -l version=v1`
## 刪除service
- 刪除指令
? - `kubectl delete service -l app=kubernetes-bootcamp`
? - 根據(jù)label刪除
# 擴(kuò)容
## 檢查 replicaset(rs)
- 命令
? `kubectl get rs`
## 擴(kuò)容
- 命令
? - `kubectl scale deployments/kubernetes-bootcamp --replicas=4`
? - 操作 - scale
? - 資源類型 - 按第二類在資源名字段體現(xiàn)
? - 資源名 - deployments/{部署名}
? - 細(xì)節(jié)參數(shù) - `--replicas=4`
- 檢查擴(kuò)容結(jié)果
? - `kubectl get deployments`
? - `kubectl get pods -o wide`
? - `kubectl describe deployments/kubernetes-bootcamp`
? ? - 有events紀(jì)錄
- 總結(jié)
? - 擴(kuò)容是針對deployment的
? - 可以從pods級看到擴(kuò)容的結(jié)果
? - pod的命名是 {部署名}-{rs名}-{pod名}
? - 其中rs名和pod名是系統(tǒng)隨機(jī)生成
? - 擴(kuò)容時, 目前看pods都屬于同一個rs
? - rs 和 deployment的區(qū)別是
? ? - 見下 rs跟著鏡像版本走 當(dāng)deployment的鏡像更新后 會產(chǎn)生新的rs
? - describe和get的參數(shù)差不多? describe給詳情信息
## 負(fù)載均衡?
- 檢查service
? - `kubectl describe services/kubernetes-bootcamp`
- 使用service訪問
? - `curl http://172.25.123.232:31092`
? - 其中31092是external port(nodeport)
- 實(shí)際訪問發(fā)現(xiàn)負(fù)載有sticky現(xiàn)象?? 原因?
## 縮容
- 命令 和擴(kuò)容一致 減少replicaset的數(shù)量
? - `kubectl scale deployments/kubernetes-bootcamp --replicas=2`
# 發(fā)布更新鏡像到deployment
## 檢查當(dāng)前deployment狀態(tài)
- 現(xiàn)有2, 要求4, 擴(kuò)容一下
## 更新
- 命令
? - `kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2`
? - 操作 - set
? - 資源類型 - image
? - 資源名 - deployments/kubernetes-bootcamp
? - 細(xì)節(jié)參數(shù) - `kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2`
? ? - 等號前面是container的名字, 需要通過describe pods確認(rèn)
? ? - 新版container名字是有隨機(jī)token后綴的
- 這個鏡像庫能否訪問?
? - 參考 配置k8s使用私有鏡像庫
? - https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
? - 直接瀏覽器訪問一下 jocatalin.com 能通
? ? - 鏡像庫省略.com 默認(rèn)應(yīng)該就是 .com
- 更新結(jié)果 通過 get pods確認(rèn)
? - pod第二段名字 rs 名字被改了
? - 可見 rs是跟著鏡像版本走的
? - 解釋了同一個deployment下有不同的rs的意義
- 看一下service的負(fù)載均衡
? - `kubectl describe services/kubernetes-bootcamp`
- 查看rollout status?
? - `kubectl rollout status deployments/kubernetes-bootcamp`
? - 當(dāng)前狀態(tài)是 successfully rolled out
### Q&A
- Q: 報(bào)錯 container不存在
- A: 通過describe pods查看正確的container名字 比如
? - google-samples-kubernetes-bootcamp-7jdm5
? - `kubectl set image deployments/kubernetes-bootcamp google-samples-kubernetes-bootcamp-7jdm5=jocatalin/kubernetes-bootcamp:v2`
## 回滾
- 創(chuàng)建一個錯誤的更新?
? - `kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=gcr.io/google-samples/kubernetes-bootcamp:v10`
? - 注意替換container名字
? - 這個目標(biāo)鏡像是錯的
? ? - 沒有v10
? ? - 網(wǎng)也不通
? - 該命令立即返回 看不出成功/失敗
? ? - 異步處理 k8s設(shè)計(jì)特點(diǎn)
- 校驗(yàn)剛才錯誤的結(jié)果
? - `kubectl get deployments`
? - `kubectl get pods`
? - `kubectl describe pods`
? - `kubectl rollout status deployments/kubernetes-bootcamp`
? ? - 這個指令類似 tail -f 等著刷新
- 回滾
? - `kubectl rollout undo deployments/kubernetes-bootcamp`
? - 再次檢查 rollout status 結(jié)果 successfully rolled out
? - 和成功更新一樣 繼續(xù)查pods
? - `kubectl describe pods`
# Learn Kubernetes Basics 總結(jié)
- 6個小節(jié)都講完了
# Configuration 學(xué)習(xí)
- 缺少搭建k8s服務(wù)的基本知識, 先暫緩該主題
# 從零開始搭建k8s上的spring boot web服務(wù)
- TODO