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