※本文檔適用於下面的參考文檔學習及配置後,再進行學習。
參考文檔:
1.Windows10 環境下的 Docker
2.Windows 10 Kubernetes(minikube)搭建
官方文檔:
學習 Kubernetes 基礎知識
Kubernetes核心概念
1.概念一覽
- Kubernetes Master(Kubernetes主節點)
集羣的主節點機器。 - Node(節點)
集羣的節點機器。 - Service(svc)(服務)
多個相同名稱的POD副本 使用不同的IP地址,Service提供DNS服務,通過指定的名稱對多個POD對象進行軟件級負載均衡訪問。 - Replication Controller(複製控制器)
使用控制器,可以快速創建指定個數的相同POD副本,並且對已經創建的POD副本進行監聽,當POD副本對象不足指定個數或者POD副本不響應,控制器會自動創建POD副本來保證指定個數的相同POD副本可以訪問。 - Label(label)(標籤)
POD副本進行名稱及類型的標記,例如:frontend(前端),backend(後端) - Pod
多個docker容器和 卷(Volumes) 在同一個POD中,且多個容器見可以使用localhost進行訪問。
Pod是短暫的,卷(Volumes) 是持久的,當創建新的POD副本時,可以快速的從卷中獲取數據。 - Deployment(部署)
代替 Replication Controller,Deployment 用來ReplicaSet,用來實現POD擴容,升級,回滾等作業。 - ReplicaSet
用來創建指定個數的POD對象及擴容POD個數,並且監聽POD狀態,當POD異常時,自動銷燬異常POD,並創建新的POD來保持整體的POD副本數目。
2.網絡框架
1.kubectl是kubernetes的命令行工具,用於創建,查詢,刪除kubernetes及容器相關的對象。
2.kubelet是用來Pod 管理,容器健康檢查 ,容器監控
3.kubectl命令
3.1創建nginx POD對象
創建nginx的deployment對象有兩種命令格式
命令格式1:kubectl run -> 該方式已被kubectl create取代
kubectl run nginx --image=nginx
解釋:kubectl run 部署對象名稱 --image=docker鏡像名稱
缺省參數:
--port 容器的訪問端口號,默認爲80,例如:--port=8080
--labels 容器的名稱標籤,格式app=名稱,env=環境,例如:--labels="app=hazelcast,env=prod"
--replicas POD的副本數量,例如:--replicas=5
命令格式2:kubectl create
kubectl create deployment nginx --image=nginx
解釋:kubectl create deployment 部署對象名稱 --image=docker鏡像名稱
3.2查看 POD對象列表
kubectl get pods
列表中NAME字段的含義:
當創建多個副本的POD時,docker name的前綴相同
STATUS字段的含義:
ImagePullBackOff :鏡像無法下載
解決方案參考2.Windows 10 Kubernetes(minikube)搭建 中的 3.14 配置minikube的docker鏡像加速
Running :下載並且啓動docker鏡像成功
在minikube的機器中,使用docker ps命令,可以看到nginx服務器正常啓動
3.3查看 deployment 對象創建的配置log
方式1:命令行
kubectl describe pod nginx
解釋:kubectl describe pod deployment對象的名稱
方式2:瀏覽器
在kubernetes-dashboard的網頁中,也可以看到deployment的對象的信息
3.4 刪除deployment的對象(POD和ReplicaSet)
kubectl delete -n default deployment nginx
解釋:kubectl delete -n 命名空間 deployment deployment名稱
3.5 訪問POD對象
1.查詢當前POD的詳細信息,查找到IP地址
kubectl get pod -o wide
2.登錄到minikube服務器中,使用curl命令獲取nginx的index文件內容
minikube ssh
$ curl IP地址/index.html
3.6 擴展POD副本的數量
1.擴展POD副本
kubectl scale deployment nginx --replicas=4
解釋:kubectl scale deployment POD名稱--replicas=擴展後的POD副本總數量
2.查看POD副本的狀態
在POD狀態中可以看到相同POD正在被創建。
kubectl get pod
3.所有POD副本被創建完成
3.7 驗證ReplicaSet的POD監聽
1.關閉多個POD副本中的某一個Docker容器
例如:
副本1:nginx-86c57db685-4k7bn
副本2:nginx-86c57db685-5qmjm
副本3:nginx-86c57db685-6ds9q
副本4:nginx-86c57db685-t7kxf
登錄到minikube服務器,關閉副本4(nginx-86c57db685-t7kxf)的docker 對象
minikube ssh
$ docker ps
獲取到容器的名稱前綴爲nginx-86c57db685-t7kxf的容器ID
$ docker stop 容器ID
2.查詢pod的信息
RESTARTS的次數加1,ReplicaSet自動恢復了POD副本
kubectl get pod
3.刪除POD副本
kubectl delete pod nginx-86c57db685-t7kxf
解釋:kubectl delete pod POD副本名稱
4.再次查詢POD副本
副本4被刪除,ReplicaSet自動創建了新的POD副本,保持整體的POD數量
kubectl get pod -o wide
3.8 創建services(svc),訪問POD副本
1.查詢pod副本的詳細信息
kubectl get pod -o wide
發現每一個POD副本有獨立的IP地址,如果想訪問它們,就需要添加負載均衡,並且當添加或者刪除POD副本時,POD副本的IP地址會發生變更,需要維護負載均衡。
services是一組提供相同服務的POD副本對外的訪問接口,且支持輪播的負載均衡,在添加或者刪除POD副本時,自動進行負載均衡設定。
2.創建services
這裏只介紹services的2種常用類型
集羣內部訪問:ClusterIP:使用一個集羣固定IP,這個是默認選項
集羣外部訪問:NodePort:使用一個集羣固定IP,並且會暴露一個端口給外部網絡進行訪問,端口的範圍(默認是30000-32767)
ClusterIP模式
1.創建services
kubectl expose deployment nginx --port=31000 --target-port=80
解釋:kubectl expose deployment 部署名稱 --port=集羣內訪問的端口號 --target-port=容器的端口號
2.查詢services
kubectl get svc
3.使用deployment的service的集羣IP訪問POD副本
1.登錄到minikube服務器中
minikube ssh
2.訪問nginx的index.html文件
curl 10.97.91.225:31000/index.html
3.9 刪除services(svc)
kubectl delete svc nginx
解釋:kubectl delete svc service名稱
3.10 創建NodePort類型的services(svc)
NodePort
方式1:
a.從ClusterIP方式修改爲NodePort
修改service的配置
kubectl edit svc nginx
解釋:kubectl edit svc service名稱
修改前:
修改後:
b.保存退出
c.再次查詢service
kubectl get svc
TYPE變更成NodePort,並且生成一個外網訪問的端口
d.獲取minikube服務器集羣的主機IP地址
注:由於切換的hyper-v的虛擬交換機的類型,導致了IP變更
查詢minikube服務器的IP地址
方式1:
1.登錄minikube服務器
minikube ssh
2.查詢IP地址
$ ifconfig
方式2:
minikube ip
e.瀏覽器訪問
http://minikube服務器IP:30302
方式2:
a.創建services,並指定類型爲NodePort
kubectl expose deployment nginx --port=32000 --type=NodePort --target-port=80
解釋:kubectl expose deployment 部署名稱 --port=集羣內訪問的端口號 --target-port=容器的端口號
b.再次查詢service
kubectl get svc
e.瀏覽器訪問
http://minikube服務器IP:30140
4 資源清單
k8s使用資源清單式進行相關組件的構建,即yaml文件格式配置文件創建POD,service等。
注意:YAML文件中不支持使用tab
獲取幫助文檔
kubectl explain pod
4.1 公共配置
apiVersion: v1 #kubernetes的API版本號
kind: <string> #資源類型 例如Pod,service
metadata: <Object> #元數據,資源的主要信息,例如命名,所在空間等
name: <string> #資源名稱 例如Pod名稱
namespace: <string> #資源所屬命名空間 如Pod的默認值 default
labels: <map[string]string> #標籤列表 資源類型添加標籤
key1: value1 #例如 version: v1
key2: value2 #例如 app: myfirstnginxapp
4.2 Pod類型配置的spec設定
spec: <Object> #必選,期望的狀態
containers: <[]Object> -required- #pod中的容器列表,可以有多個容器
- name: <string> -required- #容器名稱
image: <string> -required- #容器的鏡像名稱及版本號,例如
imagePullPolicy: <string> #獲取鏡像的策略(Always, Never, IfNotPresent)
#1.Alawys表示總是下載鏡像
#2.IfnotPresent表示優先使用本地鏡像,如果本地不存在,則下載鏡像
#3.Nerver表示僅使用本地鏡像,如果不存在,不進行下載。
#注:默認策略爲IfNotPresent,當版本號爲lastest,則策略爲Always
command: <[]string> #容器的啓動命令列表
4.2.1 使用資源文件-創建Pod
1.創建Deployment對象
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
namespace: default
labels:
app: k8s-nginx
spec:
replicas: 2 #生成複本數量爲2
selector:
matchLabels:
app: k8s-nginx
template:
metadata:
labels:
app: k8s-nginx
annotations: #用於選擇對象並查找滿足某些條件的對象集合 Annotations不會被Kubernetes直接使用,其主要目的是方便用戶閱讀查找
app: nginx-clouster
spec:
containers:
- name: nginx
image: docker.io/nginx
livenessProbe: #livenessProbe(可用性/存活探針) 對Pod內個容器健康檢查的設置,當探測無響應幾次後將自動重啓該容器,檢查方法有exec、httpGet和tcpSocket,對一個容器只需設置其中一種方法即可,另一種探針
#readiness probe(就緒探針)就緒探針的作用是控制哪些pod可以作爲svc的後端,如果pod不是就緒狀態,就把它從svc load balancer中移除.
httpGet: #通過httpget檢查健康,返回200-399之間,則認爲容器正常
path: / #URI地址
port: 80 #端口號
#host: 127.0.0.1 #主機地址
scheme: HTTP #支持的協議,http或者https
initialDelaySeconds: 5 #容器啓動後第一次執行探測是需要等待多少秒。
timeoutSeconds: 1 #探測超時時間。默認1秒,最小1秒。
imagePullPolicy: IfNotPresent #[Always | Never | IfNotPresent] #獲取鏡像的策略 Alawys表示下載鏡像 IfnotPresent表示優先使用本地鏡像,否則下載鏡像,Nerver表示僅使用本地鏡像
resources: #資源限制和請求的設置
limits:
cpu: 1 #CPU最大限制
memory: 3000Mi #內存限制,單位可以爲Mib/Gib,將用於docker run --memory參數
requests:
cpu: 0.2 #Cpu請求,容器啓動的初始可用數量,副本個數*cpu的總數量不可超過kubernetes安裝時系統設定的上限
memory: 100Mi #內存請求,容器啓動的初始可用數量
ports:
- containerPort: 80 #容器需要監聽的端口號
2.創建Service對象
apiVersion: v1
kind: Service
metadata:
labels:
run: nginx
name: nginx
namespace: default
spec:
type: NodePort
ports:
- port: 88 #這裏的端口和clusterIP對應,即clusterIP:80,供內部訪問。
targetPort: 80 #端口一定要和container暴露出來的端口對應,nginx暴露出來的端口是8081,所以這裏也應是8081
protocol: TCP
nodePort: 30060 # 所有的節點都會開放此端口,此端口供外部調用。有效範圍30000-32767
selector:
app: k8s-nginx
查詢pod狀態
kubectl get pods -o wide
瀏覽器訪問
http://minikube服務器IP:30060
3.查看POD日誌
kubectl logs Deployment的POD對象