k8s入門教程


一、k8s應用安裝

二、集群客戶端工具 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM