一.系統(tǒng)環(huán)境
本文主要基于Kubernetes1.22.2和Linux操作系統(tǒng)Ubuntu 20.04.6。
操作系統(tǒng) | 主機(jī)名 | IP地址 | 進(jìn)程 | 功能 |
Ubuntu 20.04.6 | k8s-master | 192.168.189.128 | docker,kube-apiserver,etcd,kube-scheduler,kube-controller-manager,kubelet,kube-proxy,coredns,calico | 主節(jié)點(diǎn) |
Ubuntu 20.04.6 | k8s-node1 | 192.168.189.129 | docker,kubelet,kube-proxy,calico | 從節(jié)點(diǎn) |
Ubuntu 20.04.6 | k8s-node2 | 192.168.189.130 | docker,kubelet,kube-proxy,calico | 從節(jié)點(diǎn) |
Ubuntu 20.04.6 | gitlab | 192.168.189.131 | gitlab,doker,jenkins | gitlab,jenkins |
Ubuntu 20.04.6 | harbor | 192.168.189.132 | docker,harbor | harbor |
二.Kubernetes
2.1?概述
什么是Kubernetes?它的主要特點(diǎn)是什么?Kubernetes 是一個(gè)可移植、可擴(kuò)展的開源平臺(tái),用于管理容器化的工作負(fù)載和服務(wù),可促進(jìn)聲明式配置和自動(dòng)化。 Kubernetes 擁有一個(gè)龐大且快速增長的生態(tài),其服務(wù)、支持和工具的使用范圍相當(dāng)廣泛。 Kubernetes是一個(gè)開源的容器編排平臺(tái),用于自動(dòng)化部署、擴(kuò)展和管理容器化應(yīng)用程序。其主要特點(diǎn)包括自動(dòng)化部署、自我修復(fù)、水平擴(kuò)展、服務(wù)發(fā)現(xiàn)和負(fù)載均衡等。
Kubernetes 為你提供的功能如下:
1.服務(wù)發(fā)現(xiàn)和負(fù)載均衡:Kubernetes 可以使用 DNS 名稱或自己的 IP 地址來曝露容器。 如果進(jìn)入容器的流量很大, Kubernetes 可以負(fù)載均衡并分配網(wǎng)絡(luò)流量,從而使部署穩(wěn)定。
2.存儲(chǔ)編排:Kubernetes 允許你自動(dòng)掛載你選擇的存儲(chǔ)系統(tǒng),例如本地存儲(chǔ)、公共云提供商等。
3.自動(dòng)部署和回滾:你可以使用 Kubernetes 描述已部署容器的所需狀態(tài), 它可以以受控的速率將實(shí)際狀態(tài)4更改為期望狀態(tài)。 例如,你可以自動(dòng)化 Kubernetes 來為你的部署創(chuàng)建新容器, 刪除現(xiàn)有容器并將它們的所有資源用于新容器。
4.自動(dòng)完成裝箱計(jì)算:你為 Kubernetes 提供許多節(jié)點(diǎn)組成的集群,在這個(gè)集群上運(yùn)行容器化的任務(wù)。 你告訴 Kubernetes 每個(gè)容器需要多少 CPU 和內(nèi)存 (RAM)。 Kubernetes 可以將這些容器按實(shí)際情況調(diào)度到你的節(jié)點(diǎn)上,以最佳方式利用你的資源。
5.自我修復(fù):Kubernetes 將重新啟動(dòng)失敗的容器、替換容器、殺死不響應(yīng)用戶定義的運(yùn)行狀況檢查的容器, 并且在準(zhǔn)備好服務(wù)之前不將其通告給客戶端。
6.密鑰與配置管理:Kubernetes 允許你存儲(chǔ)和管理敏感信息,例如密碼、OAuth 令牌和 ssh 密鑰。 你可以在不重建容器鏡像的情況下部署和更新密鑰和應(yīng)用程序配置,也無需在堆棧配置中暴露密鑰。
2.2Kubernetes 組件
Kubernetes 集群架構(gòu)如下:
Kubernetes 集群組件如下:
請(qǐng)解釋一下Kubernetes的架構(gòu)和核心組件。 Kubernetes的架構(gòu)包括Master節(jié)點(diǎn)和Node節(jié)點(diǎn)。核心組件包括kube-apiserver、etcd、kube-scheduler、kube-controller-manager、kubelet和kube-proxy等。
'''
1.kube-apiserver:
- kube-apiserver 是 Kubernetes 集群的 API 服務(wù)器,它是集群的控制面的入口點(diǎn)。它負(fù)責(zé)提供 RESTful API,以便其他組件和用戶可以與集群進(jìn)行交互。kube-apiserver 接收來自客戶端和其他組件的請(qǐng)求,并將這些請(qǐng)求轉(zhuǎn)換為內(nèi)部操作,如創(chuàng)建、更新和刪除資源對(duì)象。它還負(fù)責(zé)對(duì)這些請(qǐng)求進(jìn)行身份驗(yàn)證、授權(quán)和準(zhǔn)入控制。
2.etcd:
- etcd 是 Kubernetes 集群的分布式鍵值存儲(chǔ)系統(tǒng),用于存儲(chǔ)集群的配置數(shù)據(jù)、狀態(tài)信息和元數(shù)據(jù)。etcd 提供了高可用性、一致性和分布式鎖等特性,使得 Kubernetes 集群可以在多個(gè)節(jié)點(diǎn)之間共享和同步數(shù)據(jù)。kube-apiserver、kube-scheduler、kube-controller-manager 等組件都會(huì)使用 etcd 來存儲(chǔ)集群的狀態(tài)信息和配置數(shù)據(jù)。
3.kube-scheduler:
- kube-scheduler 是 Kubernetes 集群中的調(diào)度器組件,它負(fù)責(zé)將新創(chuàng)建的 Pod 調(diào)度到集群中的節(jié)點(diǎn)上。kube-scheduler 會(huì)考慮諸多因素,如資源需求、節(jié)點(diǎn)的負(fù)載情況、親和性和反親和性規(guī)則等,來決定將 Pod 調(diào)度到哪個(gè)節(jié)點(diǎn)上。通過調(diào)度器的工作,可以實(shí)現(xiàn)資源的合理分配和負(fù)載均衡。
4.kube-controller-manager:
- kube-controller-manager 是 Kubernetes 集群中的控制器管理器組件,它包含了多個(gè)控制器,用于監(jiān)控集群中的資源對(duì)象的狀態(tài),并根據(jù)需要進(jìn)行調(diào)節(jié)和控制。比如,NodeController 負(fù)責(zé)監(jiān)控節(jié)點(diǎn)的健康狀態(tài),ReplicationController 負(fù)責(zé)監(jiān)控 Pod 副本的數(shù)量,EndpointController 負(fù)責(zé)更新服務(wù)的終端信息等。這些控制器協(xié)同工作,確保集群中的資源對(duì)象處于期望的狀態(tài)。
5.kubelet:
- kubelet 是運(yùn)行在每個(gè)節(jié)點(diǎn)上的代理組件,負(fù)責(zé)管理節(jié)點(diǎn)上的容器和 Pod。kubelet 接收來自 kube-apiserver 的 Pod 創(chuàng)建請(qǐng)求,然后根據(jù)這些請(qǐng)求在節(jié)點(diǎn)上創(chuàng)建和管理對(duì)應(yīng)的 Pod。它還會(huì)監(jiān)控節(jié)點(diǎn)上的容器和 Pod 的狀態(tài),并定期上報(bào)給 kube-apiserver。此外,kubelet 還會(huì)與容器運(yùn)行時(shí)(如 Docker、containerd 等)交互,以確保容器的運(yùn)行狀態(tài)。
6.kube-proxy:
- kube-proxy 是 Kubernetes 集群中的網(wǎng)絡(luò)代理組件,負(fù)責(zé)實(shí)現(xiàn)集群內(nèi)部的服務(wù)發(fā)現(xiàn)和負(fù)載均衡。kube-proxy 會(huì)監(jiān)聽 kube-apiserver 中的服務(wù)和端點(diǎn)的變化,然后根據(jù)這些變化來更新節(jié)點(diǎn)上的網(wǎng)絡(luò)規(guī)則,以確保服務(wù)的訪問能夠正確地轉(zhuǎn)發(fā)到對(duì)應(yīng)的 Pod 上。kube-proxy 還支持多種代理模式,如 iptables、IPVS 等。
node組件如下:
1.kubelet:kubelet 會(huì)在集群中每個(gè)節(jié)點(diǎn)(node)上運(yùn)行。 它保證容器(containers)都運(yùn)行在 Pod 中。kubelet 接收一組通過各類機(jī)制提供給它的 PodSpecs, 確保這些 PodSpecs 中描述的容器處于運(yùn)行狀態(tài)且健康。 kubelet 不會(huì)管理不是由 Kubernetes 創(chuàng)建的容器。
2.kube-proxy:kube-proxy 是集群中每個(gè)節(jié)點(diǎn)(node)所上運(yùn)行的網(wǎng)絡(luò)代理, 實(shí)現(xiàn) Kubernetes 服務(wù)(Service) 概念的一部分。kube-proxy 維護(hù)節(jié)點(diǎn)上的一些網(wǎng)絡(luò)規(guī)則, 這些網(wǎng)絡(luò)規(guī)則會(huì)允許從集群內(nèi)部或外部的網(wǎng)絡(luò)會(huì)話與 Pod 進(jìn)行網(wǎng)絡(luò)通信。如果操作系統(tǒng)提供了可用的數(shù)據(jù)包過濾層,則 kube-proxy 會(huì)通過它來實(shí)現(xiàn)網(wǎng)絡(luò)規(guī)則。 否則,kube-proxy 僅做流量轉(zhuǎn)發(fā)。
1.什么是Pod?它的作用是什么?與容器的關(guān)系是什么? Pod是Kubernetes中最小的部署單元,它可以包含一個(gè)或多個(gè)容器。Pod提供了一個(gè)共享的網(wǎng)絡(luò)和存儲(chǔ)空間,容器在同一個(gè)Pod中共享這些資源。
2.什么是serveice,什么是ingress,他們的作用是啥,他們與Pod的關(guān)系是什么? 在 Kubernetes 中,Service 和 Ingress 都是用于管理集群中服務(wù)訪問的資源對(duì)象,它們與 Pod 之間有著不同的關(guān)系和作用。
Service:
- Service 是 Kubernetes 中的一種資源對(duì)象,用于定義一組具有相同功能的 Pod 的訪問方式和網(wǎng)絡(luò)策略。Service 提供了一種抽象機(jī)制,使得應(yīng)用程序可以通過 Service 名稱來訪問后端 Pod,而不需要關(guān)心具體的 Pod 實(shí)例。Service 可以通過標(biāo)簽選擇器來選擇匹配的 Pod,并為這些 Pod 提供統(tǒng)一的訪問入口,支持負(fù)載均衡和服務(wù)發(fā)現(xiàn)等功能。
Ingress:
- Ingress 是 Kubernetes 中的一種資源對(duì)象,用于定義集群中的 HTTP 和 HTTPS 路由規(guī)則,允許外部流量訪問集群中的服務(wù)。Ingress 可以定義不同的路由規(guī)則,如域名、路徑、TLS 加密等,以便將外部流量路由到集群中不同的服務(wù)。Ingress 的作用是實(shí)現(xiàn)集群的入口流量管理和路由。
與 Pod 的關(guān)系:
- Service 與 Pod 的關(guān)系:Service 通過標(biāo)簽選擇器選擇匹配的 Pod,并為這些 Pod 提供統(tǒng)一的訪問入口。Service 可以將外部流量負(fù)載均衡到多個(gè) Pod 上,實(shí)現(xiàn)了對(duì)后端 Pod 的訪問和負(fù)載均衡。
- Ingress 與 Pod 的關(guān)系:Ingress 定義了外部流量如何訪問集群中的服務(wù),它可以將外部流量路由到后端的 Service 或 Pod 上。Ingress 通過定義路由規(guī)則,將外部流量導(dǎo)向不同的服務(wù)或 Pod,實(shí)現(xiàn)了集群的入口流量管理和路由。而 Ingress 負(fù)責(zé)定義集群的入口流量路由規(guī)則,將外部流量導(dǎo)向不同的服務(wù)或 Pod。這些資源對(duì)象共同協(xié)作,實(shí)現(xiàn)了集群中服務(wù)的訪問管理和流量路由。
3.請(qǐng)解釋一下Kubernetes中的控制器(Controller)的概念和作用。 控制器是Kubernetes中用于管理Pod副本數(shù)量和狀態(tài)的組件,它包括ReplicaSet、Deployment、StatefulSet等??刂破髫?fù)責(zé)確保集群中運(yùn)行指定數(shù)量的Pod副本,并在Pod發(fā)生故障時(shí)進(jìn)行自我修復(fù)。
4.什么是Kubelet?它在Kubernetes集群中的角色是什么? Kubelet是運(yùn)行在每個(gè)Node節(jié)點(diǎn)上的代理,負(fù)責(zé)管理節(jié)點(diǎn)上的Pod和容器。它與Master節(jié)點(diǎn)通信,執(zhí)行Pod的創(chuàng)建、啟動(dòng)、停止等操作。
5.請(qǐng)解釋一下Kubernetes中的存儲(chǔ)卷(Volume)的概念和作用。 存儲(chǔ)卷是Kubernetes中用于持久化存儲(chǔ)數(shù)據(jù)的抽象,它可以被掛載到Pod中的一個(gè)或多個(gè)容器中,提供了數(shù)據(jù)持久化和共享的功能。
6.什么是Namespace?什么是Label?.它的作用是什么? 在 Kubernetes 中,Namespace 和 Label 都是用于組織和標(biāo)識(shí)集群中資源的重要概念,它們分別具有不同的作用和功能。
Namespace:
- Namespace 是 Kubernetes 中用于將集群資源劃分成多個(gè)虛擬集群的一種機(jī)制。它允許用戶在集群中創(chuàng)建多個(gè)邏輯上相互隔離的工作單元,每個(gè) Namespace 中可以包含一組相互關(guān)聯(lián)的資源,如 Pod、Service、Deployment 等。Namespace 的主要作用是提供一種邏輯隔離和資源管理的機(jī)制,使得不同團(tuán)隊(duì)或應(yīng)用程序可以在同一個(gè)集群中獨(dú)立地使用資源而不會(huì)相互干擾。
Label:
- Label 是 Kubernetes 中用于對(duì)資源對(duì)象進(jìn)行標(biāo)記和分類的一種機(jī)制。Label 是一組鍵值對(duì)的元數(shù)據(jù),可以附加到各種資源對(duì)象上,如 Pod、Service、Deployment 等。Label 可以用于對(duì)資源進(jìn)行分類、篩選和組織,以便于后續(xù)的查詢、操作和管理。Label 的主要作用是提供一種靈活的方式來對(duì)資源對(duì)象進(jìn)行分類和標(biāo)記,使得用戶可以根據(jù)標(biāo)簽的匹配關(guān)系對(duì)資源進(jìn)行選擇和操作。
作用:
- Namespace 的作用是提供了一種邏輯隔離和資源管理的機(jī)制,使得不同團(tuán)隊(duì)或應(yīng)用程序可以在同一個(gè)集群中獨(dú)立地使用資源而不會(huì)相互干擾。
- Label 的作用是提供了一種靈活的方式來對(duì)資源對(duì)象進(jìn)行分類和標(biāo)記,使得用戶可以根據(jù)標(biāo)簽的匹配關(guān)系對(duì)資源進(jìn)行選擇和操作。Label 還可以用于實(shí)現(xiàn)資源的分組、關(guān)聯(lián)和篩選,以便于后續(xù)的管理和操作。
因此,Namespace 提供了一種資源隔離和管理的機(jī)制,使得不同團(tuán)隊(duì)或應(yīng)用程序可以在同一個(gè)集群中獨(dú)立地使用資源;而 Label 則提供了一種靈活的方式對(duì)資源進(jìn)行分類和標(biāo)記,以便于后續(xù)的查詢、操作和管理。這兩個(gè)概念共同協(xié)作,為 Kubernetes 中的資源管理和組織提供了靈活和強(qiáng)大的機(jī)制。
1.請(qǐng)解釋一下Kubernetes中的水平擴(kuò)展(Horizontal Pod Autoscaler)的概念和作用。 水平擴(kuò)展是Kubernetes中用于根據(jù)資源利用率自動(dòng)調(diào)整Pod副本數(shù)量的功能,它可以根據(jù)CPU利用率或自定義指標(biāo)來自動(dòng)擴(kuò)展或縮減Pod的數(shù)量。
2.如何在Kubernetes中進(jìn)行應(yīng)用程序的部署和更新? 可以使用Deployment來進(jìn)行應(yīng)用程序的部署和更新,通過定義Deployment對(duì)象,Kubernetes可以自動(dòng)創(chuàng)建和管理Pod副本,并支持滾動(dòng)更新。
3.請(qǐng)解釋一下Kubernetes中的滾動(dòng)更新(Rolling Update)的概念和原理。 滾動(dòng)更新是Kubernetes中用于無縫更新應(yīng)用程序的機(jī)制,它通過逐步替換舊版本的Pod副本來實(shí)現(xiàn)應(yīng)用程序的更新,確保應(yīng)用程序在更新過程中保持可用性。
4.什么是Kubernetes中的健康檢查(Liveness Probe)和就緒檢查(Readiness Probe)? 健康檢查用于檢測(cè)容器是否處于健康狀態(tài),就緒檢查用于檢測(cè)容器是否已經(jīng)準(zhǔn)備好接收流量。它們可以通過HTTP請(qǐng)求、TCP連接或命令執(zhí)行等方式進(jìn)行檢查。
5.如何進(jìn)行Kubernetes集群的故障排除和調(diào)試? 可以通過查看日志、執(zhí)行命令、使用調(diào)試工具、檢查事件和狀態(tài)等方式進(jìn)行故障排除和調(diào)試。
6.什么是Deployment?用于部署無狀態(tài)的服務(wù),這個(gè)最常用的控制器。一般用于管理維護(hù)企業(yè)內(nèi)部無狀態(tài)的微服務(wù),比如configserver、zuul、springboot。他可以管理多個(gè)副本的Pod實(shí)現(xiàn)無縫遷移、自動(dòng)擴(kuò)容縮容、自動(dòng)災(zāi)難恢復(fù)、一鍵回滾等功能。
7.有狀態(tài)和無狀態(tài)的區(qū)別:
無狀態(tài)
(1)、是指該服務(wù)運(yùn)行的實(shí)例不會(huì)在本地存儲(chǔ)需要持久化的數(shù)據(jù),并且多個(gè)實(shí)例對(duì)于同一個(gè)請(qǐng)求響應(yīng)的結(jié)果是完全一致的。
(2)、多個(gè)實(shí)例可以共享相同的持久化數(shù)據(jù)。例如:nginx實(shí)例,tomcat實(shí)例等
(3)、相關(guān)的k8s資源有:ReplicaSet、ReplicationController、Deployment等,由于是無狀態(tài)服務(wù),所以這些控制器創(chuàng)建的pod序號(hào)都是隨機(jī)值。并且在縮容的時(shí)候并不會(huì)明確縮容某一個(gè)pod,而是隨機(jī)的,因?yàn)樗袑?shí)例得到的返回值都是一樣,所以縮容任何一個(gè)pod都可以
有狀態(tài)
(1)、寵物和牛的類比,農(nóng)場(chǎng)主的牛如果病了可以丟掉再重新買一頭,如果寵物主的寵物病死了是沒法找到一頭一模一樣的寵物的。
有狀態(tài)服務(wù) 可以說是 需要數(shù)據(jù)存儲(chǔ)功能的服務(wù)、或者指多線程類型的服務(wù),隊(duì)列等。(mysql數(shù)據(jù)庫、kafka、zookeeper等)
(2)、每個(gè)實(shí)例都需要有自己獨(dú)立的持久化存儲(chǔ),并且在k8s中是通過申明模板來進(jìn)行定義。持久卷申明模板在創(chuàng)建pod之前創(chuàng)建,綁定到pod中,模板可以定義多個(gè)。
說明
(1)、有狀態(tài)的 pod是用來運(yùn)行有狀態(tài)應(yīng)用的,所以其在數(shù)據(jù)卷上存儲(chǔ)的數(shù)據(jù)非常重要,在 Statefulset縮容時(shí)刪除這個(gè)聲明將是災(zāi)難性的,特別是對(duì)于 Statefulset來說,縮容就像減少其 replicas 數(shù)值一樣簡(jiǎn)單?;谶@個(gè)原因,當(dāng)你需要釋放特定的持久卷時(shí),需要手動(dòng)刪除對(duì)應(yīng)的持久卷聲明。
(2)、相關(guān)的k8s資源為:statefulSet,由于是有狀態(tài)的服務(wù),所以每個(gè)pod都有特定的名稱和網(wǎng)絡(luò)標(biāo)識(shí)。比如pod名是由statefulSet名+有序的數(shù)字組成(0、1、2..)
(3)、在進(jìn)行縮容操作的時(shí)候,可以明確知道會(huì)縮容哪一個(gè)pod,從數(shù)字最大的開始。并且Stat巳fulset 在有實(shí)例不健康的情況下是不允許做縮容操作的。
StatefulSet 縮容任何時(shí)候只會(huì)操作 一個(gè) pod 實(shí)例,所以有狀態(tài)應(yīng)用的縮容不會(huì)很迅速。舉例來說, 一個(gè)分布式存儲(chǔ)應(yīng)用若同時(shí)下線多個(gè)節(jié)點(diǎn) ,則可能導(dǎo)致其數(shù)據(jù)丟失 。 比如說一個(gè)數(shù)據(jù)項(xiàng)副本數(shù)設(shè)置為 2 的數(shù)據(jù)存儲(chǔ)應(yīng)用, 若 同時(shí)有兩個(gè)節(jié)點(diǎn)下線,一份數(shù)據(jù)記錄就會(huì)丟失,如果它正好保存在這兩個(gè)節(jié)點(diǎn)上 。 若縮容是線性的 ,則分布式存儲(chǔ)應(yīng)用就有時(shí)間把丟失的副本復(fù)制到其他節(jié)點(diǎn) ,保證數(shù)據(jù)不會(huì)丟失。
存儲(chǔ):
1、PV、PVC是什么?
PersistentVolume(PV)是群集中的一塊存儲(chǔ),可以是NFS、iSCSI、本地存儲(chǔ)等,由管理員配置或使用存儲(chǔ)類動(dòng)態(tài)配置。 PV定義了存儲(chǔ)的容量、訪問模式、持久化存儲(chǔ)的類型等屬性。PV的生命周期是獨(dú)立于Pod的,即使Pod被刪除,PV仍然存在,可以被其他Pod繼續(xù)使用。
PersistentVolumeClaim(PVC)是一個(gè)持久化存儲(chǔ)卷,我們?cè)趧?chuàng)建pod時(shí)可以定義PVC類型的存儲(chǔ)卷,PVC可以用來訪問各種類型的持久化存儲(chǔ),如本地存儲(chǔ)、網(wǎng)絡(luò)存儲(chǔ)、云存儲(chǔ)等,而不必關(guān)心這些資源的實(shí)際位置和類型,PVC的使用可以使應(yīng)用程序更加靈活和可移植,同時(shí)也可以提高存儲(chǔ)資源的利用率。
PVC和PV它們是一一對(duì)應(yīng)的關(guān)系,PV如果被PVC綁定了,就不能被其他PVC使用了。
2、PV的供應(yīng)方式
兩種分別為靜態(tài)、動(dòng)態(tài):
靜態(tài)供應(yīng):管理員手動(dòng)創(chuàng)建PV對(duì)象,并將其綁定到一個(gè)具體的存儲(chǔ)后端上,然后Pod可以通過PVC(Persistent Volume Claim)請(qǐng)求綁定到該P(yáng)V上。
動(dòng)態(tài)供應(yīng):管理員通過StorageClass定義一組存儲(chǔ)后端,然后Pod可以通過PVC請(qǐng)求綁定到該StorageClass上,K8s會(huì)自動(dòng)創(chuàng)建一個(gè)PV對(duì)象并將其綁定到一個(gè)可用的存儲(chǔ)后端上。
3、PV、PVC的回收策略
當(dāng)我們創(chuàng)建pod時(shí)如果使用pvc做為存儲(chǔ)卷,那么它會(huì)和pv綁定,當(dāng)刪除pod,pvc和pv綁定就會(huì)解除,解除之后和pvc綁定的pv卷里的數(shù)據(jù)需要怎么處理 有以下幾種:
Kubernetes中有三種PV回收策略:
Retain:保留PV,但不刪除底層存儲(chǔ)資源。這意味著PV中的數(shù)據(jù)仍然存在,但需要手動(dòng)清理。
Delete:刪除PV和底層存儲(chǔ)資源。這意味著PV中的數(shù)據(jù)將被永久刪除。
Recycle:刪除PV中的數(shù)據(jù),但不刪除底層存儲(chǔ)資源。這意味著PV中的數(shù)據(jù)將被清除,但底層存儲(chǔ)資源可以重新使用。(不推薦,1.15可能被移除)
Kubernetes中有兩種PVC回收策略:
Retain:保留PVC,但不刪除底層存儲(chǔ)資源。這意味著PVC中的數(shù)據(jù)仍然存在,但需要手動(dòng)清理。
Delete:刪除PVC和底層存儲(chǔ)資源。這意味著PVC中的數(shù)據(jù)將被永久刪除。
需要注意的是,PVC的回收策略必須與其所綁定的PV的回收策略相匹配。例如,如果PV的回收策略為Retain,則PVC的回收策略也必須為Retain。否則,可能會(huì)導(dǎo)致數(shù)據(jù)丟失或存儲(chǔ)資源泄漏。
如果刪除pvc不刪除pv,重新創(chuàng)建同樣的pvc,那么pvc狀態(tài)會(huì)處于Pending狀態(tài),因?yàn)閜v的當(dāng)前狀態(tài)為Released。這也和上面定義的回收策略息息相關(guān)。
ConfigMap配置中心理論知識(shí)
ConfigMap是API對(duì)象,用于存放明文(非機(jī)密性)數(shù)據(jù)保存到鍵值對(duì)中,可以使用環(huán)境變量、命令行參數(shù)或者存儲(chǔ)卷方式應(yīng)用到Pod中,ConfigMap相當(dāng)于Pod中程序的配置文件,通過修改ConfigMap內(nèi)容來修改程序的配置。
ConfigMap在設(shè)計(jì)上不是用來存儲(chǔ)大量數(shù)據(jù)的,所以在ConfigMap中保存的數(shù)據(jù)不能超過1MiB。
二、創(chuàng)建ConfigMap的四種方式
1、第一種:通過命令行創(chuàng)建ConfigMap
2、第二種:通過指定文件創(chuàng)建ConfigMap
3、第三種:通過指定目錄創(chuàng)建ConfigMap
4、第四種:通過YAML資源清單創(chuàng)建ConfigMap
三、使用ConfigMap的三種方式
1、第一種:使用環(huán)境變量引入-configMapKeyRef方式
2、第二種:使用環(huán)境變量引入-envfrom方式
3、第三種:使用volume卷掛載
ConfigMap編輯并保存后對(duì)于卷掛載方式,支持熱加載(大約等10s)生效,會(huì)更新到容器配置中,但對(duì)于變量方式并不支持,需要重新刪除創(chuàng)建,更改的數(shù)據(jù)才會(huì)生效。
configMapKeyRef和envfrom方式引入變量區(qū)別?
configMapKeyRef是一種將ConfigMap中的數(shù)據(jù)作為環(huán)境變量注入到容器中的方式。它允許你在Pod的定義中引用ConfigMap中的特定鍵值對(duì),并將其作為環(huán)境變量傳遞給容器。這種方式適用于將ConfigMap中的配置數(shù)據(jù)直接暴露給容器內(nèi)的應(yīng)用程序。
envFrom是一種將整個(gè)ConfigMap的數(shù)據(jù)作為環(huán)境變量注入到容器中的方式。它允許你在Pod的定義中引用一個(gè)或多個(gè)ConfigMap,并將它們的所有鍵值對(duì)作為環(huán)境變量傳遞給容器。這種方式適用于將多個(gè)相關(guān)的配置數(shù)據(jù)一次性注入到容器內(nèi)。
ConfigMap:用于存放文明非加密配置信息。
Secret:用于存放加密數(shù)據(jù),比如密碼、token等信息。
Secret三種可選參數(shù):
generic:通用類型,常于存儲(chǔ)密碼數(shù)據(jù)。
tls:用于存儲(chǔ)私鑰和證書。
docker-registry:用于存放docker倉庫的認(rèn)證信息。
Secret三種類型:
Service Account:用于被 serviceaccount 引用。serviceaccout 創(chuàng)建時(shí) Kubernetes 會(huì)默認(rèn)創(chuàng)建對(duì)應(yīng)的 secret。Pod 如果使用了 serviceaccount,對(duì)應(yīng)的 secret 會(huì)自動(dòng)掛載到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目錄中。
Opaque:base64編碼格式的Secret,用來存儲(chǔ)密碼、秘鑰等??梢酝ㄟ^base64 --decode解碼獲得原始數(shù)據(jù),因此安全性弱
kubernetes.io/dockerconfigjson:用來存儲(chǔ)私有docker registry的認(rèn)證信息
三.配置節(jié)點(diǎn)的基本環(huán)境?
先配置節(jié)點(diǎn)的基本環(huán)境,5個(gè)節(jié)點(diǎn)都要同時(shí)設(shè)置,在此以k8master作為示例。
強(qiáng)制更改時(shí)區(qū)為上海
ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
bash -c "echo 'Asia/Shanghai' > /etc/timezone"
禁用swap(如果不關(guān)閉swap,就會(huì)在kubeadm初始化Kubernetes的時(shí)候報(bào)錯(cuò))
swapoff -a ;sed -i '/swap/d' /etc/fstab
關(guān)閉防火墻。
ufw disable
ssh-keygen ?(三臺(tái)k8s配置免密)
ssh-copy-id 192.168.189.128 (分別copy到對(duì)方)
查看Ubuntu系統(tǒng)版本
cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.6 LTS"
首先設(shè)置主機(jī)名,執(zhí)行完下面修改主機(jī)名后每個(gè)節(jié)點(diǎn)都要bash一下
hostnamectl set-hostname master?
hostnamectl set-hostname node1
hostnamectl set-hostname node2
hostnamectl set-hostname gitlab (gitlab和jenkins共用)
hostnamectl set-hostname harbor
root@master:~# cat /etc/hostname?
master
配置5個(gè)節(jié)點(diǎn)靜態(tài)IP地址(本次實(shí)驗(yàn)使用的是vmware NAT模式)
cat /etc/netplan/00-installer-config.yaml
# This is the network config written by 'subiquity'
network:
? ethernets:
? ? ens33:
? ? ? dhcp4: false
? ? ? optional: true
? ? ? addresses: [192.168.189.129/24]
? ? ? gateway4: 192.168.189.2
? ? ? nameservers:
? ? ? ? addresses: [192.168.111.2,114.114.114.114] #修改dns為自己網(wǎng)絡(luò)環(huán)境中的地址
? version: 2
使配置生效
netplan apply ?
測(cè)試機(jī)器是否可以訪問網(wǎng)絡(luò)?
ping www.baidu.com
PING www.baidu.com (14.215.177.39) 56(84) bytes of data. 64 bytes from www.baidu.com (14.215.177.39): icmp_seq=1 ttl=128 time=48.0 ms 64 bytes from www.baidu.com (14.215.177.39): icmp_seq=2 ttl=128 time=52.9 ms 64 bytes from www.baidu.com (14.215.177.39): icmp_seq=3 ttl=128 time=39.8 ms ^C --- www.baidu.com ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2009ms rtt min/avg/max/mdev = 39.843/46.940/52.968/5.417 ms
配置IP地址和主機(jī)名映射k8s三臺(tái)添加host
cat /etc/hosts
127.0.0.1 localhost
127.0.1.1 root
# The following lines are desirable for IPv6 capable hosts
::1 ? ? ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
192.168.189.128 master
192.168.189.129 node1
192.168.189.130 node2
配置Ubuntu軟件源,軟件源如下,最后三行是k8s源
cat /etc/apt/sources.list
deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu focal stable
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
apt-key.gpg是k8s的deb源公鑰,加載k8s的deb源公鑰命令為:
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg |sudo apt-key add -
apt update
四.節(jié)點(diǎn)安裝docker,并進(jìn)行相關(guān)配置
k8s是容器編排工具,需要容器管理工具,所以三個(gè)節(jié)點(diǎn)同時(shí)安裝docker,其他兩臺(tái)因?yàn)橐驗(yàn)間itlab和harbor是docker跑,看個(gè)人需求
添加docker源:
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | apt-key add -
add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
apt-get install docker-ce
設(shè)置docker開機(jī)自啟動(dòng)并現(xiàn)在啟動(dòng)docker。
systemctl enable docker --now
注意kubernetes V1.22.2版本及其以后,要求容器的cgroup driver 為systemd,但是docker默認(rèn)的cgroup driver 是cgroupfs,kubernetes 1.21版本及其之前,是不需要修改cgroup driver的。
配置docker鏡像加速器,并設(shè)置docker的cgroup driver 為systemd。
cat /etc/docker/daemon.json?
{
"registry-mirrors": ["https://frz7i079.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
systemctl restart docker
docker info | grep -i cgroup :這時(shí)Cgroup Driver就變?yōu)閟ystemd了。
設(shè)置iptables不對(duì)bridge的數(shù)據(jù)進(jìn)行處理,啟用IP路由轉(zhuǎn)發(fā)功能。
cat /etc/sysctl.d/k8s.conf?
net.bridge.bridge-nf-call-ip6tables = 1?
net.bridge.bridge-nf-call-iptables = 1?
net.ipv4.ip_forward = 1?
使配置生效
sysctl -p /etc/sysctl.d/k8s.conf
五.安裝kubelet,kubeadm,kubectl
三個(gè)節(jié)點(diǎn)都安裝kubelet,kubeadm,kubectl,以k8smaster為例:?
Kubelet 是 kubernetes 工作節(jié)點(diǎn)上的一個(gè)代理組件,運(yùn)行在每個(gè)節(jié)點(diǎn)上
Kubeadm 是一個(gè)快捷搭建kubernetes(k8s)的安裝工具,它提供了 kubeadm init 以及 kubeadm join 這兩個(gè)命令來快速創(chuàng)建 kubernetes 集群,kubeadm 通過執(zhí)行必要的操作來啟動(dòng)和運(yùn)行一個(gè)最小可用的集群
kubectl是Kubernetes集群的命令行工具,通過kubectl能夠?qū)罕旧磉M(jìn)行管理,并能夠在集群上進(jìn)行容器化應(yīng)用的安裝部署
apt-get -y install kubelet=1.22.2-00 kubeadm=1.22.2-00 kubectl=1.22.2-00
設(shè)置kubelet開機(jī)自啟動(dòng)并現(xiàn)在啟動(dòng)kubelet。
systemctl enable kubelet --now
kubeadm初始化
apt update三臺(tái)
master執(zhí)行:
kubeadm init --apiserver-advertise-address=192.168.189.128 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.22.2 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
兩個(gè)node執(zhí)行:(使用上面生成的內(nèi)容)
kubeadm join 192.168.189.128:6443 --token ju8p1y.8gjm5q00l6u5y1rp \
? ? ? ? --discovery-token-ca-cert-hash sha256:3f401b6187ed44ff8f4b50aa6453cf3eacc3b86d6a72e3bf2caba02556cb918e?
如果加入集群的token忘了,可以使用如下的命令獲取最新的加入命令token。
kubeadm token create --print-join-command
六.部署CNI網(wǎng)絡(luò)插件calico
master執(zhí)行:kubectl get nodes
可以看到兩個(gè)worker節(jié)點(diǎn)都加入到了k8s集群,此時(shí)三個(gè)節(jié)點(diǎn)的狀態(tài)都是NotReady的,原因是沒有CNI網(wǎng)絡(luò)插件
為了節(jié)點(diǎn)間的通信,需要安裝cni網(wǎng)絡(luò)插件
現(xiàn)在去官網(wǎng)下載calico.yaml文件:
下載不下來的去這里下載:
https://download.csdn.net/download/u014741634/88719716
官網(wǎng):https://projectcalico.docs.tigera.io/about/about-calico
curl https://docs.projectcalico.org/manifests/calico.yaml -O
查看鏡像:
grep image calico.yaml
? ? ? ? ? image: docker.io/calico/cni:v3.26.1
? ? ? ? ? imagePullPolicy: IfNotPresent
? ? ? ? ? image: docker.io/calico/cni:v3.26.1
? ? ? ? ? imagePullPolicy: IfNotPresent
? ? ? ? ? image: docker.io/calico/node:v3.26.1
? ? ? ? ? imagePullPolicy: IfNotPresent
? ? ? ? ? image: docker.io/calico/node:v3.26.1
? ? ? ? ? imagePullPolicy: IfNotPresent
? ? ? ? ? image: docker.io/calico/kube-controllers:v3.26.1
? ? ? ? ? imagePullPolicy: IfNotPresent
k8s 三個(gè)節(jié)點(diǎn)都下載:
docker pull docker.io/calico/kube-controllers:v3.26.1
docker pull?docker.io/calico/cni:v3.26.1
docker pull docker.io/calico/node:v3.26.1
此時(shí)三個(gè)節(jié)點(diǎn)都有calico鏡像了
master修改calico.yaml 文件,CALICO_IPV4POOL_CIDR的IP段要和kubeadm初始化時(shí)候的pod網(wǎng)段一致,注意格式要對(duì)齊,不然會(huì)報(bào)錯(cuò)。
cat calico.yaml | egrep "CALICO_IPV4POOL_CIDR|"10.244""
- name: CALICO_IPV4POOL_CIDR
value: "10.244.0.0/16"
kubectl apply -f calico.yaml
kubectl get pod -A | grep calico
kubectl get node
此時(shí)發(fā)現(xiàn)三個(gè)節(jié)點(diǎn)都是Ready狀態(tài)了。
七.配置kubectl命令tab鍵自動(dòng)補(bǔ)全
查看kubectl自動(dòng)補(bǔ)全命令。
?
kubectl --help | grep bash
cat /etc/profile | head -3 # /etc/profile: system-wide .profile file for the Bourne shell (sh(1)) # and Bourne compatible shells (bash(1), ksh(1), ash(1), ...). source <(kubectl completion bash)
source /etc/profile
八.svc負(fù)載均衡修改
service的底層實(shí)現(xiàn)主要有兩種方式,iptables和ipvs兩種網(wǎng)絡(luò)模式,決定了流量如何轉(zhuǎn)發(fā)
Iptables模式和IPVS模式對(duì)比:
- iptables:靈活、功能強(qiáng)大;規(guī)則遍歷匹配和更新,呈線性時(shí)延
- IPVS:工作在內(nèi)核態(tài),有更好的性能;調(diào)度算法豐富:rr,wrr,lc,wlc,ip hash…
- 使用此種模式需要手動(dòng)去修改,因?yàn)槟J(rèn)是iptables模式。不同的k8s集群搭建方式,其修改方式不同。
-
kubeadm方式修改ipvs模式:
第一步:修改配置文kube-proxy件參數(shù)。 kubectl edit configmap kube-proxy -n kube-system... mode: “ipvs“ ... 第二步:刪除該組Pod,重建所有節(jié)點(diǎn)。 kubectl delete pod kube-proxy-btz4p -n kube-system
- 注意事項(xiàng):
- kube-proxy配置文件以configmap方式掛載存儲(chǔ)。
- 如果讓所有節(jié)點(diǎn)生效,需要重建所有節(jié)點(diǎn)kube-proxy pod
-
二進(jìn)制方式修改ipvs模式:
第一步:編輯修改配置文件。 vi kube-proxy-config.yml mode: ipvs ipvs:scheduler: "rr“ 第二步:重啟kube-proxy。 systemctl restart kube-proxy
?
1.查看配置文件位置。
[root@k8s-master bck]# kubectl get configmap -n kube-system
?
2.在線編輯kube-proxy文件,修改參數(shù)為ipvs模式。
[root@k8s-master bck]# kubectl edit configmaps kube-proxy -n kube-system
?
?
3.此時(shí)需要?jiǎng)h除這組pod重建,相當(dāng)于重啟。我這里只刪除了一個(gè)節(jié)點(diǎn),是為了驗(yàn)證對(duì)比效果,正常情況下是要重啟所有節(jié)點(diǎn)的。
[root@k8s-master bck]# kubectl delete pod kube-proxy-vkfkh -n kube-system
?4.在刪除的kube-proxy容器所在節(jié)點(diǎn)上驗(yàn)證,我這里刪除的是node2節(jié)點(diǎn)上的kube-proxy,重啟后ipvs模式生效;node1節(jié)點(diǎn)沒有刪除,也就沒有重啟,依然還是iptables模式。使用ipvs模式驗(yàn)證需要安裝ipvsadm。
三臺(tái)機(jī)器安裝ipvs
apt -y install ipvsadm ipset sysstat conntrack
ipvsadm -L 查看流量轉(zhuǎn)發(fā)
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_lc
modprobe -- ip_vs_lblc
modprobe -- ip_vs_lblcr
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- ip_vs_dh
modprobe -- ip_vs_fo
modprobe -- ip_vs_nq
modprobe -- ip_vs_sed
modprobe -- ip_vs_ftp
modprobe -- ip_vs_sh
modprobe -- ip_tables
modprobe -- ip_set
modprobe -- ipt_set
modprobe -- ipt_rpfilter
modprobe -- ipt_REJECT
modprobe -- ipip
modprobe -- xt_set
modprobe -- br_netfilter
modprobe -- nf_conntrack
EOF
chmod +x /etc/sysconfig/modules/ipvs.modules
/bin/bash /etc/sysconfig/modules/ipvs.modules
lsmod | grep -e ip_vs -e nf_conntrack_ipv4
九.gitlab安裝
安裝docker-compose
curl -L "https://github.com/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
mkdir?/data/gitlab
#如果上面的curl 拉取不到使用apt安裝如下
apt-get install docker-compose
gitlab安裝yaml
cat docker-compose.yml?
version: '3.6'
services:
web:
image: 'gitlab/gitlab-ce:13.0.14-ce.0' # 默認(rèn)最新鏡像,亦可指定版本
container_name: gitlab
restart: always #容器遇到失敗后, 則會(huì)一直嘗試重啟
privileged: true
hostname: '192.168.189.131'
environment:
TZ: 'Asia/Shanghai'
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://192.168.189.131' #這個(gè)就是配置gitlab的瀏覽器訪問的地址和端口, 也就是本機(jī)的ip地址;
gitlab_rails['time_zone'] = 'Asia/Shanghai'
gitlab_rails['gitlab_shell_ssh_port'] = 1222
ports:
- '80:80' #默認(rèn)80 自定義主機(jī)端口時(shí)需同步修改external_url
- '1222:22'
volumes:
- '/data/gitlab/config:/etc/gitlab'
- '/data/gitlab/data:/var/opt/gitlab'
- '/data/gitlab/logs:/var/log/gitlab'
docker-compose up -d 執(zhí)行會(huì)去拉取鏡像等待幾分鐘后即可訪問
#docker compose up -d apt安裝的命令沒有-了
#使用下面命令獲取初始用戶root的密碼,這個(gè)版本不需要,訪問自帶
#docker exec -it $(docker ps | grep gitlab | awk '{print $1}') grep 'Password:' /etc/gitlab/initial_root_password
http://192.168.189.131/users/sign_in?從新創(chuàng)建新密碼? 用戶名root
十.安裝Jenkins
Jenkins是一個(gè)Java應(yīng)用程序,需要在系統(tǒng)上安裝Java 8或更高版本。我們將安裝OpenJDK 11, Java平臺(tái)的開源實(shí)現(xiàn)。
?apt update sudo apt install openjdk-11-jdk
java -version
使用以下wget命令導(dǎo)入Jenkins存儲(chǔ)庫的GPG鍵:
wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add -
接下來,使用以下命令將Jenkins存儲(chǔ)庫添加到系統(tǒng)中:
sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
啟用Jenkins存儲(chǔ)庫后,通過輸入以下命令更新apt包列表并安裝最新版本的Jenkins:
sudo apt-get update sudo apt-get install jenkins
如果你得到一個(gè)錯(cuò)誤消息(沒有報(bào)錯(cuò)請(qǐng)忽略):
W: GPG 錯(cuò)誤:https://pkg.jenkins.io/debian-stable binary/ Release: 由于沒有公鑰,無法驗(yàn)證下列簽名:NO_PUBKEY 9B7D32F2D50582E6 E: 倉庫 “http://pkg.jenkins.io/debian-stable binary/ Release” 沒有數(shù)字簽名。
解決方法
導(dǎo)入密鑰:密鑰報(bào)錯(cuò)里面就有
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 9B7D32F2D50582E6
然后再次運(yùn)行:
sudo apt-get update sudo apt-get install jenkins
Jenkins服務(wù)將在安裝過程完成后自動(dòng)啟動(dòng)。您可以通過如下命令來驗(yàn)證:
systemctl status jenkins
登錄jenkins
http://192.168.189.131:8080/
cat /var/lib/jenkins/secrets/initialAdminPassword
從終端復(fù)制密碼,粘貼到“管理員密碼”域中,點(diǎn)擊“繼續(xù)”。
?通過單擊“保存并完成”按鈕來確認(rèn)URL,設(shè)置過程將完成。
單擊重啟開始使用Jenkins按鈕,您將被重定向到以您在前面的步驟之一中創(chuàng)建的admin用戶身份登錄的Jenkins儀表板。
十一.harbor 安裝
#下載harbor
?
[root@harbor ~]# wget https://github.com/goharbor/harbor/releases/download/v2.8.2/harbor-offline-installer-v2.8.2.tgz
#由于網(wǎng)絡(luò)問題下不下來,這邊提供下載地址
https://download.csdn.net/download/u014741634/88751280
#解壓 [root@harbor ~]# tar xf harbor-offline-installer-v2.7.4.tgz -C ./
#復(fù)制一份配置文件
[root@harbor ~]# cd harbor
[root@harbor harbor]# cp harbor.yml.tmpl harbor.yml
#修改配置文件
[root@harbor harbor]#vim harbor.yml
hostname: 192.168.189.132 #指定Harbor主機(jī)地址
#https: #注釋這一行,這一行是https訪問?式(需要證書才可以使?)
#port: 443 #注釋這一行
#certificate: /your/certificate/path #注釋證書?件
#private_key: /your/private/key/path #注釋證書?件
harbor_admin_password: asdqwe123 #設(shè)置訪問密碼,可自行修改
data_volume: /data/harbor #修改一下目錄
systemctl enable --now docker
[root@harbor harbor]# ./prepare
[root@harbor harbor]# ./install.sh?--with-chartmuseum
..... ? ----Harbor has been installed and started successfully.---- #成功即可
#驗(yàn)證運(yùn)?情況
[root@harbor ~]# docker ps
訪問harbor? ,用戶名:admin? 密碼上面設(shè)置的那個(gè)
十二.Jenkins基于https的k8s配置
jenkins 連接低版本的k8s時(shí),不需要驗(yàn)證。但是新版本的啟用了https和角色管理
安裝中文語言包:(從箭頭處搜索)安裝需要的插件完事一塊重啟省得麻煩
安裝kubernetes
重新登錄jenkins,返回首頁。
新建云:下面的公鑰和憑據(jù)看下面
這步很重要也容易出錯(cuò):
根據(jù)以上的配置,可以看到,已經(jīng)是啟用https了,這里就涉及到了密鑰的問題
創(chuàng)建admin證書:
?
#1、查看kubernetes的config文件
cat ~/.kube/config
#2、根據(jù)配置文件生成證書.替換引號(hào)內(nèi)部的信息為config內(nèi)相關(guān)value(替換成上面)可以看下面的圖
echo "certificate-authority-data" | base64 -d > ca.crt
echo "client-certificate-data" | base64 -d > client.crt #對(duì)應(yīng)上面的值
echo "client-key-data" | base64 -d > client.key
#3、生成jenkins使用的cert.pfx,此處需要設(shè)置一個(gè)4位數(shù)以上的密碼記住這個(gè)密碼
openssl pkcs12 -export -out cert.pfx -inkey client.key -in client.crt -certfile ca.crt
ls
ca.crt cert.pfx client.key client.crt
查看 cat ca.crt 復(fù)制到上面的jenkins里面
echo "client-certificate-data" | base64 -d > client.crt #對(duì)應(yīng)上面的值 例如:
把cert.pfx下載到本地
類型要改成上面的,把pfx文件導(dǎo)入,密碼填干才設(shè)置的密碼
連接測(cè)試ok添加jenkins地址保存
十三.gitlab和Jenkins 持續(xù)集成
創(chuàng)建test項(xiàng)目:
創(chuàng)建Jenkins用戶
我這里設(shè)置的是adsqwe123
添加Jenkins公鑰:
我這里是在項(xiàng)目里面添加例如test:
root@gitlab:~# cat .ssh/id_rsa.pub?
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC8pegIqtuQfSqGlQoTiZJ8TukoPLj4GK3RHXg81dHiABucqYzVkfMMnxlSdevZ0+dn4SQ+P7rdlPlyS5vtn2rMeKafDnKAU5mwRv+R4jpD1oEO4+0MzBvAzGrOSXxldpHvWbzamq7Xnhi01uIadVXQpluqOgx3AdSCB2fCbVAEWbPwwA40jZ9tA4UeoEJAQESKca+a1Qs9fNShFt4yvVhuSTgEuEr0q4jAeKk5S6BJ+ppsKNEl9LL51ZhfBgM6HkAlbTaIK4PcwMdf7hBou90RDj1BvCJn9Md2jhh7mXut04daXYfdyIPZymu8ueGYuKkmrQq0W0mSiFJEuluTpYY1tklP5XGnIOInfw3DPMGECu3p8GPoyj/OICiKsCrf8rTUIt6Vl6tHT8pl4fDtADC/ARDFQgLrkJBbfZKa6Fld/QNdUtJOM8GPyUgHwrD/ihb5uYW2gU9nKJTiSdzjRHGr+pZwdXPzV0H7xDrhvT/5upV7uxzBlI7bX2uEaRhNEOU= root@gitlab
復(fù)制進(jìn)去添加
后續(xù)有新項(xiàng)目需要到Deploy Keys里面,在私人訪問那里點(diǎn)啟動(dòng)就會(huì)到啟用部署鍵這里
點(diǎn)擊左側(cè)的Access?Tokens,輸入用戶?jenkins,勾選權(quán)限,點(diǎn)擊創(chuàng)建
test項(xiàng)目添加用戶和相應(yīng)權(quán)限
由于?jenkins安裝時(shí),勾選了推薦安裝的插件,因此包含了git插件。
現(xiàn)在只需要安裝gitlab插件即可
重啟后添加gitlab地址
設(shè)置Git插件的全局配置,然后點(diǎn)擊最下面的保存
創(chuàng)建Jenkins job
我這里用的是前面gitlab創(chuàng)建的jenkins用戶和密碼
選擇“構(gòu)建觸發(fā)器”,勾選“Pull SCM”,這個(gè)選項(xiàng)會(huì)每隔一段時(shí)間檢查一下GitLab倉庫中代碼是否有更新,有的話就執(zhí)行構(gòu)建操作。日程表如何設(shè)置,在這個(gè)輸入框下面有說明。
mkdir /workjob
chmod 777 /workjob
其中?WORKSPACE?表示,下載git項(xiàng)目后的路徑。
由于git項(xiàng)目為test,因此路徑為:/var/lib/jenkins/workspace/test
點(diǎn)擊保存
登錄Jenkins服務(wù)器查看ok:
十四.jenkins配置maven
下載maven:
wget https://archive.apache.org/dist/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz
tar zxvf apache-maven-3.3.9-bin.tar.gz?
mv apache-maven-3.3.9 /usr/local/
cat /etc/profile
HISTFILESIZE=3000
HISTSIZE=3000
export HISTTIMEFORMAT="%F %T"
export JAVA_HOME=/usr? #前面安裝Jenkins已經(jīng)使用openjdk11所以位置是這樣,將 JAVA_HOME 設(shè)置為 Java 的安裝目錄,而不是 Java 可執(zhí)行文件的路徑
export CLASSPATH=.:$JAVA_HOME/lib
export JAVA_HOME CLASSPATH PATH
export TMOUT=1800
export JRE_HOME=${JAVA_HOME}/jre
export PATH=${JAVA_HOME}/bin:${PATH}
export CLASSPATH=.:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jart
export M2_HOME=/usr/local/apache-maven-3.3.9
export PATH=$M2_HOME/bin:$PATH
沒有docker就去插件里面安裝后在添加
十五.gitlab創(chuàng)建maven項(xiàng)目
?
首先從github上面,找一個(gè)基于maven的項(xiàng)目,地址如下:
https://github.com/solochen84/SpringBootDemo
使用git客戶端,下載此項(xiàng)目代碼
root@gitlab:/data/gitlab
git clone?https://github.com/solochen84/SpringBootDemo.git
?
?
將github下載的代碼,提交到剛剛創(chuàng)建的項(xiàng)目中。效果如下:
把干才clone的目錄 mv?springbootdemo?springbootdemo.bak
git clone?http://192.168.189.131/root/springbootdemo.git
cd? springbootdemo
mv?springbootdemo.bak/*? .
修改Dockerfile
cat Dockerfile?
FROM openjdk:8u342-jdk
ARG app
ADD $app app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
rm?-rf??kube.yaml?刪除這個(gè)文件
?
創(chuàng)建新的k8s文件,具體詳細(xì)信息最后有講解
cat nginxtomcat.yaml?
apiVersion: v1
kind: Namespace
metadata:
? name: dev
#創(chuàng)建命名空間dev
---
apiVersion: v1
kind: ConfigMap
metadata:
? name: nginx-config
? namespace: dev
data: #ConfigMap掛載配置文件
? nginx.conf: |
? ? user ?nginx;
? ? worker_processes ?auto;
? ? error_log ?/var/log/nginx/nginx-error.log notice;
? ? pid ? ? ? ?/var/run/nginx.pid;
? ??
? ??
? ? events {
? ? ? ? worker_connections ?1024;
? ? }
? ??
? ??
? ? http {
? ? ? ? include ? ? ? /etc/nginx/mime.types;
? ? ? ? default_type ?application/octet-stream;
? ? ? ? log_format ?main ?'$remote_addr - $remote_user [$time_local] "$request" '
? ? ? ? ? ? ? ? ? ? ? ? ? '$status $body_bytes_sent "$http_referer" '
? ? ? ? ? ? ? ? ? ? ? ? ? '"$http_user_agent" "$http_x_forwarded_for"';
? ? ? ? access_log ?/var/log/nginx/access.log ?main;
? ? ? ? sendfile ? ? ? ?on;
? ? ? ? keepalive_timeout ?65;
? ? ? ? include /etc/nginx/conf.d/*.conf;
? ? }
---
apiVersion: v1
kind: PersistentVolume
metadata: ? #創(chuàng)建nginx pv 指定大小1G
? name: nginx-pv
? namespace: dev
spec:
? capacity:
? ? storage: 1Gi
? accessModes:
? ? - ReadWriteMany
? nfs:
? ? server: 192.168.189.132
? ? path: /var/nfsdata/nginx
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata: ? #創(chuàng)建pvc
? name: nginx-pvc
? namespace: dev
spec:
? storageClassName: ""
? volumeName: nginx-pv
? accessModes:
? ? - ReadWriteMany
? resources:
? ? requests:
? ? ? storage: 1Gi
? selector:
? ? matchLabels:
? ? ? type: nginx
---
apiVersion: v1
kind: PersistentVolume
metadata: ?#創(chuàng)建tomcat pv 指定大小1G
? name: tomcat-pv
? namespace: dev
spec:
? capacity:
? ? storage: 1Gi
? accessModes:
? ? - ReadWriteMany
? nfs:
? ? server: 192.168.189.132
? ? path: /var/nfsdata/tomcat
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
? name: tomcat-pvc
? namespace: dev
spec:
? storageClassName: ""
? volumeName: tomcat-pv
? accessModes:
? ? - ReadWriteMany
? resources:
? ? requests:
? ? ? storage: 1Gi
? selector:
? ? matchLabels:
? ? ? type: tomcat
---
apiVersion: apps/v1
kind: Deployment
metadata: ?#nginx配置
? name: nginx-deployment
? namespace: dev
spec:
? replicas: 2
? selector:
? ? matchLabels:
? ? ? app: nginx-pod
? template:
? ? metadata:
? ? ? labels:
? ? ? ? app: nginx-pod
? ? spec:
? ? ? volumes:
? ? ? - name: nginx-config
? ? ? ? configMap:
? ? ? ? ? name: nginx-config
? ? ? - name: nfs-volume
? ? ? ? persistentVolumeClaim:
? ? ? ? ? claimName: nginx-pvc ?# 這里是NFS的PersistentVolumeClaim的名稱
? ? ? containers:
? ? ? - name: nginx
? ? ? ? image: nginx:1.17.1
? ? ? ? ports:
? ? ? ? - containerPort: 80
? ? ? ? volumeMounts:
? ? ? ? - name: nginx-config
? ? ? ? ? mountPath: /etc/nginx/nginx.conf
? ? ? ? ? subPath: nginx.conf
? ? ? ? - name: nfs-volume
? ? ? ? ? mountPath: /usr/share/nginx/html ?# NGINX默認(rèn)的靜態(tài)資源文件目錄
---
apiVersion: apps/v1
kind: Deployment
metadata:
? name: tomcat-deployment
? namespace: dev
spec:
? replicas: 2
? selector:
? ? matchLabels:
? ? ? app: tomcat-pod
? template:
? ? metadata:
? ? ? labels:
? ? ? ? app: tomcat-pod
? ? spec:
? ? ? imagePullSecrets:
? ? ? ? - name: harborsecret
? ? ? affinity:
? ? ? ? podAntiAffinity:
? ? ? ? ? requiredDuringSchedulingIgnoredDuringExecution:
? ? ? ? ? - labelSelector:
? ? ? ? ? ? ? matchExpressions:
? ? ? ? ? ? ? - key: app
? ? ? ? ? ? ? ? operator: In
? ? ? ? ? ? ? ? values:
? ? ? ? ? ? ? ? - tomcat-pod
? ? ? ? ? ? topologyKey: "kubernetes.io/hostname"
? ? ? volumes:
? ? ? - name: web-content
? ? ? ? persistentVolumeClaim:
? ? ? ? ? claimName: tomcat-pvc
? ? ? containers:
? ? ? - name: tomcat
? ? ? ? image: 192.168.189.132/java/tomcat:latest
? ? ? ? imagePullPolicy: Always
? ? ? ? ports:
? ? ? ? - containerPort: 8080
? ? ? ? volumeMounts:
? ? ? ? - name: web-content
? ? ? ? ? mountPath: /usr/local/tomcat/webapps/ROOT
---
apiVersion: networking.k8s.io/v1
#apiVersion: v1
kind: Ingress
metadata:
? name: my-ingress
? namespace: dev
? annotations:
? ? nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
? ingressClassName: nginx ? ? ?
? rules:
? ? - host: harbor.snow.com
? ? ? http:
? ? ? ? paths:
? ? ? ? ? - path: /(.*)
? ? ? ? ? ? pathType: ImplementationSpecific
? ? ? ? ? ? backend:
? ? ? ? ? ? ? service:
? ? ? ? ? ? ? ? name: nginx-service
? ? ? ? ? ? ? ? port:
? ? ? ? ? ? ? ? ? number: 80
? ? ? ? ? - path: /tomcat(/|$)(.*)
? ? ? ? ? ? pathType: ImplementationSpecific
? ? ? ? ? ? backend:
? ? ? ? ? ? ? service:
? ? ? ? ? ? ? ? name: tomcat-service
? ? ? ? ? ? ? ? port:
? ? ? ? ? ? ? ? ? number: 8080
---
apiVersion: v1
kind: Service
metadata:
? name: nginx-service
? namespace: dev
spec:
? selector:
? ? app: nginx-pod
? clusterIP: None
? type: ClusterIP
? ports:
? - port: 80
? ? targetPort: 80
---
apiVersion: v1
kind: Service
metadata:
? name: tomcat-service
? namespace: dev
spec:
? selector:
? ? app: tomcat-pod
? clusterIP: None
? type: ClusterIP
? ports:
? - port: 8080
? ? targetPort: 8080
#上傳代碼到我們的gitlab
git add .
git commit -m "xiangmu"
git push? #輸入gitlab 賬戶密碼比如 root? asdqwe123
上面的內(nèi)容包括創(chuàng)建命名空間,前后端分離,副本數(shù)和反親和性,使用nfs、ingress和harbor 倉庫鏡像
創(chuàng)建NFS服務(wù)端:這邊是在harbor機(jī)器上搭建的
apt install -y nfs-kernel-server
mkdir -p?/var/nfsdata/nginx/? ?
mkdir -p?/var/nfsdata/tomcat/??
chmod -R 777 /var/nfsdata
systemctl restart nfs-kernel-server
exportfs -rv
k8s 三臺(tái)機(jī)器安裝nfs客戶端然后掛載:
先要?jiǎng)?chuàng)建mkdir -p /var/nfsdata/nginx?
mkdir -p?/var/nfsdata/tomcat
apt install -y nfs-common
mount 192.168.189.132:/var/nfsdata/nginx /var/nfsdata/nginx
mount 192.168.189.132:/var/nfsdata/tomcat /var/nfsdata/tomcat
十六.harbor創(chuàng)建項(xiàng)目和用戶
十七.jenkin修改默認(rèn)用戶
使用jenkins執(zhí)行shell命令時(shí),可能會(huì)出現(xiàn)權(quán)限不足的情況。
cat?/etc/default/jenkins
可以發(fā)現(xiàn)JENKINS_USER和JENKINS_GROUP變量的值是jenkins
為什么要和k8s master做ssh免密呢?因?yàn)閖enkins需要登錄到k8s master,做一些pod操作。
登錄到j(luò)enkins服務(wù)器,生成秘鑰
?
ssh-keygen
ssh-copy-id?192.168.189.128?
ssh?192.168.10.130 測(cè)試root免密
十八.jenkins登錄harbor
Jenkins機(jī)器上:
cat /etc/docker/daemon.json
{"insecure-registries": ["192.168.189.132","y0qd3iq.mirror.aliyuncs.com"]}
systemctl restart docker?
測(cè)試登錄:
?docker login 192.168.189.132 -u jenkins -p Aasdqwe123
十九.jenkins創(chuàng)建maven項(xiàng)目
登錄到j(luò)enkins后臺(tái),點(diǎn)擊?新建Item
輸入名稱,選擇構(gòu)建一個(gè)maven項(xiàng)目。注意:任務(wù)名稱最好是項(xiàng)目名,因?yàn)橄旅娴膁eploy_docker.sh腳本,會(huì)調(diào)用這個(gè)變量。
丟棄舊的構(gòu)建,保留2天
輸入倉庫下載地址,選擇用戶root
輸入maven構(gòu)建命令:clean package
mvn clean package依次執(zhí)行了clean、resources、compile、testResources、testCompile、test、jar(打包)等7個(gè)階段。
package命令完成了項(xiàng)目編譯、單元測(cè)試、打包功能,但沒有把打好的可執(zhí)行jar包(war包或其它形式的包)布署到本地maven倉庫和遠(yuǎn)程maven私服倉庫
build完成之后,選擇執(zhí)行shell命令
#!/bin/bash
jarName=spring-boot-demo-0.0.1-SNAPSHOT.jar
jarFolder=$JOB_NAME
harborPro=java
projectName=$JOB_NAME
docker_path=${WORKSPACE}
cp?${WORKSPACE}/target/${jarName}?${docker_path}
bash?-x?/root/docker_dir/deploy_docker.sh?${harborPro}?${projectName}?${docker_path}?${jarName}
jarName?jar包的文件名,名字隨便
jarFolder?jar包的文件夾
harborPro?harbor里面的項(xiàng)目,在上面步驟中,創(chuàng)建java私有項(xiàng)目。
projectName?項(xiàng)目名,名字隨便
docker_path?docker命令的工作目錄
最后一步,會(huì)執(zhí)行一個(gè)shell腳本。下面說到!
登錄到j(luò)enkins服務(wù)器
root@gitlab:/workjob# cat deploy_docker.sh?
#!/bin/bash
# maven $workspace $jarname
# ${harborPro} ${projectName} ${docker_path} ${jarName}
set -e
harbor_project=$1
projectName=$2
docker_path=$3
appName=$4
# harbor認(rèn)證用戶
user_name=jenkins
password=Aasdqwe123
# harbor地址以及tag
tag=$(date +%s)
harbor_server=192.168.189.132
server_path=${harbor_server}
taget_image=${projectName}:${tag}
#${BUILD_NUMBER}
echo ${taget_image}
# 登錄docker
cd ${docker_path}
docker login ${harbor_server} -u ${user_name} -p ${password}
# 生成鏡像并推送到harbor,最后刪除本地鏡像
docker build --build-arg app=${appName} -t ${taget_image} .
docker tag ${taget_image} ${server_path}/${harbor_project}/${projectName}
echo "The name of image is ${server_path}/${harbor_project}/${projectName}"
docker push ${server_path}/${harbor_project}/${projectName}:latest
docker rmi -f $(docker images|grep ${projectName}|grep ${tag}|awk '{print $3}'|head -n 1)
chmod 755?deploy_docker.sh?
登錄到k8s master,創(chuàng)建目錄
mkdir /root/kube-conf
登錄到j(luò)enkins服務(wù)器,新增重啟應(yīng)用腳本
?
root@gitlab:/workjob# cat reboot_app.sh?
#!/bin/bash
MASTER="192.168.189.128"
CONF_DIR="/root/kube-conf"
scp ${WORKSPACE}/*.yaml ${MASTER}:${CONF_DIR}
# Pod running process
RUN=$(ssh $MASTER kubectl get po -A |grep -w tomcat|wc -l)
if [ $RUN -eq 0 ];then
? ? ? ? ssh ${MASTER} kubectl apply -f ${CONF_DIR}/nginxtomcat.yaml
else
? ? ? ? # Delete pod
? ? ? ? podname=$(ssh ${MASTER} kubectl get po -A|grep -w tomcat|awk '{print $2}')
?? ?ns=$(ssh ${MASTER} kubectl get po -A|grep -w tomcat|awk '{print $1}')
?? ?ssh ${MASTER} kubectl delete po $podname --grace-period=0 --force -n $ns
?? ?ssh ${MASTER} kubectl apply -f ${CONF_DIR}/nginxtomcat.yaml
? ? ? ? #ssh ${MASTER} kubectl get po|grep ${ProJ}
fi
chmod 755?reboot_app.sh?
要使用 Harbor 作為 Kubernetes 集群的鏡像倉庫,你需要?jiǎng)?chuàng)建一個(gè)名為?harborsecret
?的?imagePullSecrets
,并將其與你的 Deployment 或 Pod 配置文件關(guān)聯(lián)起來。
創(chuàng)建 Harbor 憑據(jù): 使用以下命令創(chuàng)建一個(gè) Docker 憑據(jù),以便 Kubernetes 可以從 Harbor 拉取鏡像:
kubectl create secret docker-registry harborsecret --docker-server=192.168.189.132 --docker-username=jenkins --docker-password=Aasdqwe123 --docker-email=jenkins@163.com
-
將憑據(jù)關(guān)聯(lián)到 Deployment 或 Pod 配置文件中: 在你的 Deployment 或 Pod 配置文件中添加?
imagePullSecrets
?字段,將其值設(shè)置為之前創(chuàng)建的憑據(jù)名稱?harborsecret
,如下所示:具體在上方或者最下面詳解yaml里面有spec: imagePullSecrets: - name: harborsecret
如果需要?jiǎng)h除secret,使用命令
kubectl delete secrets harborsecret
保存,立即構(gòu)建
二十.訪問k8s應(yīng)用
root@k8s-master:~# kubectl get pods -o wide
如果發(fā)現(xiàn)pod運(yùn)行在node服務(wù)器,狀態(tài)是ImagePullBackOff
kubectl describe po maven-deployment-7bd87867f8-6tlgp -n dev
Get https://192.168.189.132/v2/: dial tcp 192.168.189.132:443: connect: connection refused
k8s-node?服務(wù)器的?/etc/docker/daemon.json?沒有更改,兩臺(tái)都加這個(gè)
root@node1:/home/web# cat /etc/docker/daemon.json?
{
"registry-mirrors": ["https://frz7i079.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"insecure-registries": ["192.168.189.132"]
}
重新加載docker? ?
systemctl restart docker
二十一. ingress安裝和構(gòu)建java,并訪問項(xiàng)目
由于網(wǎng)絡(luò)問題,下載不便,所以直接用修改好的文件
可以去這里下載:
https://download.csdn.net/download/u014741634/88719753
root@master:/data/xiangmu/xx# cat deploy.yaml?
apiVersion: v1
kind: Namespace
metadata:
? name: ingress-nginx
? labels:
? ? app.kubernetes.io/name: ingress-nginx
? ? app.kubernetes.io/instance: ingress-nginx
---
# Source: ingress-nginx/templates/controller-serviceaccount.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
? labels:
? ? helm.sh/chart: ingress-nginx-4.0.15
? ? app.kubernetes.io/name: ingress-nginx
? ? app.kubernetes.io/instance: ingress-nginx
? ? app.kubernetes.io/version: 1.1.1
? ? app.kubernetes.io/managed-by: Helm
? ? app.kubernetes.io/component: controller
? name: ingress-nginx
? namespace: ingress-nginx
automountServiceAccountToken: true
---
# Source: ingress-nginx/templates/controller-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
? labels:
? ? helm.sh/chart: ingress-nginx-4.0.15
? ? app.kubernetes.io/name: ingress-nginx
? ? app.kubernetes.io/instance: ingress-nginx
? ? app.kubernetes.io/version: 1.1.1
? ? app.kubernetes.io/managed-by: Helm
? ? app.kubernetes.io/component: controller
? name: ingress-nginx-controller
? namespace: ingress-nginx
data:
? allow-snippet-annotations: 'true'
---
# Source: ingress-nginx/templates/clusterrole.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
? labels:
? ? helm.sh/chart: ingress-nginx-4.0.15
? ? app.kubernetes.io/name: ingress-nginx
? ? app.kubernetes.io/instance: ingress-nginx
? ? app.kubernetes.io/version: 1.1.1
? ? app.kubernetes.io/managed-by: Helm
? name: ingress-nginx
rules:
? - apiGroups:
? ? ? - ''
? ? resources:
? ? ? - configmaps
? ? ? - endpoints
? ? ? - nodes
? ? ? - pods
? ? ? - secrets
? ? ? - namespaces
? ? verbs:
? ? ? - list
? ? ? - watch
? - apiGroups:
? ? ? - ''
? ? resources:
? ? ? - nodes
? ? verbs:
? ? ? - get
? - apiGroups:
? ? ? - ''
? ? resources:
? ? ? - services
? ? verbs:
? ? ? - get
? ? ? - list
? ? ? - watch
? - apiGroups:
? ? ? - networking.k8s.io
? ? resources:
? ? ? - ingresses
? ? verbs:
? ? ? - get
? ? ? - list
? ? ? - watch
? - apiGroups:
? ? ? - ''
? ? resources:
? ? ? - events
? ? verbs:
? ? ? - create
? ? ? - patch
? - apiGroups:
? ? ? - networking.k8s.io
? ? resources:
? ? ? - ingresses/status
? ? verbs:
? ? ? - update
? - apiGroups:
? ? ? - networking.k8s.io
? ? resources:
? ? ? - ingressclasses
? ? verbs:
? ? ? - get
? ? ? - list
? ? ? - watch
---
# Source: ingress-nginx/templates/clusterrolebinding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
? labels:
? ? helm.sh/chart: ingress-nginx-4.0.15
? ? app.kubernetes.io/name: ingress-nginx
? ? app.kubernetes.io/instance: ingress-nginx
? ? app.kubernetes.io/version: 1.1.1
? ? app.kubernetes.io/managed-by: Helm
? name: ingress-nginx
roleRef:
? apiGroup: rbac.authorization.k8s.io
? kind: ClusterRole
? name: ingress-nginx
subjects:
? - kind: ServiceAccount
? ? name: ingress-nginx
? ? namespace: ingress-nginx
---
# Source: ingress-nginx/templates/controller-role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
? labels:
? ? helm.sh/chart: ingress-nginx-4.0.15
? ? app.kubernetes.io/name: ingress-nginx
? ? app.kubernetes.io/instance: ingress-nginx
? ? app.kubernetes.io/version: 1.1.1
? ? app.kubernetes.io/managed-by: Helm
? ? app.kubernetes.io/component: controller
? name: ingress-nginx
? namespace: ingress-nginx
rules:
? - apiGroups:
? ? ? - ''
? ? resources:
? ? ? - namespaces
? ? verbs:
? ? ? - get
? - apiGroups:
? ? ? - ''
? ? resources:
? ? ? - configmaps
? ? ? - pods
? ? ? - secrets
? ? ? - endpoints
? ? verbs:
? ? ? - get
? ? ? - list
? ? ? - watch
? - apiGroups:
? ? ? - ''
? ? resources:
? ? ? - services
? ? verbs:
? ? ? - get
? ? ? - list
? ? ? - watch
? - apiGroups:
? ? ? - networking.k8s.io
? ? resources:
? ? ? - ingresses
? ? verbs:
? ? ? - get
? ? ? - list
? ? ? - watch
? - apiGroups:
? ? ? - networking.k8s.io
? ? resources:
? ? ? - ingresses/status
? ? verbs:
? ? ? - update
? - apiGroups:
? ? ? - networking.k8s.io
? ? resources:
? ? ? - ingressclasses
? ? verbs:
? ? ? - get
? ? ? - list
? ? ? - watch
? - apiGroups:
? ? ? - ''
? ? resources:
? ? ? - configmaps
? ? resourceNames:
? ? ? - ingress-controller-leader
? ? verbs:
? ? ? - get
? ? ? - update
? - apiGroups:
? ? ? - ''
? ? resources:
? ? ? - configmaps
? ? verbs:
? ? ? - create
? - apiGroups:
? ? ? - ''
? ? resources:
? ? ? - events
? ? verbs:
? ? ? - create
? ? ? - patch
---
# Source: ingress-nginx/templates/controller-rolebinding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
? labels:
? ? helm.sh/chart: ingress-nginx-4.0.15
? ? app.kubernetes.io/name: ingress-nginx
? ? app.kubernetes.io/instance: ingress-nginx
? ? app.kubernetes.io/version: 1.1.1
? ? app.kubernetes.io/managed-by: Helm
? ? app.kubernetes.io/component: controller
? name: ingress-nginx
? namespace: ingress-nginx
roleRef:
? apiGroup: rbac.authorization.k8s.io
? kind: Role
? name: ingress-nginx
subjects:
? - kind: ServiceAccount
? ? name: ingress-nginx
? ? namespace: ingress-nginx
---
# Source: ingress-nginx/templates/controller-service-webhook.yaml
apiVersion: v1
kind: Service
metadata:
? labels:
? ? helm.sh/chart: ingress-nginx-4.0.15
? ? app.kubernetes.io/name: ingress-nginx
? ? app.kubernetes.io/instance: ingress-nginx
? ? app.kubernetes.io/version: 1.1.1
? ? app.kubernetes.io/managed-by: Helm
? ? app.kubernetes.io/component: controller
? name: ingress-nginx-controller-admission
? namespace: ingress-nginx
spec:
? type: ClusterIP
? ports:
? ? - name: https-webhook
? ? ? port: 443
? ? ? targetPort: webhook
? ? ? appProtocol: https
? selector:
? ? app.kubernetes.io/name: ingress-nginx
? ? app.kubernetes.io/instance: ingress-nginx
? ? app.kubernetes.io/component: controller
---
# Source: ingress-nginx/templates/controller-service.yaml
apiVersion: v1
kind: Service
metadata:
? annotations:
? labels:
? ? helm.sh/chart: ingress-nginx-4.0.15
? ? app.kubernetes.io/name: ingress-nginx
? ? app.kubernetes.io/instance: ingress-nginx
? ? app.kubernetes.io/version: 1.1.1
? ? app.kubernetes.io/managed-by: Helm
? ? app.kubernetes.io/component: controller
? name: ingress-nginx-controller
? namespace: ingress-nginx
spec:
? type: NodePort
? externalTrafficPolicy: Local
? ipFamilyPolicy: SingleStack
? ipFamilies:
? ? - IPv4
? ports:
? ? - name: http
? ? ? port: 80
? ? ? protocol: TCP
? ? ? targetPort: http
? ? ? appProtocol: http
? ? - name: https
? ? ? port: 443
? ? ? protocol: TCP
? ? ? targetPort: https
? ? ? appProtocol: https
? selector:
? ? app.kubernetes.io/name: ingress-nginx
? ? app.kubernetes.io/instance: ingress-nginx
? ? app.kubernetes.io/component: controller
---
# Source: ingress-nginx/templates/controller-deployment.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
? labels:
? ? helm.sh/chart: ingress-nginx-4.0.15
? ? app.kubernetes.io/name: ingress-nginx
? ? app.kubernetes.io/instance: ingress-nginx
? ? app.kubernetes.io/version: 1.1.1
? ? app.kubernetes.io/managed-by: Helm
? ? app.kubernetes.io/component: controller
? name: ingress-nginx-controller
? namespace: ingress-nginx
spec:
? selector:
? ? matchLabels:
? ? ? app.kubernetes.io/name: ingress-nginx
? ? ? app.kubernetes.io/instance: ingress-nginx
? ? ? app.kubernetes.io/component: controller
? revisionHistoryLimit: 10
? minReadySeconds: 0
? template:
? ? metadata:
? ? ? labels:
? ? ? ? app.kubernetes.io/name: ingress-nginx
? ? ? ? app.kubernetes.io/instance: ingress-nginx
? ? ? ? app.kubernetes.io/component: controller
? ? spec:
? ? ? hostNetwork: true
? ? ? hostPID: true
? ? ? dnsPolicy: ClusterFirst
? ? ? containers:
? ? ? ? - name: controller
? ? ? ? ? image: docker.io/loging/ingress-nginx-controller:v1.1.1
? ? ? ? ? imagePullPolicy: IfNotPresent
? ? ? ? ? lifecycle:
? ? ? ? ? ? preStop:
? ? ? ? ? ? ? exec:
? ? ? ? ? ? ? ? command:
? ? ? ? ? ? ? ? ? - /wait-shutdown
? ? ? ? ? args:
? ? ? ? ? ? - /nginx-ingress-controller
? ? ? ? ? ? - --publish-service=$(POD_NAMESPACE)/ingress-nginx-controller
? ? ? ? ? ? - --election-id=ingress-controller-leader
? ? ? ? ? ? - --controller-class=k8s.io/ingress-nginx
? ? ? ? ? ? - --configmap=$(POD_NAMESPACE)/ingress-nginx-controller
? ? ? ? ? ? - --validating-webhook=:8443
? ? ? ? ? ? - --validating-webhook-certificate=/usr/local/certificates/cert
? ? ? ? ? ? - --validating-webhook-key=/usr/local/certificates/key
? ? ? ? ? securityContext:
? ? ? ? ? ? capabilities:
? ? ? ? ? ? ? drop:
? ? ? ? ? ? ? ? - ALL
? ? ? ? ? ? ? add:
? ? ? ? ? ? ? ? - NET_BIND_SERVICE
? ? ? ? ? ? runAsUser: 101
? ? ? ? ? ? allowPrivilegeEscalation: true
? ? ? ? ? env:
? ? ? ? ? ? - name: POD_NAME
? ? ? ? ? ? ? valueFrom:
? ? ? ? ? ? ? ? fieldRef:
? ? ? ? ? ? ? ? ? fieldPath: metadata.name
? ? ? ? ? ? - name: POD_NAMESPACE
? ? ? ? ? ? ? valueFrom:
? ? ? ? ? ? ? ? fieldRef:
? ? ? ? ? ? ? ? ? fieldPath: metadata.namespace
? ? ? ? ? ? - name: LD_PRELOAD
? ? ? ? ? ? ? value: /usr/local/lib/libmimalloc.so
? ? ? ? ? livenessProbe:
? ? ? ? ? ? failureThreshold: 5
? ? ? ? ? ? httpGet:
? ? ? ? ? ? ? path: /healthz
? ? ? ? ? ? ? port: 10254
? ? ? ? ? ? ? scheme: HTTP
? ? ? ? ? ? initialDelaySeconds: 10
? ? ? ? ? ? periodSeconds: 10
? ? ? ? ? ? successThreshold: 1
? ? ? ? ? ? timeoutSeconds: 1
? ? ? ? ? readinessProbe:
? ? ? ? ? ? failureThreshold: 3
? ? ? ? ? ? httpGet:
? ? ? ? ? ? ? path: /healthz
? ? ? ? ? ? ? port: 10254
? ? ? ? ? ? ? scheme: HTTP
? ? ? ? ? ? initialDelaySeconds: 10
? ? ? ? ? ? periodSeconds: 10
? ? ? ? ? ? successThreshold: 1
? ? ? ? ? ? timeoutSeconds: 1
? ? ? ? ? ports:
? ? ? ? ? ? - name: http
? ? ? ? ? ? ? containerPort: 80
? ? ? ? ? ? ? protocol: TCP
? ? ? ? ? ? - name: https
? ? ? ? ? ? ? containerPort: 443
? ? ? ? ? ? ? protocol: TCP
? ? ? ? ? ? - name: webhook
? ? ? ? ? ? ? containerPort: 8443
? ? ? ? ? ? ? protocol: TCP
? ? ? ? ? volumeMounts:
? ? ? ? ? ? - name: webhook-cert
? ? ? ? ? ? ? mountPath: /usr/local/certificates/
? ? ? ? ? ? ? readOnly: true
? ? ? ? ? resources:
? ? ? ? ? ? requests:
? ? ? ? ? ? ? cpu: 100m
? ? ? ? ? ? ? memory: 90Mi
? ? ? nodeSelector:
? ? ? ? kubernetes.io/os: linux
? ? ? serviceAccountName: ingress-nginx
? ? ? terminationGracePeriodSeconds: 300
? ? ? volumes:
? ? ? ? - name: webhook-cert
? ? ? ? ? secret:
? ? ? ? ? ? secretName: ingress-nginx-admission
---
# Source: ingress-nginx/templates/controller-ingressclass.yaml
# We don't support namespaced ingressClass yet
# So a ClusterRole and a ClusterRoleBinding is required
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
? labels:
? ? helm.sh/chart: ingress-nginx-4.0.15
? ? app.kubernetes.io/name: ingress-nginx
? ? app.kubernetes.io/instance: ingress-nginx
? ? app.kubernetes.io/version: 1.1.1
? ? app.kubernetes.io/managed-by: Helm
? ? app.kubernetes.io/component: controller
? name: nginx
? namespace: ingress-nginx
spec:
? controller: k8s.io/ingress-nginx
---
# Source: ingress-nginx/templates/admission-webhooks/validating-webhook.yaml
# before changing this value, check the required kubernetes version
# https://kubernetes.io/docs/reference/access-authn-authz/extensible-admission-controllers/#prerequisites
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
metadata:
? labels:
? ? helm.sh/chart: ingress-nginx-4.0.15
? ? app.kubernetes.io/name: ingress-nginx
? ? app.kubernetes.io/instance: ingress-nginx
? ? app.kubernetes.io/version: 1.1.1
? ? app.kubernetes.io/managed-by: Helm
? ? app.kubernetes.io/component: admission-webhook
? name: ingress-nginx-admission
webhooks:
? - name: validate.nginx.ingress.kubernetes.io
? ? matchPolicy: Equivalent
? ? rules:
? ? ? - apiGroups:
? ? ? ? ? - networking.k8s.io
? ? ? ? apiVersions:
? ? ? ? ? - v1
? ? ? ? operations:
? ? ? ? ? - CREATE
? ? ? ? ? - UPDATE
? ? ? ? resources:
? ? ? ? ? - ingresses
? ? failurePolicy: Fail
? ? sideEffects: None
? ? admissionReviewVersions:
? ? ? - v1
? ? clientConfig:
? ? ? service:
? ? ? ? namespace: ingress-nginx
? ? ? ? name: ingress-nginx-controller-admission
? ? ? ? path: /networking/v1/ingresses
---
# Source: ingress-nginx/templates/admission-webhooks/job-patch/serviceaccount.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
? name: ingress-nginx-admission
? namespace: ingress-nginx
? annotations:
? ? helm.sh/hook: pre-install,pre-upgrade,post-install,post-upgrade
? ? helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded
? labels:
? ? helm.sh/chart: ingress-nginx-4.0.15
? ? app.kubernetes.io/name: ingress-nginx
? ? app.kubernetes.io/instance: ingress-nginx
? ? app.kubernetes.io/version: 1.1.1
? ? app.kubernetes.io/managed-by: Helm
? ? app.kubernetes.io/component: admission-webhook
---
# Source: ingress-nginx/templates/admission-webhooks/job-patch/clusterrole.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
? name: ingress-nginx-admission
? annotations:
? ? helm.sh/hook: pre-install,pre-upgrade,post-install,post-upgrade
? ? helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded
? labels:
? ? helm.sh/chart: ingress-nginx-4.0.15
? ? app.kubernetes.io/name: ingress-nginx
? ? app.kubernetes.io/instance: ingress-nginx
? ? app.kubernetes.io/version: 1.1.1
? ? app.kubernetes.io/managed-by: Helm
? ? app.kubernetes.io/component: admission-webhook
rules:
? - apiGroups:
? ? ? - admissionregistration.k8s.io
? ? resources:
? ? ? - validatingwebhookconfigurations
? ? verbs:
? ? ? - get
? ? ? - update
---
# Source: ingress-nginx/templates/admission-webhooks/job-patch/clusterrolebinding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
? name: ingress-nginx-admission
? annotations:
? ? helm.sh/hook: pre-install,pre-upgrade,post-install,post-upgrade
? ? helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded
? labels:
? ? helm.sh/chart: ingress-nginx-4.0.15
? ? app.kubernetes.io/name: ingress-nginx
? ? app.kubernetes.io/instance: ingress-nginx
? ? app.kubernetes.io/version: 1.1.1
? ? app.kubernetes.io/managed-by: Helm
? ? app.kubernetes.io/component: admission-webhook
roleRef:
? apiGroup: rbac.authorization.k8s.io
? kind: ClusterRole
? name: ingress-nginx-admission
subjects:
? - kind: ServiceAccount
? ? name: ingress-nginx-admission
? ? namespace: ingress-nginx
---
# Source: ingress-nginx/templates/admission-webhooks/job-patch/role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
? name: ingress-nginx-admission
? namespace: ingress-nginx
? annotations:
? ? helm.sh/hook: pre-install,pre-upgrade,post-install,post-upgrade
? ? helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded
? labels:
? ? helm.sh/chart: ingress-nginx-4.0.15
? ? app.kubernetes.io/name: ingress-nginx
? ? app.kubernetes.io/instance: ingress-nginx
? ? app.kubernetes.io/version: 1.1.1
? ? app.kubernetes.io/managed-by: Helm
? ? app.kubernetes.io/component: admission-webhook
rules:
? - apiGroups:
? ? ? - ''
? ? resources:
? ? ? - secrets
? ? verbs:
? ? ? - get
? ? ? - create
---
# Source: ingress-nginx/templates/admission-webhooks/job-patch/rolebinding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
? name: ingress-nginx-admission
? namespace: ingress-nginx
? annotations:
? ? helm.sh/hook: pre-install,pre-upgrade,post-install,post-upgrade
? ? helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded
? labels:
? ? helm.sh/chart: ingress-nginx-4.0.15
? ? app.kubernetes.io/name: ingress-nginx
? ? app.kubernetes.io/instance: ingress-nginx
? ? app.kubernetes.io/version: 1.1.1
? ? app.kubernetes.io/managed-by: Helm
? ? app.kubernetes.io/component: admission-webhook
roleRef:
? apiGroup: rbac.authorization.k8s.io
? kind: Role
? name: ingress-nginx-admission
subjects:
? - kind: ServiceAccount
? ? name: ingress-nginx-admission
? ? namespace: ingress-nginx
---
# Source: ingress-nginx/templates/admission-webhooks/job-patch/job-createSecret.yaml
apiVersion: batch/v1
kind: Job
metadata:
? name: ingress-nginx-admission-create
? namespace: ingress-nginx
? annotations:
? ? helm.sh/hook: pre-install,pre-upgrade
? ? helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded
? labels:
? ? helm.sh/chart: ingress-nginx-4.0.15
? ? app.kubernetes.io/name: ingress-nginx
? ? app.kubernetes.io/instance: ingress-nginx
? ? app.kubernetes.io/version: 1.1.1
? ? app.kubernetes.io/managed-by: Helm
? ? app.kubernetes.io/component: admission-webhook
spec:
? template:
? ? metadata:
? ? ? name: ingress-nginx-admission-create
? ? ? labels:
? ? ? ? helm.sh/chart: ingress-nginx-4.0.15
? ? ? ? app.kubernetes.io/name: ingress-nginx
? ? ? ? app.kubernetes.io/instance: ingress-nginx
? ? ? ? app.kubernetes.io/version: 1.1.1
? ? ? ? app.kubernetes.io/managed-by: Helm
? ? ? ? app.kubernetes.io/component: admission-webhook
? ? spec:
? ? ? containers:
? ? ? ? - name: create
? ? ? ? ? image: lianyuxue1020/kube-webhook-certgen:v1.1.1
? ? ? ? ? imagePullPolicy: IfNotPresent
? ? ? ? ? args:
? ? ? ? ? ? - create
? ? ? ? ? ? - --host=ingress-nginx-controller-admission,ingress-nginx-controller-admission.$(POD_NAMESPACE).svc
? ? ? ? ? ? - --namespace=$(POD_NAMESPACE)
? ? ? ? ? ? - --secret-name=ingress-nginx-admission
? ? ? ? ? env:
? ? ? ? ? ? - name: POD_NAMESPACE
? ? ? ? ? ? ? valueFrom:
? ? ? ? ? ? ? ? fieldRef:
? ? ? ? ? ? ? ? ? fieldPath: metadata.namespace
? ? ? ? ? securityContext:
? ? ? ? ? ? allowPrivilegeEscalation: false
? ? ? restartPolicy: OnFailure
? ? ? serviceAccountName: ingress-nginx-admission
? ? ? nodeSelector:
? ? ? ? kubernetes.io/os: linux
? ? ? securityContext:
? ? ? ? runAsNonRoot: true
? ? ? ? runAsUser: 2000
---
# Source: ingress-nginx/templates/admission-webhooks/job-patch/job-patchWebhook.yaml
apiVersion: batch/v1
kind: Job
metadata:
? name: ingress-nginx-admission-patch
? namespace: ingress-nginx
? annotations:
? ? helm.sh/hook: post-install,post-upgrade
? ? helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded
? labels:
? ? helm.sh/chart: ingress-nginx-4.0.15
? ? app.kubernetes.io/name: ingress-nginx
? ? app.kubernetes.io/instance: ingress-nginx
? ? app.kubernetes.io/version: 1.1.1
? ? app.kubernetes.io/managed-by: Helm
? ? app.kubernetes.io/component: admission-webhook
spec:
? template:
? ? metadata:
? ? ? name: ingress-nginx-admission-patch
? ? ? labels:
? ? ? ? helm.sh/chart: ingress-nginx-4.0.15
? ? ? ? app.kubernetes.io/name: ingress-nginx
? ? ? ? app.kubernetes.io/instance: ingress-nginx
? ? ? ? app.kubernetes.io/version: 1.1.1
? ? ? ? app.kubernetes.io/managed-by: Helm
? ? ? ? app.kubernetes.io/component: admission-webhook
? ? spec:
? ? ? containers:
? ? ? ? - name: patch
? ? ? ? ? image: lianyuxue1020/kube-webhook-certgen:v1.1.1
? ? ? ? ? imagePullPolicy: IfNotPresent
? ? ? ? ? args:
? ? ? ? ? ? - patch
? ? ? ? ? ? - --webhook-name=ingress-nginx-admission
? ? ? ? ? ? - --namespace=$(POD_NAMESPACE)
? ? ? ? ? ? - --patch-mutating=false
? ? ? ? ? ? - --secret-name=ingress-nginx-admission
? ? ? ? ? ? - --patch-failure-policy=Fail
? ? ? ? ? env:
? ? ? ? ? ? - name: POD_NAMESPACE
? ? ? ? ? ? ? valueFrom:
? ? ? ? ? ? ? ? fieldRef:
? ? ? ? ? ? ? ? ? fieldPath: metadata.namespace
? ? ? ? ? securityContext:
? ? ? ? ? ? allowPrivilegeEscalation: false
? ? ? restartPolicy: OnFailure
? ? ? serviceAccountName: ingress-nginx-admission
? ? ? nodeSelector:
? ? ? ? kubernetes.io/os: linux
? ? ? securityContext:
? ? ? ? runAsNonRoot: true
? ? ? ? runAsUser: 2000
kubectl apply -f??deploy.yaml? 他會(huì)去下載相應(yīng)的鏡像和容器
這兩running就ok了
Jenkins構(gòu)建
訪問應(yīng)用
查看svc暴露的端口
訪問測(cè)試,在windows上添加域名解析
root@master:/data/xiangmu/xx# cat /var/nfsdata/nginx/index.html? ? ?添加前端測(cè)試頁面
hello boy !!!
訪問后端tomcat已經(jīng)出現(xiàn)git項(xiàng)目的代碼內(nèi)容
二十二.nginx和tomcat和ingrss yaml詳解
#創(chuàng)建命名空間dev
apiVersion: v1 kind: Namespace metadata: ? name: dev
#創(chuàng)建一個(gè) Kubernetes 的 ConfigMap,用于存儲(chǔ) Nginx 的配置文件。這個(gè)配置文件包含了 Nginx 的基本配置,包括 worker_processes、error_log、events、http 等部分。
?apiVersion: v1 kind: ConfigMap metadata: ? name: nginx-config ? namespace: dev data: #ConfigMap掛載配置文件 ? nginx.conf: | ? ? user ?nginx; ? ? worker_processes ?auto; ? ? error_log ?/var/log/nginx/nginx-error.log notice; ? ? pid ? ? ? ?/var/run/nginx.pid; ? ?? ? ?? ? ? events { ? ? ? ? worker_connections ?1024; ? ? } ? ?? ? ?? ? ? http { ? ? ? ? include ? ? ? /etc/nginx/mime.types; ? ? ? ? default_type ?application/octet-stream; ? ? ? ? log_format ?main ?'$remote_addr - $remote_user [$time_local] "$request" ' ? ? ? ? ? ? ? ? ? ? ? ? ? '$status $body_bytes_sent "$http_referer" ' ? ? ? ? ? ? ? ? ? ? ? ? ? '"$http_user_agent" "$http_x_forwarded_for"'; ? ? ? ? access_log ?/var/log/nginx/access.log ?main; ? ? ? ? sendfile ? ? ? ?on; ? ? ? ? keepalive_timeout ?65; ? ? ? ? include /etc/nginx/conf.d/*.conf; ? ? }
#您正在創(chuàng)建一個(gè)名為?
nginx-pv
?的持久卷(Persistent Volume)用于存儲(chǔ) Nginx 的數(shù)據(jù),并且指定了其大小為 1GB。這個(gè)持久卷將使用 NFS(Network File System)作為存儲(chǔ)后端,具有 ReadWriteMany 的訪問模式,這意味著多個(gè) Pod 可以同時(shí)對(duì)其進(jìn)行讀寫操作。apiVersion: v1 kind: PersistentVolume metadata: ? #創(chuàng)建nginx pv 指定大小1G ? name: nginx-pv ? namespace: dev spec: ? capacity: ? ? storage: 1Gi ? accessModes: ? ? - ReadWriteMany ? nfs: ? ? server: 192.168.189.132 ? ? path: /var/nfsdata/nginx
#創(chuàng)建一個(gè)名為 "nginx-pvc" 的 PersistentVolumeClaim(持久卷聲明)在 "dev" 命名空間中。該 PVC 請(qǐng)求 1GB 的存儲(chǔ)空間,具有 ReadWriteMany 訪問模式,并且會(huì)嘗試與一個(gè)名為 "nginx-pv" 的 PersistentVolume 綁定。此外,它還包含一個(gè)選擇器,用于匹配標(biāo)簽為 "type: nginx" 的 PersistentVolume。
apiVersion: v1 kind: PersistentVolumeClaim metadata: #創(chuàng)建pvc name: nginx-pvc namespace: dev spec: storageClassName: "" volumeName: nginx-pv accessModes: - ReadWriteMany resources: requests: storage: 1Gi selector: matchLabels: type: nginx
#下面的tomcat的和上面nginx一樣
apiVersion: v1 kind: PersistentVolume metadata: #創(chuàng)建tomcat pv 指定大小1G name: tomcat-pv namespace: dev spec: capacity: storage: 1Gi accessModes: - ReadWriteMany nfs: server: 192.168.189.132 path: /var/nfsdata/tomcat --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: tomcat-pvc namespace: dev spec: storageClassName: "" volumeName: tomcat-pv accessModes: - ReadWriteMany resources: requests: storage: 1Gi selector: matchLabels: type: tomcat
#創(chuàng)建一個(gè)名為 "nginx-deployment" 的 Deployment(部署)在 "dev" 命名空間中。這個(gè) Deployment 包含了兩個(gè)副本,使用一個(gè)標(biāo)簽選擇器來匹配 Pod,并且定義了一個(gè) Pod 模板,其中包含了兩個(gè)卷和一個(gè)容器。
其中,第一個(gè)卷是一個(gè) ConfigMap 類型的卷,名為 "nginx-config",用于將配置文件注入到 Nginx 容器中。第二個(gè)卷是一個(gè)持久卷聲明(PersistentVolumeClaim),名為 "nfs-volume",它將與名為 "nginx-pvc" 的 PersistentVolumeClaim 綁定,用于將 NFS 卷掛載到 Nginx 容器中。
Nginx 容器使用的是 "nginx:1.17.1" 鏡像,監(jiān)聽 80 端口,并且將 "nginx-config" 卷掛載到 "/etc/nginx/nginx.conf" 路徑下,將 "nfs-volume" 卷掛載到 "/usr/share/nginx/html" 路徑下,這是 Nginx 默認(rèn)的靜態(tài)資源文件目錄。
apiVersion: apps/v1 kind: Deployment metadata: #nginx配置 name: nginx-deployment namespace: dev spec: replicas: 2 selector: matchLabels: app: nginx-pod template: metadata: labels: app: nginx-pod spec: volumes: - name: nginx-config configMap: name: nginx-config - name: nfs-volume persistentVolumeClaim: claimName: nginx-pvc # 這里是NFS的PersistentVolumeClaim的名稱 containers: - name: nginx image: nginx:1.17.1 ports: - containerPort: 80 volumeMounts: - name: nginx-config mountPath: /etc/nginx/nginx.conf subPath: nginx.conf - name: nfs-volume mountPath: /usr/share/nginx/html # NGINX默認(rèn)的靜態(tài)資源文件目錄
#創(chuàng)建一個(gè)名為 "tomcat-deployment" 的 Deployment(部署)在 "dev" 命名空間中。這個(gè) Deployment 包含了兩個(gè)副本,使用一個(gè)標(biāo)簽選擇器來匹配 Pod,并且定義了一個(gè) Pod 模板,其中包含了一個(gè)卷和一個(gè)容器。
在 Pod 模板中,使用了 "imagePullSecrets" 字段來指定鏡像拉取的憑據(jù),這里使用了名為 "harborsecret" 的憑據(jù)。另外,還定義了親和性(affinity),通過 "podAntiAffinity" 字段來確保同一臺(tái)節(jié)點(diǎn)上不會(huì)調(diào)度多個(gè)具有相同標(biāo)簽的 Pod。
在卷的部分,定義了一個(gè)名為 "web-content" 的持久卷聲明(PersistentVolumeClaim),用于將存儲(chǔ)卷掛載到 Tomcat 容器中。
Tomcat 容器使用的是 "192.168.189.132/java/tomcat:latest" 鏡像,總是拉取最新的鏡像,監(jiān)聽 8080 端口,并且將 "web-content" 卷掛載到 "/usr/local/tomcat/webapps/ROOT" 路徑下。
apiVersion: apps/v1 kind: Deployment metadata: name: tomcat-deployment namespace: dev spec: replicas: 2 selector: matchLabels: app: tomcat-pod template: metadata: labels: app: tomcat-pod spec: imagePullSecrets: - name: harborsecret affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - tomcat-pod topologyKey: "kubernetes.io/hostname" volumes: - name: web-content persistentVolumeClaim: claimName: tomcat-pvc containers: - name: tomcat image: 192.168.189.132/java/tomcat:latest imagePullPolicy: Always ports: - containerPort: 8080 volumeMounts: - name: web-content mountPath: /usr/local/tomcat/webapps/ROOT
#一個(gè)名為 "my-ingress" 的 Ingress 資源,用于將外部流量路由到 Kubernetes 集群中的不同服務(wù)。這個(gè) Ingress 資源位于 "dev" 命名空間中,并且指定了一些注解和規(guī)則來定義路由行為。
在注解部分,使用了 "nginx.ingress.kubernetes.io/rewrite-target" 注解,將請(qǐng)求重寫到 "/$2"。
在規(guī)則部分,指定了 Ingress 類別為 "nginx",并且定義了兩條路由規(guī)則。第一條規(guī)則將以 "harbor.snow.com" 為主機(jī)的所有請(qǐng)求(/)路由到名為 "nginx-service" 的服務(wù)的 80 端口上。第二條規(guī)則將以 "harbor.snow.com/tomcat" 開頭的請(qǐng)求路由到名為 "tomcat-service" 的服務(wù)的 8080 端口上。這個(gè) Ingress 資源定義了基于主機(jī)和路徑的路由規(guī)則,用于將外部流量導(dǎo)向到不同的后端服務(wù)文章來源:http://www.zghlxwxcb.cn/news/detail-777209.html
apiVersion: networking.k8s.io/v1 #apiVersion: v1 kind: Ingress metadata: name: my-ingress namespace: dev annotations: nginx.ingress.kubernetes.io/rewrite-target: /$2 spec: ingressClassName: nginx rules: - host: harbor.snow.com http: paths: - path: /(.*) pathType: ImplementationSpecific backend: service: name: nginx-service port: number: 80 - path: /tomcat(/|$)(.*) pathType: ImplementationSpecific backend: service: name: tomcat-service port: number: 8080
#創(chuàng)建兩個(gè)Kubernetes Service資源,分別是"nginx-service"和"tomcat-service",它們都位于"dev"命名空間中。"nginx-service"是ClusterIP類型的服務(wù),這意味著它只能在Kubernetes集群內(nèi)部訪問。它選擇具有標(biāo)簽"app: nginx-pod"的Pod,并暴露端口80,"tomcat-service"也是ClusterIP類型的服務(wù),它選擇具有標(biāo)簽"app: tomcat-pod"的Pod,并暴露端口8080文章來源地址http://www.zghlxwxcb.cn/news/detail-777209.html
apiVersion: v1 kind: Service metadata: name: nginx-service namespace: dev spec: selector: app: nginx-pod clusterIP: None type: ClusterIP ports: - port: 80 targetPort: 80 --- apiVersion: v1 kind: Service metadata: name: tomcat-service namespace: dev spec: selector: app: tomcat-pod clusterIP: None type: ClusterIP ports: - port: 8080 targetPort: 8080
到了這里,關(guān)于Vmware虛擬機(jī)搭建 K8S ingress Jenkins Gitlab Harbor Docker 一鍵部署SpringCloud微服務(wù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!