真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Kubernetes進(jìn)階之StatefulSet有狀態(tài)部署

K8s有狀態(tài)應(yīng)用部署
目錄:分為兩類(lèi)
1.Headless Service
2.StatefulSet

公司主營(yíng)業(yè)務(wù):成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站開(kāi)發(fā)等業(yè)務(wù)。幫助企業(yè)客戶(hù)真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開(kāi)放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶(hù)帶來(lái)驚喜。創(chuàng)新互聯(lián)推出大安免費(fèi)做網(wǎng)站回饋大家。

? 部署有狀態(tài)應(yīng)用
? 解決Pod獨(dú)立生命周期,保持Pod啟動(dòng)順序和唯一性

  1. 穩(wěn)定,唯一的網(wǎng)絡(luò)標(biāo)識(shí)符,持久存儲(chǔ)
  2. 有序,優(yōu)雅的部署和擴(kuò)展、刪除和終止
  3. 有序,滾動(dòng)更新
    應(yīng)用場(chǎng)景:數(shù)據(jù)庫(kù)
說(shuō)在前面的話(huà),像我們的MySQL或者redis了,Zookerper等等這些適不適合部署在K8s中,其實(shí)呢不是太適合,但部署在里面也可以,比如部署一個(gè)Mysql來(lái)講吧,部署到k8s中還是很容易的就一個(gè)Mysql實(shí)例,就像部署其他應(yīng)用一樣,通過(guò)service、IP去訪(fǎng)問(wèn)它,但是要是作為集群的狀態(tài)去部署的話(huà),那可能就比較麻煩了。
第一點(diǎn):比如做一個(gè)Mysql的主從,Mysql主從它是有主從拓?fù)潢P(guān)系的,一個(gè)主一個(gè)從,而且各自的數(shù)據(jù)都不一樣,這就意味著,你要想搭建一個(gè)Mysql的主從,你要知道它的相互的ip地址,就是從肯定要知道主的ip地址,然后從連接主的ip地址,做數(shù)據(jù)的同步。
第二點(diǎn):它的存儲(chǔ),它兩個(gè)存儲(chǔ)的信息都不太一樣,那怎么去保證它兩個(gè)數(shù)據(jù)的存儲(chǔ)保證持久化呢,一個(gè)集群中可能會(huì)有多個(gè)節(jié)點(diǎn),要是部署到k8s中,必須要保證部署的應(yīng)用,在任意的節(jié)點(diǎn)都能使用原來(lái)的狀態(tài),也就是說(shuō)某一個(gè)節(jié)點(diǎn)掛了,上面的pod飄移到另一個(gè)節(jié)點(diǎn),能不能用到之前的狀態(tài),所以要考慮這些問(wèn)題。
而k8s設(shè)計(jì)的精髓在于并不是你部署一個(gè)單的實(shí)例,而是在于它的一個(gè)分布式一個(gè)部署,具有故障恢復(fù)能力的應(yīng)用,所以就談到了有狀態(tài)和無(wú)狀態(tài)應(yīng)用。

有狀態(tài)應(yīng)用:DB,好比一個(gè)Mysql主從,考慮兩點(diǎn)(自己的存儲(chǔ),必須是遠(yuǎn)程的存儲(chǔ),在任意節(jié)點(diǎn)掛載都恢復(fù)原來(lái)的狀態(tài))而且還有網(wǎng)絡(luò)ID的唯一,需要做主從的連接,我們的pod是短暫的,重建一個(gè)ip就換了,得保證這個(gè)ip一直去使用,不管是重建還是遷移pod,都能去使用。
無(wú)狀態(tài)應(yīng)用:典型的就是web系統(tǒng),本身就沒(méi)有什么狀態(tài)去維護(hù),比如部署了三個(gè)副本,不需要考慮其他兩個(gè)副本是什么樣的,跟它沒(méi)有直接的關(guān)系,本地也沒(méi)有什么持久化的數(shù)據(jù),即使其中有一個(gè)副本掛了,幫它在其他節(jié)點(diǎn)起來(lái),仍然可以繼續(xù)提供服務(wù),對(duì)原基礎(chǔ)服務(wù)是沒(méi)有任何影響的,所以這是一個(gè)前提,典型的就是web。

