K8S相关内容
常用工具:docker linux k8s kubeadm
概念
etcd 數據庫 類似redis?
api server 接口對外提供api 調用 可以命令 kubectl 或者 kube-proxy,能訪問etcd,事件總線
scheduler 調度決策的組件 掌握新的情況,進行決策及分布pod放在哪些node
controller 定時監控 保證實際和預期一樣?
work節點
kubelet 資源管理者 在api server上
container runtime 來管理容器 啟動 關閉容器 收集容器信息 拉鏡像
kube-proxy 管理service的組件 kube-dns 來進行解析域名
K8S對象
1、pod
pod是最小部署單元,一個pod有一個或多個容器組成,pod中容器共享存儲和網絡,在同一臺docker主機上運行
2、service
service一個應用服務抽象,定義了pod邏輯集合和訪問這個pod集合的策略 3
service代理pod集合對外表現是為一個訪問入口,分配一個集群ip地址,來自這個ip的請求將負載均衡轉發后端pod中的容器
service通過Lable Selector選擇一組Pod提供服務。
type里有LoadBalancer ,正常選nodeport,因為loadbalancer是云服務 還有Pod內部ClusterIP
端口:
port:本身端口
targetPort:后臺的端口
nodePort是在本機物理暴露端口 利用labels進行選擇Service內部域名轉發 30000~32767之間
3、Volume
數據卷,共享pod中容器使用的數據
4、Namespace
命名空間將對象邏輯上分配到不同Nameapace,可以是不通的項目、用戶等區分管理,并設定控制策略,從而實現多租戶
命名空間也稱為虛擬集群
5、Lable
標簽用于區分對象(比如pod,service),鍵值對存在,每個對象可以有多個標簽,通過標簽關聯對象。
6、ReplicaSet
下一代Replication Controller。功能就是:確保任何給定時間指定的pod副本數量,副本少了,它會創建,并提供聲明式更新等功能
RC與RS唯一區別就是lable selector支持不同,RS支持新的基于集合的標簽、RC僅支持基于等式的標簽 (RC即將被替代)
7、Deployment
Deployment是一個等高層次的API對象,他管理ReplicaSet和pod,并提供聲明式更新等功能
官方建議使用Deployment管理ReplicaSets,而不是直接使用ReplicaSets,這就意味著可能永遠不需要直接操作ReplicaSet對象
8、StatefulSet(滿足有狀態服務的部署)
StatefulSet適合持久性的應用程序,有唯一的網絡標識符(IP),持久存儲,有序的部署、擴展、刪除和滾動更新
9、DaemonSet
DaemonSet確保所有(或一些)節點運行同一個pod。當節點加入k8s集群中,pod會被調度到改節點上運行,當節點從集群中移除時,DaemonSet的pod會被刪除,刪除DaemonSet會清理它所有創建的pod
daemonset 一個節點只有一個
典型應用場景:
每個節點運行日志收集服務
每個節點運行監控服務
每個中運行網絡插件、存儲插件
10、job
一次性任務,運行完成后pod銷毀,不再重新啟動新容器。還可以任務定時運行
運行一次性容器
容器按照持續運行的時間可分為兩類:
服務類容器
服務類容器通常持續提供服務,需要一直運行,比如 http server,daemon 等。
工作類容器
工作類容器則是一次性任務,比如批處理程序,完成后容器就退出。
Kubernetes 的 Deployment、ReplicaSet 和 DaemonSet 都用于管理服務類容器;對于工作類容器,我們用 Job。
11、configMap
ConfigMap使用場景:
通過環境變量的方式,直接傳遞給pod
通過在pod的命令行下運行的方式(啟動命令中)
作為volume的方式掛載到pod內
12、Secret
一般情況下ConfigMap 是用來存儲一些非安全的配置信息,因為ConfigMap是明文存儲的,面對敏感信息時,我們就需要使用k8s的另一個對象Secret
13、ClusterIP 內部反向代理
在service下nodeport是服務器物理node對外暴露 內部pod之間相互訪問就得用ClusterIP
存儲卷 抽象 Volume :
解決掛載物理硬盤
掛在宿主機硬盤 默認是用hostPath
-存儲解耦PVC 和PV:
解決修改掛載物理硬盤必須發布的問題 動態遷移公有云
persistentvolumeClaim(PVC)持久卷申請
persistentvolume(PV) 持久卷
靜態綁定 Pod->Volume-> PVC->PV->物理存儲器
動態綁定 Pod->Volume-> PVC->StorageClass->Storage Provisioner->物理存儲器
-資源請求 和限額Request/Limit:
CPU Memory 可以用Request來申請大小,用Limit來限制大小
-Java K8S內存配置:
Metrics Server 組件 可以下載后啟動 它會定期抓取metrics HPA也要根據這個自動伸縮 ,替代品
prometheus 普羅米修斯
kubectl top po 或 kubectl top no 來看內存使用情況
內存:
heap memory 堆-> 放對象 垃圾回收這個?
non-heap 類 非堆->類 元數據
other 對象:jvm本身結構
堆_> 最小 最大 最大堆使用量 超過就OOM 初始逐漸向Max
allocated 分free used?
進入容器內?
java --XX:+PrintFlagsFinal -version | grep "UseContainerSupport | InitialRAMPercentage | MaxRAMPercentage | MinRAMPercentage"
UseContainerSupport=true時候 是支持容器的比如openjdk 1.8.0_212
如果K8S參數不設置 Limit內存 ,最大內存值就是 就用所有物理內存乘以 ?MaxRAMPercentage,比如 MaxRAMPercentage是25%,物理內存4G,最大內存就是1G
MaxRAMPercentage=80.0 就是80%
DockerFile 里java -jar 后面的啟動參數可以從K8S傳參進去ENTRYPOINT exec java $JAVA_OPTS -jar /usr/shar/app.jar
然后在yml文件下設置 ?
resources:
? ?request
? ?limit:1000m
env:
? - name:JAVA_OPTS
? ? ?value:" -XX: MaxRAMPercentage=80.0"?
結果最大就是800m
-探針:
http方式都是向容器內發送請求來判斷
就緒探針 readiness probe ?/status 是否啟動后就緒 如果不活,就不向pod發送流量
存活探針 ?liveness probe ?/healthz 是否還活著 如果不活 就殺掉容器
端口轉發:
kubectl port-forward ??
解決: 可以用瀏覽器訪問對應端口進去瀏覽
查看日志:
kubectl logs
輔助治理:
ELK: logtash ?針對 java 收集
EFK:fluentd ?針對Docker 收集
skywalking zipkin ?cat調用鏈監控平臺
分布式后續學習:
serviceMesh
分布式鎖
?
總結
- 上一篇: Java基于redis实现分布式锁(Sp
- 下一篇: 基于redis分布式锁实现的多线程并发程