天天看點

Kubernetes 學習筆記(二)--- K8S應用快速入門

目錄

一、擷取資源

二、手動部署一個應用
    2.1 手動建立一個控制器deployment
    2.2 部署一個service
    2.3 動态擴縮容Pod副本
    2.4 滾動更新
    2.5 動态復原
    2.6 配置從叢集外部通路myapp
           

此篇接上一篇 《Kubernetes 學習筆記(一)--- 基本概念及利用kubeadm部署K8S》

指令

kubectl

是API Server的用戶端程式。

taints

:污點,用于描述節點的污點。Pod排程到某個節點,取決于能夠容忍某個節點的污點的最大限度。

指令:

kubectl describe node k8s-master.fhw.com

可檢視節點的污點(taints)

Kubernetes 學習筆記(二)--- K8S應用快速入門

image.png

一、擷取資源

kubectl get <資源名稱>

幫助:

kubectl get --help

使用

kubectl api-resources

擷取支援的資源的完整清單。

Kubernetes 學習筆記(二)--- K8S應用快速入門

以node資源為例:

kubectl get nodes

Kubernetes 學習筆記(二)--- K8S應用快速入門

參數:

  • -o wide 輸出格式,常用格式:json | yaml | wide;
  • -w 監控輸出結果,類似tail指令的-f選項;
  • --show-labels 顯示标簽;

擷取資源的詳細資訊:

kubectl describe node k8s-master.fhw.com

擷取叢集資訊:

[root@k8s-master .kube]# kubectl cluster-info
Kubernetes master is running at https://192.168.100.135:6443
KubeDNS is running at https://192.168.100.135:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
           

二、手動部署一個應用

2.1 手動建立一個控制器deployment

建立一個控制器

[root@k8s-master .kube]# kubectl run nginx-deploy --image=nginx:1.14-alpine --replicas=1 --port=80
deployment.apps/nginx-deploy created
           
  • --restart=[Always, OnFailure, Never]

    ,pod重新開機政策,Always是pod退出後總是立即重新開機,Never是pod退出後不再重新開機。預設是Always
  • --command -- <cmd> <arg1> ... <argN>

    ,指定在容器中運作的指令;
  • --schedule="0/5 * * * ?"

    ,建立一個Cron Job控制器。

檢視deployment清單:

[root@k8s-master .kube]# kubectl get deployment
NAME           DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
nginx-deploy   1         1         1            1           11m
           

控制器建立後,會自動部署Pod:

[root@k8s-master .kube]# kubectl get pods -o wide
NAME                          READY     STATUS    RESTARTS   AGE       IP           NODE                NOMINATED NODE
nginx-deploy-5b595999-54c56   1/1       Running   0          1h        10.244.2.3   k8s-node2.fhw.com   <none>
           

通過pod 的IP通路pod中運作的nginx服務:

curl 10.244.2.3

Kubernetes 學習筆記(二)--- K8S應用快速入門

能夠正常通路。

2.2 部署一個service

service為pod提供一個固定通路端點。

用法:

Usage:
  kubectl expose (-f FILENAME | TYPE NAME) [--port=port] [--protocol=TCP|UDP] [--target-port=number-or-name]
[--name=name] [--external-ip=external-ip-of-service] [--type=type] [options]
           

部署service

[root@k8s-master .kube]# kubectl expose deployment nginx-deploy --port=80 --target-port=80 --protocol=TCP --type=ClusterIP
service/nginx-deploy exposed
           
  • deployment

    :暴露的資源類型為控制器deployment;
  • nginx-deploy

    : deployment的名稱
  • --port=80

    : service的端口
  • --target-port=80

    : Pod的端口
  • --type=""

    : service類型有ClusterIP, NodePort, LoadBalancer, or ExternalName. Default is 'ClusterIP'.

    --

    ClusterIP

    :表示這個service隻能在群集内部通路,不能在叢集外部通路;

    NodePort

    :表示可以在叢集外部通路到;

擷取service清單:

[root@k8s-master .kube]# kubectl get svc -o wide
NAME           TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE       SELECTOR
kubernetes     ClusterIP   10.96.0.1       <none>        443/TCP   20h       <none>
nginx          ClusterIP   10.106.125.69   <none>        80/TCP    8s
           

通過service IP 通路pod中的nginx服務:

curl 10.106.125.69

Kubernetes 學習筆記(二)--- K8S應用快速入門

可以正常通路。

運作一個用戶端Pod,在用戶端Pod内部通過service的名稱去通路nginx服務。

kubectl run client -it --image=busybox --replicas=1 --restart=Never
           

如下圖,直接通過service的名稱nginx,可以正常通路:

Kubernetes 學習筆記(二)--- K8S應用快速入門

service通過label去關聯pod:

