HOME 首頁
SERVICE 服務產(chǎn)品
XINMEITI 新媒體代運營
CASE 服務案例
NEWS 熱點資訊
ABOUT 關于我們
CONTACT 聯(lián)系我們
創(chuàng)意嶺
讓品牌有溫度、有情感
專注品牌策劃15年

    kubernetes原理(kubernetes 原理)

    發(fā)布時間:2023-04-14 07:01:19     稿源: 創(chuàng)意嶺    閱讀: 112        

    大家好!今天讓創(chuàng)意嶺的小編來大家介紹下關于kubernetes原理的問題,以下是小編對此問題的歸納整理,讓我們一起來看看吧。

    開始之前先推薦一個非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計劃、工作報告、論文、代碼、作文、做題和對話答疑等等

    只需要輸入關鍵詞,就能返回你想要的內(nèi)容,越精準,寫出的就越詳細,有微信小程序端、在線網(wǎng)頁版、PC客戶端

    官網(wǎng):https://ai.de1919.com。

    創(chuàng)意嶺作為行業(yè)內(nèi)優(yōu)秀的企業(yè),服務客戶遍布全球各地,如需了解SEO相關業(yè)務請撥打電話175-8598-2043,或添加微信:1454722008

    本文目錄:

    kubernetes原理(kubernetes 原理)

    一、簡述kube-proxy iptables的原理?

    Kubernetes從1.2版本開始,將iptables作為kube-proxy的默認模式。iptables模式下的kube-proxy不再起到Proxy的作用,其核心功能:通過API Server的Watch接口實時跟蹤Service與Endpoint的變更信息,并更新對應的iptables規(guī)則,Client的請求流量則通過iptables的NAT機制“直接路由”到目標Pod。我推薦你去看看時速云,他們是一家全棧云原生技術服務提供商,提供云原生應用及數(shù)據(jù)平臺產(chǎn)品,其中涵蓋容器云PaaS、DevOps、微服務治理、服務網(wǎng)格、API網(wǎng)關等。大家可以去體驗一下。如果我的回答能夠?qū)δ袔椭脑?,求給大大的贊。

    二、使用Kubernetes管理Kubernetes集群

    Kubernetes 1.0版本發(fā)布已經(jīng)過去了4年,繁榮的社區(qū)和廣泛用戶群體使得Kubernetes的成熟度超出了預期,大部分用戶常用的功能性需求都得到了滿足。但是,根據(jù)CNCF的調(diào)查,很多非功能性的需求尚待完善,比如,用戶所面臨的最困難的挑戰(zhàn)之一仍然是管理多個Kubernetes集群的生命周期,包括集群部署、升級和變更等。Kubernetes社區(qū)未來的一個階段的重點就是幫助用戶更好的部署和維護Kubernetes,使其無縫的融入和對接現(xiàn)有的企業(yè)環(huán)境。

    Kubernetes現(xiàn)在已經(jīng)可以支持超大規(guī)模的集群,單集群可以支撐5000個節(jié)點,15萬個POD。但是由于大規(guī)模集群的維護和調(diào)度過于復雜,比如,有些企業(yè)應用需要分級,不同級別的應用需要使用不同的資源池,有些業(yè)務應用需要帶有GPU支持的集群,有些應用需要Windows container的支持,甚至不同應用依賴不同版本的Kubernetes,所以在企業(yè)環(huán)境中通過多集群的方式實現(xiàn)多租戶和資源調(diào)度已經(jīng)成為了最佳實踐。

    當你需要管理多個集群,每個集群都有不同的規(guī)模、版本、升級計劃、硬件資源池,自動化的管理工具和理念就必不可少了。

    我們知道,Kubernetes的很多原則和理念改變了傳統(tǒng)資源管理和交付的模式,其中聲明式API和自愈機制的引入提升了用戶部署和管理應用的效率。它允許用戶通過yaml文件描述對象部署的期望狀態(tài)(比如部署3個POD實例),并持續(xù)觀測當前狀態(tài),如果和預期不一致(只剩2個POD實例),就通過控制器使其達到期望狀態(tài)(添加1個POD實例,使總數(shù)為預期的3個)。

    既然這種模式如此的成功,能不能把它適用到更多的場景中呢?比如,能不能用Kubernetes的思想來管理Kubernetes的集群呢?

    實際上社區(qū)中已經(jīng)有人這么做了,Cluster API 就是在這個背景下,由google,vmware等公司共同發(fā)起的項目。 https://github.com/kubernetes-sigs/cluster-api

    Cluster API是一個Kubernetes項目,它將聲明式的、Kubernetes風格的API用于集群創(chuàng)建、配置和管理。通過利用Kubernetes API的結構化和可擴展的特性,構建更高級別的云環(huán)境無關的工具,聲明式的、自動化的改善用戶體驗。

    當前,Cluster API已經(jīng)可以支持AWS, Azure, GCP, Openstack, VMware, Bare metal等絕大多數(shù)基礎設施環(huán)境。在目前的版本中,該API包含五個customresourcedefinition(CRD):Cluster、Machine、MachineSet、MachineDeployment和MachineClass。

    將這幾個CRD和大家熟悉的Kubernetes的對象類比一下,

    說明:以下的幾個CRD yaml文件都可以自動生成模板,在創(chuàng)建cluster的時候,并不都是必須的。

    Cluster這個CRD是全新的Kubernetes集群的抽象。它可以定義Kubernetes集群配置,例如POD網(wǎng)絡CIDR和service網(wǎng)絡CIDR,以及集群是運行在何種云平臺之上。

    Machine類似于POD,它負責描述單個Kubernetes節(jié)點(虛擬機)。只需很少的配置(主要是Kubernetes版本信息),其他配置通過嵌入云環(huán)境相關的ProviderSpec。

    MachineDeloyment 類似于Deployment。它允許對節(jié)點配置進行更新,定義工作節(jié)點的升級方式(rolling,recreate),它還允許回滾到以前的某個版本的配置。用戶可以修改yaml文件來動態(tài)調(diào)整集群節(jié)點的數(shù)量。

    MachineSet類似于ReplicaSet,管理一組Machine的擴縮容。與ReplicaSet類似,實踐中盡量使用MachineDeloyment來管理一組資源的部署而不應該直接操作ReplicaSet。

    MachineClass和StorageClass很像,定義Machine的規(guī)格。所有節(jié)點都會從指定規(guī)格的虛擬機模板中clone出來。

    Cluster API的工作原理非常簡單,用戶通過以上的幾個CRD定義需要的Kubernetes集群的規(guī)格。通過熟悉的kubectl apply命令把yaml傳遞給management cluster,managerment cluster會根據(jù)需要驅(qū)動不同的云平臺創(chuàng)建虛擬機安裝部署Kubernetes binary,并交付集群給用戶。

    那么management cluster是怎么來的?是否后續(xù)的運維工作也需要依賴它呢?實際上,初始的management cluster一般是一個單機版的Kubernetes,比如minikube或者Kind。當置備出第一個workload cluster以后,可以將management cluster的功能轉(zhuǎn)移到任何一個workload cluster,這樣后續(xù)的工作就不在依賴單機版的Kubernetes。一個有意思的地方是,你會發(fā)現(xiàn),某一個workload cluster同時也是management cluster,在管理和監(jiān)控著它自己。

    下面是一個在vsphere環(huán)境使用Cluster API的例子。

    首先,使用Cluster API項目提供的工具生成一組部署的yaml模板。

    根據(jù)需求調(diào)整yaml文件中的內(nèi)容,比如虛擬機模板的名稱、集群節(jié)點的數(shù)量等。

    然后依次創(chuàng)建這些資源對象,

    這時可以在vcenter中看到Kubernetes集群的虛擬機陸續(xù)被創(chuàng)建出來。

    大約幾分鐘后,workload cluster就可以交付給用戶使用了。

    我們可以關閉或者刪除一個workload cluster的節(jié)點的虛擬機來模擬故障場景。Cluster API會自動檢測所有節(jié)點的狀態(tài),并且驅(qū)動vsphere重新生成一個虛擬機進行替代,使得Kubernetes集群的狀態(tài)與預期描述的一致。像不像Kubernetes管理POD的功能?

    以上實驗的具體的細節(jié)可參考官方文檔, https://github.com/kubernetes-sigs/cluster-api-provider-vsphere/blob/master/docs/getting_started.md

    解決多集群生命周期的管理只是企業(yè)環(huán)境使用Kubernetes的第一步,后續(xù)還有什么問題是需要考慮的?

    三、基于Kubernetes的持續(xù)部署方案

    文章轉(zhuǎn)載自Docker

    方案概述

    本技術方案為基于Kubernetes為核心的持續(xù)部署(下文簡稱CD)方案,可以滿足開發(fā)方的程序級日志查看分析,運維方的快速擴容與日常運維分析,并且可以保證用戶的服務體驗。并且整套放在可以在資源利用率上進一步提升,在不降低服務可靠性的前提下降低資源使用成本。

    使用場景分析

    本方案適用于以Tomcat為容器的JavaWeb項目的持續(xù)部署過程,在Kubernetes方案中,所有的Node節(jié)點均采用統(tǒng)一配置,根據(jù)業(yè)務環(huán)境的需求進行節(jié)點數(shù)量的控制。

    技術架構與選型

    Kubernetes集群部署模式:Stacked etcd topology

    Kubernetes的安裝使用kubeadm安裝為高可用集群,并選用Stacked etcd topology 模式。

    詳情參考https://kubernetes.io/docs/setup/independent/high-availability/。

    Kubernetes生態(tài)技術選型:網(wǎng)絡層面選型Weave

    容器網(wǎng)絡解決方案。Weave創(chuàng)建的虛擬網(wǎng)絡可以將部署在多個主機上的容器連接起來。對容器來說,Weave就像一個巨大的以太網(wǎng)交換機,所有容器都被接入這個交換機,容器可以直接通信,無需 NAT 和端口映射。

    原理詳解:http://dockone.io/article/262

    Kubernetes生態(tài)技術選型:對外服務選型NodePort

    Kubernetes目前支持NodePort、LoadBanlace、Ingress三種對外提供服務的模式,其中LoadBanlace需要云平臺的支持,阿里云提供了解決方案,但騰訊云未找到,Ingress技術為新出技術。整體評估采用NodePort方式更為靈活,每個服務一個唯一的對外IP地址,并且使用Nginx進行負載均衡(采用Nginx主要為日志分析)。

    介紹與使用方法:https://kubernetes.io/docs/concepts/services-networking/service/#nodeport。

    持續(xù)部署過程

    各組件業(yè)務配置

    Kubernetes業(yè)務配置

    命名空間

    在業(yè)務上,Kubernetes默認配置兩套Namespace,分別為Master存放正式環(huán)境,Develop配置測試環(huán)境。

    對外端口

    正式環(huán)境Web端口以32001開始,測試環(huán)境以31001開始,且一一對應。

    Master數(shù)據(jù)目錄

    K8s-Master下的data目錄下為k8s-cd-config, k8s-cd-config目錄存放各業(yè)務的yaml配置,二級目錄為域名,三級目錄劃分Master(正式),Develop(測試),目錄下以 版本號-構建ID-GITID.yaml 命名文件,時間最后一個即為當前線上的使用配置文件,為了運維方便,在二級目錄同級內(nèi),生成一個軟鏈連接到最新的正式與測試配置文件。注意,k8s-cd-config僅在其中一臺Master中存在。

    Node數(shù)據(jù)目錄

    節(jié)點下的/data一級目錄下分Filebeat、Dockerlibs、Nodelogs,其中Dockerlibs存放Docker相關數(shù)據(jù),Nodelogs目錄通過volume的方式掛載入Kubernetes的Pod, Nodelogs下分Develop與Master目錄,區(qū)分正式環(huán)境與測試環(huán)境,每個Master與Develop下分為accesslogs、devlogs、tomcatlogs分別存放訪問日志,開發(fā)部日志,Tomcat日志,日志目錄下為項目(域名),域名下為Pod名稱目錄。

    注意事項 : 節(jié)點加入集群后,一定要下載手工下載kubernetes-dashboard-amd64鏡像,防止dashboard所在節(jié)點掛掉以后dashboard無法在其他節(jié)點啟動。

    Harbor業(yè)務配置

    業(yè)務分組

    Harbor重定義其Registry的存儲路徑直接使用docker-compose安裝。template 存放基礎進項,各域名分組存放業(yè)務鏡像。

    鏡像命名

    分組下鏡像以站點域名:版本號-類型-CDGITLAB為名稱,并基于版本號確定不同的站點版本。

    數(shù)據(jù)目錄

    Harbor數(shù)據(jù)目錄統(tǒng)一存放在/data下。

    備份策略

    Harbor默認不設置備份,對于業(yè)務鏡像無需進行備份,每次進行構建即可,對于模板類鏡像,在Jenkins機器上均可以找到,若Harbor出現(xiàn)問題,則直接重建,并將Jenkins上的模板鏡像進行重新push。

    注意:為了業(yè)務的穩(wěn)定性,Harbor由獨立的服務運行(基于Docker),并不運行在Kubernetes內(nèi)。

    Jenkins業(yè)務配置

    數(shù)據(jù)目錄

    Jenkins下的data目錄分為dockerlibs、thinbackups、gitlab-files 、jks-cd-config。

    Dockerlibs存放Docker相關文件,thinbackups存放每日的Jenkins備份,gitlab-files存放構建GitLab的文件(運維可以在此操作pull,push),jks-cd-config為jks構建目錄。

    Jenkins機使用/data/jks-cd-config目錄存放構建內(nèi)容,二級目錄為域名,三級目錄為版本號(以開發(fā)部版本號為準),三級目錄下存放ROOT.war,四級目錄為構建ID_GITID,目錄下存放構建的原始數(shù)據(jù)。

    節(jié)點每天進行images清理工作。

    業(yè)務分組

    Jenkins的分組分為template與各domain,template存放模板,domain以域名的形式存放正式項目:

    新項目由運維手工創(chuàng)建,后續(xù)的秩序構建過程由開發(fā)部調(diào)用API完成。

    構建參數(shù)

    Jenkins構建時,需要傳遞三參數(shù),1:程序版本號,2:類型:apply與delete,3:正式環(huán)境還是測試環(huán)境,正式環(huán)境為Master,測試環(huán)境為Develop,對應Kubernetes的Namespace。

    此部分功能后期將通過開發(fā)部的構建憑條調(diào)用JenkinsAPI實現(xiàn)。

    JenkinsAPI

    APIDoc:https://wiki.jenkins.io/display/JENKINS/Remote+access+API

    Token:https://jingyan.baidu.com/article/0eb457e5dbad8003f0a9056c.html

    備份策略

    Jenins安裝ThinBackup插件,配置每小時進行一次全局備份,且最多保留10份,備份后數(shù)據(jù)傳至異地。

    注意:為了業(yè)務的穩(wěn)定性,Jenkins由獨立的服務運行,并不運行在Kubernetes內(nèi)。

    GitLab業(yè)務配置

    業(yè)務分組

    CD GitLab項目下分兩個組template與各domain,template存放模板文件。例如:

    Git分支

    default下以域名劃分項目,每個項目劃分Master與Develop兩個分支,分別存放正式環(huán)境與測試環(huán)境CD文件。

    CD文件樹

    備份策略

    GitLab使用gitlab-rake gitlab:backup:create進行每日定期備份,并傳送至異地。

    EFK與日志管理

    Elasticsearch

    ES數(shù)據(jù)通過索引僅保留近10天的數(shù)據(jù),每日通過腳本方式進行數(shù)據(jù)刪除。ES的數(shù)據(jù)保存在/data/elasticsearch目錄下。

    Filebeat

    在每個Node節(jié)點啟動一個Filebeat進程,用于日志的采集工作,filebeat分別監(jiān)控:

    其中,tomcatlogs日志需要進行特殊處理,進行多行合并,數(shù)據(jù)寫入ES時,使用processors. Dissect進行目錄名稱截取,并使用域名作為ES的索引使用。

    截取gy. wtype ( master或develop) , ltype(accesslogs 、tomcatlogs、devlogs),domain(xxx.gyyx.cn)。

    Kibana

    Kibana目前我們僅使用其discover節(jié)點,用于日志數(shù)據(jù)的查詢,在配置方面。

    Kibana配置使用“域名-*”方式進行配置,每次新增域名,需要在此進行手工配置。

    Kibana使用discover查看時,默認展示一個域名下所有的日志,可以通過gy.wtype篩選選擇查看測試環(huán)境還是正式環(huán)境,或者通過gy.ltype哪種日志類型。

    容器資源監(jiān)控

    容器資源使用WeaveScope進行資源消耗監(jiān)控。

    福利

    掃描添加我微信,備注“ 姓名+公司職位 ”,加入【 云計算學習交流群 】,和志同道合的朋友們共同打卡學習!

    推薦閱讀:

    喜歡就點擊“好看”吧

    四、09-kubernetes中的域名解析流程

    從Kubernetes 1.11版本開始,Kubernetes集群的DNS服務由CoreDNS提供。CoreDNS是CNCF基金會的一個項目,是用Go語言實現(xiàn)的高性能、插件式、易擴展的DNS服務端。CoreDNS解決了KubeDNS的一些問題,例如dnsmasq的安全漏洞、externalName不能使用stubDomains設置,等等。

    CoreDNS支持自定義DNS記錄及配置upstream DNS Server,可以統(tǒng)一管理Kubernetes基于服務的內(nèi)部DNS和數(shù)據(jù)中心的物理DNS。

    CoreDNS沒有使用多個容器的架構,只用一個容器便實現(xiàn)了KubeDNS內(nèi)3個容器的全部功能。

    從kubernetes官方提供的 coredns.yml 文件中,不難看出coredns服務配置至少需要一個ConfigMap、一個Deployment和一個Service共3個資源對象。ConfigMap coredns 主要配置文件Corefile的內(nèi)容:

    其中主要有二個地方來解析配置

    1、這段配置的意思是cluster.local后綴的域名都是kubernetes內(nèi)部域名,coredns會監(jiān)控service的變化來修改域名的記錄

    2、如果coredns沒有找到dns記錄,則去找 /etc/resolv.conf 中的 nameserver 解析

    接下來使用一個帶有nslookup工具的Pod來驗證DNS服務能否正常工作:

    通過nslookup進行測試。

    查找defaul命名空間存在的ng-deploy-80服務

    如果某個Service屬于不同的命名空間,那么在進行Service查找時,需要補充Namespace的名稱,組合成完整的域名。下面以查找kubernetes-dashboard服務為例,

    眾所周知, DNS 服務器用于將域名轉(zhuǎn)換為 IP (具體為啥要轉(zhuǎn)換建議復習下 7 層網(wǎng)絡模型). Linux 服務器中 DNS 解析配置位于 /etc/resolv.conf , 在 Pod 中也不例外,

    DNS 策略可以逐個 Pod 來設定。當前kubernetes支持這4中DNS 策略

    如果我們不填dnsPolicy, 默認策略就是 ClusterFirst 。

    kubelet 在起 pause 容器的時候,會將其 DNS 解析配置初始化成集群內(nèi)的配置。配置: 它的 nameserver 就是指向 coredns 的

    k8s里面有4種DNS策略, 而coredns使用的DNS策略就是Default, 這個策略的意思就是繼承宿主機上的/etc/resolve.conf, 所以coredns Pod 里面的/etc/resolve.conf 的內(nèi)容就是宿主機上的內(nèi)容。

    在集群中 pod 之間互相用 svc name 訪問的時候,會根據(jù) resolv.conf 文件的 DNS 配置來解析域名,下面來分析具體的過程。

    pod 的 resolv.conf 文件主要有三個部分,分別為 nameserver、search 和 option。而這三個部分可以由 K8s 指定,也可以通過 pod.spec.dnsConfig 字段自定義。

    nameserver

    resolv.conf 文件的第一行 nameserver 指定的是 DNS 服務的 IP,這里就是 coreDNS 的

    clusterIP:

    也就是說所有域名的解析,都要經(jīng)過coreDNS的虛擬IP 10.100.0.2 進行解析, 不論是內(nèi)部域還是外部域名。

    search 域

    resolv.conf 文件的第二行指定的是 DNS search 域。解析域名的時候,將要訪問的域名依次帶入 search 域,進行 DNS 查詢。

    比如我要在剛才那個 pod 中訪問一個域名為 ng-deploy-80的服務,其進行的 DNS 域名查詢的順序是:

    options

    resolv.conf 文件的第三行指定的是其他項,最常見的是 dnots。dnots 指的是如果查詢的域名包含的點 “.” 小于 5,則先走 search 域,再用絕對域名;如果查詢的域名包含點數(shù)大于或等于 5,則先用絕對域名,再走 search 域。K8s 中默認的配置是 5。

    也就是說,如果我訪問的是 a.b.c.e.f.g ,那么域名查找的順序如下:

    通過 svc 訪問

    在 K8s 中,Pod 之間通過 svc 訪問的時候,會經(jīng)過 DNS 域名解析,再拿到 ip 通信。而 K8s 的域名全稱為 "<service-name>.<namespace>.svc.cluster.local",而我們通常只需將 svc name 當成域名就能訪問到 pod,這一點通過上面的域名解析過程并不難理解。

    參考

    (1)K8S落地實踐 之 服務發(fā)現(xiàn)(CoreDNS)

    https://blog.51cto.com/u_12965094/2641238

    (2)自定義 DNS 服務

    https://kubernetes.io/zh/docs/tasks/administer-cluster/dns-custom-nameservers/

    (3)Kubernetes 服務發(fā)現(xiàn)之 coreDNS

    https://juejin.cn/post/6844903965520297991

    (4)Kubernetes 集群 DNS 服務發(fā)現(xiàn)原理

    https://developer.aliyun.com/article/779121

    (5)Kubernetes之服務發(fā)現(xiàn)和域名解析過程分析

    https://www.jianshu.com/p/80ad7ff37744

    以上就是關于kubernetes原理相關問題的回答。希望能幫到你,如有更多相關問題,您也可以聯(lián)系我們的客服進行咨詢,客服也會為您講解更多精彩的知識和內(nèi)容。


    推薦閱讀:

    電商sku數(shù)據(jù)表設計(電商 sku)

    sku銷售分析(sku 銷售)

    商品sku是什么意思(商品SKU是什么意思)

    抖音小店怎么推廣和引流(抖音小店要怎么推廣)

    設計師時裝品牌(設計師時裝品牌推薦)