日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

【体系】Kubernetes容器管理

發(fā)布時(shí)間:2024/3/26 编程问答 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【体系】Kubernetes容器管理 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

  • 1. 基本概念
  • 2. 搭建集群
  • 3. 核心技術(shù)(上)
  • 4. 核心技術(shù)(下)
  • 5. 日志管理
  • 6. 監(jiān)控平臺(tái)
  • 7. 搭建高可用集群
  • 8. 集群項(xiàng)目部署實(shí)操

1. 基本概念

概述與特性:k8s是谷歌在2014年開(kāi)源的容器化集群管理系統(tǒng),主要用于容器應(yīng)用部署,具有易于應(yīng)用擴(kuò)展的特點(diǎn),讓容器化應(yīng)用部署更加簡(jiǎn)潔高效。傳統(tǒng)的應(yīng)用部署方式是通過(guò)插件或腳本來(lái)安裝應(yīng)用。這樣做的缺點(diǎn)是應(yīng)用的運(yùn)行、配 置、管理、所有生存周期將與當(dāng)前操作系統(tǒng)綁定,這樣做并不利于應(yīng)用的升級(jí)更新/回滾等 操作,當(dāng)然也可以通過(guò)創(chuàng)建虛擬機(jī)的方式來(lái)實(shí)現(xiàn)某些功能,但是虛擬機(jī)非常重,并不利于可移植性;新的方式是通過(guò)部署容器方式實(shí)現(xiàn),每個(gè)容器之間互相隔離,每個(gè)容器有自己的文件 系統(tǒng) ,容器之間進(jìn)程不會(huì)相互影響,能區(qū)分計(jì)算資源。相對(duì)于虛擬機(jī),容器能快速部署, 由于容器與底層設(shè)施、機(jī)器文件系統(tǒng)解耦的,所以它能在不同云、不同版本操作系統(tǒng)間進(jìn)行遷移。

架構(gòu)組件:k8s具有自動(dòng)裝箱、自我修復(fù)(自愈能力)、水平擴(kuò)展、服務(wù)發(fā)現(xiàn)、滾動(dòng)更新、版本回退、密鑰和配置管理、存儲(chǔ)編排和批處理等功能特點(diǎn)

  • Master Node:k8s 集群控制節(jié)點(diǎn),對(duì)集群進(jìn)行調(diào)度管理,接受集群外用戶(hù)去集群操作請(qǐng)求; Master Node 由 API Server、Scheduler、ClusterState Store(ETCD 數(shù)據(jù)庫(kù))和 Controller MangerServer 所組成
    • apiserver:集群統(tǒng)一入口,以restfull方式,交給etcd存儲(chǔ)
    • scheduler:節(jié)點(diǎn)調(diào)度,選擇node節(jié)點(diǎn)應(yīng)用部署
    • controller-manager:處理集群中常規(guī)后臺(tái)任務(wù),一個(gè)資源對(duì)應(yīng)一個(gè)控制器
    • etcd:存儲(chǔ)系統(tǒng),保存集群相關(guān)的數(shù)據(jù)
  • Worker Node:集群工作節(jié)點(diǎn),運(yùn)行用戶(hù)業(yè)務(wù)應(yīng)用容器,包含 kubelet、kube proxy 和 ContainerRuntime
    • kubelet:master排到node節(jié)點(diǎn)代表,管理本機(jī)容器
    • kube-proxy:提供網(wǎng)絡(luò)代理,負(fù)載均衡等操作

核心概念:pod、controller、service

  • pod:最小部署單元;一組容器的集合;共享網(wǎng)絡(luò);生命周期是短暫的
  • controller:確保預(yù)期的pod副本數(shù)量;無(wú)狀態(tài)應(yīng)用部署;有狀態(tài)應(yīng)用部署;確保所有的node運(yùn)行同一個(gè)pod;一次性任務(wù)和定時(shí)任務(wù)
  • service:定義一組pod訪(fǎng)問(wèn)規(guī)則

2. 搭建集群

k8s硬件要求:測(cè)試環(huán)境中master(2核 4G內(nèi)存 20G硬盤(pán))和node(4核 8G內(nèi)存 40G硬盤(pán));生產(chǎn)環(huán)境中master和node均有更高要求
搭建集群方式:kubeadm方式(Kubeadm 是一個(gè) K8s 部署工具,提供 kubeadm init 和 kubeadm join,用于快速部 署 Kubernetes 集群。官方地址,見(jiàn)鏈接)和二進(jìn)制包方式(從 github 下載發(fā)行版的二進(jìn)制包,手動(dòng)部署每個(gè)組件,組成 Kubernetes 集群)
k8s平臺(tái)規(guī)劃:環(huán)境平臺(tái)規(guī)劃分為單master集群和多master集群(常用,避免單master故障導(dǎo)致系統(tǒng)崩潰)

#mermaid-svg-Wu83BuDU1V5YH4ki .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-Wu83BuDU1V5YH4ki .label text{fill:#333}#mermaid-svg-Wu83BuDU1V5YH4ki .node rect,#mermaid-svg-Wu83BuDU1V5YH4ki .node circle,#mermaid-svg-Wu83BuDU1V5YH4ki .node ellipse,#mermaid-svg-Wu83BuDU1V5YH4ki .node polygon,#mermaid-svg-Wu83BuDU1V5YH4ki .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-Wu83BuDU1V5YH4ki .node .label{text-align:center;fill:#333}#mermaid-svg-Wu83BuDU1V5YH4ki .node.clickable{cursor:pointer}#mermaid-svg-Wu83BuDU1V5YH4ki .arrowheadPath{fill:#333}#mermaid-svg-Wu83BuDU1V5YH4ki .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-Wu83BuDU1V5YH4ki .flowchart-link{stroke:#333;fill:none}#mermaid-svg-Wu83BuDU1V5YH4ki .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-Wu83BuDU1V5YH4ki .edgeLabel rect{opacity:0.9}#mermaid-svg-Wu83BuDU1V5YH4ki .edgeLabel span{color:#333}#mermaid-svg-Wu83BuDU1V5YH4ki .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-Wu83BuDU1V5YH4ki .cluster text{fill:#333}#mermaid-svg-Wu83BuDU1V5YH4ki div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-Wu83BuDU1V5YH4ki .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-Wu83BuDU1V5YH4ki text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-Wu83BuDU1V5YH4ki .actor-line{stroke:grey}#mermaid-svg-Wu83BuDU1V5YH4ki .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-Wu83BuDU1V5YH4ki .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-Wu83BuDU1V5YH4ki #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-Wu83BuDU1V5YH4ki .sequenceNumber{fill:#fff}#mermaid-svg-Wu83BuDU1V5YH4ki #sequencenumber{fill:#333}#mermaid-svg-Wu83BuDU1V5YH4ki #crosshead path{fill:#333;stroke:#333}#mermaid-svg-Wu83BuDU1V5YH4ki .messageText{fill:#333;stroke:#333}#mermaid-svg-Wu83BuDU1V5YH4ki .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-Wu83BuDU1V5YH4ki .labelText,#mermaid-svg-Wu83BuDU1V5YH4ki .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-Wu83BuDU1V5YH4ki .loopText,#mermaid-svg-Wu83BuDU1V5YH4ki .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-Wu83BuDU1V5YH4ki .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-Wu83BuDU1V5YH4ki .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-Wu83BuDU1V5YH4ki .noteText,#mermaid-svg-Wu83BuDU1V5YH4ki .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-Wu83BuDU1V5YH4ki .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-Wu83BuDU1V5YH4ki .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-Wu83BuDU1V5YH4ki .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-Wu83BuDU1V5YH4ki .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Wu83BuDU1V5YH4ki .section{stroke:none;opacity:0.2}#mermaid-svg-Wu83BuDU1V5YH4ki .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-Wu83BuDU1V5YH4ki .section2{fill:#fff400}#mermaid-svg-Wu83BuDU1V5YH4ki .section1,#mermaid-svg-Wu83BuDU1V5YH4ki .section3{fill:#fff;opacity:0.2}#mermaid-svg-Wu83BuDU1V5YH4ki .sectionTitle0{fill:#333}#mermaid-svg-Wu83BuDU1V5YH4ki .sectionTitle1{fill:#333}#mermaid-svg-Wu83BuDU1V5YH4ki .sectionTitle2{fill:#333}#mermaid-svg-Wu83BuDU1V5YH4ki .sectionTitle3{fill:#333}#mermaid-svg-Wu83BuDU1V5YH4ki .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Wu83BuDU1V5YH4ki .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-Wu83BuDU1V5YH4ki .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Wu83BuDU1V5YH4ki .grid path{stroke-width:0}#mermaid-svg-Wu83BuDU1V5YH4ki .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-Wu83BuDU1V5YH4ki .task{stroke-width:2}#mermaid-svg-Wu83BuDU1V5YH4ki .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Wu83BuDU1V5YH4ki .taskText:not([font-size]){font-size:11px}#mermaid-svg-Wu83BuDU1V5YH4ki .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Wu83BuDU1V5YH4ki .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-Wu83BuDU1V5YH4ki .task.clickable{cursor:pointer}#mermaid-svg-Wu83BuDU1V5YH4ki .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-Wu83BuDU1V5YH4ki .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-Wu83BuDU1V5YH4ki .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-Wu83BuDU1V5YH4ki .taskText0,#mermaid-svg-Wu83BuDU1V5YH4ki .taskText1,#mermaid-svg-Wu83BuDU1V5YH4ki .taskText2,#mermaid-svg-Wu83BuDU1V5YH4ki .taskText3{fill:#fff}#mermaid-svg-Wu83BuDU1V5YH4ki .task0,#mermaid-svg-Wu83BuDU1V5YH4ki .task1,#mermaid-svg-Wu83BuDU1V5YH4ki .task2,#mermaid-svg-Wu83BuDU1V5YH4ki .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-Wu83BuDU1V5YH4ki .taskTextOutside0,#mermaid-svg-Wu83BuDU1V5YH4ki .taskTextOutside2{fill:#000}#mermaid-svg-Wu83BuDU1V5YH4ki .taskTextOutside1,#mermaid-svg-Wu83BuDU1V5YH4ki .taskTextOutside3{fill:#000}#mermaid-svg-Wu83BuDU1V5YH4ki .active0,#mermaid-svg-Wu83BuDU1V5YH4ki .active1,#mermaid-svg-Wu83BuDU1V5YH4ki .active2,#mermaid-svg-Wu83BuDU1V5YH4ki .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-Wu83BuDU1V5YH4ki .activeText0,#mermaid-svg-Wu83BuDU1V5YH4ki .activeText1,#mermaid-svg-Wu83BuDU1V5YH4ki .activeText2,#mermaid-svg-Wu83BuDU1V5YH4ki .activeText3{fill:#000 !important}#mermaid-svg-Wu83BuDU1V5YH4ki .done0,#mermaid-svg-Wu83BuDU1V5YH4ki .done1,#mermaid-svg-Wu83BuDU1V5YH4ki .done2,#mermaid-svg-Wu83BuDU1V5YH4ki .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-Wu83BuDU1V5YH4ki .doneText0,#mermaid-svg-Wu83BuDU1V5YH4ki .doneText1,#mermaid-svg-Wu83BuDU1V5YH4ki .doneText2,#mermaid-svg-Wu83BuDU1V5YH4ki .doneText3{fill:#000 !important}#mermaid-svg-Wu83BuDU1V5YH4ki .crit0,#mermaid-svg-Wu83BuDU1V5YH4ki .crit1,#mermaid-svg-Wu83BuDU1V5YH4ki .crit2,#mermaid-svg-Wu83BuDU1V5YH4ki .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-Wu83BuDU1V5YH4ki .activeCrit0,#mermaid-svg-Wu83BuDU1V5YH4ki .activeCrit1,#mermaid-svg-Wu83BuDU1V5YH4ki .activeCrit2,#mermaid-svg-Wu83BuDU1V5YH4ki .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-Wu83BuDU1V5YH4ki .doneCrit0,#mermaid-svg-Wu83BuDU1V5YH4ki .doneCrit1,#mermaid-svg-Wu83BuDU1V5YH4ki .doneCrit2,#mermaid-svg-Wu83BuDU1V5YH4ki .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-Wu83BuDU1V5YH4ki .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-Wu83BuDU1V5YH4ki .milestoneText{font-style:italic}#mermaid-svg-Wu83BuDU1V5YH4ki .doneCritText0,#mermaid-svg-Wu83BuDU1V5YH4ki .doneCritText1,#mermaid-svg-Wu83BuDU1V5YH4ki .doneCritText2,#mermaid-svg-Wu83BuDU1V5YH4ki .doneCritText3{fill:#000 !important}#mermaid-svg-Wu83BuDU1V5YH4ki .activeCritText0,#mermaid-svg-Wu83BuDU1V5YH4ki .activeCritText1,#mermaid-svg-Wu83BuDU1V5YH4ki .activeCritText2,#mermaid-svg-Wu83BuDU1V5YH4ki .activeCritText3{fill:#000 !important}#mermaid-svg-Wu83BuDU1V5YH4ki .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Wu83BuDU1V5YH4ki g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-Wu83BuDU1V5YH4ki g.classGroup text .title{font-weight:bolder}#mermaid-svg-Wu83BuDU1V5YH4ki g.clickable{cursor:pointer}#mermaid-svg-Wu83BuDU1V5YH4ki g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-Wu83BuDU1V5YH4ki g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-Wu83BuDU1V5YH4ki .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-Wu83BuDU1V5YH4ki .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-Wu83BuDU1V5YH4ki .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-Wu83BuDU1V5YH4ki .dashed-line{stroke-dasharray:3}#mermaid-svg-Wu83BuDU1V5YH4ki #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-Wu83BuDU1V5YH4ki #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-Wu83BuDU1V5YH4ki #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-Wu83BuDU1V5YH4ki #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-Wu83BuDU1V5YH4ki #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-Wu83BuDU1V5YH4ki #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-Wu83BuDU1V5YH4ki #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-Wu83BuDU1V5YH4ki #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-Wu83BuDU1V5YH4ki .commit-id,#mermaid-svg-Wu83BuDU1V5YH4ki .commit-msg,#mermaid-svg-Wu83BuDU1V5YH4ki .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Wu83BuDU1V5YH4ki .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Wu83BuDU1V5YH4ki .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Wu83BuDU1V5YH4ki g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Wu83BuDU1V5YH4ki g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-Wu83BuDU1V5YH4ki g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-Wu83BuDU1V5YH4ki g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-Wu83BuDU1V5YH4ki g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-Wu83BuDU1V5YH4ki g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-Wu83BuDU1V5YH4ki .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-Wu83BuDU1V5YH4ki .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-Wu83BuDU1V5YH4ki .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-Wu83BuDU1V5YH4ki .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-Wu83BuDU1V5YH4ki .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-Wu83BuDU1V5YH4ki .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-Wu83BuDU1V5YH4ki .edgeLabel text{fill:#333}#mermaid-svg-Wu83BuDU1V5YH4ki .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Wu83BuDU1V5YH4ki .node circle.state-start{fill:black;stroke:black}#mermaid-svg-Wu83BuDU1V5YH4ki .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-Wu83BuDU1V5YH4ki #statediagram-barbEnd{fill:#9370db}#mermaid-svg-Wu83BuDU1V5YH4ki .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-Wu83BuDU1V5YH4ki .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-Wu83BuDU1V5YH4ki .statediagram-state .divider{stroke:#9370db}#mermaid-svg-Wu83BuDU1V5YH4ki .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-Wu83BuDU1V5YH4ki .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-Wu83BuDU1V5YH4ki .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-Wu83BuDU1V5YH4ki .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-Wu83BuDU1V5YH4ki .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-Wu83BuDU1V5YH4ki .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-Wu83BuDU1V5YH4ki .note-edge{stroke-dasharray:5}#mermaid-svg-Wu83BuDU1V5YH4ki .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-Wu83BuDU1V5YH4ki .error-icon{fill:#522}#mermaid-svg-Wu83BuDU1V5YH4ki .error-text{fill:#522;stroke:#522}#mermaid-svg-Wu83BuDU1V5YH4ki .edge-thickness-normal{stroke-width:2px}#mermaid-svg-Wu83BuDU1V5YH4ki .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-Wu83BuDU1V5YH4ki .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-Wu83BuDU1V5YH4ki .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-Wu83BuDU1V5YH4ki .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-Wu83BuDU1V5YH4ki .marker{fill:#333}#mermaid-svg-Wu83BuDU1V5YH4ki .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}#mermaid-svg-Wu83BuDU1V5YH4ki {color: rgba(0, 0, 0, 0.75);font: ;}masternode1node2node3 #mermaid-svg-WTCevQQ7IE2JpDnM .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-WTCevQQ7IE2JpDnM .label text{fill:#333}#mermaid-svg-WTCevQQ7IE2JpDnM .node rect,#mermaid-svg-WTCevQQ7IE2JpDnM .node circle,#mermaid-svg-WTCevQQ7IE2JpDnM .node ellipse,#mermaid-svg-WTCevQQ7IE2JpDnM .node polygon,#mermaid-svg-WTCevQQ7IE2JpDnM .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-WTCevQQ7IE2JpDnM .node .label{text-align:center;fill:#333}#mermaid-svg-WTCevQQ7IE2JpDnM .node.clickable{cursor:pointer}#mermaid-svg-WTCevQQ7IE2JpDnM .arrowheadPath{fill:#333}#mermaid-svg-WTCevQQ7IE2JpDnM .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-WTCevQQ7IE2JpDnM .flowchart-link{stroke:#333;fill:none}#mermaid-svg-WTCevQQ7IE2JpDnM .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-WTCevQQ7IE2JpDnM .edgeLabel rect{opacity:0.9}#mermaid-svg-WTCevQQ7IE2JpDnM .edgeLabel span{color:#333}#mermaid-svg-WTCevQQ7IE2JpDnM .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-WTCevQQ7IE2JpDnM .cluster text{fill:#333}#mermaid-svg-WTCevQQ7IE2JpDnM div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-WTCevQQ7IE2JpDnM .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-WTCevQQ7IE2JpDnM text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-WTCevQQ7IE2JpDnM .actor-line{stroke:grey}#mermaid-svg-WTCevQQ7IE2JpDnM .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-WTCevQQ7IE2JpDnM .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-WTCevQQ7IE2JpDnM #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-WTCevQQ7IE2JpDnM .sequenceNumber{fill:#fff}#mermaid-svg-WTCevQQ7IE2JpDnM #sequencenumber{fill:#333}#mermaid-svg-WTCevQQ7IE2JpDnM #crosshead path{fill:#333;stroke:#333}#mermaid-svg-WTCevQQ7IE2JpDnM .messageText{fill:#333;stroke:#333}#mermaid-svg-WTCevQQ7IE2JpDnM .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-WTCevQQ7IE2JpDnM .labelText,#mermaid-svg-WTCevQQ7IE2JpDnM .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-WTCevQQ7IE2JpDnM .loopText,#mermaid-svg-WTCevQQ7IE2JpDnM .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-WTCevQQ7IE2JpDnM .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-WTCevQQ7IE2JpDnM .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-WTCevQQ7IE2JpDnM .noteText,#mermaid-svg-WTCevQQ7IE2JpDnM .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-WTCevQQ7IE2JpDnM .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-WTCevQQ7IE2JpDnM .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-WTCevQQ7IE2JpDnM .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-WTCevQQ7IE2JpDnM .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-WTCevQQ7IE2JpDnM .section{stroke:none;opacity:0.2}#mermaid-svg-WTCevQQ7IE2JpDnM .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-WTCevQQ7IE2JpDnM .section2{fill:#fff400}#mermaid-svg-WTCevQQ7IE2JpDnM .section1,#mermaid-svg-WTCevQQ7IE2JpDnM .section3{fill:#fff;opacity:0.2}#mermaid-svg-WTCevQQ7IE2JpDnM .sectionTitle0{fill:#333}#mermaid-svg-WTCevQQ7IE2JpDnM .sectionTitle1{fill:#333}#mermaid-svg-WTCevQQ7IE2JpDnM .sectionTitle2{fill:#333}#mermaid-svg-WTCevQQ7IE2JpDnM .sectionTitle3{fill:#333}#mermaid-svg-WTCevQQ7IE2JpDnM .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-WTCevQQ7IE2JpDnM .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-WTCevQQ7IE2JpDnM .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-WTCevQQ7IE2JpDnM .grid path{stroke-width:0}#mermaid-svg-WTCevQQ7IE2JpDnM .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-WTCevQQ7IE2JpDnM .task{stroke-width:2}#mermaid-svg-WTCevQQ7IE2JpDnM .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-WTCevQQ7IE2JpDnM .taskText:not([font-size]){font-size:11px}#mermaid-svg-WTCevQQ7IE2JpDnM .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-WTCevQQ7IE2JpDnM .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-WTCevQQ7IE2JpDnM .task.clickable{cursor:pointer}#mermaid-svg-WTCevQQ7IE2JpDnM .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-WTCevQQ7IE2JpDnM .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-WTCevQQ7IE2JpDnM .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-WTCevQQ7IE2JpDnM .taskText0,#mermaid-svg-WTCevQQ7IE2JpDnM .taskText1,#mermaid-svg-WTCevQQ7IE2JpDnM .taskText2,#mermaid-svg-WTCevQQ7IE2JpDnM .taskText3{fill:#fff}#mermaid-svg-WTCevQQ7IE2JpDnM .task0,#mermaid-svg-WTCevQQ7IE2JpDnM .task1,#mermaid-svg-WTCevQQ7IE2JpDnM .task2,#mermaid-svg-WTCevQQ7IE2JpDnM .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-WTCevQQ7IE2JpDnM .taskTextOutside0,#mermaid-svg-WTCevQQ7IE2JpDnM .taskTextOutside2{fill:#000}#mermaid-svg-WTCevQQ7IE2JpDnM .taskTextOutside1,#mermaid-svg-WTCevQQ7IE2JpDnM .taskTextOutside3{fill:#000}#mermaid-svg-WTCevQQ7IE2JpDnM .active0,#mermaid-svg-WTCevQQ7IE2JpDnM .active1,#mermaid-svg-WTCevQQ7IE2JpDnM .active2,#mermaid-svg-WTCevQQ7IE2JpDnM .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-WTCevQQ7IE2JpDnM .activeText0,#mermaid-svg-WTCevQQ7IE2JpDnM .activeText1,#mermaid-svg-WTCevQQ7IE2JpDnM .activeText2,#mermaid-svg-WTCevQQ7IE2JpDnM .activeText3{fill:#000 !important}#mermaid-svg-WTCevQQ7IE2JpDnM .done0,#mermaid-svg-WTCevQQ7IE2JpDnM .done1,#mermaid-svg-WTCevQQ7IE2JpDnM .done2,#mermaid-svg-WTCevQQ7IE2JpDnM .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-WTCevQQ7IE2JpDnM .doneText0,#mermaid-svg-WTCevQQ7IE2JpDnM .doneText1,#mermaid-svg-WTCevQQ7IE2JpDnM .doneText2,#mermaid-svg-WTCevQQ7IE2JpDnM .doneText3{fill:#000 !important}#mermaid-svg-WTCevQQ7IE2JpDnM .crit0,#mermaid-svg-WTCevQQ7IE2JpDnM .crit1,#mermaid-svg-WTCevQQ7IE2JpDnM .crit2,#mermaid-svg-WTCevQQ7IE2JpDnM .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-WTCevQQ7IE2JpDnM .activeCrit0,#mermaid-svg-WTCevQQ7IE2JpDnM .activeCrit1,#mermaid-svg-WTCevQQ7IE2JpDnM .activeCrit2,#mermaid-svg-WTCevQQ7IE2JpDnM .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-WTCevQQ7IE2JpDnM .doneCrit0,#mermaid-svg-WTCevQQ7IE2JpDnM .doneCrit1,#mermaid-svg-WTCevQQ7IE2JpDnM .doneCrit2,#mermaid-svg-WTCevQQ7IE2JpDnM .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-WTCevQQ7IE2JpDnM .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-WTCevQQ7IE2JpDnM .milestoneText{font-style:italic}#mermaid-svg-WTCevQQ7IE2JpDnM .doneCritText0,#mermaid-svg-WTCevQQ7IE2JpDnM .doneCritText1,#mermaid-svg-WTCevQQ7IE2JpDnM .doneCritText2,#mermaid-svg-WTCevQQ7IE2JpDnM .doneCritText3{fill:#000 !important}#mermaid-svg-WTCevQQ7IE2JpDnM .activeCritText0,#mermaid-svg-WTCevQQ7IE2JpDnM .activeCritText1,#mermaid-svg-WTCevQQ7IE2JpDnM .activeCritText2,#mermaid-svg-WTCevQQ7IE2JpDnM .activeCritText3{fill:#000 !important}#mermaid-svg-WTCevQQ7IE2JpDnM .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-WTCevQQ7IE2JpDnM g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-WTCevQQ7IE2JpDnM g.classGroup text .title{font-weight:bolder}#mermaid-svg-WTCevQQ7IE2JpDnM g.clickable{cursor:pointer}#mermaid-svg-WTCevQQ7IE2JpDnM g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-WTCevQQ7IE2JpDnM g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-WTCevQQ7IE2JpDnM .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-WTCevQQ7IE2JpDnM .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-WTCevQQ7IE2JpDnM .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-WTCevQQ7IE2JpDnM .dashed-line{stroke-dasharray:3}#mermaid-svg-WTCevQQ7IE2JpDnM #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-WTCevQQ7IE2JpDnM #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-WTCevQQ7IE2JpDnM #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-WTCevQQ7IE2JpDnM #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-WTCevQQ7IE2JpDnM #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-WTCevQQ7IE2JpDnM #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-WTCevQQ7IE2JpDnM #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-WTCevQQ7IE2JpDnM #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-WTCevQQ7IE2JpDnM .commit-id,#mermaid-svg-WTCevQQ7IE2JpDnM .commit-msg,#mermaid-svg-WTCevQQ7IE2JpDnM .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-WTCevQQ7IE2JpDnM .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-WTCevQQ7IE2JpDnM .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-WTCevQQ7IE2JpDnM g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-WTCevQQ7IE2JpDnM g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-WTCevQQ7IE2JpDnM g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-WTCevQQ7IE2JpDnM g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-WTCevQQ7IE2JpDnM g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-WTCevQQ7IE2JpDnM g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-WTCevQQ7IE2JpDnM .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-WTCevQQ7IE2JpDnM .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-WTCevQQ7IE2JpDnM .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-WTCevQQ7IE2JpDnM .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-WTCevQQ7IE2JpDnM .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-WTCevQQ7IE2JpDnM .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-WTCevQQ7IE2JpDnM .edgeLabel text{fill:#333}#mermaid-svg-WTCevQQ7IE2JpDnM .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-WTCevQQ7IE2JpDnM .node circle.state-start{fill:black;stroke:black}#mermaid-svg-WTCevQQ7IE2JpDnM .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-WTCevQQ7IE2JpDnM #statediagram-barbEnd{fill:#9370db}#mermaid-svg-WTCevQQ7IE2JpDnM .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-WTCevQQ7IE2JpDnM .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-WTCevQQ7IE2JpDnM .statediagram-state .divider{stroke:#9370db}#mermaid-svg-WTCevQQ7IE2JpDnM .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-WTCevQQ7IE2JpDnM .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-WTCevQQ7IE2JpDnM .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-WTCevQQ7IE2JpDnM .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-WTCevQQ7IE2JpDnM .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-WTCevQQ7IE2JpDnM .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-WTCevQQ7IE2JpDnM .note-edge{stroke-dasharray:5}#mermaid-svg-WTCevQQ7IE2JpDnM .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-WTCevQQ7IE2JpDnM .error-icon{fill:#522}#mermaid-svg-WTCevQQ7IE2JpDnM .error-text{fill:#522;stroke:#522}#mermaid-svg-WTCevQQ7IE2JpDnM .edge-thickness-normal{stroke-width:2px}#mermaid-svg-WTCevQQ7IE2JpDnM .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-WTCevQQ7IE2JpDnM .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-WTCevQQ7IE2JpDnM .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-WTCevQQ7IE2JpDnM .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-WTCevQQ7IE2JpDnM .marker{fill:#333}#mermaid-svg-WTCevQQ7IE2JpDnM .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}#mermaid-svg-WTCevQQ7IE2JpDnM {color: rgba(0, 0, 0, 0.75);font: ;}master1負(fù)載均衡master2master3node1node2node3