在k8s中呢在1.10版本之后有狀態(tài)部署才支持好一點(diǎn),但是剛開(kāi)始在落地K8s的時(shí)候,而不會(huì)去考慮有狀態(tài)部署的,主要做無(wú)狀態(tài)的部署,而數(shù)據(jù)庫(kù)適不適合部署在k8s中,在看k8s的一些特性,k8s有適合的一些特性,比如具有一些訪(fǎng)問(wèn)比較大的應(yīng)用,版本迭代快的應(yīng)用,或者彈性伸縮的一些應(yīng)用,凡是這些是適合放在k8s,k8s最早就支持無(wú)狀態(tài),也是一直在推薦,有狀態(tài)的也是比較復(fù)雜,復(fù)雜點(diǎn)就在與有狀態(tài)的都是一些集群化的,比如zookerper,
Mysql主從,這些都是需要自身的一個(gè)狀態(tài)維護(hù)的,這些部署進(jìn)去呢,可能去考慮它這個(gè)網(wǎng)絡(luò)拓?fù)潢P(guān)系,還有存儲(chǔ)狀態(tài)的持久化,而數(shù)據(jù)庫(kù)不具備這些特點(diǎn),部署一個(gè)數(shù)據(jù)庫(kù)一般配置比較高一些,可以會(huì)抗很多的并發(fā)量,而且要擴(kuò)容的話(huà)也是很方便,而且傳統(tǒng)的部署文章也很多,也比較成熟,在k8s中部署這些東西,那絕對(duì)是一種挑戰(zhàn),所以要根據(jù)不同的應(yīng)用特點(diǎn)去考慮上k8s,不要一味地上k8s,而且得不償失,達(dá)不到預(yù)期的效果,領(lǐng)導(dǎo)也會(huì)批你,所以在談?dòng)袪顟B(tài)部署的話(huà),可以在兩者出發(fā),一個(gè)是Headless Service維護(hù)網(wǎng)絡(luò)的,一個(gè)是StatefulSet維護(hù)存儲(chǔ)狀態(tài)的。

statefulSet是一個(gè)控制器,與Deployment存在的原則一樣,都是部署應(yīng)用的,而Statefulset它主要是部署有狀態(tài)應(yīng)用的,而deployment是部署無(wú)狀態(tài)應(yīng)用的

Headless Service 其實(shí)和service差不多,這不過(guò)定義的這個(gè)叫無(wú)頭服務(wù),它們之間唯一的區(qū)別就是將Cluster ip 設(shè)置為了none,不會(huì)幫你配置ip

[root@k8s-master demo]# mkdir headless-service
[root@k8s-master demo]# cd headless-service/
[root@k8s-master headless-service]# vim headless-svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  clusterIP: None
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376

[root@k8s-master headless-service]# kubectl create -f headless-svc.yaml 
service/my-service created
[root@k8s-master headless-service]# kubectl get svc

kubernetes   ClusterIP   10.1.0.1              443/TCP        23h
my-service   ClusterIP   None                  80/TCP         6s
service      NodePort    10.1.207.32           80:30963/TCP   87m
zhao         ClusterIP   10.1.75.232           80/TCP         9m1s
zhaocheng    ClusterIP   10.1.27.206           80/TCP         10m

怎么去訪(fǎng)問(wèn)?我們給它定義一個(gè)標(biāo)識(shí)
創(chuàng)建完之后會(huì)有這個(gè)標(biāo)識(shí)符,它會(huì)使用這個(gè)DNS來(lái)解析這個(gè)名稱(chēng),來(lái)相互的訪(fǎng)問(wèn),headless就不會(huì)通過(guò)ip去訪(fǎng)問(wèn)了,必須通過(guò)名稱(chēng)去訪(fǎng)問(wèn),

[root@k8s-master headless-service]# vim statefulset.yaml
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
  name: nginx-statefulset
  namespace: default
spec:
  serviceName: my-service
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80

[root@k8s-master headless-service]# kubectl create -f statefulset.yaml 
[root@k8s-master headless-service]# kubectl get pod

