K8s快速入門

在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

1、前言

kubectl是apiserver的客戶端工具,工做在命令行下,可以鏈接apiserver上實現各類增刪改查等各類操做
kubectl官方使用文檔:https://kubernetes.io/docs/reference/kubectl/overview/

2、設置kubectl輸入命令自動補全

[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

3、使用kubectl進行增、刪、查、改等經常使用操做

1.查看kubectl命令幫助

[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

2.建立一個應用程序

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服務器

3)建立一個service

[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,那麼能夠經過集羣內任意一臺主機加暴露的端口進行訪問

4)如今咱們來刪除剛剛參加的pod,看看會發生什麼

[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
.......(如下省略)

5)下面咱們來嘗試手動對nginx-deploy這個deployment進行擴容和縮減操做

擴容:

[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   #資源回滾管理
相關文章
相關標籤/搜索