平臺(tái)搭建1:單master集群的kubeadm方式安裝

  • 準(zhǔn)備虛擬主機(jī)(記得做好快照,以便環(huán)境快速恢復(fù))。網(wǎng)絡(luò)要求:集群機(jī)器之間能夠互通,且能夠上外網(wǎng)(操作系統(tǒng)此例為CentOS7)
  • 三個(gè)虛擬機(jī)的初始化(記得做好快照,以便環(huán)境快速恢復(fù))# 1.三臺(tái)虛擬機(jī)均關(guān)閉防火墻: systemctl stop firewalld #臨時(shí) systemctl disable firewalld #永久# 2.三臺(tái)虛擬機(jī)均關(guān)閉selinux setenforce 0 #臨時(shí) sed -i 's/enforcing/disabled/' /etc/selinux/config #永久# 3.三臺(tái)虛擬機(jī)均關(guān)閉swap分區(qū) swapoff -a #臨時(shí) sed -ri 's/.*swap.*/#&/' /etc/fstab #永久# 4.三臺(tái)虛擬機(jī)分別設(shè)置主機(jī)名 hostnamectl set-hostname k8s-master# 5.在master添加 hosts [root@k8s-master ~]# cat >> /etc/hosts << EOF > 172.16.90.146 k8s-master > 172.16.90.145 k8s-node1 > 172.16.90.144 k8s-node2 > EOF# 6. 將三臺(tái)虛擬機(jī)橋接的IPv4流量傳遞到iptables的鏈,并使之生效 [root@k8s-master ~]# cat > /etc/sysctl.d/k8s.conf << EOF > net.bridge.bridge-nf-call-ip6tables = 1 > net.bridge.bridge-nf-call-iptables = 1 > EOF [root@k8s-master ~]# sysctl --system# 7. 三臺(tái)虛擬機(jī)均設(shè)置時(shí)間同步 yum install ntpdate -y ntpdate time.windows.com
  • 所有節(jié)點(diǎn)安裝 Docker/kubeadm/kubelet# 安裝wget [root@k8s-master ~]# yum install wget# 下載docker源文件 [root@k8s-master ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo# 安裝docker [root@k8s-master ~]# yum -y install docker-ce-18.06.1.ce-3.el7# 啟動(dòng)docker [root@k8s-master ~]# systemctl enable docker && systemctl start docker# 檢查是否安裝成功 [root@k8s-master ~]# docker --version# 添加阿里云YUM軟件源 # 設(shè)置倉(cāng)庫(kù)地址 [root@k8s-master ~]# cat > /etc/docker/daemon.json << EOF > { > "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"] > } > EOF# 添加yum源 [root@k8s-master ~]# cat > /etc/yum.repos.d/kubernetes.repo << EOF > [kubernetes] > name=Kubernetes > baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 > enabled=1 > gpgcheck=0 > repo_gpgcheck=0 > gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg > https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg > EOF# 安裝 kubeadm,kubelet 和 kubectl [root@k8s-master ~]# yum install -y kubelet kubeadm kubectl# 設(shè)置開(kāi)機(jī)啟動(dòng) [root@k8s-master ~]# systemctl enable kubelet
  • 在master節(jié)點(diǎn)執(zhí)行kubeadm init命令進(jìn)行初始化# 在master節(jié)點(diǎn)機(jī)部署Kubernetes Master,并執(zhí)行一下目錄 # 由于默認(rèn)拉取鏡像地址 k8s.gcr.io 國(guó)內(nèi)無(wú)法訪(fǎng)問(wèn),這里指定阿里云鏡像倉(cāng)庫(kù)地址。 [root@k8s-master ~]# kubeadm init --apiserver-advertise-address=172.16.90.146 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.21.0 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16 ... error execution phase preflight: [preflight] Some fatal errors occurred:[ERROR ImagePull]: failed to pull image registry.aliyuncs.com/google_containers/coredns:v1.8.0: output: Error response from daemon: manifest for registry.aliyuncs.com/google_containers/coredns:v1.8.0 not found , error: exit status 1 ...# 檢查發(fā)現(xiàn)缺少鏡像coredns [root@k8s-master ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE registry.aliyuncs.com/google_containers/kube-apiserver v1.21.0 4d217480042e 3 months ago 126MB registry.aliyuncs.com/google_containers/kube-proxy v1.21.0 38ddd85fe90e 3 months ago 122MB registry.aliyuncs.com/google_containers/kube-controller-manager v1.21.0 09708983cc37 3 months ago 120MB registry.aliyuncs.com/google_containers/kube-scheduler v1.21.0 62ad3129eca8 3 months ago 50.6MB registry.aliyuncs.com/google_containers/pause 3.4.1 0f8457a4c2ec 6 months ago 683kB registry.aliyuncs.com/google_containers/etcd 3.4.13-0 0369cf4303ff 11 months ago 253MB# 解決該問(wèn)題:Kubernetes 需要的是 registry.aliyuncs.com/google_containers/coredns:v1.8.0 這個(gè)鏡像,使用 docker tag 命令重命名 # 拉取鏡像 [root@k8s-master ~]# docker pull registry.aliyuncs.com/google_containers/coredns:1.8.0 # 重命名 [root@k8s-master ~]# docker tag registry.aliyuncs.com/google_containers/coredns:1.8.0 registry.aliyuncs.com/google_containers/coredns:v1.8.0 # 刪除原有鏡像 [root@k8s-master ~]# docker rmi registry.aliyuncs.com/google_containers/coredns:1.8.0# 檢查 [root@k8s-master ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE registry.aliyuncs.com/google_containers/kube-apiserver v1.21.0 4d217480042e 3 months ago 126MB registry.aliyuncs.com/google_containers/kube-proxy v1.21.0 38ddd85fe90e 3 months ago 122MB registry.aliyuncs.com/google_containers/kube-controller-manager v1.21.0 09708983cc37 3 months ago 120MB registry.aliyuncs.com/google_containers/kube-scheduler v1.21.0 62ad3129eca8 3 months ago 50.6MB registry.aliyuncs.com/google_containers/pause 3.4.1 0f8457a4c2ec 6 months ago 683kB registry.aliyuncs.com/google_containers/coredns v1.8.0 296a6d5035e2 9 months ago 42.5MB registry.aliyuncs.com/google_containers/etcd 3.4.13-0 0369cf4303ff 11 months ago 253MB# 再次執(zhí)行kubeadm init ... Your Kubernetes control-plane has initialized successfully!To start using your cluster, you need to run the following as a regular user:mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/config ... kubeadm join 172.16.90.146:6443 --token y761gh.vxrkrulwu0tt74sw \--discovery-token-ca-cert-hash sha256:b611e2e88052ec60ac4716b0a9a48a9fa45d99a4b457563593dc29805214bbc5 # 使用 kubectl 工具: [root@k8s-master ~]# mkdir -p $HOME/.kube [root@k8s-master ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config [root@k8s-master ~]# chown $(id -u):$(id -g) $HOME/.kube/config [root@k8s-master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master NotReady control-plane,master 3m25s v1.21.3
  • 在node節(jié)點(diǎn)上執(zhí)行kubeadm join命令把node節(jié)點(diǎn)添加到當(dāng)前集群里面[root@k8s-node1 ~]# kubeadm join 172.16.90.146:6443 --token y761gh.vxrkrulwu0tt74sw --discovery-token-ca-cert-hash sha256:b611e2e88052ec60ac4716b0a9a48a9fa45d99a4b457563593dc29805214bbc5 [root@k8s-node2 ~]# kubeadm join 172.16.90.146:6443 --token y761gh.vxrkrulwu0tt74sw --discovery-token-ca-cert-hash sha256:b611e2e88052ec60ac4716b0a9a48a9fa45d99a4b457563593dc29805214bbc5# 檢查是否添加成功 [root@k8s-master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master NotReady control-plane,master 11m v1.21.3 k8s-node1 NotReady <none> 2m6s v1.21.3 k8s-node2 NotReady <none> 60s v1.21.3
  • 配置網(wǎng)絡(luò)插件[root@k8s-master ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml# 查看是否有運(yùn)行 [root@k8s-master ~]# kubectl get pods -n kube-system NAME READY STATUS RESTARTS AGE coredns-59d64cd4d4-dqx8m 1/1 Running 0 31m coredns-59d64cd4d4-z8pdq 1/1 Running 0 31m etcd-k8s-master 1/1 Running 0 31m kube-apiserver-k8s-master 1/1 Running 0 31m kube-controller-manager-k8s-master 1/1 Running 0 31m kube-flannel-ds-h7v2g 1/1 Running 0 2m46s kube-flannel-ds-xmzfh 1/1 Running 0 2m46s kube-flannel-ds-z9nbj 1/1 Running 0 2m46s kube-proxy-6c9cd 1/1 Running 0 20m kube-proxy-cnvfg 1/1 Running 0 31m kube-proxy-p4nx4 1/1 Running 0 22m kube-scheduler-k8s-master 1/1 Running 0 31m# 驗(yàn)證是否啟動(dòng) [root@k8s-master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master Ready control-plane,master 32m v1.21.3 k8s-node1 Ready <none> 23m v1.21.3 k8s-node2 Ready <none> 22m v1.21.3
  • 測(cè)試 kubernetes 集群# 在 Kubernetes 集群中創(chuàng)建一個(gè) pod,驗(yàn)證是否正常運(yùn)行 # 聯(lián)網(wǎng)下載nginx鏡像 [root@k8s-master ~]# kubectl create deployment nginx --image=nginx deployment.apps/nginx created # 查看pod狀態(tài) [root@k8s-master ~]# kubectl get pod NAME READY STATUS RESTARTS AGE nginx-6799fc88d8-lj24f 1/1 Running 0 62s # 對(duì)外暴露80端口 [root@k8s-master ~]# kubectl expose deployment nginx --port=80 --type=NodePort service/nginx exposed # 查看對(duì)外端口 [root@k8s-master ~]# kubectl get pod,svc NAME READY STATUS RESTARTS AGE pod/nginx-6799fc88d8-lj24f 1/1 Running 0 3m4sNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 39m service/nginx NodePort 10.105.227.129 <none> 80:30640/TCP 20s# 訪(fǎng)問(wèn)地址:http://NodeIP:Port(NodeIP為任意節(jié)點(diǎn)ip,port為暴露出來(lái)的端口號(hào))

平臺(tái)搭建2:單master集群的二進(jìn)制方式安裝

  • 準(zhǔn)備虛擬主機(jī)(記得做好快照,以便環(huán)境快速恢復(fù))。網(wǎng)絡(luò)要求:集群機(jī)器之間能夠互通,且能夠上外網(wǎng)(操作系統(tǒng)此例為CentOS7) 角色I(xiàn)P組件
    k8s-master172.16.90.147kube-apiserver,kube-controller-manager,kube -scheduler,etcd
    k8s-node1172.16.90.148kubelet,kube-proxy,docker etcd
  • 兩個(gè)虛擬機(jī)的初始化(記得做好快照,以便環(huán)境快速恢復(fù))# 關(guān)閉防火墻 systemctl stop firewalld systemctl disable firewalld# 關(guān)閉 selinux sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久 setenforce 0 # 臨時(shí)# 關(guān)閉 swap swapoff -a # 臨時(shí) sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久# 根據(jù)規(guī)劃設(shè)置主機(jī)名 hostnamectl set-hostname <hostname># 在 master 添加 hosts cat >> /etc/hosts << EOF 172.16.90.147 m1 172.16.90.148 n1 EOF# 將橋接的 IPv4 流量傳遞到 iptables 的鏈 cat > /etc/sysctl.d/k8s.conf << EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF# 生效 sysctl --system # 時(shí)間同步 yum install ntpdate -y ntpdate time.windows.com
  • 為etcd自簽證書(shū)# 準(zhǔn)備 cfssl 證書(shū)生成工具 # cfssl 是一個(gè)開(kāi)源的證書(shū)管理工具,使用 json 文件生成證書(shū),相比 openssl 更方便使用。 找任意一臺(tái)服務(wù)器操作,這里用 Master 節(jié)點(diǎn) # 下載 wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 chmod +x cfssl_linux-amd64 cfssljson_linux-amd64 cfssl-certinfo_linux-amd64 mv cfssl_linux-amd64 /usr/local/bin/cfssl mv cfssljson_linux-amd64 /usr/local/bin/cfssljson mv cfssl-certinfo_linux-amd64 /usr/bin/cfssl-certinfo# 生成 Etcd 證書(shū) # 自簽證書(shū)頒發(fā)機(jī)構(gòu)(CA) # 創(chuàng)建工作目錄 [root@m1 TSL]# mkdir -p ~/TLS/{etcd,k8s} [root@m1 TSL]# cd TLS/etcd# 自簽CA [root@m1 TSL]# cat > ca-config.json<< EOF {"signing": { "default": { "expiry": "87600h" },"profiles": { "www": { "expiry": "87600h", "usages": ["signing", "key encipherment", "server auth", "client auth"] } } } } EOF [root@m1 TSL]# cat > ca-csr.json<< EOF { "CN": "etcd CA", "key": { "algo": "rsa", "size": 2048 },"names": [{ "C": "CN", "L": "Beijing", "ST": "Beijing"}] } EOF# 生成證書(shū) [root@m1 etcd]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca - [root@m1 etcd]# ls *pem ca-key.pem ca.pem# 使用自簽 CA 簽發(fā) Etcd HTTPS 證書(shū) # 創(chuàng)建證書(shū)申請(qǐng)文件 [root@m1 etcd]# cat > server-csr.json<< EOF {"CN": "etcd","hosts": ["172.16.90.147","172.16.90.148"],"key": {"algo": "rsa","size": 2048},"names": [{"C": "CN","L": "BeiJing","ST": "BeiJing"}] } EOF # 注意:上述文件 hosts 字段中 IP 為所有 etcd 節(jié)點(diǎn)的集群內(nèi)部通信 IP,一個(gè)都不能少!為了 方便后期擴(kuò)容可以多寫(xiě)幾個(gè)預(yù)留的 IP。# 生成證書(shū) [root@m1 etcd]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www server-csr.json | cfssljson -bare server#查看結(jié)果 [root@m1 etcd]# ls server*pem server-key.pem server.pem
  • 部署etcd集群# 以下在節(jié)點(diǎn) 1 上操作,為簡(jiǎn)化操作,待會(huì)將節(jié)點(diǎn) 1 生成的所有文件拷貝到節(jié)點(diǎn) 2 和節(jié)點(diǎn) 3. # 創(chuàng)建工作目錄并解壓二進(jìn)制包 [root@m1 ~]# mkdir -p /opt/etcd/{bin,cfg,ssl} [root@m1 ~]# tar zxvf etcd-v3.4.9-linux-amd64.tar.gz [root@m1 ~]# mv etcd-v3.4.9-linux-amd64/{etcd,etcdctl} /opt/etcd/bin/ [root@m1 opt]# tree etcd etcd ├── bin │ ├── etcd │ └── etcdctl ├── cfg └── ssl# 創(chuàng)建etcd配置文件 [root@m1 ~]# cat > /opt/etcd/cfg/etcd.conf << EOF #[Member] #ETCD_NAME:節(jié)點(diǎn)名稱(chēng),集群中唯一 ETCD_NAME="etcd-1" #ETCD_DATA_DIR:數(shù)據(jù)目錄 ETCD_DATA_DIR="/var/lib/etcd/default.etcd" #ETCD_LISTEN_PEER_URLS:集群通信監(jiān)聽(tīng)地址 ETCD_LISTEN_PEER_URLS="https://172.16.90.147:2380" #ETCD_LISTEN_CLIENT_URLS:客戶(hù)端訪(fǎng)問(wèn)監(jiān)聽(tīng)地址 ETCD_LISTEN_CLIENT_URLS="https://172.16.90.147:2379" #[Clustering] #ETCD_INITIAL_ADVERTISE_PEER_URLS:集群通告地址 ETCD_INITIAL_ADVERTISE_PEER_URLS="https://172.16.90.147:2380" #ETCD_ADVERTISE_CLIENT_URLS:客戶(hù)端通告地址 ETCD_ADVERTISE_CLIENT_URLS="https://172.16.90.147:2379" #ETCD_INITIAL_CLUSTER:集群節(jié)點(diǎn)地址 ETCD_INITIAL_CLUSTER="etcd-1=https://172.16.90.147:2380,etcd-2=https://172.16.90.148:2380" #ETCD_INITIAL_CLUSTER_TOKEN:集群 Token ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster" #ETCD_INITIAL_CLUSTER_STATE:加入集群的當(dāng)前狀態(tài),new 是新集群,existing 表示加入 已有集群 ETCD_INITIAL_CLUSTER_STATE="new"#systemd 管理 etcd [root@m1 /]# cat > /usr/lib/systemd/system/etcd.service << EOF [Unit] Description=Etcd Server After=network.target After=network-online.target Wants=network-online.target [Service] Type=notify EnvironmentFile=/opt/etcd/cfg/etcd.conf ExecStart=/opt/etcd/bin/etcd \ --cert-file=/opt/etcd/ssl/server.pem \ --key-file=/opt/etcd/ssl/server-key.pem \ --peer-cert-file=/opt/etcd/ssl/server.pem \ --peer-key-file=/opt/etcd/ssl/server-key.pem \ --trusted-ca-file=/opt/etcd/ssl/ca.pem \ --peer-trusted-ca-file=/opt/etcd/ssl/ca.pem \ --logger=zap Restart=on-failure LimitNOFILE=65536 [Install] WantedBy=multi-user.target EOF# 筆者再啟動(dòng)etcd服務(wù)時(shí)報(bào)錯(cuò),經(jīng)排查因?yàn)?\ 引發(fā),改后可行 [Unit] Description=Etcd Server After=network.target After=network-online.target Wants=network-online.target [Service] Type=notify EnvironmentFile=/opt/etcd/cfg/etcd.conf ExecStart=/opt/etcd/bin/etcd --cert-file=/opt/etcd/ssl/server.pem --key-file=/opt/etcd/ssl/server-key.pem --peer-cert-file=/opt/etcd/ssl/server.pem --peer-key-file=/opt/etcd/ssl/server-key.pem --trusted-ca-file=/opt/etcd/ssl/ca.pem --peer-trusted-ca-file=/opt/etcd/ssl/ca.pem --logger=zap Restart=on-failure LimitNOFILE=65536 [Install] WantedBy=multi-user.target# 拷貝剛才生成的證書(shū) [root@m1 ssl]# cp ~/TLS/etcd/ca*pem ~/TLS/etcd/server*pem /opt/etcd/ssl/ [root@m1 ssl]# ls ca-key.pem ca.pem server-key.pem server.pem# 將上面mastert所有生成的文件拷貝到從節(jié)點(diǎn) [root@m1 system]# scp -r /opt/etcd/ root@172.16.90.148:/opt/ [root@m1 system]# scp /usr/lib/systemd/system/etcd.service root@172.16.90.148:/usr/lib/systemd/system/# 到從節(jié)點(diǎn)點(diǎn)修改配置文件 [root@n1 ~]# vim /opt/etcd/cfg/etcd.conf #[Member] ETCD_NAME="etcd-2" ETCD_DATA_DIR="/var/lib/etcd/default.etcd" ETCD_LISTEN_PEER_URLS="https://172.16.90.148:2380" ETCD_LISTEN_CLIENT_URLS="https://172.16.90.148:2379" #[Clustering] ETCD_INITIAL_ADVERTISE_PEER_URLS="https://172.16.90.148:2380" ETCD_ADVERTISE_CLIENT_URLS="https://172.16.90.148:2379" ETCD_INITIAL_CLUSTER="etcd-1=https://172.16.90.147:2380,etcd-2=https://172.16.90.148:2380" ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster" ETCD_INITIAL_CLUSTER_STATE="new"# 啟動(dòng)并設(shè)置開(kāi)機(jī)啟動(dòng) # 重新服務(wù)的配置文件 [root@m1 system]# systemctl daemon-reload #啟動(dòng)etcd服務(wù) [root@m1 system]# systemctl start etcd #有錯(cuò)誤可用此命令查看日志;也可檢查是否啟動(dòng) [root@m1 system]# systemctl status etcd.service #將etcd服務(wù)設(shè)置為開(kāi)機(jī)啟動(dòng) [root@m1 system]# systemctl enable etcd# 在master節(jié)點(diǎn)執(zhí)行以下命令,檢查是否啟動(dòng)成功 [root@m1 ~]# ETCDCTL_API=3 /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem --endpoints="https://172.16.90.147:2379,https://172.16.90.148:2379" endpoint health https://172.16.90.147:2379 is healthy: successfully committed proposal: took = 23.120604ms https://172.16.90.148:2379 is healthy: successfully committed proposal: took = 24.304144ms #如果輸出上面信息,就說(shuō)明集群部署成功。如果有問(wèn)題第一步先看日志: /var/log/message 或 journalctl -u etcd
  • 安裝docker# 以下在所有節(jié)點(diǎn)操作。這里采用二進(jìn)制安裝,用 yum 安裝也一樣。 # 解壓二進(jìn)制包 [root@m1 ~]# tar zxvf docker-19.03.9.tgz [root@m1 ~]# mv docker/* /usr/bin# systemd 管理 docker [root@m1 ~]# vim /usr/lib/systemd/system/docker.service [Unit] Description=Docker Application Container Engine Documentation=https://docs.docker.com After=network-online.target firewalld.service Wants=network-online.target [Service] Type=notify ExecStart=/usr/bin/dockerd ExecReload=/bin/kill -s HUP $MAINPID LimitNOFILE=infinity LimitNPROC=infinity LimitCORE=infinity TimeoutStartSec=0 Delegate=yes KillMode=process Restart=on-failure StartLimitBurst=3 StartLimitInterval=60s [Install] WantedBy=multi-user.target# 創(chuàng)建配置文件 # registry-mirrors 阿里云鏡像加速器 [root@m1 ~]# cat > /etc/docker/daemon.json << EOF > { > "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"] > } > EOF
  • 為apiserver自簽證書(shū)# 主從節(jié)點(diǎn)間的訪(fǎng)問(wèn):添加可信任的ip列表 或者 寫(xiě)到CA證書(shū)發(fā)送 # 下列以 添加可信任的ip列表 為例進(jìn)行演示# 創(chuàng)建CA配置json文件 # 自簽證書(shū)頒發(fā)機(jī)構(gòu)(CA) [root@m1 k8s]# vim ca-config.json {"signing": {"default": {"expiry": "87600h"},"profiles": {"kubernetes": {"expiry": "87600h","usages": ["signing","key encipherment","server auth","client auth"]}}} }[root@m1 k8s]# vim ca-csr.json {"CN": "kubernetes","key": {"algo": "rsa","size": 2048},"names": [{"C": "CN","L": "HuBei","ST": "WuHan","O": "k8s","OU": "System"}] }# 使用自簽 CA 簽發(fā) kube-apiserver HTTPS 證書(shū) # 創(chuàng)建apiserver證書(shū)的所需配置文件 [root@m1 k8s]# vim kube-proxy-csr.json {"CN": "system:kube-proxy","hosts": [],"key": {"algo": "rsa","size": 2048},"names": [{"C": "CN","L": "HuBei","ST": "WuHan","O": "k8s","OU": "System"}] }# 創(chuàng)建證書(shū)申請(qǐng)文件: [root@m1 k8s]# vim server-csr.json {"CN": "kubernetes","hosts": ["10.0.0.1","127.0.0.1","kubernetes","kubernetes.default","kubernetes.default.svc","kubernetes.default.svc.cluster","kubernetes.default.svc.cluster.local","172.16.90.147","172.16.90.148","172.16.90.149","172.16.90.150","172.16.90.151"],"key": {"algo": "rsa","size": 2048},"names": [{"C": "CN","L": "HuBei","ST": "WuHan","O": "k8s","OU": "System"}] } # 注:host中的最后幾個(gè)IP為需要連接apiserver的IP,一般為master集群的所有IP,和負(fù)載均衡LB的所有IP和VIP,本文中的IP # "10.16.8.150", master01 # "10.16.8.151", master02 # "10.16.8.156", LB # "10.16.8.155", 備用IP # "10.16.8.164" 備用IP # 其中10.16.8.168即可信任的IP列表 # 原配置: # ... # "10.0.0.1", # "127.0.0.1", # "kubernetes", # "kubernetes.default", # "kubernetes.default.svc", # "kubernetes.default.svc.cluster", # "kubernetes.default.svc.cluster.local", # "10.16.8.150", # "10.16.8.151", # "10.16.8.156", # "10.16.8.155", # "10.16.8.164" # ...# 自建CA,生成證書(shū) [root@m1 k8s]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca -# 生成證書(shū) [root@k8s-master01 k8s]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes server-csr.json | cfssljson -bare server [root@k8s-master01 k8s]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy# 檢查證書(shū)生成情況 [root@m1 k8s]# ll *.pem [root@m1 k8s]# ll *.pem -rw-------. 1 root root 1679 728 19:14 ca-key.pem -rw-r--r--. 1 root root 1346 728 19:14 ca.pem -rw-------. 1 root root 1675 728 19:24 kube-proxy-key.pem -rw-r--r--. 1 root root 1391 728 19:24 kube-proxy.pem -rw-------. 1 root root 1675 728 19:22 server-key.pem -rw-r--r--. 1 root root 1635 728 19:22 server.pem# 啟動(dòng)并設(shè)置開(kāi)機(jī)啟動(dòng) systemctl daemon-reload systemctl start docker systemctl enable docker
  • 部署master組件(由于未知錯(cuò)誤,筆者CentOS7無(wú)法識(shí)別 “”,此處有*.conf 和 *.server文件集合,驗(yàn)證碼:nht1)# 注:打開(kāi)鏈接你會(huì)發(fā)現(xiàn)里面有很多包,下載一個(gè) server 包就夠了,包含了 Master 和 Worker Node 二進(jìn)制文件。# 解壓二進(jìn)制包 [root@m1 ~]# mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs} [root@m1 kubernetes]# tar -xzvf kubernetes-server-linux-amd64.tar.gz [root@m1 ~]# cd kubernetes/server/bin [root@m1 bin]# cp kube-apiserver kube-scheduler kube-controller-manager /opt/kubernetes/bin [root@m1 bin]# cp kubectl /usr/bin/# 部署 kube-apiserver # 創(chuàng)建配置文件[root@m1 bin]# vim /opt/kubernetes/cfg/kube-apiserver.conf KUBE_APISERVER_OPTS="--logtostderr=false \ --v=2 \ --log-dir=/opt/kubernetes/logs \ --etcd-servers=https://172.16.90.147:2379,https://172.16.90.148:2379 \ --bind-address=172.16.90.147 \ --secure-port=6443 \ --advertise-address=172.16.90.147 \ --allow-privileged=true \ --service-cluster-ip-range=10.0.0.0/24 \ --enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,ResourceQuota,NodeRestriction \ --authorization-mode=RBAC,Node \ --enable-bootstrap-token-auth=true \ --token-auth-file=/opt/kubernetes/cfg/token.csv \ --service-node-port-range=30000-32767 \ --kubelet-client-certificate=/opt/kubernetes/ssl/server.pem \ --kubelet-client-key=/opt/kubernetes/ssl/server-key.pem \ --tls-cert-file=/opt/kubernetes/ssl/server.pem \ --tls-private-key-file=/opt/kubernetes/ssl/server-key.pem \ --client-ca-file=/opt/kubernetes/ssl/ca.pem \ --service-account-key-file=/opt/kubernetes/ssl/ca-key.pem \ --etcd-cafile=/opt/etcd/ssl/ca.pem \ --etcd-certfile=/opt/etcd/ssl/server.pem \ --etcd-keyfile=/opt/etcd/ssl/server-key.pem \ --audit-log-maxage=30 \ --audit-log-maxbackup=3 \ --audit-log-maxsize=100 \ --audit-log-path=/opt/kubernetes/logs/k8s-audit.log" # 配置詳解 # –logtostderr:啟用日志 # —v:日志等級(jí) # –log-dir:日志目錄 # –etcd-servers:etcd 集群地址 # –bind-address:監(jiān)聽(tīng)地址 # –secure-port:https 安全端口 # –advertise-address:集群通告地址 # –allow-privileged:啟用授權(quán) # –service-cluster-ip-range:Service 虛擬 IP 地址段 # –enable-admission-plugins:準(zhǔn)入控制模塊 # –authorization-mode:認(rèn)證授權(quán),啟用 RBAC 授權(quán)和節(jié)點(diǎn)自管理 # –enable-bootstrap-token-auth:啟用 TLS bootstrap 機(jī)制 # –token-auth-file:bootstrap token 文件 # –service-node-port-range:Service nodeport 類(lèi)型默認(rèn)分配端口范圍 # –kubelet-client-xxx:apiserver 訪(fǎng)問(wèn) kubelet 客戶(hù)端證書(shū) # –tls-xxx-file:apiserver https 證書(shū) # –etcd-xxxfile:連接 Etcd 集群證書(shū) # –audit-log-xxx:審計(jì)日志# 拷貝剛才生成的證書(shū),把剛才生成的證書(shū)拷貝到配置文件中的路徑 [root@m1 bin]# cp ~/TLS/k8s/ca*pem ~/TLS/k8s/server*pem /opt/kubernetes/ssl/# 啟用 TLS Bootstrapping 機(jī)制 # TLS Bootstraping:Master apiserver 啟用 TLS 認(rèn)證后,Node 節(jié)點(diǎn) kubelet 和 kube- proxy 要與 kube-apiserver 進(jìn)行通信,必須使用 CA 簽發(fā)的有效證書(shū)才可以,當(dāng) Node 節(jié)點(diǎn)很多時(shí),這種客戶(hù)端證書(shū)頒發(fā)需要大量工作,同樣也會(huì)增加集群擴(kuò)展復(fù)雜度。為了 簡(jiǎn)化流程,Kubernetes 引入了 TLS bootstraping 機(jī)制來(lái)自動(dòng)頒發(fā)客戶(hù)端證書(shū),kubelet 會(huì)以一個(gè)低權(quán)限用戶(hù)自動(dòng)向 apiserver 申請(qǐng)證書(shū),kubelet 的證書(shū)由 apiserver 動(dòng)態(tài)簽署。 # 所以強(qiáng)烈建議在 Node 上使用這種方式,目前主要用于 kubelet,kube-proxy 還是由我 們統(tǒng)一頒發(fā)一個(gè)證書(shū)。 # 創(chuàng)建上述配置文件中 token 文件: [root@m1 bin]# vim /opt/kubernetes/cfg/token.csv c47ffb939f5ca36231d9e3121a252940,kubelet-bootstrap,10001,"system:node-bootstrapper" # 格式:token,用戶(hù)名,UID,用戶(hù)組。token 也可自行生成替換: # head -c 16 /dev/urandom | od -An -t x | tr -d ' '# systemd 管理 apiserver [root@m1 bin]# vim /usr/lib/systemd/system/kube-apiserver.service [Unit] Description=Kubernetes API Server Documentation=https://github.com/kubernetes/kubernetes [Service] EnvironmentFile=/opt/kubernetes/cfg/kube-apiserver.conf ExecStart=/opt/kubernetes/bin/kube-apiserver \$KUBE_APISERVER_OPTS Restart=on-failure [Install] WantedBy=multi-user.target# 啟動(dòng)并設(shè)置開(kāi)機(jī)啟動(dòng) [root@m1 ~]# systemctl daemon-reload [root@m1 ~]# systemctl start kube-apiserver [root@m1 ~]# systemctl enable kube-apiserver# 授權(quán) kubelet-bootstrap 用戶(hù)允許請(qǐng)求證書(shū) [root@m1 k8s]# kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap# 部署 kube-controller-manager [root@m1 k8s]# vim /opt/kubernetes/cfg/kube-controller-manager.conf KUBE_CONTROLLER_MANAGER_OPTS="--logtostderr=false \ --v=2 \ --log-dir=/opt/kubernetes/logs \ --leader-elect=true \ --master=127.0.0.1:8080 \ --bind-address=127.0.0.1 \ --allocate-node-cidrs=true \ --cluster-cidr=10.244.0.0/16 \ --service-cluster-ip-range=10.0.0.0/24 \ --cluster-signing-cert-file=/opt/kubernetes/ssl/ca.pem \ --cluster-signing-key-file=/opt/kubernetes/ssl/ca-key.pem \ --root-ca-file=/opt/kubernetes/ssl/ca.pem \ --service-account-private-key-file=/opt/kubernetes/ssl/ca-key.pem \ --experimental-cluster-signing-duration=87600h0m0s" # -master:通過(guò)本地非安全本地端口 8080 連接 apiserver # -leader-elect:當(dāng)該組件啟動(dòng)多個(gè)時(shí),自動(dòng)選舉(HA) # -cluster-signing-cert-file/–cluster-signing-key-file:自動(dòng)為 kubelet 頒發(fā)證書(shū) 的 CA,與 apiserver 保持一致# systemd 管理 controller-manager [root@m1 k8s]# vim /usr/lib/systemd/system/kube-controller-manager.service [Unit] Description=Kubernetes Controller Manager Documentation=https://github.com/kubernetes/kubernetes [Service] EnvironmentFile=/opt/kubernetes/cfg/kube-controller-manager.conf ExecStart=/opt/kubernetes/bin/kube-controller-manager \$KUBE_CONTROLLER_MANAGER_OPTS Restart=on-failure [Install] WantedBy=multi-user.target# 啟動(dòng)并設(shè)置開(kāi)機(jī)啟動(dòng) [root@m1 k8s]# systemctl daemon-reload [root@m1 k8s]# systemctl start kube-controller-manager [root@m1 k8s]# systemctl enable kube-controller-manager# 部署 kube-scheduler [root@m1 k8s]# vim /opt/kubernetes/cfg/kube-scheduler.conf KUBE_SCHEDULER_OPTS="--logtostderr=false \ --v=2 \ --log-dir=/opt/kubernetes/logs \ --leader-elect \ --master=127.0.0.1:8080 \ --bind-address=127.0.0.1" # –master:通過(guò)本地非安全本地端口 8080 連接 apiserver。 # –leader-elect:當(dāng)該組件啟動(dòng)多個(gè)時(shí),自動(dòng)選舉(HA)# systemd 管理 scheduler [root@m1 k8s]# vim /usr/lib/systemd/system/kube-scheduler.service [Unit] Description=Kubernetes Scheduler Documentation=https://github.com/kubernetes/kubernetes[Service] EnvironmentFile=/opt/kubernetes/cfg/kube-scheduler.conf ExecStart=/opt/kubernetes/bin/kube-scheduler \$KUBE_SCHEDULER_OPTS Restart=on-failure[Install] WantedBy=multi-user.target# 啟動(dòng)并設(shè)置開(kāi)機(jī)啟動(dòng) [root@m1 k8s]# systemctl daemon-reload [root@m1 k8s]# systemctl start kube-scheduler [root@m1 k8s]# systemctl enable kube-scheduler# 查看集群狀態(tài) # 所有組件都已經(jīng)啟動(dòng)成功,通過(guò) kubectl 工具查看當(dāng)前集群組件狀態(tài): Warning: v1 ComponentStatus is deprecated in v1.19+ NAME STATUS MESSAGE ERROR controller-manager Healthy ok scheduler Healthy ok etcd-0 Healthy {"health":"true"} etcd-1 Healthy {"health":"true"} # 如上輸出說(shuō)明 Master 節(jié)點(diǎn)組件運(yùn)行正常。
  • 部署node組件(由于未知錯(cuò)誤,筆者CentOS7無(wú)法識(shí)別 “”,此處有*.conf 和 *.server文件集合,驗(yàn)證碼:nht1)# 創(chuàng)建工作目錄并拷貝二進(jìn)制文件 # 在所有 worker node 創(chuàng)建工作目錄 [root@n1 ~]# mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}# 將m1上證書(shū)文件拷貝到n1 [root@m1 k8s]# scp ~/TLS/k8s/ca*pem ~/TLS/k8s/kube-proxy*pem root@172.16.90.148:/opt/kubernetes/ssl/# 解壓文件并拷貝配置 [root@n1 ~]# tar -xzvf kubernetes-node-linux-amd64.tar.gz [root@n1 ~]# cd kubernetes/node/bin/ [root@n1 bin]# ls kubeadm kubectl kubelet kube-proxy [root@n1 bin]# cp kubelet kube-proxy /opt/kubernetes/bin [root@n1 bin]# cp kubectl /usr/bin/# 部署 kubelet # 創(chuàng)建配置文件 [root@n1 bin]# vim /opt/kubernetes/cfg/kubelet.conf KUBELET_OPTS="--logtostderr=false \ --v=2 \ --log-dir=/opt/kubernetes/logs \ --hostname-override=m1 \ --network-plugin=cni \ --kubeconfig=/opt/kubernetes/cfg/kubelet.kubeconfig \ --bootstrap-kubeconfig=/opt/kubernetes/cfg/bootstrap.kubeconfig \ --config=/opt/kubernetes/cfg/kubelet-config.yml \ --cert-dir=/opt/kubernetes/ssl \ --pod-infra-container-image=lizhenliang/pause-amd64:3.0" # –hostname-override:顯示名稱(chēng),集群中唯一 # –network-plugin:啟用 CNI # –kubeconfig:空路徑,會(huì)自動(dòng)生成,后面用于連接 apiserver # –bootstrap-kubeconfig:首次啟動(dòng)向 apiserver 申請(qǐng)證書(shū) # –config:配置參數(shù)文件 # –cert-dir:kubelet 證書(shū)生成目錄 # –pod-infra-container-image:管理 Pod 網(wǎng)絡(luò)容器的鏡像# 配置參數(shù)文件 [root@n1 bin]# vim /opt/kubernetes/cfg/kubelet-config.yml kind: KubeletConfiguration apiVersion: kubelet.config.k8s.io/v1beta1 address: 0.0.0.0 port: 10250 readOnlyPort: 10255 cgroupDriver: cgroupfs clusterDNS: - 10.0.0.2 clusterDomain: cluster.local failSwapOn: false authentication:anonymous:enabled: falsewebhook:cacheTTL: 2m0senabled: truex509:clientCAFile: /opt/kubernetes/ssl/ca.pem authorization:mode: Webhookwebhook:cacheAuthorizedTTL: 5m0scacheUnauthorizedTTL: 30s evictionHard: imagefs.available: 15% memory.available: 100Mi nodefs.available: 10% nodefs.inodesFree: 5% maxOpenFiles: 1000000 maxPods: 110# 生成 bootstrap.kubeconfig 文件 # 指定apiserver地址 [root@n1 kubernetes]# export KUBE_APISERVER="https://172.16.90.147:6443" # apiserver IP:PORT # 指定TOKEN值 [root@n1 kubernetes]# export TOKEN="c47ffb939f5ca36231d9e3121a252940" # 與 token.csv 里保持一致 # 設(shè)置集群參數(shù) [root@n1 kubernetes]# kubectl config set-cluster kubernetes \ > --certificate-authority=/opt/kubernetes/ssl/ca.pem \ > --embed-certs=true \ > --server=${KUBE_APISERVER} \ > --kubeconfig=bootstrap.kubeconfig Cluster "kubernetes" set. # 設(shè)置客戶(hù)端認(rèn)證參數(shù) [root@n1 kubernetes]# kubectl config set-credentials "kubelet-bootstrap" \ > --token=${TOKEN} \ > --kubeconfig=bootstrap.kubeconfig User "kubelet-bootstrap" set. # 設(shè)置上下文參數(shù) [root@n1 kubernetes]# kubectl config set-context default \ > --cluster=kubernetes \ > --user="kubelet-bootstrap" \ > --kubeconfig=bootstrap.kubeconfig Context "default" created. # 設(shè)置默認(rèn)上下文 [root@n1 kubernetes]# kubectl config use-context default --kubeconfig=bootstrap.kubeconfig Switched to context "default". # –embed-certs 為 true 時(shí)表示將 certificate-authority 證書(shū)寫(xiě)入到生成的 bootstrap.kubeconfig 文件中 # 拷貝到配置文件路徑 [root@n1 kubernetes]# cp bootstrap.kubeconfig /opt/kubernetes/cfg# systemd 管理 kubelet [root@n1 kubernetes]# vim /usr/lib/systemd/system/kubelet.service [Unit] Description=Kubernetes Kubelet After=docker.service [Service] EnvironmentFile=/opt/kubernetes/cfg/kubelet.conf ExecStart=/opt/kubernetes/bin/kubelet \$KUBELET_OPTS Restart=on-failure LimitNOFILE=65536 [Install] WantedBy=multi-user.target# 啟動(dòng)并設(shè)置開(kāi)機(jī)啟動(dòng) [root@n1 kubernetes]# systemctl daemon-reload [root@n1 kubernetes]# systemctl start kubelet [root@n1 kubernetes]# systemctl enable kubelet# 批準(zhǔn) kubelet 證書(shū)申請(qǐng)并加入集群 # 查看 kubelet 證書(shū)請(qǐng)求 [root@m1 ~]# kubectl get csr NAME AGE SIGNERNAME REQUESTOR CONDITION node-csr-j8VQGozwmrCDsJfBXTtA7MYwlmSMULb8WacDPTSniDY 61s kubernetes.io/kube-apiserver-client-kubelet kubelet-bootstrap Pending# 批準(zhǔn)申請(qǐng) [root@m1 ~]# kubectl certificate approve node-csr-j8VQGozwmrCDsJfBXTtA7MYwlmSMULb8WacDPTSniDY certificatesigningrequest.certificates.k8s.io/node-csr-j8VQGozwmrCDsJfBXTtA7MYwlmSMULb8WacDPTSniDY approved# 查看節(jié)點(diǎn) [root@m1 ~]# kubectl get node NAME STATUS ROLES AGE VERSION m1 NotReady <none> 28s v1.19.13 # 注:由于網(wǎng)絡(luò)插件還沒(méi)有部署,節(jié)點(diǎn)會(huì)沒(méi)有準(zhǔn)備就緒 NotReady# 部署 kube-proxy # 創(chuàng)建配置文件 [root@n1 kubernetes]# vim /opt/kubernetes/cfg/kube-proxy.conf KUBE_PROXY_OPTS="--logtostderr=false \ --v=2 \ --log-dir=/opt/kubernetes/logs \ --config=/opt/kubernetes/cfg/kube-proxy-config.yml"# 配置參數(shù)文件 [root@n1 kubernetes]# vim /opt/kubernetes/cfg/kube-proxy-config.yml kind: KubeProxyConfiguration apiVersion: kubeproxy.config.k8s.io/v1alpha1 bindAddress: 0.0.0.0 metricsBindAddress: 0.0.0.0:10249 clientConnection:kubeconfig: /opt/kubernetes/cfg/kube-proxy.kubeconfig hostnameOverride: n1 clusterCIDR: 10.0.0.0/24# 生成 kubeconfig 文件 # m1已經(jīng)設(shè)置集群參數(shù)KUBE_APISERVER,這里不再設(shè)置 # 設(shè)置集群參數(shù) [root@n1 kubernetes]# kubectl config set-cluster kubernetes \ > --certificate-authority=/opt/kubernetes/ssl/ca.pem \ > --embed-certs=true \ > --server=${KUBE_APISERVER} \ > --kubeconfig=kube-proxy.kubeconfig Cluster "kubernetes" set. # 設(shè)置客戶(hù)端認(rèn)證參數(shù) [root@n1 kubernetes]# kubectl config set-credentials kube-proxy \ > --client-certificate=/opt/kubernetes/ssl/kube-proxy.pem \ > --client-key=/opt/kubernetes/ssl/kube-proxy-key.pem \ > --embed-certs=true \ > --kubeconfig=kube-proxy.kubeconfig User "kube-proxy" set. # 設(shè)置上下文參數(shù) [root@n1 kubernetes]# kubectl config set-context default \ > --cluster=kubernetes \ > --user=kube-proxy \ > --kubeconfig=kube-proxy.kubeconfig Context "default" created. # 設(shè)置默認(rèn)上下文 [root@n1 kubernetes]# kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig Switched to context "default". # 設(shè)置集群參數(shù)和客戶(hù)端認(rèn)證參數(shù)時(shí) –embed-certs 都為 true,這會(huì)將 certificate-authority、client-certificate 和 client-key 指向的證書(shū)文件內(nèi)容寫(xiě)入到生成的 kube-proxy.kubeconfig 文件中 # 新增節(jié)點(diǎn)時(shí)只需,將bootstrap.kubeconfig和kube-proxy.kubeconfig文件分發(fā)到各node節(jié)點(diǎn)上# 拷貝到配置文件指定路徑 [root@n1 kubernetes]# cp kube-proxy.kubeconfig /opt/kubernetes/cfg/# systemd 管理 kube-proxy [root@n1 kubernetes]# vim /usr/lib/systemd/system/kube-proxy.service [Unit] Description=Kubernetes Proxy After=network.target [Service] EnvironmentFile=/opt/kubernetes/cfg/kube-proxy.conf ExecStart=/opt/kubernetes/bin/kube-proxy \$KUBE_PROXY_OPTS Restart=on-failure LimitNOFILE=65536 [Install] WantedBy=multi-user.target# 啟動(dòng)并設(shè)置開(kāi)機(jī)啟動(dòng) [root@n1 kubernetes]# systemctl daemon-reload [root@n1 kubernetes]# systemctl start kube-proxy [root@n1 kubernetes]# systemctl status kube-proxy ● kube-proxy.service - Kubernetes ProxyLoaded: loaded (/usr/lib/systemd/system/kube-proxy.service; disabled; vendor preset: disabled)Active: active (running) since 六 2021-07-31 19:03:13 CST; 2s ago ... [root@n1 kubernetes]# systemctl enable kube-proxy
  • 部署集群(CNI)網(wǎng)絡(luò)# 解壓二進(jìn)制包并移動(dòng)到默認(rèn)工作目錄 [root@n1 ~]# mkdir -p /opt/cni/bin [root@n1 ~]# tar zxvf cni-plugins-linux-amd64-v0.8.6.tgz -C /opt/cni/bin# 部署CNI網(wǎng)絡(luò) [root@m1 ~]# wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml [root@m1 ~]# sed -i -r "s#quay.io/coreos/flannel:.*-amd64#lizhenliang/flannel:v0.12.0- amd64#g" kube-flannel.yml# 默認(rèn)鏡像地址無(wú)法訪(fǎng)問(wèn),修改為 docker hub 鏡像倉(cāng)庫(kù) [root@m1 ~]# kubectl apply -f kube-flannel.yml [root@m1 ~]# kubectl get pods -n kube-system NAME READY STATUS RESTARTS AGE kube-flannel-ds-2kqmz 1/1 Running 0 6m26s [root@m1 ~]# kubectl get node NAME STATUS ROLES AGE VERSION m1 Ready <none> 81m v1.19.13 # 部署好網(wǎng)絡(luò)插件,Node準(zhǔn)備就緒# 授權(quán) apiserver 訪(fǎng)問(wèn) kubelet [root@m1 ~]# vim apiserver-to-kubelet-rbac.yaml apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata:annotations:rbac.authorization.kubernetes.io/autoupdate: "true"labels:kubernetes.io/bootstrapping: rbac-defaultsname: system:kube-apiserver-to-kubelet rules:- apiGroups:- ""resources:- nodes/proxy- nodes/stats- nodes/log- nodes/spec- nodes/metrics- pods/logverbs: - "*" --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata:name: system:kube-apiservernamespace: "" roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: system:kube-apiserver-to-kubelet subjects:- apiGroup: rbac.authorization.k8s.iokind: Username: kubernetes [root@m1 ~]# kubectl apply -f apiserver-to-kubelet-rbac.yaml
  • 新增加 Worker Node# 拷貝已部署好的 Node 相關(guān)文件到新節(jié)點(diǎn) # 在n1(172.16.90.148)節(jié)點(diǎn)將Worker Node涉及文件拷貝到新節(jié)點(diǎn)172.16.90.149 [root@n1 ~]# scp -r /opt/kubernetes root@172.16.90.149:/opt/ [root@n1 ~]# scp -r /usr/lib/systemd/system/{kubelet,kube-proxy}.service root@172.16.90.149:/usr/lib/systemd/system [root@n1 ~]# scp -r /opt/cni/ root@172.16.90.149:/opt/ [root@n1 ~]# scp /opt/kubernetes/ssl/ca.pem root@172.16.90.149:/opt/kubernetes/ssl# 刪除kubelet證書(shū)和kubeconfig文件 [root@n2 ~]# rm /opt/kubernetes/cfg/kubelet.kubeconfig [root@n2 ~]# rm -f /opt/kubernetes/ssl/kubelet* # 注:這幾個(gè)文件是證書(shū)申請(qǐng)審批后自動(dòng)生成的,每個(gè)Node不同,必須刪除重新生成# 修改主機(jī)名 [root@n2 ~]# vim /opt/kubernetes/cfg/kubelet.conf ... --hostname-override=n2 ... [root@n2 ~]# vim /opt/kubernetes/cfg/kube-proxy-config.yml ... hostnameOverride: n2 ...# 啟動(dòng)并設(shè)置開(kāi)機(jī)啟動(dòng) [root@n2 ~]# systemctl daemon-reload [root@n2 ~]# systemctl start kubelet [root@n2 ~]# systemctl enable kubelet [root@n2 ~]# systemctl start kube-proxy [root@n2 ~]# systemctl enable kube-proxy# 在Master上批準(zhǔn)新Node kubelet證書(shū)申請(qǐng) # 與n1相同,此處略過(guò)# 查看 Node 狀態(tài) [root@m1 ~]# Kubectl get node
  • 測(cè)試集群[root@m1 ~]# kubectl create deployment nginx --image=nginx deployment.apps/nginx created [root@m1 ~]# kubectl expose deployment nginx --port=80 --type=NodePort service/nginx exposed [root@m1 ~]# kubectl get pod,svc NAME READY STATUS RESTARTS AGE pod/nginx-6799fc88d8-j5fn2 0/1 ContainerCreating 0 20sNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 3d23h service/nginx NodePort 10.0.0.70 <none> 80:30465/TCP 7s # 瀏覽器訪(fǎng)問(wèn)地址:http://NodeIP:Port(例如:http://172.16.90.148:30465)

兩種搭建方式對(duì)比:對(duì)兩種搭建方式的總結(jié)

  • kubeadm搭建k8s集群
    • 安裝linux系統(tǒng)虛擬機(jī),并對(duì)系統(tǒng)進(jìn)行初始化操作
    • 在所有節(jié)點(diǎn)(master、node)安裝docker(包括下載、修改倉(cāng)庫(kù)地址和yum源成阿里地址)、kubeadm(kubeadm join <Master 節(jié)點(diǎn)的 IP 和端口 >)、kubelet和kubectl
    • 在master節(jié)點(diǎn)執(zhí)行初始化命令操作(kubeadm init \,指定鏡像源,使用阿里云鏡像)
    • 部署網(wǎng)絡(luò)CNI插件(kubectl apply -f kube-flannel.yml)
    • 在所有node節(jié)點(diǎn)上使用join命令把node節(jié)點(diǎn)添加到master
  • 二進(jìn)制方式搭建k8s集群
    • 安裝linux系統(tǒng)虛擬機(jī),并對(duì)系統(tǒng)進(jìn)行初始化操作
    • 生成cfssl自簽證書(shū)(ca-key.pem、ca.pem、server-key.pem、server.pem)
    • 部署ectd集群(本質(zhì)是把etcd服務(wù),交給systemd管理。把證書(shū)復(fù)制過(guò)來(lái),啟動(dòng)并設(shè)置開(kāi)機(jī)啟動(dòng))
    • 為apiserver自簽證書(shū)(生成過(guò)程和etcd類(lèi)似)
    • 部署master組件(apiserver、controller-manager、scheduler下載二進(jìn)制文件進(jìn)行安裝,交給systemd管理組件啟動(dòng)并設(shè)置開(kāi)機(jī)啟動(dòng))
    • 部署node組件(docker、kubelet、kube-proxy下載二進(jìn)制文件進(jìn)行安裝,交給systemd管理組件啟動(dòng)并設(shè)置開(kāi)機(jī)啟動(dòng),最后批準(zhǔn)kubelet證書(shū)申請(qǐng)并加入集群)
    • 部署CNI網(wǎng)絡(luò)插件

3. 核心技術(shù)(上)

kubernetes 集群命令行工具 kubectl:kubectl 是 Kubernetes 集群的命令行工具,通過(guò) kubectl 能夠?qū)罕旧磉M(jìn)行管理,并能 夠在集群上進(jìn)行容器化應(yīng)用的安裝部署。kubectl命令語(yǔ)法:kubectl [command] [TYPE] [NAME] [flags](command指定要對(duì)資源執(zhí)行的操作,例如create、get、describe和delete;TYPE指定資源類(lèi)型,資源類(lèi)型是大小寫(xiě)敏感的,開(kāi)發(fā)者能夠以單數(shù)、復(fù)數(shù)和縮略的形式,例如kubectl get pod pod1;NAME指定資源名稱(chēng),名稱(chēng)大小寫(xiě)敏感,如果省略名稱(chēng),則會(huì)顯示所有的資源例如:kubectl get pods);flags指定可選的參數(shù),例如可用-s或者-server參數(shù)指定kubernetes API server的地址和端口。獲取kubectl幫助的方法:kubectl --help,具體看某個(gè)操作kubectl get --help。kubectl 子命令使用分類(lèi):

  • 基礎(chǔ)命令
  • 部署和集群管理命令
  • 故障和調(diào)試命令
  • 其他命令

    kubernetes集群YAML文件詳解:k8s集群中對(duì)資源管理和資源對(duì)象編排部署都可以通過(guò)聲明樣式(YAML)文件來(lái)解決,我們把這種文件叫做資源清單文件,通過(guò) kubectl 命令直接使用資源清單文件就可以實(shí)現(xiàn)對(duì)大量的資源對(duì)象進(jìn)行編排部署了。語(yǔ)法格式:通過(guò)縮進(jìn)表示層級(jí)關(guān)系;不能用tab進(jìn)行縮進(jìn),只能用空格;一般開(kāi)通縮進(jìn)兩個(gè)空格;字符后縮進(jìn)一個(gè)空格,比如冒號(hào),逗號(hào)等后面;使用—表示新的yaml文件開(kāi)始;使用#表示注釋。yaml文件有控制器定義和被控制對(duì)象組成:

