kubernetes-核心概念及創建應用(六)


kubernetes是什么:

•Kubernetes是Google在2014年開源的一個容器集群管理系統,Kubernetes簡稱K8S。
•K8S用於容器化應用程序的部署,擴展和管理。
•K8S提供了容器編排,資源調度,彈性伸縮,部署管理,服務發現等一系列功能。
•Kubernetes目標是讓部署容器化應用簡單高效。
官方網站:http://www.kubernetes.io

kubernetes特性:
自我修復:在節點故障時重新啟動失敗的容器,替換和重新部署,保證預期的副本數量;殺死健康檢查失敗的容器,並且在未准備好之前不會處理客戶端請求,確保線上服務不中斷。
彈性伸縮:使用命令、UI或者基於CPU使用情況自動快速擴容和縮容應用程序實例,保證應用業務高峰並發時的高可用性;業務低峰時回收資源,以最小成本運行服務。
自動部署和回滾:K8S采用滾動更新策略更新應用,一次更新一個Pod,而不是同時刪除所有Pod,如果更新過程中出現問題,將回滾更改,確保升級不受影響業務。
服務發現和負載均衡:K8S為多個容器提供一個統一訪問入口(內部IP地址和一個DNS名稱),並且負載均衡關聯的所有容器,使得用戶無需考慮容器IP問題。
機密和配置管理:管理機密數據和應用程序配置,而不需要把敏感數據暴露在鏡像里,提高敏感數據安全性。並可以將一些常用的配置存儲在K8S中,方便應用程序使用。
存儲編排:掛載外部存儲系統,無論是來自本地存儲,公有雲(如AWS),還是網絡存儲(如NFS、GlusterFS、Ceph)都作為集群資源的一部分使用,極大提高存儲使用靈活性。
批處理:提供一次性任務,定時任務;滿足批量數據處理和分析的場景。

kubernetes核心概念:

Pod

Pod是最小部署單元,每個Pod包含一個或多個容器,Pod中的容器會作為一個整體被Master調度到一個Node上運行。

Kubernetes引入Pod主要基於下面兩個目的:

1、可管理性
有些容器天生就是需要緊密聯系,一起工作。Pod 提供了比容器更高層次的抽象,將它們封裝到一個部署單元中。Kubernetes 以 Pod 為最小單位進行調度、擴展、共享資源、管理生命周期

2、通信和資源共享
Pod中的所有容器使用同一個網絡namespace即相同的IP地址和Port空間,它們可以直接用localhost通信。同樣的,這些容器可以共享存儲,當Kubernetes掛載volume到Pod本質上是將volume掛載到Pod中的每一個容器。
Controllers

Kubernetes 通常不會直接創建Pod,而是通過Controller來管理Pod的。Controller中定義了Pod的部署特性,比如有幾個副本,在什么樣的Node上運行等。為了滿足不同的業務場景,Kubernetes 提供了多種 Controller,包括 Deployment、ReplicaSet、DaemonSet、StatefuleSet、Job 等。

Deployment :無狀態應用部署。是最常用的 Controller,Deployment可以管理Pod的多個副本,並確保Pod按照期望的狀態運行。
ReplicaSet :確保預期的Pod副本數量。使用Deployment時會自動創建ReplicaSet,也就是說Deployment是通過ReplicaSet來管理Pod的多個副本,我們通常不需要直接使用ReplicaSet。
DaemonSet :用於每個Node最多只運行一個Pod副本的場景。正如其名稱所揭示的,DaemonSet通常用於運行daemon。
StatefulSet :有狀態應用部署。能夠保證Pod的每個副本在整個生命周期中名稱是不變的。當某個Pod發生故障需要刪除並重新啟動時,Pod的名稱會發生變化。同時會保證副本按照固定的順序啟動、更新或者刪除。
Job :一次性任務。用於運行結束就刪除的應用。
Cronjob :定時任務
Service

防止Pod失聯。定義一組Pod的訪問策略。

Deployment可以部署多個副本,每個Pod都有自己的IP,而Pod很可能會被頻繁地銷毀和重啟,它們的IP會發生變化,用IP來訪問不太現實。
Kubernetes Service 定義了外界訪問一組特定Pod的方式。Service有自己的IP和端口,Service為Pod提供了負載均衡。
Kubernetes 運行容器(Pod)與訪問容器(Pod)這兩項任務分別由 Controller 和 Service 執行。
Namespaces

