1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        k8s | 搞不明白為什么大家都在學習 k8s

        共 7837字,需瀏覽 16分鐘

         ·

        2020-10-27 15:41

        前言

        都9102年了,你還不知道kubernetes就真的真的真的out啦。(販賣焦慮體) 什么是k8s,k8s這個詞來自于希臘語,有主管,舵手,船長的意思,我們從圖標中能看出來。在k8s的網(wǎng)站上,描述是這樣的

        生產(chǎn)級別的容器編排系統(tǒng)

        從定義中可以提煉出三個關(guān)鍵字,分別是

        1. 生產(chǎn)級別
        2. 容器
        3. 編排系統(tǒng)

        1. 生產(chǎn)級別

        說k8s是生產(chǎn)級別的有如下的幾個原因:

        1. k8s 是谷歌的開源系統(tǒng),基于谷歌的系統(tǒng)設(shè)計,并且已經(jīng)在谷歌系統(tǒng)上平穩(wěn)運行的很久。
        2. k8s 是CNCF的首個畢業(yè)項目。

        2. 容器

        容器有以下幾個特點

        1. 可移植性,容器可以被任何類型的操作系統(tǒng)安裝使用。
        2. 包容性:支持多種類型的軟件,這些軟件都可以打包在容器內(nèi)。
        3. 標準格式。
        4. 共存,多個容器可以運行在同一個物理機上。
        5. 隔離,不同的容器的軟件彼此隔離。

        最重要的一句話:沒有容器就沒有微服務(wù)。

        容器和微服務(wù)化后,帶來了一些好處,比如:

        1. 模塊間更加獨立,可以獨立的部署和發(fā)布,加快了發(fā)布和更新的速度
        2. 隔離的運行環(huán)境,可以為不同模塊定制不同的運行環(huán)境

        3. 編排系統(tǒng)

        容器的編排系統(tǒng)可以有效的管理在宿主機上的容器。

        1. 管理網(wǎng)絡(luò)和訪問
        2. 跟蹤容器的狀態(tài)
        3. 增大或縮小服務(wù)的規(guī)模
        4. 實現(xiàn)負載平衡
        5. 宿主機無響應(yīng)后實現(xiàn)容器的重新分配
        6. 服務(wù)發(fā)現(xiàn)
        7. 管理容器的存儲 等等…

        主要功能

        數(shù)據(jù)卷

        pod中容器之間共享數(shù)據(jù),可以使用數(shù)據(jù)卷。

        應(yīng)用程序健康檢查

        容器內(nèi)服務(wù)可能進程阻塞無法處理請求,可以設(shè)置監(jiān)控檢查的策略,

        復制應(yīng)用程序?qū)嵗?/span>

        控制器維護者pod副本數(shù)量,保證一個pod或一組同類prod數(shù)量始終可用

        彈性伸縮

        根據(jù)設(shè)定的指標,自動縮放pod副本數(shù)

        服務(wù)發(fā)現(xiàn)

        使用環(huán)境變量或DNS插件保證容器中程序發(fā)現(xiàn)pod入口訪問地址。

        負載均衡

        一組pod副本分配一個私有的集群ip地址,負載均衡轉(zhuǎn)發(fā)請求到后端容器,在集群類其他pod可以通過clusterIP訪問應(yīng)用。

        滾動更新

        更新服務(wù)不中斷,一次更新一個pod,而不是同時刪除整個服務(wù)。

        服務(wù)編排

        通過文件描述部署服務(wù),使得應(yīng)用程序部署變得高效。

        資源監(jiān)控

        Node節(jié)點組件集成cAdvisor資源收集工具,通過Heapster匯總,并保存到influxDB時序數(shù)據(jù)庫,最后由Grafana展示。

        提供認證授權(quán)

        支持RBAC認證授權(quán)機制。

        設(shè)計架構(gòu)

        功能組件

        k8s 集群中有管理節(jié)點,Master與工作節(jié)點,Node兩種類型。

        1. 管理節(jié)點Master主要負責k8s集群管理,集群中各個節(jié)點之間信息交互,任務(wù)調(diào)度,還負責容器,pod, namespaces , pv 等生命周期的管理。
        2. 工作節(jié)點node主要為容器和pod提供計算資源,pod及其容器全部運行在工作節(jié)點上,工作節(jié)點通過kubelet服務(wù)與管理節(jié)點通信以管理容器的生命周期,并與集群其他節(jié)點進行通信。

        master組件

        kube-apiserver

        kubernetes api 資源操作的唯一入口,各種組件的協(xié)調(diào)者,以HTTP API 提供接口服務(wù),并提供相關(guān)的認證,授權(quán)等機制,

        kube-controller-manager

        處理集群中常規(guī)的后臺任務(wù),一個資源對應(yīng)一個控制器,而ControllerManager負責管理這些控制器,并維護集群的狀態(tài)。

        kube-scheduler

        負責資源的調(diào)度,按照預(yù)定的策略把pod調(diào)度到對應(yīng)的Node節(jié)點上。

        Node組件

        kubelet

        kubelet是Master在Node節(jié)點上的agent,管理本機運行容器的生命周期,同時也負責Volume和網(wǎng)絡(luò)的管理。例如創(chuàng)建容器,掛載數(shù)據(jù)卷,下載secret,獲取容器和節(jié)點的狀態(tài)等工作。

        kube-proxy

        在Node節(jié)點上實現(xiàn)Pod/serviced網(wǎng)絡(luò)代理,提供cluster內(nèi)部的服務(wù)發(fā)現(xiàn)和四層負載均衡。

        docker

        真正運行容器的地方

        etcd集群

        分布式鍵值對儲存系統(tǒng),用于保存集群狀態(tài),比如pod,service等對象信息。

        分層架構(gòu)

        核心層:最核心的功能,對外提供api 應(yīng)用層,部署無狀態(tài)應(yīng)用,等,和路由。管理層:系統(tǒng)度量,自動化,以及RBAC等 接口層:kubectl命令行工具,以及客戶端sdk 生態(tài)系統(tǒng):分為外部的日志,監(jiān)控等,內(nèi)部的鏡像倉庫等。

        安裝

        創(chuàng)建集群

        首先,查看所使用的 minikube 版本:

        $ minikube version
        minikube version: v0.25.0

        啟動 minikube:

        $ minikube start
        Starting local Kubernetes v1.9.0 cluster...
        Starting VM...
        Getting VM IP address...
        Moving files into cluster...
        Setting up certs...
        Connecting to cluster...
        Setting up kubeconfig...
        Starting cluster components...
        Kubectl is now configured to use the cluster.
        Loading cached images from config file.

        minikube 啟動之后,會創(chuàng)建一個單節(jié)點 Kubernetes 集群。

        查看集群版本:

        $ kubectl version
        Client Version: version.Info{Major:"1", Minor:"9", GitVersion:"v1.9.0", GitCommit:"925c127ec6b946659ad0fd596fa959be43f0cc05", GitTreeState:"clean", BuildDate:"2017-12-15T21:07:38Z", GoVersion:"go1.9.2", Compiler:"gc", Platform:"linux/amd64"}
        Server Version: version.Info{Major:"", Minor:"", GitVersion:"v1.9.0", GitCommit:"925c127ec6b946659ad0fd596fa959be43f0cc05", GitTreeState:"clean", BuildDate:"2018-01-26T19:04:38Z", GoVersion:"go1.9.1", Compiler:"gc", Platform:"linux/amd64"}

        這里有兩個版本,client version 指的是 kubectl 命令行工具的版本,而 server version 才是 Kubernetes 的版本。

        查看更詳細的版本信息:

        $ kubectl cluster-info
        Kubernetes master is running at https://172.17.0.77:8443

        To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

        集群所在主機的 ip 為 172.17.0.77。

        注意:這里的 master 指的是 Kubernetes 集群的 master 節(jié)點(在 Kubernetes 集群中,節(jié)點分為兩類,一類是 master 節(jié)點,一類是 node 節(jié)點)。那怎么看到 node 節(jié)點呢?

        $ kubectl get node
        NAME STATUS ROLES AGE VERSION
        host01 Ready 20m v1.9.0

        host01 就是 node 節(jié)點,在當前環(huán)境中,實際上只有一臺主機。這臺主機既作為 master 節(jié)點,也作為 node 節(jié)點。

        部署應(yīng)用

        下面以部署一個 nginx 為例來演示部署應(yīng)用的過程:

        $ kubectl run first-app --image=nginx --port=80
        deployment "first-app" created

        通過 run 命令創(chuàng)建一個名為 first-app 的 deployment,使用的是 docker hub 上最新的 nginx 鏡像,并指定了應(yīng)用端口為 80。deployment 是干嘛的呢?別急,往下看:

        查看當前的 deployment:

        $ kubectl get deployment
        NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
        first-app 1 1 1 1 1m

        查看當前的 pod:

        $ kubectl get pod
        NAME READY STATUS RESTARTS AGE
        first-app-6db44b474-dbbtp 1/1 Running 0 4m

        查看更詳細的 pod 內(nèi)容:

        $ kubectl describe pod first-app-6db44b474-dbbtp
        Name: first-app-6db44b474-dbbtp
        Namespace: default
        Node: host01/172.17.0.77
        Start Time: Fri, 02 Mar 2018 06:48:02 +0000
        Labels: pod-template-hash=286006030
        run=first-app
        Annotations:
        Status: Running
        IP: 172.18.0.4
        Controlled By: ReplicaSet/first-app-6db44b474
        Containers:
        first-app:
        Container ID: docker://54eacc7ff536d7181fa366883f7ed4cf632492ad6ed391207fea436d22d219a9
        Image: nginx
        Image ID: docker-pullable://nginx@sha256:4771d09578c7c6a65299e110b3ee1c0a2592f5ea2618d23e4ffe7a4cab1ce5de
        Port: 80/TCP
        State: Running
        Started: Fri, 02 Mar 2018 06:48:14 +0000
        Ready: True
        Restart Count: 0
        Environment:
        Mounts:
        /var/run/secrets/kubernetes.io/serviceaccount from default-token-zkqw6 (ro)
        Conditions:
        Type Status
        Initialized True
        Ready True
        PodScheduled True
        Volumes:
        default-token-zkqw6:
        Type: Secret (a volume populated by a Secret)
        SecretName: default-token-zkqw6
        Optional: false
        QoS Class: BestEffort
        Node-Selectors:
        Tolerations:
        Events:
        Type Reason Age From Message
        ---- ------ ---- ---- -------
        Normal Scheduled 7m default-scheduler Successfully assigned first-app-6db44b474-dbbtp to host01
        Normal SuccessfulMountVolume 7m kubelet, host01 MountVolume.SetUp succeeded for volume "default-token-zkqw6"
        Normal Pulling 7m kubelet, host01 pulling image "nginx"
        Normal Pulled 7m kubelet, host01 Successfully pulled image "nginx"
        Normal Created 7m kubelet, host01 Created container
        Normal Started 7m kubelet, host01 Started container

        對外發(fā)布服務(wù)

        已經(jīng)部署好了一個 nginx 應(yīng)用,那么要怎么去訪問呢?這時候就需要用到 service。創(chuàng)建一個 service:

        $ kubectl expose deployment/first-app --type="NodePort" --port=80
        service "first-app" exposed

        查看創(chuàng)建好的名為 first-app 的 service :

        $ kubectl get svc first-app
        NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
        first-app NodePort 10.102.0.12 80:30491/TCP 1m

        在 PORT(S) 一欄中,除了 80 端口,后面還有一個 30491 端口。這是使用了“NodePort”類型創(chuàng)建 service 分配的端口,通過主機 ip 和這個端口,就可以訪問到這個 service 了。可以使用 curl 工具進行訪問:

        $ curl 172.17.0.77:30491



        Welcome to nginx!



        Welcome to nginx!


        If you see this page, the nginx web server is successfully installed and
        working. Further configuration is required.



        For online documentation and support please refer to
        nginx.org.

        Commercial support is available at
        nginx.com.



        Thank you for using nginx.




        擴縮應(yīng)用

        剛剛已經(jīng)成功訪問到 nginx 應(yīng)用,但有些時候,可能需要多個 nginx 來橫向擴展,那么在 Kubernetes 中怎么實現(xiàn)呢?

        $ kubectl scale deployment/first-app --replicas=3
        deployment "first-app" scaled

        再查看當前的 pod,可以看到當前已經(jīng)有了 3 個 first-app 了。

        $ kubectl get pod
        NAME READY STATUS RESTARTS AGE
        first-app-6db44b474-6vlrj 1/1 Running 0 39s
        first-app-6db44b474-dbbtp 1/1 Running 0 19m
        first-app-6db44b474-gjzgg 1/1 Running 0 39s

        如果覺得 3 個太浪費資源了,想減少 pod 的數(shù)量,那么可以使用同樣的命令,把 replicas 參數(shù)的值改為需要的值就可以了。

        更新應(yīng)用

        最常用的就是更新鏡像。之前使用的是 docker hub 上最新的 nginx,現(xiàn)在用 1.10.3 這個比較老的版本來替代最新版本。先查看當前使用的 nginx 版本。這里有一個很簡單的方法,訪問一個不存在的頁面,如下:

        $ curl 172.17.0.77:30491/abc

        404 Not Found

        404 Not Found



        nginx/1.13.9



        當前使用的 nginx 版本是 1.13.9,接下來進行更新操作:

        $ kubectl set image deployment/first-app first-app=nginx:1.10
        deployment "first-app" image updated

        再查看當前 nginx 的版本:

         $ curl 172.17.0.77:30491/abc

        404 Not Found

        404 Not Found



        nginx/1.10.3



        nginx 版本已經(jīng)成功更新為 1.10.3。

        刪除應(yīng)用

        最后來講講刪除應(yīng)用,之前是通過 deployment 來創(chuàng)建應(yīng)用,所以只需要刪除 deployment 就可以刪除對應(yīng)的應(yīng)用了。

        $ kubectl delete deployment/first-app
        deployment "first-app" deleted

        再查看一下當前的 pod:

        $ kubectl get pod
        No resources found.

        所有的 pod 都已經(jīng)刪除了。

        END/往期推薦:




        1.微服務(wù)實戰(zhàn)系列

        2.springboot從入門到精通

        3.java入門到精通

        4.中間件等

        5.程序人生

        更多信息請關(guān)注公眾號:「軟件老王」,關(guān)注不迷路,軟件老王和他的IT朋友們,分享一些他們的技術(shù)見解和生活故事。

        瀏覽 58
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

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

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            操女人的bb | 一二三四在线视频 | 黄色小说五月天 | 航空裸体服务特级毛片 | 囯产精品久久久久久久久久辛辛 | 99这里都是精品 | 免费女人18**a级毛片视频 | 丁香婷婷在线 | 伊人久久综合影院 | 国产精品不卡在线 |