快速編寫(xiě)yaml文件:使用kubectl create命令生成yaml文件,命令:kubectl create deployment web --image=nginx -o yaml --dry-run > web.yaml(用于還未真正部署);使用kubectl get命令導(dǎo)出yaml文件kubectl get deploy nginx -o=yaml --export > web.yaml(用于已經(jīng)部署好的情況)

Pod簡(jiǎn)介:Pod 是 k8s 系統(tǒng)中可以創(chuàng)建和管理的最小單元,是資源對(duì)象模型中由用戶(hù)創(chuàng)建或部署的最 小資源對(duì)象模型,也是在 k8s 上運(yùn)行容器化應(yīng)用的資源對(duì)象,其他的資源對(duì)象都是用來(lái)支 撐或者擴(kuò)展 Pod 對(duì)象功能的。k8s 不會(huì)直接處理容器,而是 Pod,Pod 是由一個(gè)或多個(gè)container組成

Pod 是 Kubernetes 的最重要概念,每一個(gè) Pod 都有一個(gè)特殊的被稱(chēng)為”根容器“的 Pause 容器。Pause 容器對(duì)應(yīng)的鏡 像屬于 Kubernetes 平臺(tái)的一部分,除了 Pause 容器,每個(gè) Pod 還包含一個(gè)或多個(gè)緊密相關(guān)的用戶(hù)業(yè)務(wù)容器(加入到Pause容器中)

