一、k8s應用安裝
- k8s安裝教程:https://www.cnblogs.com/lvlinguang/p/16270133.html
- k3s安裝教程:https://www.cnblogs.com/lvlinguang/p/15679754.html
二、集群客戶端工具 kubectl
1、檢查kubectl是否安裝
rpm -qa|grep kubectl
2、獲取kubectl幫助方法
kubectl --help
3、kubectl 子命令使用分類
- 基礎命令 (Beginner)
| 命令 | 描述 |
|---|---|
| create | 通過文件名稱或標准輸入創建資源 |
| expose | 使用 replication controller, service, deployment 或者 pod 並暴露它作為一個 新的 Kubernetes Service |
| run | 在集群中運行一個指定的鏡像 |
| set | 為 objects 設置一個指定的特征 |
- 基礎命令 (Intermediate)
| 命令 | 描述 |
|---|---|
| explain | 查看資源的文檔 |
| get | 顯示一個或更多 resources |
| edit | 在服務器上編輯一個資源 |
| delete | 通過文件名、標准輸入、資源名稱或標簽選擇器來刪除資源 |
- 部署命令
| 命令 | 描述 |
|---|---|
| rollout | 管理資源的發布 |
| scale | 擴容或縮容Pod數量,Deployment、ReplicaSet、RC或job |
| autoscale | 創建一個自動選擇擴容或縮容並設置Pod數量 |
- 群集管理命令
| 命令 | 描述 |
|---|---|
| certificate | 修改 certificate 資源. |
| cluster-info | 顯示集群信息 |
| top | 顯示 Resource (CPU/Memory) 使用. |
| cordon | 標記 node 為 unschedulable |
| uncordon | 標記 node 為 schedulable |
| drain | 驅逐節點上的應用,准備下線維護 |
| taint | 更新一個或者多個 node 上的 taints |
- 故障診斷和調試命令
| 命令 | 描述 |
|---|---|
| describe | 顯示一個指定 resource 或者 group 的 resources 詳情 |
| logs | 輸出容器在 pod 中的日志 |
| attach | Attach 到一個運行中的 container |
| exec | 在一個 container 中執行一個命令 |
| port-forward | 轉發一個或多個本地端口到一個pod |
| proxy | 運行一個 proxy 到 Kubernetes API server |
| cp | 復制 files 和 directories 到 containers 和從容器中復制 files 和 directories. |
| auth | 檢查授權 |
| debug | 創建調試會話以對工作負載和節點進行故障排除 |
- 高級命令
| 命令 | 描述 |
|---|---|
| diff | 將實時版本與可能應用的版本區分開來 |
| apply | 通過文件名或標准輸入流(stdin)對資源進行配置 |
| patch | 使用補丁修改、更新資源的字段 |
| replace | 通過 filename 或者 stdin替換一個資源 |
| wait | 實驗性:等待一個或多個資源上的特定條件 |
| kustomize | 從目錄或URL構建kustomization目標 |
- 設置命令
| 命令 | 描述 |
|---|---|
| label | 更新在這個資源上的 labels |
| annotate | 更新一個資源的注解 |
| completion | 用於實現kubectl工具自動補全 |
- 其它命令
| 命令 | 描述 |
|---|---|
| api-resources | 打印受支持的API資源 |
| api-versions | 打印受支持的API版本 |
| config | 修改 kubeconfig 文件 |
| plugin | 運行一個命令行插件 |
| version | 輸出 client 和 server 的版本信息 |
4、使用kubectl命令的必要環境
- work節點如果想使用kubectl命令,需要從master節點復制config文件
mkdir .kube
scp k3s-master1:/root/.kube/config .kube/
# 使用命令驗證
kubectl get nodes
三、常用命令
1、node節點操作
# 得到節點信息
kubectl get node -o wide
# 刪除node節點
kubectl delete node node名稱
2、命名空間操作
# 查看所有命名空間
kubectl get namespace
# 創建命名空間
kubectl create namespace 空間名稱
# 刪除命名空間
kubectl delete namespaces 空間名稱
3、deployment操作
# 查看deployment
kubectl get deployment -n default
# 詳情
kubectl describe deployment deployment名稱 -n default
# 刪除deployment
kubectl delete deployment deployment名稱 -n default
4、pod操作
# 查看pod
kubectl get pod -n default
# pod詳情
kubectl describe pod pod名稱 -n default
# 刪除pod
kubectl delete pod pod名稱 -n default
# 前最新的200條日志
kubectl logs --tail 200 -f pod名稱 -n default
5、service操作
# 查看service
kubectl get service -n default
# 詳情
kubectl describe service svc名稱 -n default
# 刪除service
kubectl delete service svc名稱 -n default
6、顯示top資源
# 查看node top資源
kubectl top node
# 查看pod top資源
kubectl top pod --all-namespaces
7、資源清單
# 部署yaml
kubectl apply -f xxx.yaml
# 刪除yaml
kubectl delete -f xxx.yaml
四、集群資源清單(YAML)文件
1、基本語法
- 使用空格作為縮進
- 縮進的空格數目不重要,只要相同層級的元素左側對齊即可
- 低版本縮進時不允許使用Tab鍵,只允許使用空格
- 使用#標識注釋,從這個字符一直到行尾,都會被解釋器忽略
2、YAML支持的數據結構
-
對象:
- 鍵值對的集合
- 又稱為映射(mapping) / 哈希(hashes) / 字典
(dictionary)
對象類型:對象的一組鍵值對,使用冒號結構表示 name: Tom age: 18 Yaml 也允許另一種寫法,將所有鍵值對寫成一個行內對象 hash: { name: Tom, age: 18 } -
數組:
- 一組按次序排列的值
- 又稱為序列(sequence) / 列表 (list)
數組類型:一組連詞線開頭的行,構成一個數組 People - Tom - Jack 數組也可以采用行內表示法 People: [Tom, Jack] -
純量(scalars)
- 單個的、不可再分的值
純量:純量是最基本的、不可再分的值。以下數據類型都屬純量 數值直接以字面量的形式表示 number: 12.30 布爾值用true和false表示 isSet: true null用 ~ 表示 parent: ~ 時間采用 ISO8601 格式 iso8601: 2001-12-14t21:59:43.10-05:00 日期采用復合 iso8601 格式的年、月、日表示 date: 1976-07-31 YAML 允許使用兩個感嘆號,強制轉換數據類型 e: !!str 123 f: !!str true 字符串默認不使用引號表示 str: 這是一行字符串 如果字符串之中包含空格或特殊字符,需要放在引號之中 str: '內容: 字符串' 單引號和雙引號都可以使用,雙引號不會對特殊字符轉義 s1: '內容\n字符串' s2: "內容\n字符串" 單引號之中如果還有單引號,必須連續使用兩個單引號轉義 str: 'labor''s day' 字符串可以寫成多行,從第二行開始,必須有一個單空格縮 進。換行符會被轉為 空格 str: 這是一段 多行字 符串 多行字符串可以使用|保留換行符,也可以使用>折疊換行 this: | Foo Bar that Foo Bar
3、資源清單描述方法
- 在k8s中,一般使用YAML格式的文件來創建符合我們預期期望的pod,這樣的YAML文件成為資源清單。
3.1、常用字段







