一 Docker介紹
1.1 docker是什么
??Docker 是一個開源項目, 誕生于 2013 年初,最初是 dotCloud 公司內(nèi)部的一個業(yè)余項目。它基于 Google 公司推出的 Go 語言實現(xiàn)。 項目后來加入了 Linux 基金會,遵從了 Apache 2.0協(xié)議, 項目代碼在 GitHub 上進行維護。Docker 自開源后受到廣泛的關(guān)注和討論,以至于 dotCloud 公司后來都改名為 Docker Inc。Redhat 已經(jīng)在其 RHEL6.5 中集中支持 Docker;Google 也在其 PaaS 產(chǎn)品中廣泛應用。Docker 項目的目標是實現(xiàn)輕量級的操作系統(tǒng)虛擬化解決方案。 Docker 的基礎是 Linux 容( LXC)等技術(shù)。在 LXC 的基礎上 Docker 進行了進一步的封裝, 讓用戶不需要去關(guān)心容器的管理,使得操作更為簡便。用戶操作 Docker 的容器就像操作一個快速輕量級的虛擬機一樣簡單。
官方解釋:
1.2 為什么要用docker
??作為一種新興的虛擬化方式, Docker 跟傳統(tǒng)的虛擬化方式相比具有眾多的優(yōu)勢。首先, Docker 容器的啟動可以在秒級實現(xiàn),這相比傳統(tǒng)的虛擬機方式要快得多。其次,Docker 對系統(tǒng)資源的利用率很高,一臺主機上可以同時運行數(shù)千個 Docker 容器。容器除了運行其中應用外,基本不消耗額外的系統(tǒng)資源,使得應用的性能很高,同時系統(tǒng)的開銷盡量小。傳統(tǒng)虛擬機方式運行 10 個不同的應用就要起 10 個虛擬機,而 Docker 只需要啟動 10 個隔離的應用即可。具體說來, Docker 在如下幾個方面具有較大的優(yōu)勢:
- 更快速的交付和部署:對開發(fā)和運維( devop)人員來說,最希望的就是一次創(chuàng)建或配置,可以在任意地方正常運行。開發(fā)者可以使用一個標準的鏡像來構(gòu)建一套開發(fā)容器,開發(fā)完成之后, 運維人員可以直接使用這個容器來部署代碼。 Docker 可以快速創(chuàng)建容器,快速迭代應用程序,并讓整個過程全程可見,使團隊中的其他成員更容易理解應用程序是如何創(chuàng)建和工作的。Docker 容器很輕很快!容器的啟動時間是秒級的,大量地節(jié)約開發(fā)、 測試、部署的時間。
- 更高效的虛擬化: Docker 容器的運行不需要額外的 hypervisor 支持,它是內(nèi)核級的虛擬化,因此可以實現(xiàn)更高的性能和效率。
- 更輕松的遷移和擴展 :Docker 容器幾乎可以在任意的平臺上運行,包括物理機、虛擬機、公有云、私有云、個人電腦、服務器等。 這種兼容性可以讓用戶把一個應用程序從一個平臺直接遷移到另外一個。
- 更簡單的管理 :使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分發(fā)和更新,從而實現(xiàn)自動化并且高效的管理。
對比傳統(tǒng)的虛擬機docker的好處:
1.3 docker的基本概念
- 鏡像(Image)
??鏡像,從認識上簡單的來說,就是面向?qū)ο笾械念?,相當于一個模板。從本質(zhì)上來說,鏡像相當于一個文件系統(tǒng)。Docker 鏡像是一個特殊的文件系統(tǒng),除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些為運行時準備的一些配置參數(shù)(如匿名卷、環(huán)境變量、用戶等)。鏡像不包含任何動態(tài)數(shù)據(jù),其內(nèi)容在構(gòu)建之后也不會被改變。
2.容器(Container)
??容器,從認識上來說,就是類創(chuàng)建的實例,就是依據(jù)鏡像這個模板創(chuàng)建出來的實體。容器的實質(zhì)是進程,但與直接在宿主執(zhí)行的進程不同,容器進程運行于屬于自己的獨立的命名空間。因此容器可以擁有自己的root 文件系統(tǒng)、自己的網(wǎng)絡配置、自己的進程空間,甚至自己的用戶ID 空間。容器內(nèi)的進程是運行在一個隔離的環(huán)境里,使用起來,就好像是在一個獨立于宿主的系統(tǒng)下操作一樣。這種特性使得容器封裝的應用比直接在宿主運行更加安全。
3.倉庫(Repository)
??倉庫是集中存放鏡像文件的場所。有時候會把倉庫和倉庫注冊服務器( Registry)混為一談,并不嚴格區(qū)分。 實際上,倉庫注冊服務器上往往存放著多個倉庫,每個倉庫中又包含了多個鏡像,每個鏡像有不同的標簽( tag)。倉庫分為公開倉庫( Public)和私有倉庫( Private) 兩種形式。
最大的公開倉庫是 Docker Hub(https://hub.docker.com)存放了數(shù)量龐大的鏡像供用戶下載。 國內(nèi)的公開倉庫包括 Docker Pool(http://dockerpool.com) 等,可以提供大陸用戶更穩(wěn)定快速的訪問。
當然,用戶也可以在本地網(wǎng)絡內(nèi)創(chuàng)建一個私有倉庫。當用戶創(chuàng)建了自己的鏡像之后就可以使用 push 命令將它上傳到公有或者私有倉庫,這樣下次在另外一臺機器上使用這個鏡像時候,只需要從倉庫上 pull 下來就可以了。
1.4 docker的安裝
- centos(7以上)
yum install docker
systemctl enable docker
systemctl start docker
- Ubuntu
apt-get update
apt-get install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository “deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable”
apt-get update
apt-cache madison docker-ce
#安裝指定版
#apt-get install docker-ce=17.12.0ce-0ubuntu
#安裝最新版
apt-get install docker-ce
systemctl enable docker
systemctl start docker
1.5 docker的基礎命令
1,docker info: 查看當前docker的所有配置信息
2,docker pull [鏡像名稱]: 遠程拉取image. eg: [docker pull library/hello-world -等同于-> docker pull hello-world]其中l(wèi)ibrary是image所在的組,docker官方的
鏡像都在這個組內(nèi).docker pull hello-world等同于 docker pull hello-world.
拉取DockPool鏡像: docker pull dl.dockerpool.com:5000/{IMAGE_NAME}:{TAG}
3,docker build 創(chuàng)建image
docker build -f cenosAddVimDockerfile -t mycentos:1.0 .
4,docker images: 列出本地所有的image
docker load -i 鏡像名稱.tar
docker tag [鏡像id] [新鏡像名稱]:[新鏡像標簽]
5,docker run: 運行容器container
docker run [可選參數(shù)] image 命令 #啟動容器(無鏡像會先下載鏡像)
#參數(shù)說明
--name = "Name" 容器名字
-c 后面跟待完成的命令
-d 以后臺方式運行并且返回ID,啟動守護進程式容器
-i 使用交互方式運行容器,通常與t同時使用
-t 為容器重新分配一個偽輸入終端。也即啟動交互式容器
-p 指定容器端口 -p 容器端口:物理機端口 映射端口
-P 隨機指定端口
-v 給容器掛載存儲卷
-v 容器內(nèi)路徑 #匿名掛在
-v 卷名:容器內(nèi)路徑 #具名掛在
-v /宿主機路徑:容器內(nèi)路徑 # 指定路徑掛載
-v /宿主機路徑:容器內(nèi)路徑:ro # 指定路徑掛載,并設置只讀權(quán)限
-v /宿主機路徑:容器內(nèi)路徑:rw # 指定路徑掛載,并設置讀寫權(quán)限默認是rw
第一種:交互方式創(chuàng)建容器,退出后容器關(guān)閉: docker run -it 鏡像名稱:標簽 /bin/bash
第二種:守護進程方式創(chuàng)建容器: docker run -id 鏡像名稱:標簽.
通過這種方式創(chuàng)建的容器,我們不會直接進入到容器界面,而是在后臺運行了容器,如果我們需要進去,則還需要一個命令。
docker exec -it containerID /bin/bash: 通過這種方式運行的容器,當使用exit退出時,容器不會停止,需要停止輸入:docker stop containerID
就可以停止容器,只有停止的容器才能刪除.
docker attach containerID:對于正在運行的容器,使用該命令可以進入容器,輸入exti會停止容器
docker rename 原容器名 新容器名
6,docker ps: 列出當前運行的容器container
docker container ls: 列出本機正在運行的容器
docker container ls -all: 列出本機所有容器,包括終止運行的容器
7,docker [rm | stop | restart] [容器id]: 刪除已經(jīng)結(jié)束的容器container => 等價于:docker container rm [containerID]:
8,docker cp [當前文件的] [容器id:/容器下面的文件目錄] 在本地和容器之間拷貝文件
9,docker commit -m [提示信息] [容器id] [新鏡像名稱]: 保存改動生成新的image
10,docker rmi 刪除image
1.6 docker私有倉庫搭建
點擊參考地址
1.7 DockerFile
??Dockerfile 是一個由一堆命令+參數(shù)構(gòu)成的腳本,使用 docker build 即可執(zhí)行腳本構(gòu)建鏡像,自動的去做一些事,主要用于進行持續(xù)集成。
具體命令如下:
1.FROM:
1.FROM指定一個基礎鏡像, 一般情況下一個可用的 Dockerfile一定是FROM為第一個指令。至于image則可以是任何合理存在的image鏡像。
2.FROM 一定是首個非注釋指令 Dockerfile。
3.FROM 可以在一個 Dockerfile 中出現(xiàn)多次,以便于創(chuàng)建混合的images。
4.如果沒有指定 tag ,latest 將會被指定為要使用的基礎鏡像版本
2.MAINTAINER | LABEL:
這里是用于指定鏡像制作者的信息。(已被棄用,目前是使用LABEL代替)
LABEL 指令用來給鏡像添加一些元數(shù)據(jù)(metadata),以鍵值對的形式,語法格式如下:
LABEL <key>=<value> <key>=<value> <key>=<value> ...
比如我們可以添加鏡像的作者:
LABEL org.opencontainers.image.authors="runoob"
3.RUN:
用來修改鏡像的命令,常用來安裝庫、程序以及配置程序。一條RUN指令執(zhí)行完畢后,會在當前鏡像上創(chuàng)建一個新的鏡像層,接下來對的指令會
1在新的鏡像上繼續(xù)執(zhí)行。
4.CMD: 用來設置啟動容器時默認運行的命令。類似于 RUN 指令,用于運行程序(只有最后一個會生效,可被替代)
5.EXPOSE: 用來指明容器內(nèi)進程對外開放的端口,多個端口之間使用空格隔開。
6.ENV:#設置環(huán)境變量,定義了環(huán)境變量,那么在后續(xù)的指令中,就可以使用這個環(huán)境變量
1.ENV指令可以用于為docker容器設置環(huán)境變量
2.ENV設置的環(huán)境變量,可以使用 docker inspect命令來查看。同時還可以使用docker run --env =來修改環(huán)境變量。。
7.ADD: # 步驟:tomcat鏡像,這個tomcat壓縮包。添加內(nèi)容。
ADD 將文件從路徑 復制添加到容器內(nèi)部路徑 。向新鏡像中添加文件,這個文件可以是一個主機文件,也可以是一個網(wǎng)絡文件,
也可以使一個文件夾。
第一個參數(shù):源文件(夾),如果是相對路徑,它必須是相對于Dockerfile所在目錄的相對路徑。如果是URL,會先下載下來,再添加到鏡像里去。
第二個參數(shù):目標路徑。如果源文件是主機上zip或者tar形式的壓縮文件,Docker會先解壓縮,然后將文件添加到鏡像的指定位置。如果源文件是一個通過URL指定的網(wǎng)絡壓縮文件,則不會解壓。
8.COPY: COPY 將文件從路徑 復制添加到容器內(nèi)部路徑。必須是想對于源文件夾的一個文件或目錄,也可以是一個遠程的url,
是目標容器中的絕對路徑。
9.VOLUME: 創(chuàng)建一個可以從本地主機或其他容器掛載的掛載點,一般用來存放數(shù)據(jù)庫和需要保持的數(shù)據(jù)等。
10.USER: 用于指定執(zhí)行后續(xù)命令的用戶和用戶組,這邊只是切換后續(xù)命令執(zhí)行的用戶(用戶和用戶組必須提前已經(jīng)存在)。
11.WORKDIR: 為接下來執(zhí)行的指令指定一個新的工作目錄,這個目錄可以使絕對目錄,也可以是相對目錄
12.ENTRYPOINT: 類似于 CMD 指令,但其不會被 docker run 的命令行參數(shù)指定的指令所覆蓋,會追加命令。
13.ONBUILD: 當構(gòu)建一個被繼承Dokcerfile,就會運行ONBUILD的指令。出發(fā)執(zhí)行。
注意:CMD類似于 RUN 指令,用于運行程序,但二者運行的時間點不同:
CMD 在docker run 時運行。
RUN 是在 docker build。
作用:為啟動的容器指定默認要運行的程序,程序運行結(jié)束,容器也就結(jié)束。
CMD 指令指定的程序可被 docker run 命令行參數(shù)中指定要運行的程序所覆蓋。
如果 Dockerfile 中如果存在多個 CMD 指令,僅最后一個生效。
二 Kubernetes介紹
2.1 Kubernetes是什么
??Kubernetes(通常稱為K8s,K8s是將8個字母“ubernete”替換為“8”的縮寫)是一個完備的分布式系統(tǒng)支撐平臺。Kubernetes具有完備的集群管理能力,包括多層次的安全防護和準入機制/多租戶應用支撐能力、透明的服務注冊和服務發(fā)現(xiàn)機制、內(nèi)建智能負載均衡器、強大的故障發(fā)現(xiàn)和自我修復功能、服務滾動升級和在線擴容能力、可擴展的資源自動調(diào)度機制,以及多粒度的資源配額管理能力。同時kubernetes提供了完善的管理工具,這些工具覆蓋了包括開發(fā)、測試部署、運維監(jiān)控在內(nèi)的各個環(huán)節(jié);因此kubernetes是一個全新的基于容器技術(shù)的分布式架構(gòu)解決方案,并且是一個一站式的完備的分布式系統(tǒng)開發(fā)和支撐平臺。
具體架構(gòu)如上圖所示,下面來詳細介紹一下各個模塊的功能
2.2 Master介紹
??Kubernetes 里的Master指的是集群控制節(jié)點,每個Kubernetes集群里需要有一個Master節(jié)點來負責整個集群的管理和控制,基本上Kubernetes所有的控制命令都發(fā)給它,它負責具體的執(zhí)行過程,我們后面執(zhí)行的所有命令基本上都是在Master節(jié)點上運行的。如果Master宕機或不可用,那么集群內(nèi)容器的管理都將失效master節(jié)點上運行一些關(guān)鍵進程:
- k8s API server(kube-apiserver):提供了HTTP Rest接口的關(guān)鍵服務進程,是所有資源的增刪改查的唯一入口,也是集群集群控制的入口進程。kubectl的命令會調(diào)用到api server,來實現(xiàn)資源的增刪查改。
- kube-controller-manager:k8s所有資源對象的自動化控制中心。
- kube-scheduler:調(diào)度客戶端操作請求,選擇合適的Node節(jié)點運行資源,例如:pod調(diào)度進程。
-
etcd服務:k8s里所有資源對象的數(shù)據(jù)全部是保存在etcd中的,etcd是一個高可用的鍵值存儲系統(tǒng),主要用于共享配置和服務發(fā)現(xiàn)。
2.3 Node介紹
??除了Master,集群中其他機器被稱為Node節(jié)點,每個Node都會被Master分配一些工作負載docker容器,當某個Node宕機時,其上的工作負載會被Master自動轉(zhuǎn)移到其他節(jié)點上去。
每個Node節(jié)點上都運行著以下一組關(guān)鍵進程:
- kubelet:負責Pod對應容器的創(chuàng)建、停止等任務,同時與Master節(jié)點密切協(xié)作,實現(xiàn)集群管理的基本功能。
- kube-proxy:實現(xiàn)Kubernetes Service的通信與負載均衡機制的重要組件。
- Docker Engine(Docker):Docker引擎,負責本機的容器創(chuàng)建和管理工作。
??查看當前nodes:kubectl get nodes
然后通過下面命令查看某個node的詳細信息:kubectl describe node <node_name>
2.4 Kubernetes 中Master與Node工作內(nèi)容
??在集群管理方面,Kubernets將集群中的機器劃分為一個Master節(jié)點和一群工作節(jié)點(Node),其中,在Master節(jié)點上運行著集群管理相關(guān)的一組進程kube-apiserver、kube-controller-manager和kube-scheduler,這些進程實現(xiàn)了整個集群的資源管理、Pod調(diào)度、彈性收縮、安全控制、系統(tǒng)監(jiān)控和糾錯等管理功能,并且都是全自動完成的。Node作為集群中的工作節(jié)點,運行真正的應用程序,在Node上Kubernetes管理的最小運行單元是Pod。Node上運行著Kubernetes的kubelet、kube-proxy服務進程,這些服務進程負責Pod創(chuàng)建、啟動、監(jiān)控、重啟、銷毀、以及實現(xiàn)軟件模式的負載均衡
2.5 Pod介紹
??Pod是kubernetes最重要也最基本的概念,如圖所示是Pod的組成示意圖,我們看到每個Pod都有一個特殊的被稱為“根容器”的Pause容器對應的鏡像屬于Kubernetes的平臺的一部分,除了Pause容器,每個Pod還包含一個或多個緊密相關(guān)的用戶業(yè)務容器。
??每個pod由一個根容器的pause容器,其他是業(yè)務容器。k8s為每個pod分配了唯一的IP地址,一個pod里的多個容器共享pod IP。
??pod其實有兩種類型:普通的pod和靜態(tài)pod,后者比較特殊,它并不存放在etcd存儲中,而是存放在某個具體的Node上的一個具體文件中,并且只在此Node上啟動運行。而普通的pod一旦被創(chuàng)建,就會被放入etcd中存儲。隨后被master調(diào)度到某個具體的Node上并進行綁定,隨后該pod被對應的Node上的kubelet進程實例化成一組相關(guān)的docker容器并啟動起來。
??每個pod都可以對其使用的服務器上的計算資源設置限額,當前可以設置限額的源有CPU和memory兩種。其中CPU的資源單位為CPU的數(shù)量。一般而言,一個CPU的配額已經(jīng)算是相當大的一個資源配額,所以在k8s中,通常以千分之一的CPU配額為最小單位,以m來表示,通常一個容器的CPU配額為100-300m,即占用0.1-0.3個CPU。這個配額是個絕對值,不是占比。
??在k8s中,一個計算資源進行配額限定需要設定兩個參數(shù):requests,資源的最小申請量,系統(tǒng)必須滿足要求
2.6 Label
??一個label是一個key=value的鍵值組合,然后可以通過label selector(標簽選擇器)查詢和篩選擁有某些label的資源對象。(Label 相當于我們熟悉的標簽,給某個資源對象定義一個Label,就相當于給它打了一個標簽,隨后可以通過Label Selector 標簽選擇器 查詢和篩選有某些Label的資源對象。Kubernetes通過這種方式實現(xiàn)了類似SQL的簡單又通用的對象查詢機制)。
label的重要使用場景:
??kube-controller進程通過資源對象RC上定義的label selector來篩選要監(jiān)控的pod的數(shù)量,從而實現(xiàn)全自動控制流程。
kube-proxy進程通過service的label selector來選擇對應的pod,自動建立起每個service到對應pod的請求轉(zhuǎn)發(fā)路由表。從而實現(xiàn)service的智能負載均衡機制。
2.7 RC(Replication Controller)
?&emsp當我們定義了一個RC并提交到Kubernetes集群中以后,Master節(jié)點上的Controller Manager組件就得到通知,定期巡檢系統(tǒng)中當前存活的目標Pod,并確保目標Pod實力的數(shù)量剛好等于此RC的期望值,如果有過多的Pod副本在運行,系統(tǒng)就會停掉一些Pod,否則系統(tǒng)就會再自動創(chuàng)建一些Pod。 可以說,通過RC,Kubernetes實現(xiàn)了用戶應用集群的高可用性,并大大減少了傳統(tǒng)IT需要手動的工作。RC定義了如下
- Pod期待的副本數(shù)(replicas)
- 用于篩選目標Pod的Label Seletcor(標簽選擇器)
- 當Pod的副本小于預期(replicas)時,用于創(chuàng)建新Pod的Pod模板(template)
刪除RC并不會影響通過該RC已創(chuàng)建號的Pod。為了刪除所有Pod,可以設置replicas的值為0,然后更新該RC。另外,kubectl提供了stop和delete命令來一次性刪除RC和RC控制的全部Pod
2.8 HPA(horizontal Pod Authosacler Pod橫向自動擴容)
通過手動執(zhí)行kubectl scale命令,可以通過RC實現(xiàn)pod擴容。HPA,pod橫向自動擴容,實現(xiàn)原理是通過追蹤分析RC控制的所有目標Pod的負載變化情況,來確定是否需要針對性地挑戰(zhàn)目標pod的副本數(shù)。有兩種方式作為pod負載的度量指標。
- CPU utilization percentage:是一個算術(shù)平均值,目標pod所有副本自身的CPU利用率的平均值。一個Pod自身的CPU利用率是該Pod當前CPU使用量除以它的Pod request的值。比如當我們定義一個Pod的pod request為0.4,而當前pod的cpu使用量為0.2,則使用率為50%。如此可以得出一個平均值,如果某一個時刻CPU utilization percentage超過80%,則表示當前副本數(shù)不夠,需要進行擴容.
- 應用程序自定義的度量指標,比如服務在每秒內(nèi)的相應的請求數(shù)。
2.9 Service
Service是Kubernetes里最核心的資源對象之一,Service定義了一個服務的訪問入口地址,前端的應用(Pod)通過這個入口地址訪問其背后的一組由Pod副本組成的集群實力。 Service與其后端Pod副本集群之間則是通過Label Selector來實現(xiàn)"無縫對接"。而RC的作用實際上是保證Service 的服務能力和服務質(zhì)量處于預期的標準。
每個pod會被分配一個獨立的IP地址,也就是每個pod都提供一個獨立的endpoint(IP+port)以被訪問,那多個pod如何被客戶端訪問呢,k8s通過運行在每個Node上的kube-proxy進程,負責將對service的請求轉(zhuǎn)發(fā)到后端某個pod實例上,也就實現(xiàn)了類似負載均衡器的功能,至于具體轉(zhuǎn)發(fā)到哪個pod,則由負載均衡器的算法所決定。并且service不是共用一個負載均衡器的IP地址,而是每一個service分配了一個全局唯一的虛擬IP,這樣每個服務就變成了具有唯一IP的通信節(jié)點,服務調(diào)用也就變成了最為基礎的TCP通信問題。
pod的Endpoint地址會隨著Pod的銷毀和重新創(chuàng)建而發(fā)生改變,因為新的Pod地址與之前的舊的Pod不同。而Service一旦被創(chuàng)建,Kubernetes就會自動為它分配一個可用的Cluster IP,而且在Service的整個聲明周期內(nèi),它的Cluster IP不會發(fā)生改變。所以只要將Service的name與Service的Cluster IP地址做一個DNS域名映射即可解決問題。
k8s的服務發(fā)現(xiàn)機制:每個service都有一個唯一的cluster IP以及唯一的名字,而名字是由開發(fā)者自己定義的,部署的時候也沒必要改變,所以完全可以固定在配置中,接下來的問題 就是如何通過service的名字找到對應的cluster IP。
外部系統(tǒng)訪問service的問題:
k8s中有三種IP:
- Node IP:node節(jié)點的IP地址
- Pod IP:pod的IP地址
- cluster IP:service IP
首先,Node IP是k8s集群中每個節(jié)點的物理網(wǎng)卡的IP地址,這是一個真實存在的物理網(wǎng)絡,所有屬于這個網(wǎng)絡的服務器之間都能直接通信,不管屬不屬于k8s集群。這也表明了k8s集群之外的節(jié)點訪問k8s集群之內(nèi)的某個節(jié)點后者TCP/IP服務的時候,必須要通過Node IP通信。
其次,pod IP是每個Pod的IP地址,它是根據(jù)docker網(wǎng)橋的IP地址段進行分配的,通常是一個虛擬的二層網(wǎng)絡,因此不同pod之間的通信就是通過Pod IP所在的虛擬二層網(wǎng)絡進行通信的。而真實的TCP/IP流量則是通過Node IP所在的物理網(wǎng)卡流出的。
Cluster IP,它是一個虛擬IP,但更像是一個偽造的IP網(wǎng)絡
- Cluster IP僅僅作用于Kubernetes Service對象,并由Kubernetes管理和分配IP地址(來源于Cluster IP地址池)
- Cluster IP無法被Ping,因為沒有一個"實體網(wǎng)絡對象"來響應
- 在Kubernetes集群內(nèi),Node IP、Pod IP、Cluster IP之間的通信,采用的是Kubernetes自己設計的特殊路由規(guī)則
2.10 Volume 存儲卷
Volume是pod中能夠被多個容器訪問的共同目錄。也就是被定義在pod上,然后被一個pod中的多個容器掛載到具體的文件目錄下,其次,volume與pod生命周期相同,但與容器生命周期不相關(guān),當容器終止或重啟,volume中的數(shù)據(jù)也不會丟失
2.11 namespace命名空間
大多數(shù)情況下用于實現(xiàn)多租戶的資源隔離,namespace通過將集群內(nèi)部的資源對象分配到不同的namespace中,形成邏輯上分組的不同項目、小組,便于不同的分組在共享使用整個集群的資源的同時還能被分別管理。
namespace的定義很簡單,如下所示的yaml定義了名為development的
namespace
apiVersion: v1
kind: Namespace
metadata:
name: development
一旦創(chuàng)建了Namespace,我們在創(chuàng)建資源對象時就可以指定這個資源對象屬于哪個namespace,比如下面,定義了名為busybox的Pod,放入development這個namespace里:
apiVersion: v1
kind: Pod
metadata:
name: busybox
namespace: development
2.12 kubernetes基礎命令
1,kubectl get用來獲取資源信息列表,可用來查看pod是否健康,當前的運行狀態(tài),重啟了幾次,生命周期等,是最常用的命令之一
kubectl get pod: 獲取pod資源列表,默認獲取default命名空間
kubectl get pod -n kube-system: 獲取kube-system命名空間的pod資源列表
kubectl get pod --all-namespaces: 獲取所有命名空間的pod資源列表
kubectl get pod -n kube-system kube-apiserver-k8s-01: 獲取kube-system命名空間中指定的pod:kube-apiserver-k8s-01的信息。當查看某個具體的pod時,必須指明該pod所在的命名空間,像–all-namespaces參數(shù)是不能使用的
kubectl get pod -n kube-system kube-apiserver-k8s-01 -o wide: 獲取kube-system命名空間中指定的pod:kube-apiserver-k8s-01的信息,并且展示更多信息,包括pod ip,所在節(jié)點等信息
kubectl get pod -n kube-system kube-apiserver-k8s-01 -o yaml: 獲取kube-system命名空間中指定的pod:kube-apiserver-k8s-01的信息,并且以yaml格式展示pod詳細信息
kubectl get pod -n kube-system kube-apiserver-k8s-01 -o json: 獲取kube-system命名空間中指定的pod:kube-apiserver-k8s-01的信息,并且以json格式展示pod詳細信息
kubectl get pod --all-namespaces --watch: 監(jiān)控pod資源的變化
上述命令中的pod為kubernetes集群中的一種資源對象,其它資源對象,例如:deployment、deamonset、endpoint、ingress、services、secrets等等,都可以用get命令,全部的資源對象詳見這里
2, kubectl describe: 打印所選資源的詳細描述信息,當pod啟動異常的時候也可以用該命令排查問題
kubectl describe -n kube-system pod kube-apiserver-k8s-01
描述pod:kube-apiserver-k8s-01的詳細信息
kubectl describe -n kube-system secrets kubernetes-dashboard-token-9mvxp
描述secrets詳細信息,例如該命令可查詢登錄dashboard所需的token信息
container_name可以通過kubectl describe命令獲得
kubectl describe pod calico-node-rw4c2 -n kube-system | grep -B 1 “Container ID”
3,kubectl exec:與docker exec命令一樣,kubectl exec 也是用來進入容器內(nèi)部的
kubectl exec -it -n kube-system kube-apiserver-k8s-01 sh
進入kube-system命名空間下的kube-apiserver-k8s-01容器內(nèi)部
僅當pod內(nèi)只有一個容器的時候適用
kubectl exec -it -n kube-system calico-node-rw4c2 -c install-cni sh
-it:開啟虛擬終端tty,并將標準輸入傳入容器中
-i, --stdin=false: Pass stdin to the container
-t, --tty=false: Stdin is a TTY
當pod中有多個容器,需要進入指定的容器時適用,比上一條命令多了-c container_name
4,kubectl logs
kubectl logs用來查看容器的日志,在定位問題時非常有用
kubectl logs -n kube-system -f --tail 10 kube-apiserver-k8s-01
-f: 動態(tài)打印日志
–tail 10: 打印最后10行日志,不加該參數(shù)時默認會打印全部的日志,在日志非常多的時候非常有用
5,kubectl scale
kubectl scale用來對deployement、replicaset、statefulset等資源進行伸縮
kubectl scale deployment -n kube-system --replicas=2 kubernetes-dashboard
–replicas=2: 指定副本數(shù)量為2
先設置replicas=0,再設置replicas=1可實現(xiàn)pod重啟操作
6,kubectl apply
通過傳入文件名或者標準輸入來創(chuàng)建資源或配置
kubectl apply -f .
創(chuàng)建或更新當前目錄所有的yaml文件描述的配置或資源
kubectl apply -f /home/agms/
創(chuàng)建或更新指定目錄所有的yaml文件描述的配置或資源
kubectl apply -f /home/agms/a.yaml
創(chuàng)建或更新指定yaml文件描述的配置或資源
7,kubectl delete
kubectl delete -f .
刪除當前目錄所有的yaml文件描述的配置或資源
kubectl delete -f /home/agms/
刪除指定目錄所有的yaml文件描述的配置或資源
kubectl delete -f /home/agms/a.yaml
刪除指定yaml文件描述的配置或資源
kubectl delete nodes k8s-01
按照節(jié)點名刪除集群中的節(jié)點(慎用)
8,kubectl explain
列出受支持資源的字段、版本,各字段的描述、類型等,在編寫yaml文件時非常有用
kubectl explain deployment.spec
描述deployment資源的spec字段
9,kubectl create
通過命令行創(chuàng)建kubernetes資源或配置信息
kubectl create namespace fpi-inc
創(chuàng)建一個fpi-inc的命名空間
一般建議通過kubectl apply的方式來進行資源或配置的創(chuàng)建
三 k8s搭建
因服務器原因搭建,大家參考其他博文吧。
參考如下:
https://blog.csdn.net/qq_44214446/article/details/128531430文章來源:http://www.zghlxwxcb.cn/news/detail-767600.html
參考文獻:
https://blog.csdn.net/qq_60387497/article/details/121980495
https://blog.csdn.net/qq_38328477/article/details/86712892
https://blog.csdn.net/weixin_56790951/article/details/123510916文章來源地址http://www.zghlxwxcb.cn/news/detail-767600.html
到了這里,關(guān)于docker和k8s基礎介紹的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!