pod基本概念:最小部署單元、包含多個(gè)容器(一組容器的集合)、各個(gè)pod中容器共享網(wǎng)絡(luò)命名空間、pod是短暫的

pod存在意義:創(chuàng)建容器使用docker,一個(gè)docker對(duì)應(yīng)一個(gè)容器(便于管理),一個(gè)容器對(duì)應(yīng)一個(gè)進(jìn)程,一個(gè)容器運(yùn)行一個(gè)應(yīng)用程序;pod是多進(jìn)程設(shè)計(jì),運(yùn)行多個(gè)應(yīng)用程序(一個(gè)pod有多個(gè)容器,一個(gè)容器里面運(yùn)行一個(gè)應(yīng)用程序);pod存在為了親密性應(yīng)用(兩個(gè)應(yīng)用之間進(jìn)行交互、網(wǎng)絡(luò)之間調(diào)用、兩個(gè)應(yīng)用需要頻繁調(diào)用)

pod與應(yīng)用、容器、節(jié)點(diǎn)、pos差別:每個(gè)pod都是應(yīng)用的一個(gè)實(shí)例,有專(zhuān)用的IP;一個(gè)pod可以有多個(gè)容器,彼此之間共享網(wǎng)絡(luò)和存儲(chǔ)資源,每個(gè)pod中有一個(gè)pause容器保存所有的容器狀態(tài),通過(guò)管理pause容器,達(dá)到管理pod中所有容器的效果;同一個(gè)pod中的容器總會(huì)被調(diào)度到相同node節(jié)點(diǎn),不同節(jié)點(diǎn)間pod的通信基于虛擬二層網(wǎng)絡(luò)技術(shù)實(shí)現(xiàn);普通的pod和靜態(tài)pod

pod特性:共享網(wǎng)絡(luò),pod中容器之間通過(guò)linux的namespace和group機(jī)制進(jìn)行隔離,所以要想實(shí)現(xiàn)網(wǎng)絡(luò)共享其前提是pod中所有容器都在一個(gè)namespace里面,其實(shí)現(xiàn)原理是先創(chuàng)建pause容器(也稱(chēng)作info容器),然后將其他業(yè)務(wù)容器加入到pause容器中,使得所有業(yè)務(wù)容器處于同一namespace中,對(duì)外則暴露info容器的ip、mac、port等信息;共享存儲(chǔ),采用docker的Volumn數(shù)據(jù)卷進(jìn)行持久化存儲(chǔ)到某一特定區(qū)間,所有node都可以訪(fǎng)問(wèn)該區(qū)間;生命周期短暫,當(dāng)pod所在節(jié)點(diǎn)發(fā)生故障,那么該節(jié)點(diǎn)的pod會(huì)被調(diào)度到其他節(jié)點(diǎn),而且被重新調(diào)度的pod是一個(gè)全新的pod;網(wǎng)絡(luò)平坦,K8S集群中的所有Pod都在同一個(gè)共享網(wǎng)絡(luò)地址空間中,也就是說(shuō)每個(gè)Pod都可以通過(guò)其他Pod的IP地址來(lái)實(shí)現(xiàn)訪(fǎng)問(wèn)

pod常見(jiàn)配置:拉取策略、資源限制、重啟機(jī)制和健康檢查

  • 鏡像拉取策略
  • 資源限制
  • 重啟策略
  • 健康檢查

pod調(diào)度策略:主要包括創(chuàng)建pod流程和pod調(diào)度影響因素兩部分

  • 創(chuàng)建pod流程:首先在master通過(guò)apiserver創(chuàng)建pod節(jié)點(diǎn),隨后相關(guān)信息持久化到etcd中,此時(shí)scheduler是實(shí)時(shí)監(jiān)控apiserver當(dāng)檢查到有pod創(chuàng)建時(shí),它會(huì)通過(guò)apiserver讀取到該pod存放在etcd的信息,并通過(guò)自身調(diào)度算法將該pod調(diào)度到某個(gè)node節(jié)點(diǎn)上;被調(diào)度的node節(jié)點(diǎn)通過(guò)kubelet訪(fǎng)問(wèn)apiserver,并讀取到etcd中存放的信息,隨后通知docker創(chuàng)建該容器。
  • 影響pod調(diào)度的因素:主要有資源限制(前面所講的request、limit)、節(jié)點(diǎn)選擇器、節(jié)點(diǎn)親和性、污點(diǎn)和污點(diǎn)容忍這幾個(gè)方面


controller簡(jiǎn)介:在集群上管理和運(yùn)行容器的對(duì)象,Pod是通過(guò)Controller實(shí)現(xiàn)應(yīng)用的運(yùn)維(比如伸縮、滾動(dòng)升級(jí)等等),Pod和Controller之間通過(guò)label標(biāo)簽建立關(guān)系,其圖示如下:

