這篇文章主要介紹“什么是對象模型”,在日常操作中,相信很多人在什么是對象模型問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”什么是對象模型”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比措勤網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式措勤網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋措勤地區(qū)。費(fèi)用合理售后完善,十年實體公司更值得信賴。
k8s可以看做是面向?qū)ο蟮?,每類服?wù)可看做是k8s的一個對象。這些對象由用戶定義yaml,k8s的api負(fù)責(zé)創(chuàng)建。所有對象包含spec(規(guī)范)+status兩類基本信息。
例如:k8s創(chuàng)建pod的api為:https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.17/#pod-v1-core
kubectl 也會將yaml轉(zhuǎn)成json發(fā)送到master節(jié)點。
k8s中常用的對象有pod、deployment、service、statefulSet等,每個對象至少包含3個metadata:namespace、name、uid。
pod
基本調(diào)度單元,特定關(guān)系的一組容器集合,最小的部署集合。
非持久性實體,調(diào)度失敗、自愈等情況會被終止,重建,不建議手動創(chuàng)建Pod,而是通過controller創(chuàng)建pod,如deployment。
Service
pod 重啟之后ip會改變,多個相同服務(wù)的pod需要有discovery+loadbalance 。這一點與“微服務(wù)”中的概念一致。通過label selector 可輕松實現(xiàn)邏輯分組。
service 的聲明周期內(nèi),ip不會改變??赏ㄟ^nodeport 暴露到外部。
有的service不需要ip、有的service 不需要負(fù)載均衡。
Controllers
Replicaset (rs)副本數(shù),用于loadbalance和冗余。(老版本是ReplicationController- rc,算是功能升級,官方推薦使用rs 代替rc)?,F(xiàn)階段非特殊情況如升級pod的操作,也不推薦單獨(dú)使用,
Deployment
使用并管理rs ,算是更高一層的概念,這是現(xiàn)在比較常用的部署app的方式。deployment為pod和rs提供聲明式更新(而非命令式)。支持滾動更新(rollingUpdate),支持回滾操作。
statefulSet(k8s 1.9 GA)
我們自己開發(fā)的應(yīng)用一般都是stateless的,像是redis、zk、kafka、MySQL這類的中間件通常需要使用statefulSet。通常適用于穩(wěn)定的持久存儲、穩(wěn)定的網(wǎng)絡(luò)標(biāo)識、有序部署有序擴(kuò)展、有序收縮、有序滾動升級的場景。
pod的存儲一般都是volumes外掛到persistent介質(zhì)。并且伸縮或刪除不會刪除關(guān)聯(lián)的存儲。需要headless service負(fù)責(zé)pod的網(wǎng)絡(luò)身份。
<font color=red size=1> "注意:statefulSet 對應(yīng)的service為headless servie,和普通的service的區(qū)別在于,普通的有cluster ip,通過只有service 有DNS,通過iptables進(jìn)行負(fù)載。headless service無cluster ip,endpoints是所有pod的dns地址。就意味著statefulset 創(chuàng)建pod的時候為pod生成了dns信息。如3 節(jié)點的mysql,會生成mysql-0 ... mysql-2三個pod(pod名稱生產(chǎn)規(guī)則為pod+遞增序號),并且會生成域: $(podname).(headless server name),完整FQDN為: $(podname).(headless server name).namespace.svc.cluster.local"
</font>
看一個完整的statefulSet + headless service 的示例。
apiVersion: v1 kind: Service metadata: name: nginx labels: app: nginx spec: ports: - port: 80 name: web clusterIP: None selector: app: nginx --- apiVersion: apps/v1beta1 kind: StatefulSet metadata: name: web spec: serviceName: "nginx" replicas: 1 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.11 ports: - containerPort: 80 name: web volumeMounts: - name: www mountPath: /usr/share/nginx/html nodeSelector: node: kube-node3 volumes: - name: www hostPath: path: /mydir
DeamonSet
每個node都有一個pod副本運(yùn)行。常用在后臺常駐程序如ceph,日志收集,心跳檢查,Prometheus exporter等。
ConfigMap
向pod 提供非敏感的配置信息,支持鍵值對,單個屬性,配置文件。
使用方式:環(huán)境變量,容器命令行參數(shù),數(shù)據(jù)卷掛載。
定義示例:
apiVersion:V1 kind:ConfigMap metadata: name:hello-config namespace:public-config data: title:hello everybody sex:girl
引用示例:
apiVersion:V1 kind:deployment metadata: name:hello-dem spec: containers: - name:goodboy image:hub/images command:["/bin/bash","-c","echo ${envTitle} ${envSex}"] env: - name:envTitle valueFrom: configMapKeyRef: name:hello-config key:title - name:envSex valueFrom: configMapKeyRef: name:hello-config key:sex
Secret
對應(yīng)于ConfigMap,用于敏感信息配置,如token,密碼,秘鑰等。
Endpoints
service 和 pod 之間的關(guān)系會創(chuàng)建endpoint對象,默認(rèn)與service 同名。kube-proxy將會監(jiān)聽service 和 endpoint的變化,從而更新iptables的規(guī)則。
PodDisruptionBudget(pdb,主動驅(qū)逐保護(hù))
沒有pdb。當(dāng)進(jìn)行節(jié)點維護(hù)時,如果某個服務(wù)的多個pod在該節(jié)點上,則節(jié)點的停機(jī)可能會造成服務(wù)中斷或者服務(wù)降級。舉個例子,某服務(wù)有5個pod,最低3個pod能保證服務(wù)質(zhì)量,否則會造成響應(yīng)慢等影響,此時該服務(wù)的4個pod在node01上,如果對node01進(jìn)行停機(jī)維護(hù),此時只有1個pod能正常對外服務(wù),在node01的4個pod遷移過程中,就會影響該服務(wù)正常響應(yīng);
pdb能保證應(yīng)用在節(jié)點維護(hù)時不低于一定數(shù)量的pod運(yùn)行,從而保持服務(wù)質(zhì)量;
等等其他的如 ingress
name && UID (uid是在k8s的整個聲明周期中均唯一,不會產(chǎn)生相同的uid,可對等為mysql的auto increment key)
來看一個api訪問對象的路徑:/api/{version}/namespaces/{namespace}/{object-kind}/{name} ,k8s通過層層限定來尋找唯一標(biāo)識的name。
namespace
對一組資源和對象的抽象集合,從邏輯上劃分k8s實現(xiàn)分層管理,并實現(xiàn)一定層度上的資源和權(quán)限隔離。
內(nèi)置三個namespace:default,kube-system(存放api-server、dns插件等),kube-public(供所有用戶包含未經(jīng)過身份驗證的用戶使用,實現(xiàn)資源集群內(nèi)共享)
Node和persistentVolume(簡稱PV,通過PVC和pod綁定)不屬于任何namespace。
label
標(biāo)識性的數(shù)據(jù),有嚴(yán)格的命名規(guī)范,k8s可通過標(biāo)簽組合管理對象,達(dá)到松耦合。在spec中通過selectors進(jìn)行匹配。
annotation(理解為java注釋吧)
非標(biāo)識性的元數(shù)據(jù)附加到對象上。通常會有時間戳,版本號,用戶信息等輔助信息。
selectors(標(biāo)簽和標(biāo)簽選擇器)
對應(yīng)label對應(yīng)的key-value 進(jìn)行對象的選擇
k8s的ip:
node Ip :node節(jié)點的ip,為物理ip.
pod Ip:pod的ip,即docker 容器的ip,為虛擬ip。
cluster Ip:service 的ip,為虛擬ip。提供一個集群內(nèi)部的虛擬IP以供Pod訪問。
k8s的volume和docker有所不同,v是獨(dú)立于容器的,與pod聲明周期相同,即pod刪除空間也被刪除。有多重類型
emptydir
空目錄,pod中的容器會共享此目錄
如下所示,busybox的文件寫入,在nginx容器中能夠讀出來。
[root@master ~]# cat test.yaml apiVersion: v1 kind: Service metadata: name: serivce-mynginx namespace: default spec: type: NodePort selector: app: mynginx ports: - name: nginx port: 80 targetPort: 80 nodePort: 30080 --- apiVersion: apps/v1 kind: Deployment metadata: name: deploy namespace: default spec: replicas: 1 selector: matchLabels: app: mynginx template: metadata: labels: app: mynginx spec: containers: - name: mynginx image: lizhaoqwe/nginx:v1 volumeMounts: - mountPath: /usr/share/nginx/html/ name: share ports: - name: nginx containerPort: 80 - name: busybox image: busybox command: - "/bin/sh" - "-c" - "sleep 4444" volumeMounts: - mountPath: /data/ name: share volumes: - name: share emptyDir: {}
到此,關(guān)于“什么是對象模型”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
網(wǎng)站欄目:什么是對象模型
轉(zhuǎn)載來源:http://muchs.cn/article10/ihcjgo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、網(wǎng)站收錄、搜索引擎優(yōu)化、品牌網(wǎng)站制作、手機(jī)網(wǎng)站建設(shè)、ChatGPT
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)