在k8s中全部的內容都抽象爲資源,資源實例化以後,叫作對象。通常使用yaml格式的文件來建立符合咱們預期指望的pod,這樣的yaml文件咱們通常稱爲資源清單html
資源清單的格式:node
apiVersion: group/apiversion # 若是沒有給定group名稱,那麼默認爲croe,可使用kubectl api-versions 獲取當前k8s版本上全部的apiVersion版本信息(每一個版本可能不一樣) kind: #資源類別 metadata: #資源元數據 name namespace #k8s自身的namespace lables annotations #主要目的是方便用戶閱讀查找 spec:指望的狀態(disired state) status:當前狀態,本字段有kubernetes自身維護,用戶不能去定義
使用kubectl explain 獲取資源配置清單中各字段設置的幫助文檔:nginx
幫助信息中常見格式以下: apiVersion <string> #表示字符串類型 metadata <Object> #表示須要嵌套多層字段,須要查看下一級的字段幫助信息 labels <map[string]string> #表示由k:v組成的映射 finalizers <[]string> #表示字串列表 ownerReferences <[]Object> #表示對象列表 hostPID <boolean> #布爾類型 priority <integer> #整型 name <string> -required- #若是類型後面接 -required-,表示爲必填字段
----------------------------------------------------------------------------------------git
kubectl是apiserver的客戶端工具,工做在命令行下,可以鏈接apiserver上實現各類增刪改查等各類操做 kubectl官方使用文檔:https://kubernetes.io/docs/reference/kubectl/overview/
[root@k8s-master01 ~]# yum install -y bash-completion [root@k8s-master01 ~]# source /usr/share/bash-completion/bash_completion [root@k8s-master01 ~]# source <(kubectl completion bash) [root@k8s-master01 ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc
[root@k8s-master01 ~]# kubectl -h kubectl controls the Kubernetes cluster manager. Find more information at: https://kubernetes.io/docs/reference/kubectl/overview/ Basic Commands (Beginner): #基本命令集,適合新手 create Create a resource from a file or from stdin. expose 使用 replication controller, service, deployment 或者 pod 並暴露它做爲一個 新的 Kubernetes Service run 在集羣中運行一個指定的鏡像 set 爲 objects 設置一個指定的特徵 run-container 在集羣中運行一個指定的鏡像. This command is deprecated, use "run" instead Basic Commands (Intermediate): #基本命令集,適合有必定基礎的人 get 顯示一個或更多 resources explain 查看資源的文檔 edit 在服務器上編輯一個資源 delete Delete resources by filenames, stdin, resources and names, or by resources and label selector Deploy Commands: #發佈相關的命令集 rollout Manage the rollout of a resource rolling-update 完成指定的 ReplicationController 的滾動升級 scale 爲 Deployment, ReplicaSet, Replication Controller 或者 Job 設置一個新的副本數量 autoscale 自動調整一個 Deployment, ReplicaSet, 或者 ReplicationController 的副本數量 Cluster Management Commands: #集羣管理相關的命令集 certificate 修改 certificate 資源. cluster-info 顯示集羣信息 top Display Resource (CPU/Memory/Storage) usage. cordon 標記 node 爲 unschedulable uncordon 標記 node 爲 schedulable drain Drain node in preparation for maintenance taint 更新一個或者多個 node 上的 taints Troubleshooting and Debugging Commands: #故障檢測及調試相關命令集 describe 顯示一個指定 resource 或者 group 的 resources 詳情 logs 輸出容器在 pod 中的日誌 attach Attach 到一個運行中的 container exec 在一個 container 中執行一個命令 port-forward Forward one or more local ports to a pod proxy 運行一個 proxy 到 Kubernetes API server cp 複製 files 和 directories 到 containers 和從容器中複製 files 和 directories. auth Inspect authorization Advanced Commands: #高級命令集 apply 經過文件名或標準輸入流(stdin)對資源進行配置 patch 使用 strategic merge patch 更新一個資源的 field(s) replace 經過 filename 或者 stdin替換一個資源 convert 在不一樣的 API versions 轉換配置文件 Settings Commands: #設置相關的命令集 label 更新在這個資源上的 labels annotate 更新一個資源的註解 completion Output shell completion code for the specified shell (bash or zsh) Other Commands: #其餘命令集 api-versions Print the supported API versions on the server, in the form of "group/version" config 修改 kubeconfig 文件 help Help about any command plugin Runs a command-line plugin version 輸出 client 和 server 的版本信息 Usage: #使用格式 kubectl [flags] [options] Use "kubectl <command> --help" for more information about a given command. #各個子命令如何獲取命令幫助 Use "kubectl options" for a list of global command-line options (applies to all commands). #查看命令的通用選項(全部命令)
#能夠看到,命令幫助很人性化的幫咱們對各個命令作了劃分,讓咱們能夠更好的學習和使用,下面咱們開始使用kubectl命令在命令行下測試相關命令的用法github
1)建立一個應用程序,咱們使用 "kubectl run " 命令,是 "kubectl run -h" 查看命令使用幫助,命令說明告訴咱們這個命令能夠建立一個deployment或者job的容器(deployment和job是什麼意思,咱們後續再講)docker
[root@k8s-master01 ~]# kubectl run nginx-deploy --image=nginx:1.14-alpine --port=80 --replicas=1 --dry-run=true #nginx-deploy表示deployment的名稱 --image表示鏡像的地址 --port表示pod暴露的端口 --replicas表示副本的個數 --dry-run表示測試,不真正執行命令 NAME AGE nginx-deploy <unknown> [root@k8s-master01 ~]# kubectl run nginx-deploy --image=nginx:1.14-alpine --port=80 --replicas=1 #測試發現命令正常,執行命令 deployment.apps "nginx-deploy" created #提示咱們建立成功了 [root@k8s-master01 ~]# kubectl get deployment #咱們查看一下deployment的信息,是否有當前建立的 NAME(名稱) DESIRED(須要pod的個數) CURRENT(當前已經存在的個數) UP-TO-DATE(最新建立的pod個數) AVAILABLE(可用的pod個數) AGE(deployment存活的時間) nginx-deploy 1 1 1 1 12s [root@k8s-master01 ~]# kubectl get pod -o wide #獲取pod的信息,-o wide 表示更詳細的顯示信息 NAME(pod的名稱) READY(就緒的個數/總的個數) STATUS(目前的狀態) RESTARTS(重啓的次數) AGE(存活的時間) IP(pod的IP地址) NODE(部署在哪一個節點) nginx-deploy-7db697dfbd-qkdqp 1/1 Running 0 19s 10.244.2.2 k8s-node02
2)下面咱們來訪問一下這個nginx podshell
集羣內訪問api
[root@k8s-master01 ~]# curl -I 10.244.2.2 #在集羣內進行訪問,返回狀態碼爲200,訪問沒有問題 HTTP/1.1 200 OK Server: nginx/1.14.0 Date: Tue, 30 Oct 2018 03:20:33 GMT Content-Type: text/html Content-Length: 612 Last-Modified: Wed, 12 Sep 2018 00:04:31 GMT Connection: keep-alive ETag: "5b98580f-264" Accept-Ranges: bytes
集羣外部訪問bash
當咱們在集羣以外訪問是發現沒法訪問,那麼集羣以外的客戶端如何才能訪問呢?這就須要咱們的service服務了,下面咱們就建立一個service,是外部客戶端能夠訪問咱們的pod服務器
[root@k8s-master01 ~]# kubectl expose deployment nginx-deploy --name=nginx --port=80 --target-port=80 --type=NodePort # service "nginx" exposed #使用kubectl expose 能夠建立一個service ,可使用 kubectl expose -h命令查看命令幫助,因爲篇幅有限,各參數含義參考命令幫助 [root@k8s-master01 ~]# kubectl get svc -o wide #查看咱們service的詳細信息 NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 54m <none> nginx NodePort 10.107.16.3 <none> 80:30757/TCP 56s run=nginx-deploy #這是咱們新建立service的信息,使用30757端口進行映射
使用集羣外客戶端再一次訪問,須要使用集羣任意節點的IP地址加上暴露的端口號
service服務有個特色,若是端口暴露類型爲NodePort,那麼能夠經過集羣內任意一臺主機加暴露的端口進行訪問
[root@k8s-master01 ~]# kubectl get pod NAME READY STATUS RESTARTS AGE nginx-deploy-7db697dfbd-qkdqp 1/1 Running 0 2h [root@k8s-master01 ~]# kubectl delete pod nginx-deploy-7db697dfbd-qkdqp #刪除deployment下的pod pod "nginx-deploy-7db697dfbd-qkdqp" deleted [root@k8s-master01 ~]# kubectl get pod -w #而後迅速的查看pod狀態,-w是一直等待的意思,咱們能夠看到pod被刪除後系統又自動建立一個新的pod (deployment管理的pod會盡可能一直保持咱們指望的狀態) NAME READY STATUS RESTARTS AGE nginx-deploy-7db697dfbd-46x7s 0/1 ContainerCreating 0 6s nginx-deploy-7db697dfbd-46x7s 1/1 Running 0 15s
查看下deployment和service的狀態
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE nginx-deploy 1 1 1 1 2h [root@k8s-master01 ~]# kubectl get svc #service的名稱和IP沒有發生改變 NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2h nginx NodePort 10.107.16.3 <none> 80:30757/TCP 1h
再一次訪問service地址,看看是否能夠訪問成功
沒有問題,爲何咱們刪除pod以後從新建立service還可建立成功呢?這是由於service和pod直接是使用標籤來進行關聯的
[root@k8s-master01 ~]# kubectl describe svc nginx #查看nginx的信息 Name: nginx Namespace: default Labels: run=nginx-deploy #咱們看到nginx的標籤爲run=nginx-deploy Annotations: <none> Selector: run=nginx-deploy Type: NodePort IP: 10.107.16.3 Port: <unset> 80/TCP TargetPort: 80/TCP NodePort: <unset> 30757/TCP Endpoints: 10.244.1.2:80 Session Affinity: None External Traffic Policy: Cluster Events: <none> [root@k8s-master01 ~]# kubectl describe pod nginx-deploy-7db697dfbd-46x7s #在看下新建立的pod信息 Name: nginx-deploy-7db697dfbd-46x7s Namespace: default Node: k8s-node01/172.16.150.213 Start Time: Tue, 30 Oct 2018 13:06:02 +0800 Labels: pod-template-hash=3862538968 run=nginx-deploy #一樣也擁有run=nginx-deploy的標籤 Annotations: <none> Status: Running IP: 10.244.1.2
.......(如下省略)
擴容:
[root@k8s-master01 ~]# kubectl get deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx-deploy 1 1 1 1 2h
[root@k8s-master01 ~]# kubectl scale --replicas=5 deployment nginx-deploy #對名稱爲nginx-deploy類型爲deployment的對象進行擴容,有初始的1個擴容到五個
deployment.extensions "nginx-deploy" scaled
[root@k8s-master01 ~]# kubectl get pod -w #咱們能夠看到pod擴容的過程
NAME READY STATUS RESTARTS AGE
nginx-deploy-7db697dfbd-46x7s 1/1 Running 0 14m
nginx-deploy-7db697dfbd-lr7wx 0/1 ContainerCreating 0 1s
nginx-deploy-7db697dfbd-sk48l 0/1 ContainerCreating 0 1s
nginx-deploy-7db697dfbd-tdtc8 0/1 ContainerCreating 0 1s
nginx-deploy-7db697dfbd-xg25w 0/1 ContainerCreating 0 1s
nginx-deploy-7db697dfbd-xg25w 1/1 Running 0 11s
nginx-deploy-7db697dfbd-lr7wx 1/1 Running 0 12s
nginx-deploy-7db697dfbd-sk48l 1/1 Running 0 12s
nginx-deploy-7db697dfbd-tdtc8 1/1 Running 0 12s
縮減:
[root@k8s-master01 ~]# kubectl scale --replicas=3 deployment nginx-deploy #使用replicas指定咱們想要的個數便可 deployment.extensions "nginx-deploy" scaled [root@k8s-master01 ~]# kubectl get pod -w NAME READY STATUS RESTARTS AGE nginx-deploy-7db697dfbd-46x7s 1/1 Running 0 16m nginx-deploy-7db697dfbd-lr7wx 0/1 Terminating 0 2m nginx-deploy-7db697dfbd-sk48l 0/1 Terminating 0 2m nginx-deploy-7db697dfbd-tdtc8 1/1 Running 0 2m nginx-deploy-7db697dfbd-xg25w 1/1 Running 0 2m nginx-deploy-7db697dfbd-sk48l 0/1 Terminating 0 2m nginx-deploy-7db697dfbd-sk48l 0/1 Terminating 0 2m nginx-deploy-7db697dfbd-lr7wx 0/1 Terminating 0 2m nginx-deploy-7db697dfbd-lr7wx 0/1 Terminating 0 2m
6.如今咱們對nginx-deploy進行滾動升級及回滾操做,由1.14-alpine 升級到
1.15-alpine,並由1.15-alpine回滾到1.14-alpine版本(nginx在docker hub上版本信息:https://hub.docker.com/_/nginx/)
滾動升級:
[root@k8s-master01 ~]# kubectl set image deployment nginx-deploy nginx-deploy=nginx:1.15-alpine --record #具體命令及參數含義請參考命令幫助 deployment.apps "nginx-deploy" image updated [root@k8s-master01 ~]# kubectl get pod -w #觀察滾動升級的過程 NAME READY STATUS RESTARTS AGE nginx-deploy-6c7dd4d9bf-c58mr 0/1 ContainerCreating 0 3s nginx-deploy-6c7dd4d9bf-fvmt5 0/1 ContainerCreating 0 3s nginx-deploy-7db697dfbd-46x7s 1/1 Running 0 27m nginx-deploy-7db697dfbd-xg25w 1/1 Running 0 13m nginx-deploy-6c7dd4d9bf-c58mr 1/1 Running 0 28s nginx-deploy-7db697dfbd-xg25w 1/1 Terminating 0 13m nginx-deploy-6c7dd4d9bf-lp7w2 0/1 Pending 0 0s nginx-deploy-6c7dd4d9bf-lp7w2 0/1 Pending 0 0s nginx-deploy-6c7dd4d9bf-lp7w2 0/1 ContainerCreating 0 0s nginx-deploy-7db697dfbd-xg25w 0/1 Terminating 0 13m nginx-deploy-7db697dfbd-xg25w 0/1 Terminating 0 13m nginx-deploy-7db697dfbd-xg25w 0/1 Terminating 0 13m nginx-deploy-6c7dd4d9bf-fvmt5 1/1 Running 0 30s nginx-deploy-7db697dfbd-46x7s 1/1 Terminating 0 27m nginx-deploy-7db697dfbd-46x7s 0/1 Terminating 0 27m nginx-deploy-7db697dfbd-46x7s 0/1 Terminating 0 27m nginx-deploy-7db697dfbd-46x7s 0/1 Terminating 0 27m ^C[root@k8s-master01 ~]# kubectl get pod NAME READY STATUS RESTARTS AGE nginx-deploy-6c7dd4d9bf-c58mr 1/1 Running 0 41s nginx-deploy-6c7dd4d9bf-fvmt5 1/1 Running 0 41s nginx-deploy-6c7dd4d9bf-lp7w2 0/1 ContainerCreating 0 13s [root@k8s-master01 ~]# kubectl get pod #查看最後的狀態,比對一下如今的pod和以前的pod是否相同 NAME READY STATUS RESTARTS AGE nginx-deploy-6c7dd4d9bf-c58mr 1/1 Running 0 1m nginx-deploy-6c7dd4d9bf-fvmt5 1/1 Running 0 1m nginx-deploy-6c7dd4d9bf-lp7w2 1/1 Running 0 45s
查看任意一個pod的信息,看看鏡像是否升級
[root@k8s-master01 ~]# kubectl describe pod nginx-deploy-6c7dd4d9bf-c58mr Name: nginx-deploy-6c7dd4d9bf-c58mr Namespace: default Node: k8s-node02/172.16.150.214 Start Time: Tue, 30 Oct 2018 13:33:15 +0800 Labels: pod-template-hash=2738808569 run=nginx-deploy Annotations: <none> Status: Running IP: 10.244.2.5 Controlled By: ReplicaSet/nginx-deploy-6c7dd4d9bf Containers: nginx-deploy: Container ID: docker://934e8074c90e0a5114ae846a2405515885efbcf1fcba8653a66d303f94e47253 Image: nginx:1.15-alpine #image信息 Image ID: docker-pullable://docker.io/nginx@sha256:ae5da813f8ad7fa785d7668f0b018ecc8c3a87331527a61d83b3b5e816a0f03c
......(如下省略)
版本回滾:
[root@k8s-master01 ~]# kubectl rollout undo deployment nginx-deploy #--to-revision 參數能夠指定回退的版本 deployment.apps "nginx-deploy" [root@k8s-master01 ~]# kubectl get pod -w NAME READY STATUS RESTARTS AGE nginx-deploy-6c7dd4d9bf-c58mr 1/1 Running 0 7m nginx-deploy-6c7dd4d9bf-fvmt5 1/1 Running 0 7m nginx-deploy-6c7dd4d9bf-lp7w2 0/1 Terminating 0 7m nginx-deploy-7db697dfbd-gskcv 0/1 ContainerCreating 0 4s nginx-deploy-7db697dfbd-ssws8 0/1 ContainerCreating 0 4s nginx-deploy-7db697dfbd-ssws8 1/1 Running 0 11s nginx-deploy-6c7dd4d9bf-fvmt5 1/1 Terminating 0 7m nginx-deploy-7db697dfbd-2qh7v 0/1 Pending 0 0s nginx-deploy-7db697dfbd-2qh7v 0/1 Pending 0 0s nginx-deploy-7db697dfbd-2qh7v 0/1 ContainerCreating 0 0s nginx-deploy-6c7dd4d9bf-fvmt5 0/1 Terminating 0 7m nginx-deploy-6c7dd4d9bf-lp7w2 0/1 Terminating 0 7m nginx-deploy-6c7dd4d9bf-lp7w2 0/1 Terminating 0 7m ....(如下省略)
查看任意一個pod的信息,看看鏡像是否回滾到1.14-alpine版本
[root@k8s-master01 ~]# kubectl get pod NAME READY STATUS RESTARTS AGE nginx-deploy-7db697dfbd-2qh7v 1/1 Running 0 5m nginx-deploy-7db697dfbd-gskcv 1/1 Running 0 5m nginx-deploy-7db697dfbd-ssws8 1/1 Running 0 5m [root@k8s-master01 ~]# kubectl describe pod nginx-deploy-7db697dfbd-2qh7v #查看任意一個pod的版本信息,查看是否回滾到1.14版本 Name: nginx-deploy-7db697dfbd-2qh7v Namespace: default Node: k8s-node02/172.16.150.214 Start Time: Tue, 30 Oct 2018 13:40:55 +0800 Labels: pod-template-hash=3862538968 run=nginx-deploy Annotations: <none> Status: Running IP: 10.244.2.7 Controlled By: ReplicaSet/nginx-deploy-7db697dfbd Containers: nginx-deploy: Container ID: docker://b75740e5919bd975755b256c83e03b63ea95cf2307ffc606abd03b59fea6634a Image: nginx:1.14-alpine Image ID: docker-pullable://docker.io/nginx@sha256:8976218be775f4244df2a60a169d44606b6978bac4375192074cefc0c7824ddf
下面咱們對剛剛操做的命令作一個大體的總結:
kubectl run #建立一個deployment或job來管理建立的容器 kubectl get #顯示一個或多個資源,可使用標籤過濾,默認查看當前名稱空間的資源 kubectl expose #將一個資源暴露爲一個新的kubernetes的service資源,資源包括pod (po), service (svc), replicationcontroller (rc),deployment(deploy), replicaset (rs) kubectl describe #顯示特定資源或資源組的詳細信息 kubectl scale #能夠對Deployment, ReplicaSet, Replication Controller, 或者StatefulSet設置新的值,能夠指定一個或多個先決條件 kubectl set #更改現有的應用程序資源 kubectl rollout #資源回滾管理