Kubernetes 學習筆記(二)--- K8S應用快速入門

這時你删除這個關聯的pod,控制器會立即啟動一個新pod,并且關聯至名為nginx這個service。

2.3 動态擴縮容Pod副本

先建立一個新應用,叫myapp:

[root@k8s-master ~]# kubectl run myapp --image=ikubernetes/myapp:v1 --replicas=2
deployment.apps/myapp created
[root@k8s-master ~]# 
[root@k8s-master ~]# kubectl get deployment -w
NAME           DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
myapp          2         2         2            2           22s
nginx-deploy   1         1         1            1           3h
[root@k8s-master ~]# 
[root@k8s-master ~]# 
[root@k8s-master ~]# kubectl get pods -o wide
NAME                          READY     STATUS    RESTARTS   AGE       IP           NODE                NOMINATED NODE
client                        1/1       Running   0          1h        10.244.2.4   k8s-node2.fhw.com   <none>
myapp-848b5b879b-fqbkd        1/1       Running   0          42s       10.244.1.6   k8s-node1.fhw.com   <none>
myapp-848b5b879b-j7lj5        1/1       Running   0          42s       10.244.2.5   k8s-node2.fhw.com   <none>
nginx-deploy-5b595999-54c56   1/1       Running   0          2h        10.244.2.3   k8s-node2.fhw.com   <none>
           

在第2.2節建立的用戶端Pod中通過ip通路建立的應用myapp:

Kubernetes 學習筆記(二)--- K8S應用快速入門

兩個Pod中的内容分别對應Pod名稱。

為myapp建立一個service。

kubectl expose deployment myapp --name=myapp --port=80

Kubernetes 學習筆記(二)--- K8S應用快速入門

再到用戶端Pod中使用service名稱myapp去通路:

Kubernetes 學習筆記(二)--- K8S應用快速入門

如圖,兩個myapp Pod做負載均衡。

将myapp擴容至5個

kubectl scale deployment myapp --replicas=5

Kubernetes 學習筆記(二)--- K8S應用快速入門

這時新增的Pod會立即加入到myapp service中接受請求。

Kubernetes 學習筆記(二)--- K8S應用快速入門

再将myapp縮減至3個

Kubernetes 學習筆記(二)--- K8S應用快速入門

2.4 滾動更新

更新myapp鏡像的版本。

[root@k8s-master ~]# kubectl set image deployment myapp myapp=ikubernetes/myapp:v2
deployment.extensions/myapp image updated
           
Kubernetes 學習筆記(二)--- K8S應用快速入門

檢視滾動更新狀态

[root@k8s-master ~]# kubectl rollout status deployment myapp
deployment "myapp" successfully rolled out
           

檢視滾動更新後的結果

Kubernetes 學習筆記(二)--- K8S應用快速入門

myapp更新過後,pod名稱也更新了

Kubernetes 學習筆記(二)--- K8S應用快速入門

檢視pod内容器的鏡像版本:

Kubernetes 學習筆記(二)--- K8S應用快速入門

2.5 動态復原

kubectl rollout undo deployment myapp

預設復原至上一版本

Kubernetes 學習筆記(二)--- K8S應用快速入門

檢視復原結果:

Kubernetes 學習筆記(二)--- K8S應用快速入門

自動擴縮容依賴于監控系統,去監控系統資源使用率,根據系統資源去判斷是否需要擴容。這個問題後續再記錄。

2.6 配置從叢集外部通路myapp

修改service myapp的類型為NodePort

kubectl edit svc myapp

Kubernetes 學習筆記(二)--- K8S應用快速入門

修改後:

Kubernetes 學習筆記(二)--- K8S應用快速入門

檢視service myapp

Kubernetes 學習筆記(二)--- K8S應用快速入門

在叢集中每個節點上都會開啟一個31679端口(這個端口是随機生成的),映射到K8S叢集的myapp service的80端口。可自行在其它節點驗證。

Kubernetes 學習筆記(二)--- K8S應用快速入門

提供給叢集外部的通路端口為31679。

外部通路位址:http://192.168.100.135:31679

在192.168.100.200這台主機上驗證,如圖:

Kubernetes 學習筆記(二)--- K8S應用快速入門

三個節點均可正常通路。

如果想通過一個固定位址去通路這個myapp,可以利用nginx做反向代理:

Kubernetes 學習筆記(二)--- K8S應用快速入門

此篇結尾:

這一篇筆記隻是示範如何通過手動去建立、更新、復原一個應用。這隻是在使用K8S中,最簡單但是無法實作其全部功能 、全部定制的一種使用方式。而在真正使用K8S時,基本不會這樣去操作。我們使用K8S的常用方式,應該是基于YAML格式的配置檔案來定義和建立資源。

下一篇學習用YAML配置檔案來建立資源。

繼續閱讀