命名空間,將對象邏輯上隔離

Namespace 可以將一個物理的Cluster邏輯上划分成多個虛擬Cluster,每個Cluster就是一個Namespace。不同Namespace里的資源是完全隔離的。

Kubernetes 默認創建了兩個 Namespace。
default -- 創建資源時如果不指定,將被放到這個Namespace中。
kube-system -- Kubernetes 自己創建的系統資源將放到這個Namespace中。
Label

標簽,附加到某個資源上,用於關聯對象、查詢和篩選

K8s資源對象上的key/value對。同一個對象的labels屬性的key必須唯一。label可以附加到各種資源對象上,如Node,Pod,Service,RC等。
通過給指定的資源對象捆綁一個或多個不用的label來實現多維度的資源分組管理功能,以便於靈活,方便地進行資源分配,調度,配置,部署等管理工作。
默認配置下,Scheduler會將Pod調度到所有可用的 Node。不過有些實際情況我們希望將 Pod部署到指定的Node,比如將有大量磁盤 I/O 的 Pod 部署到配置了 SSD 的 Node;或者 Pod 需要 GPU,需要運行在配置了 GPU 的節點上。

kubectl命令行管理工具

kubectl命令常用選項:

kubectl工具管理資源

創建應用

[root@k8s-master1 ~]# kubectl run nginx --replicas=3 --image=nginx:1.14 --port=80
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/nginx created
[root@k8s-master1 ~]# kubectl get deploy,pods
NAME                          READY   UP-TO-DATE   AVAILABLE   AGE
deployment.extensions/nginx   1/3     3            1           32s

NAME                         READY   STATUS              RESTARTS   AGE
pod/nginx-7bc87ddb4d-cwptc   0/1     ContainerCreating   0          32s
pod/nginx-7bc87ddb4d-krl94   0/1     ContainerCreating   0          32s
pod/nginx-7bc87ddb4d-xzbjn   1/1     Running             0          32s

發布

[root@k8s-master1 ~]# kubectl expose deployment nginx --port=80 --type=NodePort --target-port=80 --name=nginx-service
service/nginx-service exposed
[root@k8s-master1 ~]# kubectl get service
NAME            TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
kubernetes      ClusterIP   10.0.0.1     <none>        443/TCP        19h
nginx-service   NodePort    10.0.0.201   <none>        80:37857/TCP   36s

更新

[root@k8s-master1 ~]# kubectl set image deployment/nginx nginx=nginx:1.15
[root@k8s-master1 ~]# kubectl get deploy,pods -o wide
NAME                          READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES       SELECTOR
deployment.extensions/nginx   3/3     3            3           9m44s   nginx        nginx:1.15   run=nginx

NAME                         READY   STATUS    RESTARTS   AGE   IP            NODE            NOMINATED NODE   READINESS GATES
pod/nginx-6f7d58d4cc-24x56   1/1     Running   0          6s    172.17.92.2   192.168.0.126   <none>           <none>
pod/nginx-6f7d58d4cc-jnlx7   1/1     Running   0          14s   172.17.92.3   192.168.0.126   <none>           <none>
pod/nginx-6f7d58d4cc-wpk6n   1/1     Running   0          28s   172.17.19.3   192.168.0.125   <none>           <none>

回滾

[root@k8s-master1 ~]# kubectl rollout history deployment/nginx
deployment.extensions/nginx 
REVISION  CHANGE-CAUSE
1         <none>
2         <none>

[root@k8s-master1 ~]# kubectl rollout undo deployment/nginx
deployment.extensions/nginx rolled back
[root@k8s-master1 ~]# kubectl get deploy,pods -o wide
NAME                          READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES       SELECTOR
deployment.extensions/nginx   3/3     3            3           11m   nginx        nginx:1.14   run=nginx

NAME                         READY   STATUS    RESTARTS   AGE   IP            NODE            NOMINATED NODE   READINESS GATES
pod/nginx-7bc87ddb4d-nqc6f   1/1     Running   0          44s   172.17.19.2   192.168.0.125   <none>           <none>
pod/nginx-7bc87ddb4d-tqmxl   1/1     Running   0          40s   172.17.92.3   192.168.0.126   <none>           <none>
pod/nginx-7bc87ddb4d-zstkj   1/1     Running   0          42s   172.17.92.2   192.168.0.126   <none>           <none>

