<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部署如此簡單,看完全明白了

          共 17897字,需瀏覽 36分鐘

           ·

          2021-03-14 20:21

          公眾號關(guān)注“杰哥的IT之旅”,

          選擇“星標(biāo)”,重磅干貨,第一時間送達(dá)!


          來自:51CTO博客,作者:wx5c1cfd6e22842

          鏈接:https://blog.51cto.com/14143894/2437186

          制作鏡像

          制作鏡像分為三步:


          • 第一步基礎(chǔ)鏡像,是基于哪個操作系統(tǒng),比如CentOS 7或者其他的

          • 第二步中間件鏡像,比如服務(wù)鏡像,跑的像Nginx服務(wù),Tomcat服務(wù)

          • 第三步項(xiàng)目鏡像,它是服務(wù)鏡像之上的,將你的項(xiàng)目打包進(jìn)去,那么這個項(xiàng)目就能在你這個服務(wù)鏡像里面運(yùn)行了



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

          控制器管理Pod

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

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

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

          • DaemonSet:守護(hù)進(jìn)程部署

          • Job & CronJob:批處理


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

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

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

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


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

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

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

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

          暴露應(yīng)用

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


          Service

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

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

          • 使用CoreDNS解析Service名稱

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


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

          傳統(tǒng)部署與Kubernetes部署的區(qū)別


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


          Kubernetes部署首先也是開發(fā)將代碼放在代碼倉庫,然后通過Jenkins去完成拉取代碼,編譯,上傳到我們的鏡像倉庫,這里是將代碼打包成一個鏡像,而不是刻意執(zhí)行的war或者jar包,這個鏡像包含了你項(xiàng)目的運(yùn)行環(huán)境和項(xiàng)目代碼,這個鏡像可以放在任何Docker上去run起來,都可以去訪問,首先得保證能夠在Docker上去部署起來,再部署到Kubernetes上,打出來的鏡像去放在鏡像倉庫中,來集中管理這些鏡像。

          因?yàn)槊刻鞎a(chǎn)生幾十或者上百個鏡像,所以必須通過鏡像倉庫去管理,這里可能會去寫一個腳本去連接Kubernetes Master,而Kubernetes會根據(jù)自己的部署去調(diào)度這些Pod,然后通過Ingress去發(fā)布我們的應(yīng)用,讓用戶去訪問。每個Ingress會關(guān)聯(lián)一組Pod,而Service會創(chuàng)建這組Pod的負(fù)載均衡,通過Service去區(qū)分這些節(jié)點(diǎn)上的Pod,數(shù)據(jù)庫放在集群之外,監(jiān)控系統(tǒng)、日志系統(tǒng)也可以放在Kubernetes集群去部署,也可以放在集群之外。我們是放在Kubernetes集群內(nèi)的,也不是特別敏感,主要用來運(yùn)維和開發(fā)調(diào)試用,不會影響到我們的業(yè)務(wù),所以我們優(yōu)先去Kubernetes中部署。

          現(xiàn)在我們?nèi)ゲ渴鹨粋€Java項(xiàng)目到我們的Kubernetes中。

          1、安裝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
          2、使用Maven進(jìn)行編譯

          這里我們需要配置Maven的國內(nèi)源,這樣比較快一點(diǎn)。

          [root@k8s-master CI]# vim /etc/maven/settings.xml
           <mirror>
                <id>central</id>
                <mirrorOf>central</mirrorOf>
                <name>aliyun maven</name>
                <url>https://maven.aliyun.com/repository/public</url>
              </mirror>
            </mirrors>
          [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 .
          3、上傳到我們的鏡像倉庫
          [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
          這里報錯,其實(shí)我們需要在每臺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


          4、控制器管理Pod

          編寫Deployment,一般項(xiàng)目都寫到自定義的命名空間下,名稱寫項(xiàng)目名稱,方便記憶:
          name: tomcat-java-demo
          namespace: test
          另外就是下一個項(xiàng)目名稱,這里分為多個,一般由很多的組件組成,所以下面可以寫個APP的名稱,比如組件1、2、3,起碼標(biāo)簽有這兩個維度:

          • project:www

          • app:java-demo


          另外就是鏡像拉取,在哪個倉庫去下載,這里我建議鏡像倉庫的項(xiàng)目名稱和我們定義的是一種,避免混了。

          我重新打個標(biāo)簽,并傳到我們的私有鏡像倉庫中。
          [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)建項(xià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鏡像倉庫的認(rèn)證信息,這里一定要寫上我們項(xiàng)目的命名空間。
          [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,這里的標(biāo)簽也要保持一致,不然找不到相應(yīng)的標(biāo)簽就提供不了服務(wù),這里我們應(yīng)該使用Ingress來訪問發(fā)布,直接使用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   <none>        80/TCP    19s
          測試訪問我們的項(xiàng)目,是可以的,現(xiàn)在要通過ingress發(fā)布出去。
          [root@k8s-master java-demo]# curl 10.1.175.191
          <!DOCTYPE html>
          <html>
          <head lang="en">
              <meta charset="utf-8">
              <meta http-equiv="X-UA-Compatible" content="IE=edge">
              <title>把美女帶回家應(yīng)用案例</title>
              <meta name="description" content="把美女帶回家應(yīng)用案例">
              <meta name="keywords" content="index">
          現(xiàn)在部署一個ingress-nginx的控制器,這個網(wǎng)上都可以找到,官方也有,我這里是按DaemonSet的方式去部署的,所以每個節(jié)點(diǎn)都會跑一個控制器。
          [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)用

          這里注意兩點(diǎn),一個是網(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   <none>        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來進(jìn)行訪問。在hosts文件里面加入域名和節(jié)點(diǎn)IP就能訪問到我們的項(xiàng)目了。

          推薦閱讀

          超詳細(xì)!K8S 面試題總結(jié)

          IT運(yùn)維面試問題總結(jié)-LVS、Keepalived、HAProxy、Kubernetes、OpenShift等

          2020 年度開發(fā)者工具 TOP 100 名單!

          又一款 Nginx 管理可視化神器!通過界面完成配置監(jiān)控

          速度快,性能好!壓縮神器 zstd

          瀏覽 88
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <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>
                  麻豆综合网 | 美女18网站视频 | 国产午夜福利免费视频在线观看 | 99精品视频16在线免费观看 | 男女免费av |