my-pod                                   1/1     Running   0          3h60m
nfs-744d977b46-dh9xj                     1/1     Running   0          22h
nfs-744d977b46-kcx6h                     1/1     Running   0          22h
nfs-744d977b46-wqhc6                     1/1     Running   0          22h
nfs-client-provisioner  1/1     Running   0          4h
nginx-797db8dc57-tdd5s                   1/1     Running   0          100m
nginx-statefulset-0                      1/1     Running   0          73s
nginx-statefulset-1                      1/1     Running   0          46s
nginx-statefulset-2                      1/1     Running   0          24s

這里的statfulset的 serviceName: my-service字段要關(guān)聯(lián)起來(lái),這樣才能去基于名稱(chēng)去訪(fǎng)問(wèn)
可以通過(guò)busybox測(cè)試工具通過(guò)nslookup去測(cè)試解析。解析我們的my-service就能解析到
這里會(huì)分配一個(gè)名稱(chēng),這個(gè)my-service和這個(gè)編號(hào)是永久的,可以通過(guò)這個(gè)名稱(chēng)訪(fǎng)問(wèn)pod
要是mysql主從的話(huà)就可以通過(guò)訪(fǎng)問(wèn)這個(gè)標(biāo)簽來(lái)連接我們從庫(kù)的狀態(tài),這個(gè)是維護(hù)的網(wǎng)絡(luò)狀態(tài)
然后再來(lái)看一下存儲(chǔ)狀態(tài)

官方文檔這個(gè)實(shí)例
https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/
這個(gè)其實(shí)我們也是部署一個(gè)nginx,使用的headless,ClusterIP為none,然后用headless來(lái)維護(hù)statefulset起得pod網(wǎng)絡(luò)id為1,以 volumeClaimTemplates:來(lái)維護(hù)pod獨(dú)立的一個(gè)存儲(chǔ)

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  selector:
    matchLabels:
      app: nginx # has to match .spec.template.metadata.labels
  serviceName: "nginx"
  replicas: 3 # by default is 1
  template:
    metadata:
      labels:
        app: nginx # has to match .spec.selector.matchLabels
    spec:
      terminationGracePeriodSeconds: 10
      containers:

- name: nginx
        image: nginx
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "managed-nfs-storage"
      resources:
        requests:
          storage: 1Gi

這是我們的存儲(chǔ)要寫(xiě)我們nfs的名稱(chēng)
managed-nfs-storage

[root@k8s-master headless-service]# kubectl get sc

managed-nfs-storage   fuseim.pri/ifs   22h

這里會(huì)給我們自動(dòng)創(chuàng)建pv,并掛載到我們的NFS上

[root@k8s-master headless-service]# kubectl get pod

my-pod                                   1/1     Running            0          6h5m
nfs                     1/1     Running            0          24h
nfs                    1/1     Running            0          24h
nfs                     1/1     Running            0          24h
nfs-client-provisioner-fbc  1/1     Running            0          6h33m
nginx-797db8dc57-tdd5s                   1/1     Running            0          3h64m
nginx-a1-6d5fd7b8dd-w647x                1/1     Running            0          3m28s
nginx-statefulset-0                      1/1     Running            0          135m
nginx-statefulset-1                      1/1     Running            0          135m
nginx-statefulset-2                      1/1     Running            0          134m
web-0                                    1/1     Running            0          3
web-1                                    1/1     Running            0          85s
web-2                                    1/1     Running            0          57s
[root@k8s-master headless-service]# kubectl get pv

pvc-06  1Gi        RWO            Delete           Bound    default/www-web-2   managed-nfs-storage            63s
pvc-4f   1Gi        RWO            Delete           Bound    default/www-web-0   managed-nfs-storage            6m3s
pvc-a2   5Gi        RWX            Delete           Bound    default/my-pvc      managed-nfs-storage            6h5m
pvc-bc 1Gi        RWO            Delete           Bound    default/www-web-1   managed-nfs-storage           

headless保證它的網(wǎng)絡(luò),statefulset存儲(chǔ)模版來(lái)保證每個(gè)pod存儲(chǔ)的唯一性,這樣才解決了有狀態(tài)應(yīng)用的兩大痛點(diǎn)


當(dāng)前題目:Kubernetes進(jìn)階之StatefulSet有狀態(tài)部署
文章地址:http://weahome.cn/article/iijdes.html

其他資訊

在線(xiàn)咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部