3.2、舉例說明
- 創建一個namespace
apiVersion: v1
kind: Namespace
metadata:
name: test
- 創建一個pod
apiVersion: v1
kind: Pod
metadata:
name: pod1
spec:
containers:
- name: nginx-containers
image: nginx:latest
五、NameSpace(命名空間)
1、場景介紹
我們接到項目組同事的第一個任務,需要准備兩套k8s集群用於開發測試及預發布,但是由
於項目組可用主機資源有限,沒有那么多主機可用,不能滿足兩套k8s集群的要求,所以播仔就想在現有的k8s集群中運行兩套環境,你覺得可行嗎?答案是可行的,我們可以使用k8s集群中的命名空間即可實現開發測試與預發布環境的隔離。
2、NameSpace介紹
- 命名空間
- 作用:多租戶情況下,實現資源隔離
- 屬於邏輯隔離
- 屬於管理邊界
- 不屬於網絡邊界
- 可以針對每個namespace做資源配額
3、查看NameSpace
kubectl get namespace
默認命名空間說明
- default 用戶創建的pod默認在此命名空間
- kube-public 所有用戶均可以訪問,包括未認證用戶
- kube-node-lease kubernetes集群節點租約狀態 v1.13加入
- kube-system kubernetes集群在使用
4、創建NameSpace
- 通過kubectl命令行創建
kubectl create namespace test
- 通過Kubectl命令應用資源清單文件創建
# 創建資源清單
vim 01-create-ns.yaml
#內容如下
apiVersion: v1
kind: Namespace
metadata:
name: demons1
# 應用資源清單文件
kubectl apply -f 01-create-ns.yaml
5、刪除NameSpace
注:刪除命名空間的同時,命名空間中包含所有的資源對象同時被刪除
- 通過kubectl命令行刪除
kubectl delete namespace test
- 通過kubectl命令應用資源清單文件刪除
kubectl delete -f 01-create-ns.yaml
六、集群核心概念 Pod
1、場景介紹
如果我們想在k8s集群中運行應用程序,應該使用什么資源對象呢?我們知道k8s集群中是不能直接運行容器的,k8s集群中最小調度單元為Pod,因此我們要使用Pod來運行應用程序。
2、Pod介紹
- Pod是kubernetes集群能夠調度的最小單元
- Pod是容器的封裝
3、查看Pod
- 查看default命名空間中的Pod
kubectl get pod
或
kubectl get pods
或
kubectl get pods --namespace default
或
kubectl get pod --namespace default
4、創建Pod
- 編寫用於創建Pod資源清單文件(02-create-pod.yaml)
apiVersion: v1
kind: Pod
metadata:
name: pod1
spec:
containers:
- name: ngninx-pod
image: nginx:latest
ports:
- name: nginxport
containerPort: 80
- 應用用於創建Pod資源清單文件
kubectl apply -f 02-create-pod.yaml
- 驗證Pod是否被創建
kubectl get pods
- 通過指定默認命名空間查看已創建pod
kubectl get pods -n default
- 查看pod更加詳細信息
kubectl get pods -o wide
5、Pod訪問
curl 10.72.1.11
6、刪除Pod
- kubectl 命令行刪除
kubectl delete pods pod1
- 通過kubectl通過Pod資源清單文件刪除
kubectl delete -f 02-create-pod.yaml
七、集群核心概念 Controller
1、Controller介紹
- 控制器
- 用於對應用運行的資源對象進行監控
- 當pod出現問題的時候,會把Pod重新拉起,以達到用戶期望的狀態
2、Controller分類
| 控制器名稱 | 作用 |
|---|---|
| Deployment | 聲明式更新控制器,用於發布無狀態應用 |
| ReplicaSet | 副本集控制器,用於對Pod進行副本規模擴大或剪裁 |
| StatefulSet | 有狀態副本集,用於發布有狀態應用 |
| DeamonSet | 在k8s集群每一個Node上運行一個副本,用於發布監控或日志收集類等應用 |
| Job | 運行一次性作業任務 |
| CronJob | 運行周期性作業任務 |
3、Deployment 控制器介紹
- 具有上線部署,滾動升級,創建副本,回滾以前某一版本(成功/穩定)等功能
- Deployment包含ReplicaSet,除非需要自定義升級功能或者不需要升級Pod,否則還是建議使用Deployment而不直接使用Replica Set。
4、創建Deployment控制器應用
4.1通過kubectl命令行創建
- kubectl命令創建
kubectl run nginx-app --image=nginx:latest --image-pull-policy=IfNotPresent --replicas=2
說明
nginx-app 是deployment控制器類型的應用名稱
nginx:latest 是應用運行的Pod中的Container所使用的鏡像
IfNotPresent 是Container容器鏡像下載策略,如果本地有鏡像,使用本地,如果本地沒有鏡像,下載鏡像
--replicas 是指應用運行的Pod共計2個副本,這是用戶的期望值
- 查看Deployment控制器類型
kubectl get deployment
或
kubectl get deployment.apps
- 查看ReplicaSet控制器類型
kubectl get replicaset
或
kubectl get replicaset.apps
4.2、通過資源清單文件創建
- 創建03-creat-deployment-app.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-app
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx-app-container
image: nginx:latest
imagePullPolicy: IfNotPresent
ports:
- name: nginx-app2
containerPort: 80
5、刪除Deployment
帶有控制器類型的Pod不能隨便刪除,如果必須刪除,請刪除控制器類型的應用名稱
- 通過kubectl命令行刪除
# 查詢
kubectl get deployment.apps
# 刪除
kubectl delete deployment.apps nginx-app
- 通過kubectl應用資源清單刪除
kubectl delete -f 03-creat-deployment-app.yaml
八、集群核心概念 Service
1、Service介紹
- 不是實體服務
- 只是一條iptables或者ipvs的轉發規則
2、Service作用
- 通過Service為Pod的客戶端提供訪問pod方法,及客戶端訪問pod入口
- Service通過pod標簽與pod進行關聯