刪除

[root@k8s-master1 ~]# kubectl delete deploy/nginx
deployment.extensions "nginx" deleted
[root@k8s-master1 ~]# kubectl delete svc/nginx-service
service "nginx-service" deleted

 YAML配置文件管理資源

配置文件說明:

定義配置時,指定最新穩定版API(當前為v1);
配置文件應該存儲在集群之外的版本控制倉庫中。如果需要,可以快速回滾配置、重新創建和恢復;
應該使用YAML格式編寫配置文件,而不是JSON。盡管這些格式都可以使用,但YAML對用戶更加友好;
可以將相關對象組合成單個文件,通常會更容易管理;
不要沒必要的指定默認值,簡單和最小配置減少錯誤;
在注釋中說明一個對象描述更好維護。

語法格式:

•縮進表示層級關系
•不支持制表符“tab”縮進,使用空格縮進
•通常開頭縮進2 個空格
•字符后縮進1 個空格,如冒號、逗號等
•“---” 表示YAML格式,一個文件的開始
•“#”注釋

以YAML文件方式創建deployment

[root@k8s-master1 nginx]# vim nginx-deployment.yaml
apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: default
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.15
        ports:
        - containerPort: 80

[root@k8s-master1 nginx]# kubectl create -f nginx-deployment.yaml
deployment.apps/nginx-deployment created

查看deployment,pod

[root@k8s-master1 nginx]# kubectl get deploy,pod
NAME                                     READY   UP-TO-DATE   AVAILABLE   AGE
deployment.extensions/nginx-deployment   3/3     3            3           2m4s

NAME                                    READY   STATUS    RESTARTS   AGE
pod/nginx-deployment-5fc86c987f-cx9t7   1/1     Running   0          2m4s
pod/nginx-deployment-5fc86c987f-gj2v9   1/1     Running   0          2m4s
pod/nginx-deployment-5fc86c987f-r5w7n   1/1     Running   0          2m4s

對副本數進行擴容

[root@k8s-master1 nginx]# kubectl scale deployment nginx-deployment --replicas 5
deployment.extensions/nginx-deployment scaled [root@k8s-master1 nginx]# kubectl get deploy,pod -o wide NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR deployment.extensions/nginx-deployment 5/5 5 5 18m nginx nginx:1.15 app=nginx NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES pod/nginx-deployment-5fc86c987f-cx9t7 1/1 Running 0 18m 172.17.19.3 192.168.0.125 <none> <none> pod/nginx-deployment-5fc86c987f-gj2v9 1/1 Running 0 18m 172.17.92.2 192.168.0.126 <none> <none> pod/nginx-deployment-5fc86c987f-q7rhb 1/1 Running 0 4s 172.17.92.3 192.168.0.126 <none> <none> pod/nginx-deployment-5fc86c987f-r5w7n 1/1 Running 0 18m 172.17.19.2 192.168.0.125 <none> <none> pod/nginx-deployment-5fc86c987f-sqksm 1/1 Running 0 4s 172.17.19.4 192.168.0.125 <none>

使用service提供外部訪問

[root@k8s-master1 nginx]# vim nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  labels:
    app: nginx
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: nginx


[root@k8s-master1 nginx]# kubectl create -f nginx-service.yaml 
service/nginx-service created
[root@k8s-master1 nginx]# kubectl get svc -o wide
NAME            TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE   SELECTOR
kubernetes      ClusterIP   10.0.0.1     <none>        443/TCP        20h   <none>
nginx-service   NodePort    10.0.0.194   <none>        80:41854/TCP   20s   app=nginx

瀏覽器訪問Node IP:41854

幫助生成YAML文件的方式
•用run命令生成
kubectl run --image=nginx my-deploy -o yaml --dry-run > my-deploy.yaml
•用get命令導出
kubectl get my-deploy/nginx-o=yaml --export > my-deploy.yaml
•Pod容器的字段拼寫忘記了
kubectl explain pods.spec.containers


免責聲明!

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



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