常用控制器deployment:用于部署無(wú)狀態(tài)應(yīng)用(例如web應(yīng)用、之前部署的nginx,都是無(wú)狀態(tài)應(yīng)用)、管理Pod和ReplicaSet、部署和滾動(dòng)升級(jí)等功能。常用于web服務(wù)和微服務(wù)的場(chǎng)景,以下是使用deploy部署應(yīng)用的過(guò)程:

  • 導(dǎo)出yaml文件kubectl create deployment web --image=nginx --dry-run -o yaml > web.yaml
  • 使用yaml部署應(yīng)用 kubectl apply -f web.yaml
  • 查看應(yīng)用的啟動(dòng)情況 kubectl get pods
  • 對(duì)外發(fā)布(暴露端口)kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name=web1 -o yaml > web1.yaml,并執(zhí)行該yaml文件kubectl apply -f web1.yaml
  • 查看運(yùn)行情況kubectl get pods,svc
  • 應(yīng)用升級(jí) kubectl set image deployment web nginx=nignx:1.15,其升級(jí)過(guò)程,首先k8s下載1.15版本的nginx(期間1.1.4并不停止服務(wù)),下載完成后1.15版本的nginx會(huì)替換1.14版本的nginx,其升級(jí)過(guò)程中服務(wù)不中斷,最后查看升級(jí)狀態(tài) kubectl rollout status deployment web
  • 彈性回滾,首先可通過(guò) kubectl rollout history deployment web查看升級(jí)版本,通過(guò) kubectl rollout undo deployment web回滾到上一個(gè)版本,也可以通過(guò) kubectl rollout undo deployment web --to-revision=2回到指定版本,可通過(guò) kubectl rollout status deployment web查看當(dāng)前狀態(tài)。利用命令kubectl scale deployment web --relicas=10可彈性伸縮新增10個(gè)相同的pod
  • 常用控制器statefueset:pod分為無(wú)狀態(tài)pod(認(rèn)為pod都是一樣的;沒(méi)有順序要求;不用考慮在哪個(gè)node運(yùn)行;隨意進(jìn)行伸縮和拓展)和有狀態(tài)pod(以上因素都需要考慮到;讓每個(gè)pod獨(dú)立的保持pod啟動(dòng)順序和唯一性;唯一的網(wǎng)絡(luò)表示符,持久存儲(chǔ);有序,比如mysql主從),而statefueset用于有狀態(tài)pod控制。其創(chuàng)建過(guò)程分為無(wú)頭service和有狀態(tài)應(yīng)用:



    常用控制器DaemonSet:用于部署守護(hù)進(jìn)程,在每個(gè)node上運(yùn)行一個(gè)pod,新加入的node也同樣運(yùn)行在一個(gè)pod里面(例如:在每個(gè)node節(jié)點(diǎn)安裝數(shù)據(jù)采集工具)


    常用控制器Job:一次性任務(wù)




    常用控制器cronJob:定時(shí)任務(wù)



    Service簡(jiǎn)介:service用于定義一組pod訪(fǎng)問(wèn)規(guī)則。作用:防止pod失聯(lián)、定義一組pod訪(fǎng)問(wèn)策略(負(fù)載均衡)。起源如下圖:




    常用的Service類(lèi)型:ClusterIP、NodePort、LoadBalancer

    • ClusterIP:集群內(nèi)部使用(例如node1節(jié)點(diǎn)訪(fǎng)問(wèn)啟動(dòng)的pod,可利用 kubectl get svc查看分配的ip)
    • NodePort:對(duì)外訪(fǎng)問(wèn)應(yīng)用使用(例如:通過(guò)ip訪(fǎng)問(wèn)系統(tǒng),在瀏覽器訪(fǎng)問(wèn)pod里面的nginx)
    • loadBalancer:對(duì)外訪(fǎng)問(wèn)應(yīng)用使用,公有云亦可

    4. 核心技術(shù)(下)

    配置管理:以是否加密來(lái)區(qū)分使用,分為Secret(常用作憑證,作用是將加密數(shù)據(jù)存在etcd里面,讓pod容器以?huà)燧dvolume方式進(jìn)行訪(fǎng)問(wèn))和ConfigMap(常用作配置文件,作用是存儲(chǔ)不加密數(shù)據(jù)到etcd,讓Pod以變量或者Volume掛載到容器中)

    • secret的使用




    • ConfigMap的使用





    集群安全機(jī)制:訪(fǎng)問(wèn)k8s集群時(shí)候,需要經(jīng)過(guò)以下三個(gè)步驟完成具體操作。而在進(jìn)行訪(fǎng)問(wèn)的時(shí)候,過(guò)程中都需要經(jīng)過(guò)apiserver,apiserver作為統(tǒng)一協(xié)調(diào)(類(lèi)比于門(mén)衛(wèi))。訪(fǎng)問(wèn)過(guò)程中需要證書(shū)、token或者用戶(hù)名+密碼;如果訪(fǎng)問(wèn)pod則需要serviceAccount

    • 認(rèn)證:傳輸安全(對(duì)外不暴露8080端口,只能內(nèi)部訪(fǎng)問(wèn),對(duì)外使用端口6443)、認(rèn)證(客戶(hù)端認(rèn)證常用方式有:https證書(shū)認(rèn)證,基于ca證書(shū);http tokens認(rèn)證,通過(guò)token識(shí)別用戶(hù);http基本認(rèn)證,用戶(hù)名+密碼方式認(rèn)證)
    • 鑒權(quán)(授權(quán)):基于RBAC進(jìn)行鑒權(quán)操作;基于角色訪(fǎng)問(wèn)控制
    • 準(zhǔn)入控制:就是準(zhǔn)入控制器的列表,如果列表有請(qǐng)求內(nèi)容則通過(guò),否則就拒絕
    #mermaid-svg-oSsf4ENcZdYTy5Py .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-oSsf4ENcZdYTy5Py .label text{fill:#333}#mermaid-svg-oSsf4ENcZdYTy5Py .node rect,#mermaid-svg-oSsf4ENcZdYTy5Py .node circle,#mermaid-svg-oSsf4ENcZdYTy5Py .node ellipse,#mermaid-svg-oSsf4ENcZdYTy5Py .node polygon,#mermaid-svg-oSsf4ENcZdYTy5Py .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-oSsf4ENcZdYTy5Py .node .label{text-align:center;fill:#333}#mermaid-svg-oSsf4ENcZdYTy5Py .node.clickable{cursor:pointer}#mermaid-svg-oSsf4ENcZdYTy5Py .arrowheadPath{fill:#333}#mermaid-svg-oSsf4ENcZdYTy5Py .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-oSsf4ENcZdYTy5Py .flowchart-link{stroke:#333;fill:none}#mermaid-svg-oSsf4ENcZdYTy5Py .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-oSsf4ENcZdYTy5Py .edgeLabel rect{opacity:0.9}#mermaid-svg-oSsf4ENcZdYTy5Py .edgeLabel span{color:#333}#mermaid-svg-oSsf4ENcZdYTy5Py .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-oSsf4ENcZdYTy5Py .cluster text{fill:#333}#mermaid-svg-oSsf4ENcZdYTy5Py div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-oSsf4ENcZdYTy5Py .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-oSsf4ENcZdYTy5Py text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-oSsf4ENcZdYTy5Py .actor-line{stroke:grey}#mermaid-svg-oSsf4ENcZdYTy5Py .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-oSsf4ENcZdYTy5Py .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-oSsf4ENcZdYTy5Py #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-oSsf4ENcZdYTy5Py .sequenceNumber{fill:#fff}#mermaid-svg-oSsf4ENcZdYTy5Py #sequencenumber{fill:#333}#mermaid-svg-oSsf4ENcZdYTy5Py #crosshead path{fill:#333;stroke:#333}#mermaid-svg-oSsf4ENcZdYTy5Py .messageText{fill:#333;stroke:#333}#mermaid-svg-oSsf4ENcZdYTy5Py .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-oSsf4ENcZdYTy5Py .labelText,#mermaid-svg-oSsf4ENcZdYTy5Py .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-oSsf4ENcZdYTy5Py .loopText,#mermaid-svg-oSsf4ENcZdYTy5Py .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-oSsf4ENcZdYTy5Py .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-oSsf4ENcZdYTy5Py .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-oSsf4ENcZdYTy5Py .noteText,#mermaid-svg-oSsf4ENcZdYTy5Py .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-oSsf4ENcZdYTy5Py .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-oSsf4ENcZdYTy5Py .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-oSsf4ENcZdYTy5Py .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-oSsf4ENcZdYTy5Py .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-oSsf4ENcZdYTy5Py .section{stroke:none;opacity:0.2}#mermaid-svg-oSsf4ENcZdYTy5Py .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-oSsf4ENcZdYTy5Py .section2{fill:#fff400}#mermaid-svg-oSsf4ENcZdYTy5Py .section1,#mermaid-svg-oSsf4ENcZdYTy5Py .section3{fill:#fff;opacity:0.2}#mermaid-svg-oSsf4ENcZdYTy5Py .sectionTitle0{fill:#333}#mermaid-svg-oSsf4ENcZdYTy5Py .sectionTitle1{fill:#333}#mermaid-svg-oSsf4ENcZdYTy5Py .sectionTitle2{fill:#333}#mermaid-svg-oSsf4ENcZdYTy5Py .sectionTitle3{fill:#333}#mermaid-svg-oSsf4ENcZdYTy5Py .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-oSsf4ENcZdYTy5Py .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-oSsf4ENcZdYTy5Py .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-oSsf4ENcZdYTy5Py .grid path{stroke-width:0}#mermaid-svg-oSsf4ENcZdYTy5Py .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-oSsf4ENcZdYTy5Py .task{stroke-width:2}#mermaid-svg-oSsf4ENcZdYTy5Py .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-oSsf4ENcZdYTy5Py .taskText:not([font-size]){font-size:11px}#mermaid-svg-oSsf4ENcZdYTy5Py .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-oSsf4ENcZdYTy5Py .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-oSsf4ENcZdYTy5Py .task.clickable{cursor:pointer}#mermaid-svg-oSsf4ENcZdYTy5Py .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-oSsf4ENcZdYTy5Py .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-oSsf4ENcZdYTy5Py .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-oSsf4ENcZdYTy5Py .taskText0,#mermaid-svg-oSsf4ENcZdYTy5Py .taskText1,#mermaid-svg-oSsf4ENcZdYTy5Py .taskText2,#mermaid-svg-oSsf4ENcZdYTy5Py .taskText3{fill:#fff}#mermaid-svg-oSsf4ENcZdYTy5Py .task0,#mermaid-svg-oSsf4ENcZdYTy5Py .task1,#mermaid-svg-oSsf4ENcZdYTy5Py .task2,#mermaid-svg-oSsf4ENcZdYTy5Py .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-oSsf4ENcZdYTy5Py .taskTextOutside0,#mermaid-svg-oSsf4ENcZdYTy5Py .taskTextOutside2{fill:#000}#mermaid-svg-oSsf4ENcZdYTy5Py .taskTextOutside1,#mermaid-svg-oSsf4ENcZdYTy5Py .taskTextOutside3{fill:#000}#mermaid-svg-oSsf4ENcZdYTy5Py .active0,#mermaid-svg-oSsf4ENcZdYTy5Py .active1,#mermaid-svg-oSsf4ENcZdYTy5Py .active2,#mermaid-svg-oSsf4ENcZdYTy5Py .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-oSsf4ENcZdYTy5Py .activeText0,#mermaid-svg-oSsf4ENcZdYTy5Py .activeText1,#mermaid-svg-oSsf4ENcZdYTy5Py .activeText2,#mermaid-svg-oSsf4ENcZdYTy5Py .activeText3{fill:#000 !important}#mermaid-svg-oSsf4ENcZdYTy5Py .done0,#mermaid-svg-oSsf4ENcZdYTy5Py .done1,#mermaid-svg-oSsf4ENcZdYTy5Py .done2,#mermaid-svg-oSsf4ENcZdYTy5Py .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-oSsf4ENcZdYTy5Py .doneText0,#mermaid-svg-oSsf4ENcZdYTy5Py .doneText1,#mermaid-svg-oSsf4ENcZdYTy5Py .doneText2,#mermaid-svg-oSsf4ENcZdYTy5Py .doneText3{fill:#000 !important}#mermaid-svg-oSsf4ENcZdYTy5Py .crit0,#mermaid-svg-oSsf4ENcZdYTy5Py .crit1,#mermaid-svg-oSsf4ENcZdYTy5Py .crit2,#mermaid-svg-oSsf4ENcZdYTy5Py .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-oSsf4ENcZdYTy5Py .activeCrit0,#mermaid-svg-oSsf4ENcZdYTy5Py .activeCrit1,#mermaid-svg-oSsf4ENcZdYTy5Py .activeCrit2,#mermaid-svg-oSsf4ENcZdYTy5Py .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-oSsf4ENcZdYTy5Py .doneCrit0,#mermaid-svg-oSsf4ENcZdYTy5Py .doneCrit1,#mermaid-svg-oSsf4ENcZdYTy5Py .doneCrit2,#mermaid-svg-oSsf4ENcZdYTy5Py .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-oSsf4ENcZdYTy5Py .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-oSsf4ENcZdYTy5Py .milestoneText{font-style:italic}#mermaid-svg-oSsf4ENcZdYTy5Py .doneCritText0,#mermaid-svg-oSsf4ENcZdYTy5Py .doneCritText1,#mermaid-svg-oSsf4ENcZdYTy5Py .doneCritText2,#mermaid-svg-oSsf4ENcZdYTy5Py .doneCritText3{fill:#000 !important}#mermaid-svg-oSsf4ENcZdYTy5Py .activeCritText0,#mermaid-svg-oSsf4ENcZdYTy5Py .activeCritText1,#mermaid-svg-oSsf4ENcZdYTy5Py .activeCritText2,#mermaid-svg-oSsf4ENcZdYTy5Py .activeCritText3{fill:#000 !important}#mermaid-svg-oSsf4ENcZdYTy5Py .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-oSsf4ENcZdYTy5Py g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-oSsf4ENcZdYTy5Py g.classGroup text .title{font-weight:bolder}#mermaid-svg-oSsf4ENcZdYTy5Py g.clickable{cursor:pointer}#mermaid-svg-oSsf4ENcZdYTy5Py g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-oSsf4ENcZdYTy5Py g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-oSsf4ENcZdYTy5Py .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-oSsf4ENcZdYTy5Py .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-oSsf4ENcZdYTy5Py .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-oSsf4ENcZdYTy5Py .dashed-line{stroke-dasharray:3}#mermaid-svg-oSsf4ENcZdYTy5Py #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-oSsf4ENcZdYTy5Py #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-oSsf4ENcZdYTy5Py #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-oSsf4ENcZdYTy5Py #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-oSsf4ENcZdYTy5Py #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-oSsf4ENcZdYTy5Py #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-oSsf4ENcZdYTy5Py #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-oSsf4ENcZdYTy5Py #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-oSsf4ENcZdYTy5Py .commit-id,#mermaid-svg-oSsf4ENcZdYTy5Py .commit-msg,#mermaid-svg-oSsf4ENcZdYTy5Py .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-oSsf4ENcZdYTy5Py .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-oSsf4ENcZdYTy5Py .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-oSsf4ENcZdYTy5Py g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-oSsf4ENcZdYTy5Py g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-oSsf4ENcZdYTy5Py g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-oSsf4ENcZdYTy5Py g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-oSsf4ENcZdYTy5Py g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-oSsf4ENcZdYTy5Py g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-oSsf4ENcZdYTy5Py .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-oSsf4ENcZdYTy5Py .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-oSsf4ENcZdYTy5Py .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-oSsf4ENcZdYTy5Py .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-oSsf4ENcZdYTy5Py .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-oSsf4ENcZdYTy5Py .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-oSsf4ENcZdYTy5Py .edgeLabel text{fill:#333}#mermaid-svg-oSsf4ENcZdYTy5Py .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-oSsf4ENcZdYTy5Py .node circle.state-start{fill:black;stroke:black}#mermaid-svg-oSsf4ENcZdYTy5Py .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-oSsf4ENcZdYTy5Py #statediagram-barbEnd{fill:#9370db}#mermaid-svg-oSsf4ENcZdYTy5Py .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-oSsf4ENcZdYTy5Py .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-oSsf4ENcZdYTy5Py .statediagram-state .divider{stroke:#9370db}#mermaid-svg-oSsf4ENcZdYTy5Py .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-oSsf4ENcZdYTy5Py .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-oSsf4ENcZdYTy5Py .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-oSsf4ENcZdYTy5Py .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-oSsf4ENcZdYTy5Py .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-oSsf4ENcZdYTy5Py .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-oSsf4ENcZdYTy5Py .note-edge{stroke-dasharray:5}#mermaid-svg-oSsf4ENcZdYTy5Py .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-oSsf4ENcZdYTy5Py .error-icon{fill:#522}#mermaid-svg-oSsf4ENcZdYTy5Py .error-text{fill:#522;stroke:#522}#mermaid-svg-oSsf4ENcZdYTy5Py .edge-thickness-normal{stroke-width:2px}#mermaid-svg-oSsf4ENcZdYTy5Py .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-oSsf4ENcZdYTy5Py .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-oSsf4ENcZdYTy5Py .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-oSsf4ENcZdYTy5Py .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-oSsf4ENcZdYTy5Py .marker{fill:#333}#mermaid-svg-oSsf4ENcZdYTy5Py .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}#mermaid-svg-oSsf4ENcZdYTy5Py {color: rgba(0, 0, 0, 0.75);font: ;}訪(fǎng)問(wèn)開(kāi)始認(rèn)證授權(quán)準(zhǔn)入控制PodServiceController

    RBAC簡(jiǎn)介:基于角色的訪(fǎng)問(wèn)控制

    • 角色:role(特定命名空間訪(fǎng)問(wèn)權(quán)限)和ClusterRole(所有命名空間訪(fǎng)問(wèn)權(quán)限)
    • 角色綁定:roleBinding(角色綁定到主體)和ClusterRoleBinding(集群角色綁定到主體)
    • 主體:user(用戶(hù))、group(用戶(hù)組)、serviceAccount(服務(wù)賬號(hào))

    RBAC實(shí)現(xiàn)鑒權(quán):以下用實(shí)例的方式表述其過(guò)程(以下TLS文件是以二進(jìn)制安裝方式環(huán)境為例)










    引入Ingress控制器:在使用Service里面的NodePort(把端口對(duì)外暴露,通過(guò)ip:port方式進(jìn)行訪(fǎng)問(wèn))時(shí),其存在如下缺陷:在每個(gè)節(jié)點(diǎn)上都會(huì)起到端口,在訪(fǎng)問(wèn)時(shí)候通過(guò)任何檢點(diǎn),通過(guò)節(jié)點(diǎn)ip:port實(shí)現(xiàn)訪(fǎng)問(wèn);意味著每個(gè)端口只能使用一次,一個(gè)端口對(duì)應(yīng)一個(gè)應(yīng)用。但是實(shí)際訪(fǎng)問(wèn)中都是用域名,根據(jù)不同域名跳轉(zhuǎn)到不同服務(wù),Ingress正是為了解決此問(wèn)題而提出的解決方案,它使得pod和ingress通過(guò)service關(guān)聯(lián),ingress作為統(tǒng)一入口由service關(guān)聯(lián)一組pod,其原理如下圖所示:

    使用ingress控制器:這里選擇官方維護(hù)的nginx控制器進(jìn)行部署,其步驟大致分為部署ingress controller和創(chuàng)建ingress規(guī)則,以下過(guò)程是使用Ingress對(duì)外暴露應(yīng)用

    • 創(chuàng)建nginx應(yīng)用,對(duì)外暴露端口使用NodePort

    • 部署ingress controller

      apiVersion: v1 kind: Namespace metadata:name: ingress-nginxlabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx---kind: ConfigMap apiVersion: v1 metadata:name: nginx-configurationnamespace: ingress-nginxlabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx--- kind: ConfigMap apiVersion: v1 metadata:name: tcp-servicesnamespace: ingress-nginxlabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx--- kind: ConfigMap apiVersion: v1 metadata:name: udp-servicesnamespace: ingress-nginxlabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx--- apiVersion: v1 kind: ServiceAccount metadata:name: nginx-ingress-serviceaccountnamespace: ingress-nginxlabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx--- apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRole metadata:name: nginx-ingress-clusterrolelabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx rules:- apiGroups:- ""resources:- configmaps- endpoints- nodes- pods- secretsverbs:- list- watch- apiGroups:- ""resources:- nodesverbs:- get- apiGroups:- ""resources:- servicesverbs:- get- list- watch- apiGroups:- ""resources:- eventsverbs:- create- patch- apiGroups:- "extensions"- "networking.k8s.io"resources:- ingressesverbs:- get- list- watch- apiGroups:- "extensions"- "networking.k8s.io"resources:- ingresses/statusverbs:- update--- apiVersion: rbac.authorization.k8s.io/v1beta1 kind: Role metadata:name: nginx-ingress-rolenamespace: ingress-nginxlabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx rules:- apiGroups:- ""resources:- configmaps- pods- secrets- namespacesverbs:- get- apiGroups:- ""resources:- configmapsresourceNames:# Defaults to "<election-id>-<ingress-class>"# Here: "<ingress-controller-leader>-<nginx>"# This has to be adapted if you change either parameter# when launching the nginx-ingress-controller.- "ingress-controller-leader-nginx"verbs:- get- update- apiGroups:- ""resources:- configmapsverbs:- create- apiGroups:- ""resources:- endpointsverbs:- get--- apiVersion: rbac.authorization.k8s.io/v1beta1 kind: RoleBinding metadata:name: nginx-ingress-role-nisa-bindingnamespace: ingress-nginxlabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx roleRef:apiGroup: rbac.authorization.k8s.iokind: Rolename: nginx-ingress-role subjects:- kind: ServiceAccountname: nginx-ingress-serviceaccountnamespace: ingress-nginx--- apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRoleBinding metadata:name: nginx-ingress-clusterrole-nisa-bindinglabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: nginx-ingress-clusterrole subjects:- kind: ServiceAccountname: nginx-ingress-serviceaccountnamespace: ingress-nginx---apiVersion: apps/v1 kind: Deployment metadata:name: nginx-ingress-controllernamespace: ingress-nginxlabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx spec:replicas: 1selector:matchLabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginxtemplate:metadata:labels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginxannotations:prometheus.io/port: "10254"prometheus.io/scrape: "true"spec:hostNetwork: true# wait up to five minutes for the drain of connectionsterminationGracePeriodSeconds: 300serviceAccountName: nginx-ingress-serviceaccountnodeSelector:kubernetes.io/os: linuxcontainers:- name: nginx-ingress-controllerimage: lizhenliang/nginx-ingress-controller:0.30.0args:- /nginx-ingress-controller- --configmap=$(POD_NAMESPACE)/nginx-configuration- --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services- --udp-services-configmap=$(POD_NAMESPACE)/udp-services- --publish-service=$(POD_NAMESPACE)/ingress-nginx- --annotations-prefix=nginx.ingress.kubernetes.iosecurityContext:allowPrivilegeEscalation: truecapabilities:drop:- ALLadd:- NET_BIND_SERVICE# www-data -> 101runAsUser: 101env:- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespaceports:- name: httpcontainerPort: 80protocol: TCP- name: httpscontainerPort: 443protocol: TCPlivenessProbe:failureThreshold: 3httpGet:path: /healthzport: 10254scheme: HTTPinitialDelaySeconds: 10periodSeconds: 10successThreshold: 1timeoutSeconds: 10readinessProbe:failureThreshold: 3httpGet:path: /healthzport: 10254scheme: HTTPperiodSeconds: 10successThreshold: 1timeoutSeconds: 10lifecycle:preStop:exec:command:- /wait-shutdown---apiVersion: v1 kind: LimitRange metadata:name: ingress-nginxnamespace: ingress-nginxlabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx spec:limits:- min:memory: 90Micpu: 100mtype: Container
    • 創(chuàng)建ingress規(guī)則

      apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata:name: example-ingress spec:rules:- host: example.ingredemo.comhttp:paths:- path: /backend:serviceName: webservicePort: 80
    • 在windows系統(tǒng)hosts文件中添加域名訪(fǎng)問(wèn)規(guī)則

    • 驗(yàn)證

    helm引入:之前部署應(yīng)用的基本過(guò)程都是編寫(xiě)yaml文件、deployment、service最后ingress,該方式是和部署單一的、少數(shù)服務(wù)的應(yīng)用,但是如果部署微服務(wù)項(xiàng)目,則可能有幾十個(gè)服務(wù),每個(gè)服務(wù)都有一套yaml文件,此時(shí)需要維護(hù)大量yaml文件,版本管理特別不方便。Helm就是為解決此問(wèn)題而產(chǎn)生的解決方案。helm是一個(gè)Kubernetes的包管理工具,就像Linux下的包管理器,如yum/apt等,可以很方便的將之前打包好的yaml文件部署到kubernetes上。使用helm可以把所有yaml作為一個(gè)整體管理,以實(shí)現(xiàn)yaml高效復(fù)用。helm有三個(gè)重要概念分別是helm(一個(gè)命令行客戶(hù)端工具)、chart(把yaml打包,是yaml集合)和release(基礎(chǔ)chart部署實(shí)體,應(yīng)用級(jí)別的版本管理)。helm在2019年發(fā)布V3版本,和之前版本相比有明顯變化:V3版本中刪除Tiller、release可以在不同命名空間重用、將chart推送到dorcker倉(cāng)庫(kù)中。

    helm安裝使用:主要包括helm安裝、配置helm倉(cāng)庫(kù)、使用helm快速部署應(yīng)用

    # 安裝helm [root@k8s-master ~]# tar -xzvf helm-v3.0.0-linux-amd64.tar.gz [root@k8s-master ~]# cd linux-amd64/ [root@k8s-master linux-amd64]# ls helm LICENSE README.md [root@k8s-master linux-amd64]# mv helm /usr/bin# 配置helm倉(cāng)庫(kù) # 添加存儲(chǔ)庫(kù) [root@k8s-master linux-amd64]# helm repo add stable http://mirror.azure.cn/kubernetes/charts #微軟倉(cāng)庫(kù),這個(gè)倉(cāng)庫(kù)推薦,基本 上官網(wǎng)有的 chart 這里都有 [root@k8s-master linux-amd64]# helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts #阿里云倉(cāng)庫(kù) # 更新倉(cāng)庫(kù)源 [root@k8s-master linux-amd64]# helm repo update # 查看配置的存儲(chǔ)庫(kù) [root@k8s-master linux-amd64]# helm repo list # 刪除倉(cāng)庫(kù) [root@k8s-master linux-amd64]# helm repo remove stable# 使用helm快速部署應(yīng)用 # 使用命令搜索應(yīng)用,格式:helm search repo 名稱(chēng) [root@k8s-master ~]# helm search repo weave NAME CHART VERSION APP VERSION DESCRIPTION aliyun/weave-cloud 0.1.2 Weave Cloud is a add-on to Kubernetes which pro... aliyun/weave-scope 0.9.2 1.6.5 A Helm chart for the Weave Scope cluster visual... # 根據(jù)搜索內(nèi)容選擇安裝,格式:helm install 安裝之后名稱(chēng) 搜索之后應(yīng)用名稱(chēng) [root@k8s-master ~]# helm install ui aliyun/weave-scope # 查看安裝之后狀態(tài) [root@k8s-master ~]# helm list [root@k8s-master ~]# helm status ui# 查應(yīng)用狀態(tài)發(fā)現(xiàn),ui-weave-scope其TYPE為ClusterIP [root@k8s-master ~]# kubectl get svc # 修改其TYPE [root@k8s-master ~]# kubectl edit svc ui-weave-scope ...type: NodePort ... # 查看修改后狀態(tài)發(fā)現(xiàn),ui-weave-scope其TYPE為NodePort [root@k8s-master ~]# kubectl get svc

    自定義chart部署:過(guò)程見(jiàn)以下命令

    # 使用命令創(chuàng)建chart,格式為:helm create chart 名稱(chēng) [root@k8s-master ~]# helm create mychart Creating mychart [root@k8s-master ~]# cd mychart/ #Chart.yaml:當(dāng)前chart屬性配置信息 #templates:編寫(xiě)yaml文件放在這個(gè)目錄 #values.yaml:yaml文件可以使用全局變量 [root@k8s-master mychart]# ls charts Chart.yaml templates values.yaml# 在templates文件夾中創(chuàng)建兩個(gè)yaml文件deployment.yaml和service.yaml [root@k8s-master mychart]# cd templates/ [root@k8s-master templates]# ls deployment.yaml _helpers.tpl ingress.yaml NOTES.txt serviceaccount.yaml service.yaml tests [root@k8s-master templates]# rm -rf ./* [root@k8s-master templates]# kubectl create deployment web1 --image=nginx --dry-run -o yaml > deployment.yaml W0817 20:20:53.148698 15888 helpers.go:557] --dry-run is deprecated and can be replaced with --dry-run=client. [root@k8s-master templates]# ls deployment.yaml [root@k8s-master templates]# kubectl expose deployment web1 --port=80 --target-port=80 --type=NodePort --dry-run -o yaml > service.yaml W0817 20:24:22.445043 21372 helpers.go:557] --dry-run is deprecated and can be replaced with --dry-run=client. Error from server (NotFound): deployments.apps "web1" not found [root@k8s-master templates]# ls deployment.yaml service.yaml # 此時(shí)打開(kāi)service.yaml發(fā)現(xiàn)為空 [root@k8s-master templates]# kubectl create deployment web1 --image=nginx deployment.apps/web1 created [root@k8s-master templates]# kubectl expose deployment web1 --port=80 --target-port=80 --type=NodePort --dry-run -o yaml > service.yaml # 此時(shí)service.yaml里面就有內(nèi)容 # 刪掉web1,以helm方式部署 [root@k8s-master templates]# kubectl delete deployment web1 deployment.apps "web1" deleted# 安裝mychart [root@k8s-master ~]# helm install web1 mychart/ # 檢查 [root@k8s-master ~]# kubectl get pods [root@k8s-master ~]# kubectl get svc# 應(yīng)用升級(jí) [root@k8s-master ~]# helm upgrade web1 mychart/

    chart模板使用:chart模板可實(shí)現(xiàn)yaml高效復(fù)用,其方式是通過(guò)chart的values.yaml文件定義全局變量傳遞參數(shù)(在values.yaml定義變量和值,在具體yaml文件中獲取定義變量值),動(dòng)態(tài)渲染模板,yaml內(nèi)容動(dòng)態(tài)傳入?yún)?shù)生成(在yaml文件中大體只有image、tag、label、port和replicas這幾個(gè)地方不同而已),其實(shí)現(xiàn)過(guò)程如下

    # 在values.yaml定義變量和值 [root@k8s-master ~]# cd mychart/ [root@k8s-master mychart]# ls charts Chart.yaml templates values.yaml [root@k8s-master mychart]# vim values.yaml ... replicas: 1 image: nginx tag: 1.16 label: nginx port: 80 ...# 在templates的yaml文件使用values.yaml定義變量 # 通過(guò)表達(dá)式使用全局變量,其格式為:{{.Values.變量名稱(chēng)}} # 也常用{{.Release.Name}}避免生成隨機(jī)名稱(chēng) [root@k8s-master mychart]# cd templates/ [root@k8s-master templates]# vim deployment.yaml apiVersion: apps/v1 kind: Deployment metadata:name: {{ .Release.Name}}-deploy spec:replicas: 1selector:matchLabels:app: {{ .Values.label}}strategy: {}template:metadata:creationTimestamp: nulllabels:app: {{ .Values.label}}spec:containers:- image: {{ .Values.image}}name: nginxresources: {} status: {} [root@k8s-master templates]# vim deployment.yaml apiVersion: v1 kind: Service metadata:name: {{ .Release.Name}}-svc spec:ports:- port: {{ .Values.port}}protocol: TCPtargetPort: 80selector:app: {{ .Values.label}}type: NodePort status:loadBalancer: {} [root@k8s-master ~]# helm install --dry-run web2 mychart/ #檢查 [root@k8s-master ~]# kubectl get pods [root@k8s-master ~]# kubectl get svc

    持久化存儲(chǔ):數(shù)據(jù)卷emptydir是本地存儲(chǔ),pod重啟后數(shù)據(jù)會(huì)丟失,為了解決這一問(wèn)題就需要對(duì)數(shù)據(jù)進(jìn)行持久化存儲(chǔ)。實(shí)現(xiàn)這一方案,k8s使用nfs網(wǎng)絡(luò)存儲(chǔ)實(shí)現(xiàn)pod重啟數(shù)據(jù)還在,以下是實(shí)現(xiàn)過(guò)程

    # 1. 準(zhǔn)備環(huán)境:創(chuàng)建一臺(tái)服務(wù)器安裝nfs服務(wù)端(筆者這里ip設(shè)置為172.16.90.134)并關(guān)閉防火墻 [root@90143-k8s-nfs ~]# systemctl disable --now firewalld Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service. Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service. [root@90143-k8s-nfs ~]# firewall-cmd --list-all FirewallD is not running # 2. 安裝nfs [root@90143-k8s-nfs ~]# yum install -y nfs-utils # 3. 創(chuàng)建掛載路徑 [root@90143-k8s-nfs ~]# mkdir -p /data/nfs # 4. 設(shè)置掛載路徑 [root@90143-k8s-nfs ~]# vim /etc/exports /data/nfs *(rw,no_root_squash) # 5. 在k8s的node節(jié)點(diǎn)安裝nfs [root@k8s-node1 ~]# yum install -y nfs-utils [root@k8s-node2 ~]# yum install -y nfs-utils # 6. 在nfs服務(wù)器中啟動(dòng)服務(wù) [root@90143-k8s-nfs ~]# systemctl start nfs [root@90143-k8s-nfs ~]# ps -ef | grep nfs avahi 5936 1 0 14:52 ? 00:00:00 avahi-daemon: running [90143-k8s-nfs.local] root 27593 2 0 15:10 ? 00:00:00 [nfsd4_callbacks] root 27599 2 0 15:10 ? 00:00:00 [nfsd] root 27600 2 0 15:10 ? 00:00:00 [nfsd] root 27601 2 0 15:10 ? 00:00:00 [nfsd] root 27602 2 0 15:10 ? 00:00:00 [nfsd] root 27603 2 0 15:10 ? 00:00:00 [nfsd] root 27604 2 0 15:10 ? 00:00:00 [nfsd] root 27605 2 0 15:10 ? 00:00:00 [nfsd] root 27606 2 0 15:10 ? 00:00:00 [nfsd] root 28030 7550 0 15:10 pts/0 00:00:00 grep --color=auto nfs # 7. 在k8s集群部署應(yīng)該用使用nfs持久網(wǎng)絡(luò)存儲(chǔ) [root@k8s-master ~]# mkdir pv [root@k8s-master ~]# vim pv/nfs-nginx.yaml apiVersion: apps/v1 kind: Deployment metadata:name: nginx-dep1 spec:replicas: 1selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginxvolumeMounts:- name: wwwrootmountPath: /usr/share/nginx/htmlports:- containerPort: 80volumes:- name: wwwrootnfs:server: 172.16.90.143path: /data/nfs [root@k8s-master ~]# cd pv [root@k8s-master pv]# kubectl apply -f nfs-nginx.yaml deployment.apps/nginx-dep1 created [root@k8s-master pv]# kubectl describe pod nginx-dep1-776574d4d-hg647 [root@k8s-master pv]# kubectl exec -it nginx-dep1-776574d4d-mdtcd bash kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead. root@nginx-dep1-776574d4d-mdtcd:/# ls /usr/share/nginx/html [root@90143-k8s-nfs ~]# cd /data/nfs/ hello nfs root@nginx-dep1-776574d4d-mdtcd:/# ls /usr/share/nginx/html index.html root@nginx-dep1-776574d4d-mdtcd:/# exit exit # 8. 驗(yàn)證,通過(guò)NodeIP:Port可瀏覽器查看 [root@k8s-master pv]# kubectl expose deployment nginx-dep1 --port=80 --target-port=80 --type=NodePort service/nginx-dep1 exposed [root@k8s-master pv]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 22d nginx NodePort 10.105.227.129 <none> 80:30640/TCP 22d nginx-dep1 NodePort 10.96.151.113 <none> 80:31987/TCP 12s web1 NodePort 10.101.103.2 <none> 80:31093/TCP 2d5h

    PV與PVC:PV(持久化存儲(chǔ),對(duì)存儲(chǔ)資源進(jìn)行抽象,對(duì)外提供可以調(diào)用的地方,本質(zhì)是生產(chǎn)者)與PVC(用于調(diào)用,不需要關(guān)心內(nèi)部實(shí)現(xiàn)細(xì)節(jié),本質(zhì)是消費(fèi)者)其實(shí)現(xiàn)流程如下圖所示:

    #mermaid-svg-Gt1zp0CZe0Bw8wuX .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-Gt1zp0CZe0Bw8wuX .label text{fill:#333}#mermaid-svg-Gt1zp0CZe0Bw8wuX .node rect,#mermaid-svg-Gt1zp0CZe0Bw8wuX .node circle,#mermaid-svg-Gt1zp0CZe0Bw8wuX .node ellipse,#mermaid-svg-Gt1zp0CZe0Bw8wuX .node polygon,#mermaid-svg-Gt1zp0CZe0Bw8wuX .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-Gt1zp0CZe0Bw8wuX .node .label{text-align:center;fill:#333}#mermaid-svg-Gt1zp0CZe0Bw8wuX .node.clickable{cursor:pointer}#mermaid-svg-Gt1zp0CZe0Bw8wuX .arrowheadPath{fill:#333}#mermaid-svg-Gt1zp0CZe0Bw8wuX .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-Gt1zp0CZe0Bw8wuX .flowchart-link{stroke:#333;fill:none}#mermaid-svg-Gt1zp0CZe0Bw8wuX .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-Gt1zp0CZe0Bw8wuX .edgeLabel rect{opacity:0.9}#mermaid-svg-Gt1zp0CZe0Bw8wuX .edgeLabel span{color:#333}#mermaid-svg-Gt1zp0CZe0Bw8wuX .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-Gt1zp0CZe0Bw8wuX .cluster text{fill:#333}#mermaid-svg-Gt1zp0CZe0Bw8wuX div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-Gt1zp0CZe0Bw8wuX .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-Gt1zp0CZe0Bw8wuX text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-Gt1zp0CZe0Bw8wuX .actor-line{stroke:grey}#mermaid-svg-Gt1zp0CZe0Bw8wuX .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-Gt1zp0CZe0Bw8wuX .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-Gt1zp0CZe0Bw8wuX #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-Gt1zp0CZe0Bw8wuX .sequenceNumber{fill:#fff}#mermaid-svg-Gt1zp0CZe0Bw8wuX #sequencenumber{fill:#333}#mermaid-svg-Gt1zp0CZe0Bw8wuX #crosshead path{fill:#333;stroke:#333}#mermaid-svg-Gt1zp0CZe0Bw8wuX .messageText{fill:#333;stroke:#333}#mermaid-svg-Gt1zp0CZe0Bw8wuX .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-Gt1zp0CZe0Bw8wuX .labelText,#mermaid-svg-Gt1zp0CZe0Bw8wuX .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-Gt1zp0CZe0Bw8wuX .loopText,#mermaid-svg-Gt1zp0CZe0Bw8wuX .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-Gt1zp0CZe0Bw8wuX .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-Gt1zp0CZe0Bw8wuX .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-Gt1zp0CZe0Bw8wuX .noteText,#mermaid-svg-Gt1zp0CZe0Bw8wuX .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-Gt1zp0CZe0Bw8wuX .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-Gt1zp0CZe0Bw8wuX .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-Gt1zp0CZe0Bw8wuX .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-Gt1zp0CZe0Bw8wuX .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Gt1zp0CZe0Bw8wuX .section{stroke:none;opacity:0.2}#mermaid-svg-Gt1zp0CZe0Bw8wuX .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-Gt1zp0CZe0Bw8wuX .section2{fill:#fff400}#mermaid-svg-Gt1zp0CZe0Bw8wuX .section1,#mermaid-svg-Gt1zp0CZe0Bw8wuX .section3{fill:#fff;opacity:0.2}#mermaid-svg-Gt1zp0CZe0Bw8wuX .sectionTitle0{fill:#333}#mermaid-svg-Gt1zp0CZe0Bw8wuX .sectionTitle1{fill:#333}#mermaid-svg-Gt1zp0CZe0Bw8wuX .sectionTitle2{fill:#333}#mermaid-svg-Gt1zp0CZe0Bw8wuX .sectionTitle3{fill:#333}#mermaid-svg-Gt1zp0CZe0Bw8wuX .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Gt1zp0CZe0Bw8wuX .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-Gt1zp0CZe0Bw8wuX .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Gt1zp0CZe0Bw8wuX .grid path{stroke-width:0}#mermaid-svg-Gt1zp0CZe0Bw8wuX .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-Gt1zp0CZe0Bw8wuX .task{stroke-width:2}#mermaid-svg-Gt1zp0CZe0Bw8wuX .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Gt1zp0CZe0Bw8wuX .taskText:not([font-size]){font-size:11px}#mermaid-svg-Gt1zp0CZe0Bw8wuX .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Gt1zp0CZe0Bw8wuX .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-Gt1zp0CZe0Bw8wuX .task.clickable{cursor:pointer}#mermaid-svg-Gt1zp0CZe0Bw8wuX .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-Gt1zp0CZe0Bw8wuX .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-Gt1zp0CZe0Bw8wuX .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-Gt1zp0CZe0Bw8wuX .taskText0,#mermaid-svg-Gt1zp0CZe0Bw8wuX .taskText1,#mermaid-svg-Gt1zp0CZe0Bw8wuX .taskText2,#mermaid-svg-Gt1zp0CZe0Bw8wuX .taskText3{fill:#fff}#mermaid-svg-Gt1zp0CZe0Bw8wuX .task0,#mermaid-svg-Gt1zp0CZe0Bw8wuX .task1,#mermaid-svg-Gt1zp0CZe0Bw8wuX .task2,#mermaid-svg-Gt1zp0CZe0Bw8wuX .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-Gt1zp0CZe0Bw8wuX .taskTextOutside0,#mermaid-svg-Gt1zp0CZe0Bw8wuX .taskTextOutside2{fill:#000}#mermaid-svg-Gt1zp0CZe0Bw8wuX .taskTextOutside1,#mermaid-svg-Gt1zp0CZe0Bw8wuX .taskTextOutside3{fill:#000}#mermaid-svg-Gt1zp0CZe0Bw8wuX .active0,#mermaid-svg-Gt1zp0CZe0Bw8wuX .active1,#mermaid-svg-Gt1zp0CZe0Bw8wuX .active2,#mermaid-svg-Gt1zp0CZe0Bw8wuX .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-Gt1zp0CZe0Bw8wuX .activeText0,#mermaid-svg-Gt1zp0CZe0Bw8wuX .activeText1,#mermaid-svg-Gt1zp0CZe0Bw8wuX .activeText2,#mermaid-svg-Gt1zp0CZe0Bw8wuX .activeText3{fill:#000 !important}#mermaid-svg-Gt1zp0CZe0Bw8wuX .done0,#mermaid-svg-Gt1zp0CZe0Bw8wuX .done1,#mermaid-svg-Gt1zp0CZe0Bw8wuX .done2,#mermaid-svg-Gt1zp0CZe0Bw8wuX .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-Gt1zp0CZe0Bw8wuX .doneText0,#mermaid-svg-Gt1zp0CZe0Bw8wuX .doneText1,#mermaid-svg-Gt1zp0CZe0Bw8wuX .doneText2,#mermaid-svg-Gt1zp0CZe0Bw8wuX .doneText3{fill:#000 !important}#mermaid-svg-Gt1zp0CZe0Bw8wuX .crit0,#mermaid-svg-Gt1zp0CZe0Bw8wuX .crit1,#mermaid-svg-Gt1zp0CZe0Bw8wuX .crit2,#mermaid-svg-Gt1zp0CZe0Bw8wuX .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-Gt1zp0CZe0Bw8wuX .activeCrit0,#mermaid-svg-Gt1zp0CZe0Bw8wuX .activeCrit1,#mermaid-svg-Gt1zp0CZe0Bw8wuX .activeCrit2,#mermaid-svg-Gt1zp0CZe0Bw8wuX .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-Gt1zp0CZe0Bw8wuX .doneCrit0,#mermaid-svg-Gt1zp0CZe0Bw8wuX .doneCrit1,#mermaid-svg-Gt1zp0CZe0Bw8wuX .doneCrit2,#mermaid-svg-Gt1zp0CZe0Bw8wuX .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-Gt1zp0CZe0Bw8wuX .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-Gt1zp0CZe0Bw8wuX .milestoneText{font-style:italic}#mermaid-svg-Gt1zp0CZe0Bw8wuX .doneCritText0,#mermaid-svg-Gt1zp0CZe0Bw8wuX .doneCritText1,#mermaid-svg-Gt1zp0CZe0Bw8wuX .doneCritText2,#mermaid-svg-Gt1zp0CZe0Bw8wuX .doneCritText3{fill:#000 !important}#mermaid-svg-Gt1zp0CZe0Bw8wuX .activeCritText0,#mermaid-svg-Gt1zp0CZe0Bw8wuX .activeCritText1,#mermaid-svg-Gt1zp0CZe0Bw8wuX .activeCritText2,#mermaid-svg-Gt1zp0CZe0Bw8wuX .activeCritText3{fill:#000 !important}#mermaid-svg-Gt1zp0CZe0Bw8wuX .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Gt1zp0CZe0Bw8wuX g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-Gt1zp0CZe0Bw8wuX g.classGroup text .title{font-weight:bolder}#mermaid-svg-Gt1zp0CZe0Bw8wuX g.clickable{cursor:pointer}#mermaid-svg-Gt1zp0CZe0Bw8wuX g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-Gt1zp0CZe0Bw8wuX g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-Gt1zp0CZe0Bw8wuX .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-Gt1zp0CZe0Bw8wuX .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-Gt1zp0CZe0Bw8wuX .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-Gt1zp0CZe0Bw8wuX .dashed-line{stroke-dasharray:3}#mermaid-svg-Gt1zp0CZe0Bw8wuX #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-Gt1zp0CZe0Bw8wuX #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-Gt1zp0CZe0Bw8wuX #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-Gt1zp0CZe0Bw8wuX #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-Gt1zp0CZe0Bw8wuX #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-Gt1zp0CZe0Bw8wuX #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-Gt1zp0CZe0Bw8wuX #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-Gt1zp0CZe0Bw8wuX #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-Gt1zp0CZe0Bw8wuX .commit-id,#mermaid-svg-Gt1zp0CZe0Bw8wuX .commit-msg,#mermaid-svg-Gt1zp0CZe0Bw8wuX .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Gt1zp0CZe0Bw8wuX .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Gt1zp0CZe0Bw8wuX .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Gt1zp0CZe0Bw8wuX g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Gt1zp0CZe0Bw8wuX g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-Gt1zp0CZe0Bw8wuX g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-Gt1zp0CZe0Bw8wuX g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-Gt1zp0CZe0Bw8wuX g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-Gt1zp0CZe0Bw8wuX g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-Gt1zp0CZe0Bw8wuX .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-Gt1zp0CZe0Bw8wuX .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-Gt1zp0CZe0Bw8wuX .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-Gt1zp0CZe0Bw8wuX .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-Gt1zp0CZe0Bw8wuX .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-Gt1zp0CZe0Bw8wuX .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-Gt1zp0CZe0Bw8wuX .edgeLabel text{fill:#333}#mermaid-svg-Gt1zp0CZe0Bw8wuX .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Gt1zp0CZe0Bw8wuX .node circle.state-start{fill:black;stroke:black}#mermaid-svg-Gt1zp0CZe0Bw8wuX .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-Gt1zp0CZe0Bw8wuX #statediagram-barbEnd{fill:#9370db}#mermaid-svg-Gt1zp0CZe0Bw8wuX .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-Gt1zp0CZe0Bw8wuX .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-Gt1zp0CZe0Bw8wuX .statediagram-state .divider{stroke:#9370db}#mermaid-svg-Gt1zp0CZe0Bw8wuX .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-Gt1zp0CZe0Bw8wuX .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-Gt1zp0CZe0Bw8wuX .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-Gt1zp0CZe0Bw8wuX .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-Gt1zp0CZe0Bw8wuX .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-Gt1zp0CZe0Bw8wuX .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-Gt1zp0CZe0Bw8wuX .note-edge{stroke-dasharray:5}#mermaid-svg-Gt1zp0CZe0Bw8wuX .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-Gt1zp0CZe0Bw8wuX .error-icon{fill:#522}#mermaid-svg-Gt1zp0CZe0Bw8wuX .error-text{fill:#522;stroke:#522}#mermaid-svg-Gt1zp0CZe0Bw8wuX .edge-thickness-normal{stroke-width:2px}#mermaid-svg-Gt1zp0CZe0Bw8wuX .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-Gt1zp0CZe0Bw8wuX .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-Gt1zp0CZe0Bw8wuX .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-Gt1zp0CZe0Bw8wuX .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-Gt1zp0CZe0Bw8wuX .marker{fill:#333}#mermaid-svg-Gt1zp0CZe0Bw8wuX .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}#mermaid-svg-Gt1zp0CZe0Bw8wuX {color: rgba(0, 0, 0, 0.75);font: ;}根據(jù)存儲(chǔ)容量匹配模式應(yīng)用部署定義pvc:綁定pv定義pv:包括ip和路徑 # 避免影響刪除nfs-nginx.yaml [root@k8s-master pv]# kubectl delete -f nfs-nginx.yaml deployment.apps "nginx-dep1" deleted [root@k8s-master pv]# kubectl get pods NAME READY STATUS RESTARTS AGE nginx-6799fc88d8-lj24f 1/1 Running 0 22d web-7866dfdb9f-7zg68 0/1 ImagePullBackOff 0 2d5h web-96d5df5c8-br8md 1/1 Running 0 2d5h # 定義pvc [root@k8s-master pv]# vim pvc.yaml apiVersion: apps/v1 kind: Deployment metadata:name: nginx-dep1 spec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginxvolumeMounts:- name: wwwrootmountPath: /usr/share/nginx/htmlports:- containerPort: 80volumes:- name: wwwrootpersistentVolumeClaim:claimName: my-pvc---apiVersion: v1 kind: PersistentVolumeClaim metadata:name: my-pvc spec:accessModes:- ReadWriteManyresources:requests:storage: 5Gi [root@k8s-master pv]# kubectl apply -f pvc.yaml deployment.apps/nginx-dep1 created persistentvolumeclaim/my-pvc created [root@k8s-master pv]# vim pv.yaml apiVersion: v1 kind: PersistentVolume metadata:name: my-pv spec:capacity:storage: 5GiaccessModes:- ReadWriteManynfs:path: /data/nfsserver: 172.16.90.143 [root@k8s-master pv]# kubectl apply -f pv.yaml persistentvolume/my-pv created #檢查 [root@k8s-master pv]# kubectl get pv,pvc NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE persistentvolume/my-pv 5Gi RWX Retain Bound default/my-pvc 43sNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE persistentvolumeclaim/my-pvc Bound my-pv 5Gi RWX 3m13s [root@k8s-master pv]# kubectl get pods NAME READY STATUS RESTARTS AGE nginx-6799fc88d8-lj24f 1/1 Running 0 22d nginx-dep1-69f5bb95b-bwn2g 1/1 Running 0 4m11s nginx-dep1-69f5bb95b-gpn9f 1/1 Running 0 4m11s nginx-dep1-69f5bb95b-k9xhw 1/1 Running 0 4m11s web-7866dfdb9f-7zg68 0/1 ImagePullBackOff 0 2d5h web-96d5df5c8-br8md 1/1 Running 0 2d5h [root@k8s-master pv]# kubectl exec -it nginx-dep1-69f5bb95b-bwn2g bash kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead. root@nginx-dep1-69f5bb95b-bwn2g:/# ls /usr/share/nginx/html/ index.html

    5. 日志管理


    6. 監(jiān)控平臺(tái)

    集群資源監(jiān)控:包括監(jiān)控指標(biāo)和監(jiān)控平臺(tái),其中

    • 監(jiān)控指標(biāo)
      • 集群監(jiān)控:節(jié)點(diǎn)資源利用率、節(jié)點(diǎn)數(shù)、運(yùn)行pods
      • Pod監(jiān)控:容器指標(biāo)、應(yīng)用程序
    • 監(jiān)控平臺(tái)搭建方案(prometheus+Grafana)
      • prometheus:開(kāi)源的;監(jiān)控、報(bào)警、數(shù)據(jù)庫(kù);以HTTP協(xié)議周期性抓取被監(jiān)控組件狀態(tài);不需要復(fù)雜的集成過(guò)程,使用http接口接入就可以
      • Grafana:開(kāi)源的數(shù)據(jù)分析和可視化工具;支持多種數(shù)據(jù)源
    #mermaid-svg-V2HeoPRqH6VcMr35 .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-V2HeoPRqH6VcMr35 .label text{fill:#333}#mermaid-svg-V2HeoPRqH6VcMr35 .node rect,#mermaid-svg-V2HeoPRqH6VcMr35 .node circle,#mermaid-svg-V2HeoPRqH6VcMr35 .node ellipse,#mermaid-svg-V2HeoPRqH6VcMr35 .node polygon,#mermaid-svg-V2HeoPRqH6VcMr35 .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-V2HeoPRqH6VcMr35 .node .label{text-align:center;fill:#333}#mermaid-svg-V2HeoPRqH6VcMr35 .node.clickable{cursor:pointer}#mermaid-svg-V2HeoPRqH6VcMr35 .arrowheadPath{fill:#333}#mermaid-svg-V2HeoPRqH6VcMr35 .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-V2HeoPRqH6VcMr35 .flowchart-link{stroke:#333;fill:none}#mermaid-svg-V2HeoPRqH6VcMr35 .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-V2HeoPRqH6VcMr35 .edgeLabel rect{opacity:0.9}#mermaid-svg-V2HeoPRqH6VcMr35 .edgeLabel span{color:#333}#mermaid-svg-V2HeoPRqH6VcMr35 .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-V2HeoPRqH6VcMr35 .cluster text{fill:#333}#mermaid-svg-V2HeoPRqH6VcMr35 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-V2HeoPRqH6VcMr35 .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-V2HeoPRqH6VcMr35 text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-V2HeoPRqH6VcMr35 .actor-line{stroke:grey}#mermaid-svg-V2HeoPRqH6VcMr35 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-V2HeoPRqH6VcMr35 .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-V2HeoPRqH6VcMr35 #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-V2HeoPRqH6VcMr35 .sequenceNumber{fill:#fff}#mermaid-svg-V2HeoPRqH6VcMr35 #sequencenumber{fill:#333}#mermaid-svg-V2HeoPRqH6VcMr35 #crosshead path{fill:#333;stroke:#333}#mermaid-svg-V2HeoPRqH6VcMr35 .messageText{fill:#333;stroke:#333}#mermaid-svg-V2HeoPRqH6VcMr35 .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-V2HeoPRqH6VcMr35 .labelText,#mermaid-svg-V2HeoPRqH6VcMr35 .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-V2HeoPRqH6VcMr35 .loopText,#mermaid-svg-V2HeoPRqH6VcMr35 .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-V2HeoPRqH6VcMr35 .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-V2HeoPRqH6VcMr35 .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-V2HeoPRqH6VcMr35 .noteText,#mermaid-svg-V2HeoPRqH6VcMr35 .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-V2HeoPRqH6VcMr35 .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-V2HeoPRqH6VcMr35 .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-V2HeoPRqH6VcMr35 .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-V2HeoPRqH6VcMr35 .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-V2HeoPRqH6VcMr35 .section{stroke:none;opacity:0.2}#mermaid-svg-V2HeoPRqH6VcMr35 .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-V2HeoPRqH6VcMr35 .section2{fill:#fff400}#mermaid-svg-V2HeoPRqH6VcMr35 .section1,#mermaid-svg-V2HeoPRqH6VcMr35 .section3{fill:#fff;opacity:0.2}#mermaid-svg-V2HeoPRqH6VcMr35 .sectionTitle0{fill:#333}#mermaid-svg-V2HeoPRqH6VcMr35 .sectionTitle1{fill:#333}#mermaid-svg-V2HeoPRqH6VcMr35 .sectionTitle2{fill:#333}#mermaid-svg-V2HeoPRqH6VcMr35 .sectionTitle3{fill:#333}#mermaid-svg-V2HeoPRqH6VcMr35 .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-V2HeoPRqH6VcMr35 .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-V2HeoPRqH6VcMr35 .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-V2HeoPRqH6VcMr35 .grid path{stroke-width:0}#mermaid-svg-V2HeoPRqH6VcMr35 .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-V2HeoPRqH6VcMr35 .task{stroke-width:2}#mermaid-svg-V2HeoPRqH6VcMr35 .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-V2HeoPRqH6VcMr35 .taskText:not([font-size]){font-size:11px}#mermaid-svg-V2HeoPRqH6VcMr35 .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-V2HeoPRqH6VcMr35 .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-V2HeoPRqH6VcMr35 .task.clickable{cursor:pointer}#mermaid-svg-V2HeoPRqH6VcMr35 .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-V2HeoPRqH6VcMr35 .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-V2HeoPRqH6VcMr35 .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-V2HeoPRqH6VcMr35 .taskText0,#mermaid-svg-V2HeoPRqH6VcMr35 .taskText1,#mermaid-svg-V2HeoPRqH6VcMr35 .taskText2,#mermaid-svg-V2HeoPRqH6VcMr35 .taskText3{fill:#fff}#mermaid-svg-V2HeoPRqH6VcMr35 .task0,#mermaid-svg-V2HeoPRqH6VcMr35 .task1,#mermaid-svg-V2HeoPRqH6VcMr35 .task2,#mermaid-svg-V2HeoPRqH6VcMr35 .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-V2HeoPRqH6VcMr35 .taskTextOutside0,#mermaid-svg-V2HeoPRqH6VcMr35 .taskTextOutside2{fill:#000}#mermaid-svg-V2HeoPRqH6VcMr35 .taskTextOutside1,#mermaid-svg-V2HeoPRqH6VcMr35 .taskTextOutside3{fill:#000}#mermaid-svg-V2HeoPRqH6VcMr35 .active0,#mermaid-svg-V2HeoPRqH6VcMr35 .active1,#mermaid-svg-V2HeoPRqH6VcMr35 .active2,#mermaid-svg-V2HeoPRqH6VcMr35 .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-V2HeoPRqH6VcMr35 .activeText0,#mermaid-svg-V2HeoPRqH6VcMr35 .activeText1,#mermaid-svg-V2HeoPRqH6VcMr35 .activeText2,#mermaid-svg-V2HeoPRqH6VcMr35 .activeText3{fill:#000 !important}#mermaid-svg-V2HeoPRqH6VcMr35 .done0,#mermaid-svg-V2HeoPRqH6VcMr35 .done1,#mermaid-svg-V2HeoPRqH6VcMr35 .done2,#mermaid-svg-V2HeoPRqH6VcMr35 .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-V2HeoPRqH6VcMr35 .doneText0,#mermaid-svg-V2HeoPRqH6VcMr35 .doneText1,#mermaid-svg-V2HeoPRqH6VcMr35 .doneText2,#mermaid-svg-V2HeoPRqH6VcMr35 .doneText3{fill:#000 !important}#mermaid-svg-V2HeoPRqH6VcMr35 .crit0,#mermaid-svg-V2HeoPRqH6VcMr35 .crit1,#mermaid-svg-V2HeoPRqH6VcMr35 .crit2,#mermaid-svg-V2HeoPRqH6VcMr35 .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-V2HeoPRqH6VcMr35 .activeCrit0,#mermaid-svg-V2HeoPRqH6VcMr35 .activeCrit1,#mermaid-svg-V2HeoPRqH6VcMr35 .activeCrit2,#mermaid-svg-V2HeoPRqH6VcMr35 .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-V2HeoPRqH6VcMr35 .doneCrit0,#mermaid-svg-V2HeoPRqH6VcMr35 .doneCrit1,#mermaid-svg-V2HeoPRqH6VcMr35 .doneCrit2,#mermaid-svg-V2HeoPRqH6VcMr35 .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-V2HeoPRqH6VcMr35 .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-V2HeoPRqH6VcMr35 .milestoneText{font-style:italic}#mermaid-svg-V2HeoPRqH6VcMr35 .doneCritText0,#mermaid-svg-V2HeoPRqH6VcMr35 .doneCritText1,#mermaid-svg-V2HeoPRqH6VcMr35 .doneCritText2,#mermaid-svg-V2HeoPRqH6VcMr35 .doneCritText3{fill:#000 !important}#mermaid-svg-V2HeoPRqH6VcMr35 .activeCritText0,#mermaid-svg-V2HeoPRqH6VcMr35 .activeCritText1,#mermaid-svg-V2HeoPRqH6VcMr35 .activeCritText2,#mermaid-svg-V2HeoPRqH6VcMr35 .activeCritText3{fill:#000 !important}#mermaid-svg-V2HeoPRqH6VcMr35 .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-V2HeoPRqH6VcMr35 g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-V2HeoPRqH6VcMr35 g.classGroup text .title{font-weight:bolder}#mermaid-svg-V2HeoPRqH6VcMr35 g.clickable{cursor:pointer}#mermaid-svg-V2HeoPRqH6VcMr35 g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-V2HeoPRqH6VcMr35 g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-V2HeoPRqH6VcMr35 .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-V2HeoPRqH6VcMr35 .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-V2HeoPRqH6VcMr35 .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-V2HeoPRqH6VcMr35 .dashed-line{stroke-dasharray:3}#mermaid-svg-V2HeoPRqH6VcMr35 #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-V2HeoPRqH6VcMr35 #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-V2HeoPRqH6VcMr35 #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-V2HeoPRqH6VcMr35 #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-V2HeoPRqH6VcMr35 #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-V2HeoPRqH6VcMr35 #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-V2HeoPRqH6VcMr35 #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-V2HeoPRqH6VcMr35 #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-V2HeoPRqH6VcMr35 .commit-id,#mermaid-svg-V2HeoPRqH6VcMr35 .commit-msg,#mermaid-svg-V2HeoPRqH6VcMr35 .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-V2HeoPRqH6VcMr35 .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-V2HeoPRqH6VcMr35 .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-V2HeoPRqH6VcMr35 g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-V2HeoPRqH6VcMr35 g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-V2HeoPRqH6VcMr35 g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-V2HeoPRqH6VcMr35 g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-V2HeoPRqH6VcMr35 g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-V2HeoPRqH6VcMr35 g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-V2HeoPRqH6VcMr35 .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-V2HeoPRqH6VcMr35 .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-V2HeoPRqH6VcMr35 .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-V2HeoPRqH6VcMr35 .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-V2HeoPRqH6VcMr35 .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-V2HeoPRqH6VcMr35 .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-V2HeoPRqH6VcMr35 .edgeLabel text{fill:#333}#mermaid-svg-V2HeoPRqH6VcMr35 .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-V2HeoPRqH6VcMr35 .node circle.state-start{fill:black;stroke:black}#mermaid-svg-V2HeoPRqH6VcMr35 .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-V2HeoPRqH6VcMr35 #statediagram-barbEnd{fill:#9370db}#mermaid-svg-V2HeoPRqH6VcMr35 .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-V2HeoPRqH6VcMr35 .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-V2HeoPRqH6VcMr35 .statediagram-state .divider{stroke:#9370db}#mermaid-svg-V2HeoPRqH6VcMr35 .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-V2HeoPRqH6VcMr35 .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-V2HeoPRqH6VcMr35 .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-V2HeoPRqH6VcMr35 .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-V2HeoPRqH6VcMr35 .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-V2HeoPRqH6VcMr35 .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-V2HeoPRqH6VcMr35 .note-edge{stroke-dasharray:5}#mermaid-svg-V2HeoPRqH6VcMr35 .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-V2HeoPRqH6VcMr35 .error-icon{fill:#522}#mermaid-svg-V2HeoPRqH6VcMr35 .error-text{fill:#522;stroke:#522}#mermaid-svg-V2HeoPRqH6VcMr35 .edge-thickness-normal{stroke-width:2px}#mermaid-svg-V2HeoPRqH6VcMr35 .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-V2HeoPRqH6VcMr35 .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-V2HeoPRqH6VcMr35 .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-V2HeoPRqH6VcMr35 .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-V2HeoPRqH6VcMr35 .marker{fill:#333}#mermaid-svg-V2HeoPRqH6VcMr35 .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}#mermaid-svg-V2HeoPRqH6VcMr35 {color: rgba(0, 0, 0, 0.75);font: ;}被抓取被抓取node1prometheusnode2Grafana

    搭建過(guò)程:相關(guān)yaml文件地址(驗(yàn)證碼:mzzv)

    • 啟動(dòng)Prometheus和Grafana[root@k8s-master ~]# mkdir pgmonitor [root@k8s-master ~]# cd pgmonitor/ # 將yaml文件上傳到 [root@k8s-master pgmonitor]# ls grafana node-exporter.yaml prometheus[root@k8s-master pgmonitor]# vim node-exporter.yaml --- apiVersion: apps/v1 kind: DaemonSet metadata:name: node-exporternamespace: kube-systemlabels:k8s-app: node-exporter spec:selector:matchLabels:k8s-app: node-exporter ... # 部署守護(hù)進(jìn)程 [root@k8s-master pgmonitor]# kubectl create -f node-exporter.yaml # 部署prometheus [root@k8s-master prometheus]# kubectl create -f rbac-setup.yaml [root@k8s-master prometheus]# kubectl create -f configmap.yaml [root@k8s-master prometheus]# vim prometheus.deploy.yml --- apiVersion: apps/v1 ... [root@k8s-master prometheus]# kubectl create -f prometheus.deploy.yml [root@k8s-master prometheus]# kubectl create -f prometheus.svc.yml # 檢查 [root@k8s-master prometheus]# kubectl get pods -n kube-system NAME READY STATUS RESTARTS AGE coredns-59d64cd4d4-dqx8m 1/1 Running 0 23d coredns-59d64cd4d4-z8pdq 1/1 Running 0 23d etcd-k8s-master 1/1 Running 0 23d kube-apiserver-k8s-master 1/1 Running 0 23d kube-controller-manager-k8s-master 1/1 Running 0 23d kube-flannel-ds-h7v2g 1/1 Running 0 23d kube-flannel-ds-xmzfh 1/1 Running 0 23d kube-flannel-ds-z9nbj 1/1 Running 0 23d kube-proxy-6c9cd 1/1 Running 0 23d kube-proxy-cnvfg 1/1 Running 0 23d kube-proxy-p4nx4 1/1 Running 0 23d kube-scheduler-k8s-master 1/1 Running 0 23d node-exporter-g68xs 1/1 Running 0 7m57s node-exporter-rk2rg 1/1 Running 0 7m57s prometheus-68546b8d9-xk7tx 1/1 Running 0 116s# 部署Grafana [root@k8s-master pgmonitor]# cd grafana/ [root@k8s-master grafana]# vim grafana-deploy.yaml apiVersion: apps/v1 kind: Deployment metadata:name: grafana-corenamespace: kube-systemlabels:app: grafanacomponent: core spec:replicas: 1selector:matchLabels:app: grafanacomponent: core ... [root@k8s-master grafana]# kubectl create -f grafana-deploy.yaml [root@k8s-master grafana]# kubectl create -f grafana-svc.yaml [root@k8s-master grafana]# kubectl create -f grafana-ing.yaml # 檢查 [root@k8s-master grafana]# kubectl get pods -n kube-system NAME READY STATUS RESTARTS AGE coredns-59d64cd4d4-dqx8m 1/1 Running 0 23d coredns-59d64cd4d4-z8pdq 1/1 Running 0 23d etcd-k8s-master 1/1 Running 0 23d grafana-core-85587c9c49-khvnk 1/1 Running 0 83s kube-apiserver-k8s-master 1/1 Running 0 23d kube-controller-manager-k8s-master 1/1 Running 0 23d kube-flannel-ds-h7v2g 1/1 Running 0 23d kube-flannel-ds-xmzfh 1/1 Running 0 23d kube-flannel-ds-z9nbj 1/1 Running 0 23d kube-proxy-6c9cd 1/1 Running 0 23d kube-proxy-cnvfg 1/1 Running 0 23d kube-proxy-p4nx4 1/1 Running 0 23d kube-scheduler-k8s-master 1/1 Running 0 23d node-exporter-g68xs 1/1 Running 0 17m node-exporter-rk2rg 1/1 Running 0 17m prometheus-68546b8d9-xk7tx 1/1 Running 0 11m# 查看打開(kāi)的端口號(hào) [root@k8s-master grafana]# kubectl get svc -n kube-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE grafana NodePort 10.111.191.90 <none> 3000:31708/TCP 4m32s kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 23d node-exporter NodePort 10.97.61.70 <none> 9100:31672/TCP 20m prometheus NodePort 10.111.182.252 <none> 9090:30003/TCP 14m [root@k8s-master grafana]# kubectl get svc -n kube-system -o wide
    • 打開(kāi)Grafana,配置數(shù)據(jù)源,導(dǎo)入顯示模板,默認(rèn)用戶(hù)名密碼都是admin。最后配置prometheus數(shù)據(jù)源







    7. 搭建高可用集群




    步驟文檔地址:驗(yàn)證碼0x23


    8. 集群項(xiàng)目部署實(shí)操



    k8s集群部署java項(xiàng)目:以下將以java項(xiàng)目(驗(yàn)證碼c78o)為例實(shí)現(xiàn)這一流程

  • 準(zhǔn)備Java項(xiàng)目

  • 通過(guò)maven進(jìn)行打包

    [root@15-package demo]# ls demojenkins [root@15-package demo]# cd demojenkins [root@15-package demojenkins]# mvn clean package [root@15-package demojenkins]# ls demojenkins.iml Dockerfile HELP.md mvnw mvnw.cmd pom.xml src target [root@15-package demojenkins]# cd target/ [root@15-package target]# ls classes demojenkins.jar demojenkins.jar.original generated-sources generated-test-sources maven-archiver maven-status surefire-reports test-classes
  • 制作鏡像

    [root@15-package demojenkins]# ls demojenkins.iml Dockerfile HELP.md mvnw mvnw.cmd pom.xml src target [root@15-package demojenkins]# docker build -t java-demo-01:latest . [root@15-package demojenkins]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE java-demo-01 latest 3563dd6e175a 3 minutes ago 122MB openjdk 8-jdk-alpine a3562aa0b991 2 years ago 105MB# 簡(jiǎn)單測(cè)試鏡像 [root@62-cent demojenkins]# docker run -d -p 8111:8111 java-demo-01:latest -t

  • 上傳鏡像到鏡像服務(wù)器中(以阿里云為例)


    # 登錄阿里云倉(cāng)庫(kù) [root@62-cent demojenkins]# docker login --username=xxxx registry.cn-hangzhou.aliyuncs.com # 為鏡像添加版本號(hào) [root@62-cent demojenkins]# docker tag 3563dd6e175a registry.cn-hangzhou.aliyuncs.com/my_demo_space/java-project-01:1.0.0 # 實(shí)現(xiàn)推送 [root@62-cent demojenkins]# docker push registry.cn-hangzhou.aliyuncs.com/my_demo_space/java-project-01:1.0.0

  • 部署鏡像暴露應(yīng)用

    # 導(dǎo)出yaml [root@k8s-master ~]# kubectl create deployment javademo1 --image=registry.cn-hangzhou.aliyuncs.com/my_demo_space/java-project-01:1.0.0 --dry-run -o yaml > javademo1.yaml # 創(chuàng)建yaml [root@k8s-master ~]# kubectl apply -f javademo1.yaml deployment.apps/javademo1 created # 查看創(chuàng)建情況 [root@k8s-master ~]# kubectl get pods # 擴(kuò)容 [root@k8s-master ~]# kubectl scale deployment javademo1 --replicas=3 # 暴露端口 [root@k8s-master ~]# kubectl expose deployment javademo1 --port=8111 --target-port=8111 --type=NodePort#通過(guò)NodeIp:port訪(fǎng)問(wèn)即可
  • 總結(jié)

    以上是生活随笔為你收集整理的【体系】Kubernetes容器管理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    精精国产xxxx视频在线播放 | 我要看黄色一级片 | 一本色道久久综合亚洲二区三区 | 国产精品美女久久久久久久久 | 99久久精品免费视频 | 色婷婷av国产精品 | 性色av免费在线观看 | 久久免费99精品久久久久久 | 在线欧美a| 欧美久久久久久久久久久久 | 午夜精品一区二区三区视频免费看 | 天天天干| 国产精品日韩欧美一区二区 | 久久久噜噜噜久久久 | av福利在线播放 | 久久99中文字幕 | 久久艹人人 | 国产成人黄色片 | 国产成人福利片 | 91高清视频| 国语精品视频 | 国产高清不卡一区二区三区 | 精品视频免费久久久看 | 91九色在线播放 | 国产专区在线播放 | 色九九影院 | 麻豆成人在线观看 | 国产国产人免费人成免费视频 | 婷婷丁香六月 | 天天摸天天操天天舔 | 色综合亚洲精品激情狠狠 | 丁香六月激情婷婷 | 最近乱久中文字幕 | 国产亚洲精品日韩在线tv黄 | 97视频一区 | 中文在线a√在线 | 狠狠色2019综合网 | 国产亚洲综合性久久久影院 | 久久久久久久久久久免费 | 综合婷婷丁香 | 国产精品免费视频网站 | 色wwww| 91在线看片| 能在线观看的日韩av | 九九视频在线播放 | 天天曰| 中文字幕婷婷 | 激情五月婷婷综合网 | 日韩三级视频在线观看 | 久久久人人爽 | 男女靠逼app | 人人干免费| 综合亚洲视频 | 国产99久久精品一区二区300 | av在线电影网站 | 久久国产精品99久久久久久进口 | 2022中文字幕在线观看 | 激情欧美日韩一区二区 | 久久久免费 | 亚洲一级性 | 亚洲精品久久视频 | 久久精品国产免费 | 国产又粗又猛又爽 | 亚洲综合色婷婷 | 免费观看不卡av | 精品美女国产在线 | 天天搞天天干 | 久久国际影院 | 超碰国产人人 | www久久99| av超碰免费在线 | 国产精品手机在线播放 | 深夜免费福利视频 | 波多野结衣在线观看一区 | 免费av在 | 天天操天天色天天射 | 亚洲精品乱码久久久久久蜜桃不爽 | 亚洲理论片在线观看 | 精品a在线| av片免费播放 | 日本xxxx裸体xxxx17 | 97视频免费看 | 日韩免费大片 | 国产一线二线三线性视频 | 在线观看色视频 | 激情视频一区二区三区 | 免费一级黄色 | 夜夜夜精品 | 91手机视频在线 | 日本精品中文字幕 | 婷婷激情5月天 | www.99在线观看| 最新免费中文字幕 | av网站有哪些 | 四虎在线观看视频 | 91亚洲国产成人久久精品网站 | 欧美另类激情 | 国产69精品久久久久久 | 日韩视频www | 色av色av色av| 成人毛片网| 国产精品一区二区无线 | 91精品视频观看 | 国产精品99久久久久久有的能看 | 中文字幕在线第一页 | 久久黄色美女 | 亚洲精品国偷拍自产在线观看 | 4hu视频| 99久久99久久综合 | 免费网站黄| 91麻豆国产福利在线观看 | 在线免费视频你懂的 | 在线中文视频 | 亚洲精品视频在线免费播放 | 国产精品尤物 | 久草精品视频在线看网站免费 | av在线免费播放 | 国内精品视频在线 | 激情电影影院 | 久久国内精品 | 91亚洲精品在线 | 中文字幕一区三区 | 欧美一二三视频 | 久久久久久久久久亚洲精品 | 粉嫩aⅴ一区二区三区 | 很污的网站| 欧美精品色 | 黄色小说网站在线 | 黄色网址在线播放 | 久久99精品久久久久婷婷 | 97国产大学生情侣酒店的特点 | 九色porny真实丨国产18 | 久久激情小视频 | 天天草天天草 | 337p日本欧洲亚洲大胆裸体艺术 | 欧美日韩中文在线观看 | av资源在线看 | 国外成人在线视频网站 | 粉嫩高清一区二区三区 | 免费看黄在线 | 日韩a级黄色片 | 五月在线视频 | 日韩在线小视频 | 国产成人三级三级三级97 | 国产中文字幕国产 | 国产黄色视 | 久久国产精品影视 | 91爱爱中文字幕 | 91伊人影院| 国产精品成人aaaaa网站 | 亚洲精品白浆高清久久久久久 | 欧美色图亚洲图片 | 色就色,综合激情 | 日韩av电影免费观看 | 9色在线视频 | 久久精品婷婷 | 91精品久久久久久综合五月天 | 久久久五月天 | 99精品免费久久久久久久久 | 操操操干干干 | 午夜精品久久久久久久久久久久 | 久久久久亚洲天堂 | 成人av av在线| 九九免费精品视频在线观看 | 视频国产精品 | 久久免费资源 | 国产 视频 久久 | 久久涩涩网站 | 亚洲综合激情小说 | 久久综合久久鬼 | 一级黄色片在线免费看 | 不卡在线一区 | 98久久 | 欧美综合在线观看 | 久草视频在线免费播放 | 日韩精品一区二区三区丰满 | 天天操天操| 亚洲视频在线观看免费 | 91看毛片 | 色天天综合网 | 区一区二区三在线观看 | 国产一区欧美日韩 | 国产高清视频免费观看 | 欧美一级免费高清 | 日本中文字幕在线一区 | 玖玖玖在线| 在线播放一区二区三区 | 中文字幕一区二区三区四区在线视频 | 97视频在线看 | 精品久久久久久久久中文字幕 | 在线91视频 | 在线观看中文字幕dvd播放 | 日韩视频1区 | 午夜精品一区二区三区在线 | 免费日韩 精品中文字幕视频在线 | 欧美性大胆 | 成人国产精品免费 | 国色天香第二季 | 亚洲国产免费网站 | 伊人狠狠色丁香婷婷综合 | 天天天天爱天天躁 | 免费下载高清毛片 | a视频在线看 | 欧美 亚洲 另类 激情 另类 | 中文字幕在线播放一区 | 色婷婷综合视频在线观看 | 久草在线手机视频 | 99热手机在线 | 亚洲综合色视频在线观看 | 摸阴视频| 国产大片黄色 | 亚洲欧美视频在线 | 精品色综合| 久久九精品 | 五月天亚洲综合 | 中文字幕欧美日韩va免费视频 | av免费观看在线 | mm1313亚洲精品国产 | 美女精品久久久 | av在线小说 | av网站在线免费观看 | 亚洲 av网站| 精品国产一区二区三区av性色 | 激情视频综合网 | 久久久91精品国产 | 色网站中文字幕 | 特片网久久 | 欧美日一级片 | 27xxoo无遮挡动态视频 | 激情综合色综合久久 | 又色又爽又黄高潮的免费视频 | 久久久网站 | 日本中文字幕系列 | 午夜精品久久久久久久99无限制 | 四虎国产免费 | 韩国一区视频 | 午夜精品久久久久久久久久 | 国产视频在线免费观看 | 中文字幕在线看片 | 色窝资源 | 99热最新地址 | 久久久wwww| 69av视频在线观看 | 亚洲激情中文 | 又色又爽的网站 | 亚洲一区日韩精品 | av女优中文字幕在线观看 | 在线有码中文 | 日韩激情视频在线观看 | 国产精品综合在线 | av亚洲产国偷v产偷v自拍小说 | 亚洲色图22p | a精品视频| 国产精品免费麻豆入口 | 三级a毛片| 麻花天美星空视频 | 2019天天干天天色 | 成年人免费看片 | 超碰在线色| 精品理论片 | 91精品1区2区 | 久久精品国产v日韩v亚洲 | 蜜臀av网址 | 国产视频一区二区三区在线 | 国产精品你懂的在线观看 | 97精品国产91久久久久久 | 久久婷婷色 | 91丨九色丨国产丨porny精品 | 精品国产精品久久一区免费式 | 日日干天天操 | 欧美国产日韩久久 | 色婷丁香| 久久精品综合视频 | 日本aaa在线观看 | 欧美亚洲久久 | 超碰免费公开 | 欧美大jb| 夜夜摸夜夜爽 | 免费男女羞羞的视频网站中文字幕 | 国产精品国产三级国产不产一地 | 国内外激情视频 | 99久久精品国产欧美主题曲 | 最近免费中文字幕 | 欧美日韩一区二区免费在线观看 | 国产麻豆成人传媒免费观看 | 女人18毛片a级毛片一区二区 | 久久国产精品一区二区三区四区 | 国产视频久| 91精彩视频在线观看 | 婷婷色在线视频 | 久久精品中文字幕少妇 | 国产黄色片在线 | 久久夜色精品国产欧美乱 | 国产裸体bbb视频 | www.久久com| 丁香激情综合久久伊人久久 | 一区二区不卡视频在线观看 | 成 人 黄 色 视频播放1 | 91精品国产电影 | 91精品免费在线视频 | 国内精品久久久久影院优 | 成年人在线免费看 | 97理论片 | 日本中文字幕在线播放 | 国产精品99精品久久免费 | 91成人黄色 | 日韩乱码在线 | 丁香六月在线 | 狠狠操狠狠干天天操 | 国产成人精品免高潮在线观看 | 日韩一区正在播放 | 久久久亚洲影院 | 一区二区三区播放 | 91.dizhi永久地址最新 | 国产精品理论片在线观看 | 国产精品久久嫩一区二区免费 | 中文字幕久久精品一区 | 成人免费中文字幕 | 日韩,精品电影 | 欧美一区影院 | 精品亚洲国产视频 | 国产对白av | 亚洲综合成人专区片 | 国产黄 | 中文字幕久久精品一区 | 少妇高潮冒白浆 | 九九免费观看视频 | 国产精品视频免费看 | 四虎影视4hu4虎成人 | 精品久久久成人 | 一区二区三区影院 | 激情丁香在线 | 久久理论电影网 | 人成免费网站 | 久久久精品影视 | 天天综合网天天综合色 | 日韩欧美高清视频在线观看 | 久久久久欠精品国产毛片国产毛生 | 欧美日本不卡高清 | 在线免费观看涩涩 | 欧美福利久久 | 免费一级片观看 | 免费网址你懂的 | 狠狠色丁香婷婷综合 | 在线91精品 | 久久资源总站 | 伊人国产在线观看 | 国产99免费 | 精品99久久 | 国产精品久久网站 | 日韩在线观看免费 | 碰超在线观看 | 欧美一级在线观看视频 | 人人草人人草 | 国产精品久久久av | 成人久久久久 | 天天看天天干天天操 | 日韩理论在线视频 | 最近中文字幕免费大全 | 日本久久精 | 99视频导航| 亚洲综合视频在线 | 亚洲天堂网视频在线观看 | 91免费观看视频在线 | 色国产精品 | 欧美成人理伦片 | 美女啪啪图片 | 99热这里只有精品在线观看 | 亚洲精品免费视频 | 中文字幕av一区二区三区四区 | 久久精品视频在线观看 | 亚洲精品美女久久久久网站 | 精品国产自在精品国产精野外直播 | 亚洲精品美女在线观看播放 | 91中文字幕一区 | 国产精品久久久久一区二区国产 | 69亚洲精品 | 亚洲一区二区三区毛片 | 国产午夜剧场 | 免费情趣视频 | 亚洲在线精品 | 免费人成在线观看 | 一区二区视频在线看 | 欧美激情奇米色 | 深爱开心激情网 | 午夜a区| 成人免费网站在线观看 | 久久久伊人网 | 国产乱码精品一区二区三区介绍 | 午夜精品久久久久久久99无限制 | 中文字幕在线视频免费播放 | 日韩成人精品 | 久久中文视频 | 国产色影院 | 激情视频免费在线观看 | 久久伊人八月婷婷综合激情 | 91九色视频 | 91久久久久久久一区二区 | 国产精品中文字幕在线 | 亚洲精品视频在线观看免费视频 | 日韩免费电影在线观看 | 久久精品永久免费 | 国产精品黑丝在线观看 | 天天天天天天天操 | 在线观看激情av | 美女视频一区二区 | 亚洲一区二区观看 | 福利一区在线视频 | 狠狠网站 | 日韩和的一区二在线 | 在线播放视频一区 | av大全在线免费观看 | 中文字幕在线精品 | 日韩视频在线观看免费 | 夜夜骑日日操 | 亚洲欧美在线综合 | 天天操天天操天天操天天操 | 久草com | 999国内精品永久免费视频 | 欧洲一区二区三区精品 | 国产精品一区二区av影院萌芽 | 伊人婷婷久久 | 欧美另类高清 | 四虎成人精品在永久免费 | 日韩h在线观看 | 97精品超碰一区二区三区 | 天天爱天天操 | 久久久久亚洲精品 | 久久免费高清视频 | 五月亚洲| 久久综合精品国产一区二区三区 | 91插插影库| 国产精品久久99精品毛片三a | 日韩亚洲在线观看 | 成人h在线观看 | 国产免费观看久久黄 | 欧美色图狠狠干 | 婷婷色中文| 综合色婷婷 | 蜜臀av性久久久久蜜臀aⅴ四虎 | 国产精品99在线观看 | 中文字幕二区在线观看 | 少妇按摩av | 日韩av成人 | 激情综合五月婷婷 | 久久精品国产免费观看 | 国产高清视频免费 | 久草在线久 | 区一区二区三区中文字幕 | 午夜电影久久久 | 欧美精品首页 | www.亚洲| 在线观看av片 | 欧美在线视频一区二区 | 久久亚洲人 | 日韩小视频| 国产成人精品一区二区在线 | 久草视频在线免费播放 | 婷婷在线播放 | 国产日韩欧美在线一区 | 成人av电影网址 | 午夜在线免费观看视频 | 亚洲国产成人精品在线 | 国产精品久久久久久久7电影 | 国产精品欧美久久久久无广告 | 国产亚洲无 | 久久九九久久 | 日韩精品一二三 | 国产精品一区二区久久 | 久久久久国产精品一区 | 99久久久国产免费 | 欧美日一级片 | av高清一区二区三区 | 色欧美88888久久久久久影院 | 日韩精品最新在线观看 | 日韩中文字幕视频在线 | 91人人干| 在线观看岛国av | 五月婷婷丁香在线观看 | 国产不卡一二三区 | 欧美做受69 | 99精品视频免费看 | 久久99亚洲精品久久 | 久久综合之合合综合久久 | 国产97av | 999成人精品 | 玖草在线观看 | 在线看不卡av | 色多视频在线观看 | 日本99精品 | 国产99久久九九精品 | 天天视频色| 九九热只有精品 | 国产精品美女久久久 | av短片在线观看 | 午夜久久福利影院 | 色综久久| 久久久久久久99精品免费观看 | 91系列在线观看 | 成人在线免费观看视视频 | 91色欧美| 久久黄色免费视频 | 96精品视频 | 日韩综合第一页 | 日韩欧美精品在线观看视频 | 色在线视频 | 婷婷丁香在线 | 国产免费一区二区三区最新6 | 日韩精品一区二区免费视频 | 一本一道波多野毛片中文在线 | 亚洲成人资源 | 91久久国产精品 | 九九99视频 | 国产二区视频在线观看 | www.色com| 久艹视频在线免费观看 | 免费高清在线一区 | 91精品网站 | 二区三区在线视频 | 亚洲网站在线看 | 国产精品成人一区二区三区吃奶 | 国产精品日韩欧美一区二区 | 国产精品自拍av | 黄色一级在线观看 | 国产一区在线精品 | 91chinesexxx| www.天天草 | 欧美日韩亚洲在线观看 | 日韩www在线 | 久久久av免费 | 三级黄色网络 | 欧美精品在线观看 | 中文av网 | 91色蜜桃| 天天操人 | 黄色免费在线视频 | 国产最新91 | 婷婷国产在线观看 | 最近久乱中文字幕 | 日日操操 | 精品国产一区二区三区噜噜噜 | av在线色| 久久成人国产 | 97国产超碰在线 | 五月婷激情| 亚洲狠狠婷婷 | 欧美日韩高清免费 | 久久久久久高潮国产精品视 | 麻豆精品传媒视频 | 国产短视频在线播放 | 最近更新好看的中文字幕 | 欧美另类人妖 | 在线a人v观看视频 | 久久中文字幕导航 | 国产精品一区二区三区在线免费观看 | 国产日韩在线视频 | 又大又硬又黄又爽视频在线观看 | 99精品免费久久久久久日本 | 综合网成人| 天天操天天干天天操天天干 | 91精品蜜桃 | 亚洲一区二区视频在线 | 毛片1000部免费看 | 久久免费精品 | 精品国产伦一区二区三区 | 亚洲视频axxx| 日韩av美女| 婷婷色六月天 | 色婷在线 | 黄色亚洲在线 | 亚洲网站在线看 | 天天干天天碰 | 在线网站黄 | 久久婷婷精品 | 99成人免费视频 | 日韩高清在线一区二区 | 亚洲精品国产精品久久99 | 午夜视频在线观看一区二区三区 | 一区二区不卡在线观看 | 日韩久久精品 | 国产福利电影网址 | 久久黄色小说视频 | 国产精品一区二区你懂的 | 国产精品美女久久久久久免费 | 国产裸体视频网站 | 婷婷五天天在线视频 | 天天综合色 | 久久久午夜精品福利内容 | 久免费| 国产成人精品福利 | www色网站 | 人人干在线观看 | 成人欧美一区二区三区在线观看 | 久久人人爽人人爽人人片av免费 | 91在线视频免费91 | 久草在线播放视频 | 欧美少妇18p | 黄色软件大全网站 | 成人在线播放免费观看 | 国产在线1区 | 我要色综合天天 | 日韩黄色在线观看 | 成人理论电影 | 91精品国产综合久久婷婷香蕉 | 麻豆成人小视频 | 国产精品久久久久毛片大屁完整版 | 激情喷水| 四虎在线永久免费观看 | 国产在线 一区二区三区 | 成人蜜桃 | 精品在线视频一区 | 日韩在线 一区二区 | 成人久久久电影 | 99久久精品无码一区二区毛片 | 国产免费嫩草影院 | 一区二区精品视频 | 中文字幕在线看视频国产 | 国产亚洲精品久久久网站好莱 | 天天干天天操天天干 | 日韩av资源站 | 米奇狠狠狠888 | 久久综合九色综合网站 | 欧美性久久久久久 | 91精品色 | 精品久久久久久久久久 | 国产成人亚洲在线观看 | 国产精品第二页 | 在线观看www视频 | 国产精品一区二区av日韩在线 | 中国一区二区视频 | 国产专区在线 | 黄色成人av在线 | 91传媒91久久久 | 天天艹天天 | 91免费观看国产 | 久草在线中文888 | 日韩精品在线观看av | 亚洲va欧美| 天天干天天插伊人网 | www.av在线播放 | 久久国产午夜精品理论片最新版本 | 午夜精品区| 色婷婷综合久色 | 亚州免费视频 | 亚洲丝袜中文 | avwww在线 | 亚洲天天干 | 国产女教师精品久久av | 天天操狠狠操夜夜操 | 亚洲精品综合欧美二区变态 | 91看片在线免费观看 | 久久综合九色综合欧美就去吻 | 日韩激情免费视频 | 色婷婷激婷婷情综天天 | 天天看天天操 | 国产做爰视频 | 亚洲精品在线观看av | 精品视频99| 日韩中文字幕免费看 | 国产亚洲综合性久久久影院 | 丁香狠狠| 西西人体www444| 精品在线视频播放 | 亚洲日本在线视频观看 | 亚洲综合在线播放 | 成人精品在线 | 高潮久久久久久 | 精品国产中文字幕 | 一区二区久久久久 | 2018精品视频 | 国产成人黄色片 | 久草在线手机观看 | 91在线免费视频观看 | 久久国产精品一二三区 | 色插综合 | 丝袜美腿在线 | 午夜丁香视频在线观看 | 香蕉视频在线免费 | 欧美色黄 | 99这里只有 | 在线日本看片免费人成视久网 | 成人在线观看你懂的 | 在线观看欧美成人 | 亚一亚二国产专区 | 亚洲成aⅴ人片久久青草影院 | 天天射网站 | 精品女同一区二区三区在线观看 | 中文字幕精品一区久久久久 | 狠狠狠干| 一二三区av | 黄色av免费看 | 四虎成人网 | 人人看人人爱 | 在线观看资源 | 午夜在线免费观看 | 久久综合导航 | 久草99 | 亚洲理论视频 | 一区二区视频播放 | 国产成人久久精品77777 | 成人免费毛片aaaaaa片 | 丝袜美腿在线 | 91天天操 | 精品国产一区二区三区噜噜噜 | 天天色天天爱天天射综合 | 亚洲精品高清一区二区三区四区 | 亚洲精品成人 | 日日摸日日 | 91秒拍国产福利一区 | 激情视频免费观看 | 婷香五月 | 激情综合婷婷 | 国产精品激情偷乱一区二区∴ | 激情五月伊人 | 人人射av | 日韩精品一区二区在线视频 | 亚洲欧美999| 免费av试看| 国产码电影 | 热久久视久久精品18亚洲精品 | 久久久久久久久久免费视频 | 国产成人精品av在线观 | 成人久久久久久久久 | 高清一区二区 | 黄网站免费大全入口 | 久久99深爱久久99精品 | 91大神视频网站 | 日韩免费一级电影 | 狠狠干天天射 | 日韩精品视频第一页 | 国语精品久久 | 日本精品久久久久影院 | 亚洲激情国产精品 | 国产一区二区精 | 国产一级免费观看 | 丁香高清视频在线看看 | 激情综合色综合久久 | 最近中文字幕完整高清 | 久久久久久久久久久福利 | 在线观看视频一区二区三区 | 亚洲人成综合 | 亚洲综合精品视频 | 中文字幕在线观看av | 中文字幕av免费 | 欧美精品在线观看一区 | 黄色免费网站下载 | 狠狠操操| av成人亚洲 | 亚洲日本成人 | 婷婷色在线观看 | 中文字幕影片免费在线观看 | 午夜精品一区二区三区免费 | 日韩网站在线看片你懂的 | 99精品国产在热久久下载 | 99在线热播精品免费99热 | 精品久久美女 | 天天草av| 最近日韩免费视频 | 精品女同一区二区三区在线观看 | 精品亚洲男同gayvideo网站 | 精壮的侍卫呻吟h | 一区二区三区在线观看中文字幕 | 久久综合9988久久爱 | 亚洲欧美综合 | 欧洲精品二区 | 国产日韩欧美在线 | 97日日 | 亚洲精品在线二区 | 激情综合色综合久久 | 中文在线中文资源 | 最新av网址在线观看 | 四虎国产精品免费观看视频优播 | 免费色网站| 黄污网| www.com.日本一级 | 国产精品成人久久久 | 日一日干一干 | 成人免费毛片aaaaaa片 | 日韩中文字幕国产 | 亚洲人在线 | 91看片淫黄大片91 | 国产精品a成v人在线播放 | 国产在线观看不卡 | 日韩欧美高清在线观看 | 九九久久久 | 亚洲无线视频 | 99精品色| 在线电影中文字幕 | 福利一区二区在线 | 亚洲视频一区二区三区在线观看 | 黄色影院在线免费观看 | 在线观看日韩av | www.久久久| 国产成人精品久久 | 狠狠狠色丁香婷婷综合激情 | 欧美色综合久久 | 久久国产精品色av免费看 | 丁香六月婷婷 | 18性欧美xxxⅹ性满足 | 91精品国产自产91精品 | 视频在线观看99 | av片在线观看 | 五月天婷婷在线播放 | 亚洲japanese制服美女 | 精品国产视频在线观看 | 国产精品18久久久久久首页狼 | 久久高清免费视频 | 国内精品久久久久影院优 | 日韩视频免费观看高清完整版在线 | 国产在线观看地址 | 亚洲精品美女在线观看 | 视频一区二区三区视频 | 亚洲国产精品va在线看黑人动漫 | 日韩在线第一区 | 亚洲高清久久久 | 91九色视频在线观看 | 欧美少妇xxxxxx | 最近乱久中文字幕 | 国产高清亚洲 | 天天在线免费视频 | 中文字幕在线观看完整版 | 色久网| 草久久av| 五月天久久婷 | 97人人看 | 久久视频一区二区 | 999久久久久久久久 69av视频在线观看 | 在线视频免费观看 | 免费日韩 精品中文字幕视频在线 | 免费男女羞羞的视频网站中文字幕 | 亚洲视频在线观看网站 | 欧美成人中文字幕 | 国产福利免费看 | 国产69精品久久久久久久久久 | 国产不卡免费 | 国产一级高清 | 国产精品18久久久久久久久久久久 | 成人av免费看 | 高清av中文字幕 | 国产精品第一页在线观看 | 99久久精品无码一区二区毛片 | 日韩资源在线 | 在线天堂日本 | 免费www视频 | 一区二区三区免费在线 | 狠狠操天天射 | 日韩三级久久 | 久久精品欧美 | 亚洲三级精品 | 最近中文字幕免费视频 | 久久香蕉影视 | 亚洲精品麻豆视频 | www一起操 | 久久久免费高清视频 | 国产成人在线观看免费 | 婷婷久久国产 | 深爱开心激情网 | 久久综合9988久久爱 | 久久区二区| 国产xxxxx在线观看 | 日韩午夜av | 久久精品伊人 | 天天狠狠干 | 国产91小视频 | 久久视频免费在线 | aaa日本高清在线播放免费观看 | 四虎成人网 | 99精品视频在线播放免费 | 久久免费视频播放 | 天天干,狠狠干 | 久久玖 | 日韩欧美在线视频一区二区三区 | 91免费黄视频 | 久艹视频在线免费观看 | 日韩在线观看免费 | 成人午夜电影在线 | 日韩欧美aaa | 91在线观看视频网站 | 2023国产精品自产拍在线观看 | 免费久久久 | 国产又粗又猛又色 | 精品一区二区三区电影 | 黄色美女免费网站 | 日韩高清在线看 | 国产精品久久电影观看 | 国产资源在线播放 | 成人久久久久久久久久 | 91精品国产电影 | 色小说av | 欧美韩日在线 | www.五月天色 | 亚洲人xxx| 在线日本看片免费人成视久网 | 久久无码精品一区二区三区 | 91资源在线| 麻豆视频免费入口 | 一级黄色在线免费观看 | 在线看中文字幕 | 日韩欧美中文 | 日韩av女优视频 | 天天干天天弄 | 久久久久久影视 | 91精品久久久久久综合乱菊 | 超碰在线97国产 | 国产精品美女在线观看 | 国产成人精品电影久久久 | 成人9ⅰ免费影视网站 | 色婷婷99 | 久久精品韩国 | 久久成年人网站 | 日日干夜夜草 | 色婷av| 欧美日韩1区2区 | 国产日韩精品在线观看 | 久草www| 99 久久久久 | av丁香花 | 正在播放国产一区二区 | 一级欧美一级日韩 | 亚洲精品视频久久 | 欧美性极品xxxx娇小 | 久久精品中文字幕 | 四虎在线永久免费观看 | 久久久久国产精品视频 | 亚洲免费av在线播放 | 久久人人爽人人爽人人片 | 午夜视频二区 | 久久久久久久久毛片 | 激情综合网色播五月 | 手机av观看| 色综合夜色一区 | 精品在线观看一区二区 | 亚洲免费av在线播放 | 久久婷婷色综合 | 亚洲精品456在线播放 | 日韩电影一区二区在线观看 | 欧美日本国产在线观看 | 日韩精品一区电影 | 国产色拍拍拍拍在线精品 | 亚洲首页| 久久看片网| 久久视频这里只有精品 | 精品视频免费在线 | 久久成人国产精品免费软件 | 日韩欧美在线不卡 | 91九色视频在线 | 国内精品久久久久影院一蜜桃 | 亚洲资源在线网 | 国产99久久九九精品免费 | 97电院网手机版 | 中文字幕高清 | 国产中的精品av小宝探花 | 激情综合婷婷 | 亚洲一区精品人人爽人人躁 | 91在线视频网址 | 国产成人91 | av电影中文字幕在线观看 | 久久久久9999亚洲精品 | 日韩精品第一区 | 国产网红在线观看 | 国产亚洲情侣一区二区无 | 日本久久电影 | 伊人国产在线播放 | 亚洲精品乱码久久久久久9色 | 国产精品视频永久免费播放 | av免费在线观 | 四虎影视欧美 | 伊人久久国产 | 日韩欧美一区二区三区黑寡妇 | 91av免费观看 | 亚洲日本精品视频 | 狠狠操操网 | 91天堂素人约啪 | 日韩免费电影在线观看 | 久久精品久久久久久久 | 欧美专区亚洲专区 | 亚洲视频资源在线 | 毛片1000部免费看 | 欧美国产日韩在线观看 | 99久久婷婷国产综合精品 | 国产资源在线免费观看 | 欧美婷婷色 | 国产精品刺激对白麻豆99 | 成人av在线亚洲 | 在线小视频| 日韩毛片久久久 | 国产免费视频在线 | 天天av资源| 九九热视频在线免费观看 | 亚洲狠狠婷婷综合久久久 | 九九99视频 | 久久草在线精品 | 日本精品一区二区三区在线播放视频 | 一二三区高清 | 亚洲精品视频在线免费播放 | 日韩在线高清免费视频 | 免费精品人在线二线三线 | 91久久在线观看 |