<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          原來 Kubernetes 部署如此簡單,看完全明白了~

          共 9560字,需瀏覽 20分鐘

           ·

          2020-12-08 12:27

          點擊上方“全棧IT技術(shù)前線”,選擇“星標”

          每天實用技術(shù)分享?在看|留言|真愛



          將項目遷移到k8s平臺是怎樣實現(xiàn)的?

          1. 制作鏡像

          2. 控制器管理Pod

          3. Pod數(shù)據(jù)持久化

          4. 暴露應(yīng)用

          5. 對外發(fā)布應(yīng)用

          6. 日志/監(jiān)控

          1 制作鏡像分為三步:

          • 第一基礎(chǔ)鏡像,是基于哪個操作系統(tǒng),比如Centos7或者其他的
          • 第二步中間件鏡像,比如服務(wù)鏡像,跑的像nginx服務(wù),tomcat服務(wù)
          • 第三步項目鏡像,它是服務(wù)鏡像之上的,將你的項目打包進去,那么這個項目就能在你這個服務(wù)鏡像里面運行了

          一般運維人員都是提前將鏡像做好,而開發(fā)人員就能直接拿這個鏡像去用,這個鏡像一定要符合現(xiàn)在環(huán)境部署的環(huán)境。

          2 控制器管理 pod

          也就是k8s去部署這個鏡像了,一般我們都會去拿控制器去部署,用的最多的就是 deployment

          • Deployment:無狀態(tài)部署

          • StatefulSet:有狀態(tài)部署

          • DaemonSet:守護進程部署

          • Job & CronJob:批處理

          無狀態(tài)和有狀態(tài)的有什么區(qū)別?

          有狀態(tài)的是有身份的,比如網(wǎng)絡(luò)ID、存儲、這個兩個是提前規(guī)劃好的,有序啟動/停止

          持久化與非持久化

          3 Pod 數(shù)據(jù)持久化

          pod數(shù)據(jù)持久化主要是因?qū)σ粋€應(yīng)用程序說的,比如開發(fā)一個項目,這個項目有沒有落地到本地文件,如果有落的話,就保證他持久的有了,那就必須要用到pod數(shù)據(jù)的持久化了。



          容器部署過程中一般有以下三種數(shù)據(jù):

          • 啟動時需要的初始數(shù)據(jù),可以是配置文件

          • 啟動過程中產(chǎn)生的臨時數(shù)據(jù),該臨時數(shù)據(jù)需要多個容器間共享

          • 啟動過程中產(chǎn)生的持久化數(shù)據(jù)

          4 暴露應(yīng)用


          在 k8s中,部署一個deployment,它是無法對外進行訪問的,即其他應(yīng)用程序要想訪問部署的deployment,它找不到該怎么去訪問。為什么去這么講,因為deployment一般都是多副本的去部署,有可能會分布在不同的節(jié)點之上,而且重建 pod ip也會變,重新發(fā)布一下也會變了,所以沒有辦法去固定去訪問哪個pod,即使固定了,其他的pod也訪問不了。
          要想做到多個 pod 都去提供服務(wù)的話,前面有必須要加一個負載均衡,提供一個訪問入口,只有訪問這個統(tǒng)一入口,才能轉(zhuǎn)發(fā)到后端多個pod上,只要訪問這個Cluster IP就能轉(zhuǎn)發(fā)到后端的pod上。


          Service

          • Service 定義了 Pod 的邏輯集合和訪問這個集合的策略

          • Service 引入為了解決Pod的動態(tài)變化,提供服務(wù)發(fā)現(xiàn)和負載均衡

          • 使用 CoreDNS 解析 Service 名稱

          5 對外發(fā)布應(yīng)用

          暴露出去之后呢,也就是需要讓用戶去訪問,比如搭建一個電商網(wǎng)站,讓用戶去訪問,ingress相對于service,它是一個互補的狀態(tài),彌補了各自,service主要提供了集群內(nèi)部的訪問,也可以暴露一個TCP/UDP的端口,而ingress主要是一個7層的轉(zhuǎn)發(fā),也就是提供一個統(tǒng)一的入口,只要訪問ingress controller,它就能幫你轉(zhuǎn)發(fā)你部署所有的項目,也就是所有的項目都使用域名去訪問。

          首先開發(fā)者將代碼部署到你的代碼倉庫中,主流的用的Git或者gitlab,提交完代碼通過CI/CD平臺需要對代碼進行拉取、編譯、構(gòu)建,產(chǎn)生一個War包,然后交給Ansible然后發(fā)送到云主機上/物理機,然后通過負載均衡將項目暴露出去,然后會有數(shù)據(jù)庫,監(jiān)控系統(tǒng),日志系統(tǒng)來提供相關(guān)的服務(wù)。

          首先也是開發(fā)將代碼放在代碼倉庫,然后通過jenkins去完成拉取代碼,編譯,上傳到我們的鏡像倉庫。

          這里是將代碼打包成一個鏡像,而不是刻意執(zhí)行的war或者jar包,這個鏡像包含了你的項目的運行環(huán)境和項目代碼,這個鏡像可以放在任何docker上去run起來,都可以去訪問,首先得保證能夠在docker上去部署起來,再部署到k8s上,打出來的鏡像去放在鏡像倉庫中,來集中的去管理這些鏡像。

          因為每天會產(chǎn)生幾十個或者上百個鏡像,必須通過鏡像倉庫去管理,這里可能會去寫一個腳本去連接k8smaster,而k8s會根據(jù)自己的部署去調(diào)度這些pod,然后通過ingress去發(fā)布我們的應(yīng)用,讓用戶去訪問,每個ingress會關(guān)聯(lián)一組pod,而service會創(chuàng)建這組pod的負載均衡,通過service去區(qū)分這些節(jié)點上的Pod。

          然后數(shù)據(jù)庫是放在集群之外,監(jiān)控系統(tǒng)日志系統(tǒng)也可以放在k8s集群放在去部署,也可以放在之外,我們是放在k8s集群內(nèi)的,也不是特別敏感,主要用來運維和開發(fā)調(diào)試用的,不會影響到我們的業(yè)務(wù),所以我們優(yōu)先去k8s中去部署。

          現(xiàn)在以部署一個JAVA項目到我們的k8s中

          一、安裝一個openjdk

          [root@k8s-master ~]# yum -y install java-1.8.0-openjdk.x86_64 maven
          [root@k8s-master ~]# java -version
          openjdk version "1.8.0_222"
          OpenJDK Runtime Environment (build 1.8.0_222-b10)
          OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)

          然后我們將代碼拉到本地一般Dockerfile中跟我們的代碼都放在同一目錄下,

          [root@k8s-master tomcat-java-demo-master]# ls
          db Dockerfile LICENSE pom.xml README.md src
          [root@k8s-master tomcat-java-demo-master]# vim Dockerfile
          FROM lizhenliang/tomcat
          LABEL maintainer zhaochengcheng
          RUN rm -rf /usr/local/tomcat/webapps/*
          ADD target/*.war /usr/local/tomcat/webapps/ROOT.war

          二、進行編譯

          這里我們需要配置maven的國內(nèi)源,這樣的話就比較快一點

          [root@k8s-master CI]# vim /etc/maven/settings.xml

          central
          central
          aliyun maven
          https://maven.aliyun.com/repository/public

          [root@k8s-master tomcat-java-demo-master]# mvn clean package -D maven test.skip=true
          [root@k8s-master tomcat-java-demo-master]# ls
          db Dockerfile LICENSE pom.xml README.md src target
          [root@k8s-master tomcat-java-demo-master]# cd target/
          [root@k8s-master target]# ls
          classes generated-sources ly-simple-tomcat-0.0.1-SNAPSHOT ly-simple-tomcat-0.0.1-SNAPSHOT.war maven-archiver maven-status
          [root@k8s-master tomcat-java-demo-master]# cd target/

          我們就使用這個編譯好的war包,然后打成鏡像,上傳到我們的Harbor倉庫里

          [root@k8s-master target]# ls
          classes ly-simple-tomcat-0.0.1-SNAPSHOT maven-archiver
          generated-sources ly-simple-tomcat-0.0.1-SNAPSHOT.war maven-status

          [root@k8s-master tomcat-java-demo-master]# docker build -t 192.168.30.24/library/java-demo:latest .

          三、上傳到鏡像倉庫

          [root@k8s-master tomcat-java-demo-master]# docker login 192.168.30.24
          Username: admin
          Password:
          Error response from daemon: Get https://192.168.30.24/v2/: dial tcp 192.168.30.24:443: connect: connection refused

          這里報錯,其實我們需要在每臺docker下都要寫入對harbor倉庫的信任才可以,后面上傳鏡像也會用

          [root@k8s-master java-demo]# vim /etc/docker/daemon.json
          {
          "registry-mirrors": ["http://f1361db2.m.daocloud.io"],
          "insecure-registries": ["192.168.30.24"]
          }

          再等錄一下push就可以了

          [root@k8s-master tomcat-java-demo-master]# docker push 192.168.30.24/library/java-demo:latest

          四、控制器管理pod

          編寫deployment,一般項目都寫到自定義的命名空間下,名稱寫項目名稱,方便記憶,name: tomcat-java-demo
          namespace: test

          另外就是下一個項目名稱,這里分為多個,一般有很多的組件組成,所以下面可以寫個app的名稱,比如組件1、2、3,起碼標簽有這兩個維度
          project: www
          app: java-demo

          另外就是鏡像拉取,在哪個倉庫去下載,這里我建議鏡像倉庫的項目名稱和我們定義的是一種,避免混了。我重新打個標簽,并傳到我們的私有鏡像倉庫中

          [root@k8s-master java-demo]# docker tag 192.168.30.24/library/java-demo  192.168.30.24/tomcat-java-demo/java-demo
          [root@k8s-master java-demo]# docker push 192.168.30.24/tomcat-java-demo/java-demo:latest

          鏡像地址也改一下地址

          imagePullSecrets:
          - name: registry-pull-secret
          containers:
          - name: tomcat
          image: 192.168.30.24/tomcat-java-demo/java-demo:latest

          現(xiàn)在開始創(chuàng)建 yaml

          創(chuàng)建項目的命名空間

          [root@k8s-master java-demo]# vim namespace.yaml
          apiVersion: v1
          kind: Namespace
          metadata:
          name: test

          [root@k8s-master java-demo]# kubectl create -f namespace.yaml
          namespace/test created
          [root@k8s-master java-demo]# kubectl get ns
          NAME STATUS AGE
          default Active 22h
          kube-node-lease Active 22h
          kube-public Active 22h
          kube-system Active 22h
          test Active 5s

          創(chuàng)建一個secret來保證我們harbor鏡像倉庫的認證信息,這里一定要寫上我們的項目的命名空間。

          [root@k8s-master java-demo]# kubectl create secret docker-registry registry-pull-secret --docker-username=admin --docker-password=Harbor12345 [email protected] --docker-server=192.168.30.24 -n test
          secret/registry-pull-secret created
          [root@k8s-master java-demo]# kubectl get ns
          NAME STATUS AGE
          default Active 23h
          kube-node-lease Active 23h
          kube-public Active 23h
          kube-system Active 23h
          test Active 6m39s
          [root@k8s-master java-demo]# kubectl get secret
          NAME TYPE DATA AGE
          default-token-2vtgm kubernetes.io/service-account-token 3 23h
          registry-pull-secret kubernetes.io/dockerconfigjson 1 46s

          [root@k8s-master java-demo]# vim deployment.yaml
          apiVersion: apps/v1beta1
          kind: Deployment
          metadata:
          name: tomcat-java-demo
          namespace: test
          spec:
          replicas: 3
          selector:
          matchLabels:
          project: www
          app: java-demo
          template:
          metadata:
          labels:
          project: www
          app: java-demo
          spec:
          imagePullSecrets:
          - name: registry-pull-secret
          containers:
          - name: tomcat
          image: 192.168.30.24/tomcat-java-demo/java-demo:latest
          imagePullPolicy: Always
          ports:
          - containerPort: 8080
          name: web
          protocol: TCP
          resources:
          requests:
          cpu: 0.5
          memory: 1Gi
          limits:
          cpu: 1
          memory: 2Gi
          livenessProbe:
          httpGet:
          path: /
          port: 8080
          initialDelaySeconds: 60
          timeoutSeconds: 20
          readinessProbe:
          httpGet:
          path: /
          port: 8080
          initialDelaySeconds: 60
          timeoutSeconds: 20

          [root@k8s-master java-demo]# kubectl get pod -n test
          NAME READY STATUS RESTARTS AGE
          tomcat-java-demo-6d798c6996-fjjvk 1/1 Running 0 2m58s
          tomcat-java-demo-6d798c6996-lbklf 1/1 Running 0 2m58s
          tomcat-java-demo-6d798c6996-strth 1/1 Running 0 2m58s

          另外就是暴露一個Service,這里的標簽也要保持一致,不然他找不到相應(yīng)的標簽就提供不了服務(wù),這里我們是使用ingress來訪問發(fā)布應(yīng)該,直接使用ClusterIP就可以

          [root@k8s-master java-demo]# vim service.yaml
          apiVersion: v1
          kind: Service
          metadata:
          name: tomcat-java-demo
          namespace: test
          spec:
          selector:
          project: www
          app: java-demo
          ports:
          - name: web
          port: 80
          targetPort: 8080

          [root@k8s-master java-demo]# kubectl get pod,svc -n test
          NAME READY STATUS RESTARTS AGE
          pod/tomcat-java-demo-6d798c6996-fjjvk 1/1 Running 0 37m
          pod/tomcat-java-demo-6d798c6996-lbklf 1/1 Running 0 37m
          pod/tomcat-java-demo-6d798c6996-strth 1/1 Running 0 37m

          NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
          service/tomcat-java-demo ClusterIP 10.1.175.191 80/TCP 19s

          測試訪問我們的項目,是可以的,現(xiàn)在要發(fā)布出去通過ingress

          [root@k8s-master java-demo]# curl 10.1.175.191





          把美女帶回家應(yīng)用案例

          現(xiàn)在部署一個ingress-nginx的控制器,這個網(wǎng)上都可以找到,官方也有,我這里是按DaemonSet的方式去部署的,所以每個節(jié)點都會跑一個控制器。

          [root@k8s-master java-demo]# kubectl get pod -n ingress-nginx
          NAME READY STATUS RESTARTS AGE
          nginx-ingress-controller-g95pp 1/1 Running 0 3m6s
          nginx-ingress-controller-wq6l6 1/1 Running 0 3m6s

          發(fā)布應(yīng)用

          這里注意兩點,第一個就是網(wǎng)站域名,一個是service的命名空間。

          [root@k8s-master java-demo]# kubectl get pod,svc -n test
          NAME READY STATUS RESTARTS AGE
          pod/tomcat-java-demo-6d798c6996-fjjvk 1/1 Running 0 53m
          pod/tomcat-java-demo-6d798c6996-lbklf 1/1 Running 0 53m
          pod/tomcat-java-demo-6d798c6996-strth 1/1 Running 0 53m

          NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
          service/tomcat-java-demo ClusterIP 10.1.175.191 80/TCP 16m
          [root@k8s-master java-demo]# vim service.yaml
          [root@k8s-master java-demo]# kubectl create -f ingress.yaml
          apiVersion: extensions/v1beta1
          kind: Ingress
          metadata:
          name: tomcat-java-demo
          namespace: test
          spec:
          rules:
          - host: java.maidikebi.com
          http:
          paths:
          - path: /
          backend:
          serviceName: tomcat-java-demo
          servicePort: 80


          另外我這邊是測試的,所以綁定我本地的hosts來進行訪問,在hosts文件里面加入域名和和節(jié)點ip就能訪問到我們的項目了。
          來源:https://blog.51cto.com/14143894/2437186

          ---END---


          點個在看,月薪幾萬
          瀏覽 80
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产黄色视频在线观看免费 | 欧美在线91 豆花 | 欧美日韩一级电影 | 亚洲高清福利视频 | 18禁网站色 |