3、Service類型
- ClusterIp
- 默認,分配一個集群內部可以訪問的虛擬IP
- NodePort
- 在每個Node上分配一個端口作為外部訪問入口
- LoadBalancer
- 工作在特定的Cloud Provide上,例如Google Cloud。AWS,OpenStack
- ExternalName
- 表示把集群外部的服務引入到集群內部中來,即實現了集群內部pod和集群外部的服務進行通信
4、Service參數
- port:訪問service使用的端口
- targetPort:Pod中容器端口
- NodePort:通過Node實現外網用戶訪問k8s集群內service(30000-3267)
5、Service創建
5.1、通過命令行創建
- 默認創建Service為ClusterIP類型
- 創建Service與Deployment類型應用關聯
kubectl expose deployment.apps nginx-app --type=ClusterIP --target-port=80 --port=80
說明
expose 創建service
deployment.apps 控制器類型
nginx-app 應用名稱,也是service名稱
--type=ClusterIP 指定service類型
--target-port=80 指定pod中容器端口
--port=80 指定service端口
5.2、通過資源清單創建
- 編寫用於創建Service資源清單文件(04-create-deployment-service-clusterip.yaml)
apiVersion: v1
kind: Service
metadata:
name: nginx-apps-svc
spec:
type: ClusterIP
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
- 創建NodePort類型Service
apiVersion: v1
kind: Service
metadata:
name: nginx-apps-svc
spec:
type: NodePort
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
nodePort: 30001
- 驗證NodePort端口
ss -anput | grep ":30090"
6、刪除service
- 通過命令行刪除
# 查詢
kubectl get service
或
kubectl get svc
# 刪除
kubectl delete service nginx-apps-svc
- 通過資源清單文件刪除
kubectl delete -f 04-create-deployment-service-clusterip.yaml
九、ingress學習
1、http代理訪問
vim 18-ingress-nginx-http-01.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-nginx-http
spec:
ingressClassName: nginx
rules:
- host: foo.bar.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-service-nodeport
port:
number: 80
- 目標重寫
vim 21-ingress-nginx-01.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-nginx-rewrite-1
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
ingressClassName: nginx
rules:
- host: foo.bar.com
http:
paths:
- path: /open/api(/|$)(.*)
pathType: Prefix
backend:
service:
name: nginx-service-nodeport
port:
number: 80
十、ConfigMap使用
- ConfigMap是一種API對象,用來將非加密數據保存到鍵值對中。可以用作環境變量、命令行參數或者存儲卷中的配置文件。
- ConfigMap就是為了讓鏡像和配置文件解耦,以便實現鏡像的可移植性和可復用性,因為一個configMap其實就是一系列配置信息的集合,將來可直接注入到Pod中的容器使用,而注入方式有兩種,一種將configMap做為存儲卷,一種是將configMap通過env中configMapKeyRef注入到容器中
1、ConfigMap創建
- 通過命令行創建
kubectl create configmap screen-config1 --from-literal=key1=hello --from-literal=key2=word
- 通過yaml文件創建
apiVersion: v1
kind: ConfigMap
metadata:
name: screen-config
data:
key1: hello
key2: world
2、ConfigMap的使用
Pod的使用方式:
- 將ConfigMap中的數據設置為容器的環境變量
apiVersion: v1
kind: Pod
metadata:
name: pod1
spec:
containers:
- name: ngninx-pod
image: nginx:latest
ports:
- name: nginxport
containerPort: 80
env:
- name: KEY1
valueFrom:
configMapKeyRef:
name: screen-config
key: key1
- name: KEY2
valueFrom:
configMapKeyRef:
name: screen-config
key: key2
- 將ConfigMap中的數據設置為命令行參數
apiVersion: v1
kind: Pod
metadata:
name: pod1
spec:
containers:
- name: ngninx-pod
image: nginx:latest
ports:
- name: nginxport
containerPort: 80
command: [ "/bin/sh","-c","echo $(KEY1) $(KEY2)"]
env:
- name: KEY1
valueFrom:
configMapKeyRef:
name: screen-config
key: key1
- name: KEY2
valueFrom:
configMapKeyRef:
name: screen-config
key: key2
3、查看ConfigMap
kubectl get configmap
十一、應用例子
- 基礎例子
apiVersion: v1
kind: Service
metadata:
name: rapid-screen-back
spec:
type: NodePort
selector:
app: screen
ports:
- protocol: TCP
port: 8080
targetPort: 8080
nodePort: 30001
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: rapid-screen-back
spec:
replicas: 2
selector:
matchLabels:
app: screen
template:
metadata:
labels:
app: screen
spec:
containers:
- name: rapid-screen-back
image: 192.168.3.12:6007/library/rapid-screen-back:v1.0.1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
- 基礎例子(命名空間、標簽)
apiVersion: v1
kind: Namespace
metadata:
name: my-springboot
---
apiVersion: v1
kind: Service
metadata:
name: rapid-screen-back
namespace: my-springboot
labels:
app: rapid-screen-back-svc
spec:
type: NodePort
selector:
app: screen
ports:
- protocol: TCP
port: 8080
targetPort: 8080
nodePort: 30001
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: rapid-screen-back
namespace: my-springboot
labels:
app: rapid-screen-back-dept
spec:
replicas: 2
selector:
matchLabels:
app: screen
template:
metadata:
labels:
app: screen
spec:
containers:
- name: rapid-screen-back
image: 192.168.3.12:6007/library/rapid-screen-back:v1.0.1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
十二、入門視頻教程
- k3s/k83學習有一定門檻,通過入門視頻教程能夠快速掌握基礎知識,推薦大家學習
- 百度網盤地址如下,推薦大家直接從第6章開始學習
鏈接:https://pan.baidu.com/s/101YH_l0DthYLvMX-5a69qA
提取碼:3faf
