1. 程式人生 > 其它 >03-K8S Basic-kubernetes應用快速入門

03-K8S Basic-kubernetes應用快速入門

回顧

  • k8s有三個網路
    • 節點網路
    • pod網路
    • service網路
  • 整個K8S系統不過是在master上控制層面有三個核心元件
    • 1.平面控制 API Server(唯一可以接入API Server就是master主機的6443埠)
      • 部署完成後預設監控在master節點的6443埠上
      • 唯一可以介入到API Server的介面就是master主機節點地址的6443埠
      • API Server預設情況下要做使用者認證
    • 2、Scheduler負責排程某一node節點來執行pod
    • 3、Contorller 控制器(統稱)
    • 4、Service

一、kubectl就是API Server客戶端程式

1.1、API Server介紹

  • k8s API Server提供了k8s各類資源物件(pod,RC,Service等)的增刪改查及watch等HTTP Rest介面,是整個系統的資料匯流排和資料中心。

1.1.1、API Server的功能

  • API資源型別
  • kubernetes API Server的功能(唯一可以接入API Server就是master主機的6443埠):

    • 提供了叢集管理的REST API介面(包括認證授權、資料校驗以及叢集狀態變更); (REST API表徵狀態轉移)
    • 提供其他模組之間的資料互動和通訊的樞紐(其他模組通過API Server查詢或修改資料,只有API Server才直接操作etcd);
    • 是資源配額控制的入口;
    • 擁有完備的叢集安全機制.
  • API Server資源

    • api介面中的資源分成多個邏輯組合
    • 每個組合:API Group,api群組
    • 每個組可以獨立演進
    • 每個組還可以多版本並存
  • 資源物件的配置格式

    • API Server接受和返回的所有JSON物件都遵循同一個模式,它們都具有“Kind" 和 “api version” 欄位,用於標識物件所屬的資源型別、API群組及相關的版本
    • 大多數的物件或列表型別的資源還具有三個巢狀型的字典 metadata、apec和status
      • metadata : 欄位為資源提供的元資料資訊,例如:名稱、隸屬的名稱空間和標籤等
      • apec:用於定義使用者期望的狀態,不同的資源型別,其狀態的意義各有不同,例如pod資源最為核心的功能在於執行容器
      • stats :則記錄著活動物件當前的狀態,它由kubernetes系統自行維護,對於使用者來說為只讀欄位
    • kubectl api-resources 命令可以獲取叢集支援使用的所有資源型別
  • 和解迴圈(Reconciliation Loop)

    • 客戶端向API Server提交POST請求以建立物件
      • 通過JSON格式的body提交
      • YAML格式需要事先完成向JSON的轉換
      • 物件配置資訊保存於etcd中,其定義出的狀態也成為“期望的狀態(Spec)”
    • stats由控制器通過各界迴圈(loop)不間斷地監控著相關地物件地狀態,在物件地當前狀態發生改變時執行合適地操作當前狀態無限接近期望地狀態
  • 管理資源物件

1.1.2、kube-apiserver工作原理

  • kube-apiserver提供了k8s的rest api,實現了認證、授權和准入控制等安全功能,同時也負責了叢集狀態的儲存操作。
  • kube-apiserver工作原理圖
  • rest api

    • kube-apiserver支援同時提供https和http api,其中http api是非安全介面,不做任何認證授權機制,不建議生產環境啟用,但兩個介面提供的rest api格式相同。
    • https api 預設監聽在6443埠(–secure-port=6443);
    • http api 預設監聽在127.0.0.1的8080埠(使用引數 --insecure-port=8080);
  • 訪問控制說明

    • k8s api 每個請求都會經過多階段的訪問控制才會被接受,包括認證、授權及准入控制等。
    • 認證
      • 開啟TLS情況下,所有請求都需要首先認證。k8s支援多種認證機制,並且支援同時開啟多個認證外掛(僅一個認證通過即可),如認證成功,則使用者的username會傳入授權模組做進一步的授權驗證,而認證失敗的請求則返回http 401
    • 授權
      • 認證之後的請求就到了授權模組,和認證類似,k8s也支援多種授權機制,並支援同時開啟多個授權外掛(僅一個驗證通過即可)。如授權成功,則使用者的請求會發送到准入控制模組做進一步的請求驗證,失敗的請求則返回http403
    • 准入控制
      • 用來對請求做進一步的驗證或新增預設引數,不同於認證和授權只關心請求的使用者和操作,准入控制還會處理請求的內容,並且僅對建立、更新、刪除或連線(如代理)等有效,而對讀操作無效。准入控制也支援同時開啟多個外掛,但他們是依次呼叫的,只有全部外掛都通過的請求才可以允許進入系統

1.1.3、訪問kubernetes API

k8s通過kube-apiserver這個程序提供服務,該程序執行在單個k8s-master節點上,預設有兩個埠。

  • 本地埠

    • 1.該埠用於接收HTTP請求;
    • 2.該埠預設值為8080,可以通過API Server的啟動引數“–insecure-port”的值來修改預設值;
    • 3.預設的IP地址為“localhost”,可以通過啟動引數“–insecure-bind-address”的值來修改該IP地址;
    • 4.非認證或授權的HTTP請求通過該埠訪問API Server;
  • 安全埠

    • 1.該埠預設值為6443,可通過啟動引數“–secure-port”的值來修改預設值;
    • 2.預設IP地址為非本地(Non-Localhost)網路埠,通過啟動引數“–bind-address”設定該值;
    • 3.該埠用於接收HTTPS請求;
    • 4.用於基於Tocken檔案或客戶端證書及HTTP Base的認證;
    • 5.用於基於策略的授權;
    • 6.預設不啟動HTTPS安全訪問控制
1.1.3.1、直接訪問api(瞭解即可)
  • 通過本地8080埠使用curl命令能直接獲取REST api的資訊,例如:
檢視所有支援的api
    ~]# kubectl api-versions
        admissionregistration.k8s.io/v1
        admissionregistration.k8s.io/v1beta1
        apiextensions.k8s.io/v1
        apiextensions.k8s.io/v1beta1
        apiregistration.k8s.io/v1
        apiregistration.k8s.io/v1beta1
        apps/v1                    # 控制器API群組
        authentication.k8s.io/v1
        authentication.k8s.io/v1beta1
        authorization.k8s.io/v1
        authorization.k8s.io/v1beta1
        autoscaling/v1
        autoscaling/v2beta1
        autoscaling/v2beta2
        batch/v1
        batch/v1beta1
        certificates.k8s.io/v1beta1
        coordination.k8s.io/v1
        coordination.k8s.io/v1beta1
        csi.storage.k8s.io/v1alpha1
        events.k8s.io/v1beta1
        extensions/v1beta1
        metrics.k8s.io/v1beta1
        networking.k8s.io/v1
        networking.k8s.io/v1beta1
        node.k8s.io/v1beta1
        policy/v1beta1
        rbac.authorization.k8s.io/v1
        rbac.authorization.k8s.io/v1beta1
        scheduling.k8s.io/v1
        scheduling.k8s.io/v1beta1
        storage.k8s.io/v1
        storage.k8s.io/v1beta1
        v1                       #pod為api核心版本的v1當中
 
 
 
 
 
檢視版本:
       curl  127.0.0.1:8080/api
檢視支援的資源物件:
       curl  127.0.0.1:8080/api/v1
檢視資源物件資訊:
       curl  127.0.0.1:8080/api/v1/nodes
       curl  127.0.0.1:8080/api/v1/pods
       curl  127.0.0.1:8080/api/v1/services
       curl  127.0.0.1:8080/api/v1/replicationcontrollers
具體到某一個具體的物件:
       curl 127.0.0.1:8080/api/v1/nodes/10.0.0.3
指定不同namespace中的物件進行訪問:
       curl  http://127.0.0.1:8080/api/v1/namespaces/default/services/php-apache
直接訪問後端服務內容:
       curl  http://127.0.0.1:8080/api/v1/namespaces/default/services/http:tomcat-service:/proxy/
       curl  http://127.0.0.1:8080/api/v1/namespaces/default/services/http:php-apache:/proxy/
其他的API資訊:
       curl 127.0.0.1:8080/apis/batch/v1

1.1.3.2、Kubernetes Proxy

  • Kubernetes Proxy主要用於代理REST請求。 可以通過這種代理方式將API Server收到的REST請求轉發到某個Node上的kubelet上,由Kubelet負責響應。
建立一個Proxy 介面(此處建立一個監聽本地10.0.0.1上的8001埠):
    kubectl proxy --port=8001 --accept-hosts='.*' --address='10.0.0.1' &
 
 
 如果需要對訪問的資源和源地址進行限制,可以使用正則進行匹配,限制對services進行訪問:
     kubectl  proxy --port=8001  --accept-hosts='.*'  --address=10.0.0.1  --reject-paths='^/api/v1/services'
 
 
通過此埠可以在外部直接訪問此api代理,在新的版本中,訪問方式和常規訪問的URL一致:
    curl  http://10.0.0.1:8001/api/v1/pods
    curl  http://10.0.0.1:8001/api/v1/nodes
    curl  http://10.0.0.1:8001/api/v1/services
    curl  http://10.0.0.1:8001/api/v1/replicationcontrollers
    curl  http://10.0.0.1:8001/api/v1/namespaces/default/pods/tomcat-deployment-65799d5fc4-5dx4h
    curl  http://10.0.0.1:8001/api/v1/namespaces/default/services/http:php-apache:/proxy/
    curl  10.0.0.1:8001/apis/batch/v1

1.2、API Server客戶端-kubectl

1.2.1、kubectl概述

  • kubectl是Kubernetes叢集的命令列工具,通過kubectl能夠對叢集本身進行管理,並能夠在叢集上進行容器化應用的安裝部署。執行kubectl命令的語法如下所示:
$ kubectl [command] [TYPE] [NAME] [flags]
 
 
#comand:
    指定要對資源執行的操作,例如:create、get、describe和delete
 
 
#type:
    指定資源型別,資源型別是大小敏感的。開發者能夠以單數、複數和縮略的形式,例如:
    $ kubectl get pod pod1
    $ kubectl get pods pod1
    $ kubectl get po pod1
 
 
#name:
    指定資源的名稱,名稱也是大小寫敏感的,如果省略名稱,則會顯示所有資源,例如:
    $ kubectl get pods
 
 
#flags:
    指定可選的引數,例如,使用-s或者--server引數指定kubernetes API Server的地址和埠
    另外,可以通過kubectl help獲取更多的資訊
 
 
~]# kubectl
#新手使用的基本命令
Basic Commands (Beginner):
  create         Create a resource from a file or from stdin.  在伺服器上增加一個資源
  expose         使用 replication controller, service, deployment 或者 pod 並暴露它作為一個 新的Kubernetes Service
  run            在叢集中執行一個指定的映象
  set            為 objects 設定一個指定的特徵
  
#中級基礎命令
Basic Commands (Intermediate):
  explain        檢視資源的文件
  get            顯示一個或更多 resources
  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  滾動、回滾
  scale          為 Deployment, ReplicaSet, Replication Controller 或者 Job 設定一個新的副本數量
  autoscale      自動調整一個 Deployment, ReplicaSet, 或者 ReplicationController 的副本數量
  
#叢集管理相關的命令
Cluster Management Commands:
  certificate    修改 certificate(證書) 資源.
  cluster-info   顯示叢集資訊
  top            Display Resource (CPU/Memory/Storage) usage.   cpu、記憶體、儲存
  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替換一個資源                  替換
  wait           Experimental: Wait for one condition on one or many resources
  convert        在不同的 API versions 轉換配置檔案
  
#設定命令
Settings Commands:
  label          更新在這個資源上的 labels                             打標籤
  annotate       更新一個資源的註解                                    #註解,比labels簡單,可打上長度不受限制的K/V對
  completion     Output shell completion code for the specified shell (bash or zsh)     命令補全
  
#其餘的命令
Other Commands:
  alpha          Commands for features in alpha
  api-resources  Print the supported API resources on the server
  api-versions   Print the supported API versions on the server, in the form of "group/version"
  config         修改 kubeconfig 檔案
  plugin         Runs a command-line plugin      關於外掛
  version        輸出 client 和 server 的版本資訊

1.3、kubectl常用命令表格

  • kubectl作為kubernetes的命令列工具,主要的職責就是對叢集中的資源的物件進行操作,這些操作包括對資源物件的建立、刪除和檢視等。下表中顯示了kubectl支援的所有操作,以及這些操作的語法和描述資訊:
操作 語法 描述
annotate kubectl annotate (-f FILENAME | TYPE NAME | TYPE/NAME) KEY_1=VAL_1 … KEY_N=VAL_N [–overwrite] [–all] [–resource-version=version] [flags] 新增或更新一個或多個資源的註釋
api-versions kubectl api-versions [flags] 列出可用的API版本
apply kubectl apply -f FILENAME [flags] 將來自於檔案或stdin的配置變更應用到主要物件中
attach kubectl attach POD -c CONTAINER [-i] [-t] [flags] 連線到正在執行的容器上,以檢視輸出流或與容器互動(stdin)
autoscale kubectl autoscale (-f FILENAME | TYPE NAME | TYPE/NAME) [–min=MINPODS] –max=MAXPODS [–cpu-percent=CPU] [flags] 自動擴宿容由副本控制器管理的Pod
cluster-info kubectl cluster-info [flags] 顯示群集中的主節點和服務的的端點資訊
config kubectl config SUBCOMMAND [flags] 修改kubeconfig檔案
create kubectl create -f FILENAME [flags] 從檔案或stdin中建立一個或多個資源物件
delete kubectl delete (-f FILENAME | TYPE [NAME | /NAME | -l label | –all]) [flags] 刪除資源物件
describe kubectl describe (-f FILENAME | TYPE [NAME_PREFIX | /NAME | -l label]) [flags] 顯示一個或者多個資源物件的詳細資訊
edit kubectl edit (-f FILENAME | TYPE NAME | TYPE/NAME) [flags] 通過預設編輯器編輯和更新伺服器上的一個或多個資源物件
exec kubectl exec POD [-c CONTAINER] [-i] [-t] [flags] [– COMMAND [args…]] 在Pod的容器中執行一個命令
explain kubectl explain [–include-extended-apis=true] [–recursive=false] [flags] 獲取Pod、Node和服務等資源物件的文件
expose kubectl expose (-f FILENAME | TYPE NAME | TYPE/NAME) [–port=port] [–protocol=TCP|UDP] [–target-port=number-or-name] [–name=name] [—-external-ip=external-ip-of-service] [–type=type] [flags] 為副本控制器、服務或Pod等暴露一個新的服務
get kubectl get (-f FILENAME | TYPE [NAME | /NAME | -l label]) [–watch] [–sort-by=FIELD] [[-o | –output]=OUTPUT_FORMAT] [flags] 列出一個或多個資源
label kubectl label (-f FILENAME | TYPE NAME | TYPE/NAME) KEY_1=VAL_1 … KEY_N=VAL_N [–overwrite] [–all] [–resource-version=version] [flags] 新增或更新一個或者多個資源物件的標籤
logs kubectl logs POD [-c CONTAINER] [–follow] [flags] 顯示Pod中一個容器的日誌
patch kubectl patch (-f FILENAME | TYPE NAME | TYPE/NAME) –patch PATCH [flags] 使用策略合併補丁過程更新資源物件中的一個或多個欄位
port-forward kubectl port-forward POD [LOCAL_PORT:]REMOTE_PORT […[LOCAL_PORT_N:]REMOTE_PORT_N] [flags] 將一個或多個本地埠轉發到Pod
proxy kubectl proxy [–port=PORT] [–www=static-dir] [–www-prefix=prefix] [–api-prefix=prefix] [flags] 為kubernetes API伺服器執行一個代理
replace kubectl replace -f FILENAME 從檔案或stdin中替換資源物件
rolling-update kubectl rolling-update OLD_CONTROLLER_NAME ([NEW_CONTROLLER_NAME] –image=NEW_CONTAINER_IMAGE | -f NEW_CONTROLLER_SPEC) [flags] 通過逐步替換指定的副本控制器和Pod來執行滾動更新
run kubectl run NAME –image=image [–env=”key=value”] [–port=port] [–replicas=replicas] [–dry-run=bool] [–overrides=inline-json] [flags] 在叢集上執行一個指定的映象
scale kubectl scale (-f FILENAME | TYPE NAME | TYPE/NAME) –replicas=COUNT [–resource-version=version] [–current-replicas=count] [flags] 擴宿容副本集的數量
version kubectl version [–client] [flags] 顯示執行在客戶端和伺服器端的Kubernetes版本

1.4、kubectl實戰命令

1.4.1、叢集資訊檢視

1.4.1.1、顯示叢集資訊及節點詳細資訊 kubectl get

1、顯示叢集節點資訊
    ~]# kubectl get nodes
    NAME            STATUS   ROLES    AGE   VERSION
    192.168.1.141   Ready    <none>   41m   v1.16.4
    192.168.1.185   Ready    <none>   37m   v1.16.4
    192.168.1.211   Ready    <none>   42m   v1.16.4
    192.168.1.247   Ready    <none>   36m   v1.16.4
    192.168.1.51    Ready    <none>   33m   v1.16.4
 
2、檢視kubectl和apiserver各自的版本
    ~]# kubectl version
    Client Version: version.Info{Major:"1", Minor:"16", GitVersion:"v1.16.4", GitCommit:"224be7bdce5a9dd0c2fd0d46b83865648e2fe0ba", GitTreeState:"clean", BuildDate:"2019-12-11T12:47:40Z", GoVersion:"go1.12.12", Compiler:"gc",   Platform:"linux/amd64"}
    Server Version: version.Info{Major:"1", Minor:"16", GitVersion:"v1.16.4", GitCommit:"224be7bdce5a9dd0c2fd0d46b83865648e2fe0ba", GitTreeState:"clean", BuildDate:"2019-12-11T12:37:43Z", GoVersion:"go1.12.12", Compiler:"gc", Platform:"linux/amd64"}
 
3、檢視整個叢集的資訊
    ~]# kubectl cluster-info
    #向外輸出的API地址
    Kubernetes master is running at https://192.168.1.129:6443
    #coredns  從叢集外部執行獲取路徑,叢集外部的埠轉發的訪問方式
    CoreDNS is running at https://192.168.1.129:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
    To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
 
 
 
4、檢視一個node節點的詳細資訊
~]# kubectl describe node 192.168.1.141
Name:               192.168.1.141
Roles:              <none>
Labels:             UhostID=uhost-jjckmq54
                    beta.kubernetes.io/arch=amd64
                    beta.kubernetes.io/os=linux
                    failure-domain.beta.kubernetes.io/region=cn-bj2
                    failure-domain.beta.kubernetes.io/zone=cn-bj2-05
                    kubernetes.io/arch=amd64
                    kubernetes.io/hostname=192.168.1.141
                    kubernetes.io/os=linux
                    node.uk8s.ucloud.cn/instance_type=uhost
                    node.uk8s.ucloud.cn/resource_id=uhost-jjckmq54
                    role.node.kubernetes.io/k8s-node=true
                    topology.udisk.csi.ucloud.cn/region=cn-bj2
                    topology.udisk.csi.ucloud.cn/zone=cn-bj2-05
Annotations:        csi.volume.kubernetes.io/nodeid: {"udisk.csi.ucloud.cn":"192.168.1.141","ufile.csi.ucloud.cn":"192.168.1.141"}
                    node.alpha.kubernetes.io/ttl: 0
CreationTimestamp:  Mon, 17 Feb 2020 10:13:18 +0800
Taints:             <none>
Unschedulable:      false
Conditions:
  Type             Status  LastHeartbeatTime                 LastTransitionTime                Reason                       Message
  ----             ------  -----------------                 ------------------                ------                       -------
  MemoryPressure   False   Mon, 17 Feb 2020 10:55:19 +0800   Mon, 17 Feb 2020 10:13:18 +0800   KubeletHasSufficientMemory   kubelet has sufficient memory available
  DiskPressure     False   Mon, 17 Feb 2020 10:55:19 +0800   Mon, 17 Feb 2020 10:13:18 +0800   KubeletHasNoDiskPressure     kubelet has no disk pressure
  PIDPressure      False   Mon, 17 Feb 2020 10:55:19 +0800   Mon, 17 Feb 2020 10:13:18 +0800   KubeletHasSufficientPID      kubelet has sufficient PID available
  Ready            True    Mon, 17 Feb 2020 10:55:19 +0800   Mon, 17 Feb 2020 10:13:18 +0800   KubeletReady                 kubelet is posting ready status
Addresses:
  InternalIP:  192.168.1.141
  Hostname:    192.168.1.141
Capacity:
 cpu:                2
 ephemeral-storage:  41931756Ki
 hugepages-1Gi:      0
 hugepages-2Mi:      0
 memory:             3900272Ki
 pods:               110
Allocatable:
 cpu:                1800m
 ephemeral-storage:  38644306266
 hugepages-1Gi:      0
 hugepages-2Mi:      0
 memory:             2745608599
 pods:               110
System Info:
 Machine ID:                 60bda943e80613c2542b9b1dadb10720
 System UUID:                26179467-6182-4bd3-85be-337cbfbade88
 Boot ID:                    abcb11eb-c85f-4f6b-b93a-867b95794a61
 Kernel Version:             4.19.0-3.el7.ucloud.x86_64
 OS Image:                   CentOS Linux 7 (Core)
 Operating System:           linux
 Architecture:               amd64
 Container Runtime Version:  docker://18.9.9
 Kubelet Version:            v1.16.4
 Kube-Proxy Version:         v1.16.4
ProviderID:                  UCloud://cn-bj2-05//uk8s-z3zv2xip-n-x6oha
Non-terminated Pods:         (2 in total)
  Namespace                  Name               CPU Requests  CPU Limits  Memory Requests  Memory Limits  AGE
  ---------                  ----               ------------  ----------  ---------------  -------------  ---
  kube-system                csi-udisk-qprnf    0 (0%)        0 (0%)      0 (0%)           0 (0%)         42m
  kube-system                csi-ufile-fkvwt    0 (0%)        0 (0%)      0 (0%)           0 (0%)         42m
Allocated resources:
  (Total limits may be over 100 percent, i.e., overcommitted.)
  Resource           Requests  Limits
  --------           --------  ------
  cpu                0 (0%)    0 (0%)
  memory             0 (0%)    0 (0%)
  ephemeral-storage  0 (0%)    0 (0%)
Events:
  Type    Reason                   Age                From                       Message
  ----    ------                   ----               ----                       -------
  Normal  Starting                 42m                kubelet, 192.168.1.141     Starting kubelet.
  Normal  NodeHasSufficientMemory  42m (x2 over 42m)  kubelet, 192.168.1.141     Node 192.168.1.141 status is now: NodeHasSufficientMemory
  Normal  NodeHasNoDiskPressure    42m (x2 over 42m)  kubelet, 192.168.1.141     Node 192.168.1.141 status is now: NodeHasNoDiskPressure
  Normal  NodeHasSufficientPID     42m (x2 over 42m)  kubelet, 192.168.1.141     Node 192.168.1.141 status is now: NodeHasSufficientPID
  Normal  NodeAllocatableEnforced  42m                kubelet, 192.168.1.141     Updated Node Allocatable limit across pods
  Normal  Starting                 42m                kube-proxy, 192.168.1.141  Starting kube-proxy.
 
 
5、檢視當前叢集中的名稱空間
    在k8s上資源有兩個級別
        叢集級別的資源,整個叢集可以劃分為名稱空間
        節點級別的資源
     
    ~]# kubectl get ns     #初始安裝完生成的名稱空間     kubectl get namespaces
    NAME              STATUS   AGE
    default           Active   3h9m   #預設的名稱空間
    kube-node-lease   Active   3h9m  
    kube-public       Active   3h9m   #公共的名稱空間,任何人都可以訪問的名稱空間
    kube-system       Active   3h9m   #系統級別的pod都執行在此名稱空間
 
     
6、當使用get pods命令獲取系統上的pod時,實際的意思是列出當前系統上pod,但是pod是名稱空間級別的資源,沒有指定名稱空間,預設的為defaults   #(當我們建立pod時沒有指定名稱空間時預設都會執行在defaults名稱空間中)
    kubectl get pods -n 名稱空間    #使用-n選項指定檢視的名稱空間下的pod
    ~]# kubectl get pods -n kube-system
    NAME                                    READY   STATUS    RESTARTS   AGE
    cloudprovider-ucloud-5679f4ff69-flc64   1/1     Running   0          3h14m
    coredns-68cccdd88-7g46d                 1/1     Running   0          3h14m
    coredns-68cccdd88-q8gmg                 1/1     Running   0          3h14m
    csi-udisk-7h7x2                         2/2     Running   0          3h6m
    csi-udisk-controller-0                  4/4     Running   0          3h14m
    csi-udisk-ps2qb                         2/2     Running   0          3h4m
    csi-udisk-qprnf                         2/2     Running   0          3h9m
    csi-udisk-vnf4j                         2/2     Running   0          3h10m
    csi-udisk-z4lhv                         2/2     Running   0          3h1m
    csi-ufile-8bnst                         2/2     Running   0          3h4m
    csi-ufile-controller-0                  4/4     Running   0          3h14m
    csi-ufile-fd4r2                         2/2     Running   0          3h10m
    csi-ufile-fkvwt                         2/2     Running   0          3h9m
    csi-ufile-hkwpn                         2/2     Running   0          3h1m
    csi-ufile-kmbpc                         2/2     Running   0          3h6m
    metrics-server-c84754b6-ncqvf           1/1     Running   0          3h14m
    uk8s-kubectl-6585dbb994-6vbss           1/1     Running   0          3h14m
 
  
7、顯示指定名稱空間下的pod資源,並顯示詳細格式即長格式資訊
    -o wide
    ~]# kubectl get pods -n kube-system -o wide
                                                                                 #pod自己的IP地址    #pod執行的node節點資訊
    NAME                                    READY   STATUS    RESTARTS   AGE     IP                  NODE            NOMINATED NODE   READINESS GATES
    cloudprovider-ucloud-5679f4ff69-flc64   1/1     Running   0          3h16m   192.168.1.211   192.168.1.211   <none>           <none>
    coredns-68cccdd88-7g46d                 1/1     Running   0          3h16m   192.168.1.148   192.168.1.211   <none>           <none>
    coredns-68cccdd88-q8gmg                 1/1     Running   0          3h16m   192.168.1.103   192.168.1.211   <none>           <none>
    csi-udisk-7h7x2                         2/2     Running   0          3h7m    192.168.1.185   192.168.1.185   <none>  

1.4.2、Namespace名稱空間操作

1.4.2.1、k8s名稱空間資源增刪改查

#建立
1、使用kubectl create 檢視可以建立的資源型別
    ~]# kubectl create -h    或者  ~]# kubectl api-resources  可以檢視到當前系統上所有的資源型別
        Available Commands:
            clusterrole         Create a ClusterRole.
            clusterrolebinding  Create a ClusterRoleBinding for a particular ClusterRole
            configmap           Create a configmap from a local file, directory or literal value
            cronjob             Create a cronjob with the specified name.
            deployment          Create a deployment with the specified name.         #建立控制器
            job                 Create a job with the specified name.
            namespace           Create a namespace with the specified name           #建立名稱空間
            poddisruptionbudget Create a pod disruption budget with the specified name.
            priorityclass       Create a priorityclass with the specified name.
            quota               Create a quota with the specified name.
            role                Create a role with single rule.
            rolebinding         Create a RoleBinding for a particular Role or ClusterRole
            secret              Create a secret using specified subcommand
            service             Create a service using specified subcommand.          #建立service
            serviceaccount      Create a service account with the specified name
 
2、示例建立一個名稱空間
    ~]# kubectl create namespace develop
        namespace/develop created
 
    ~]# kubectl get ns
        NAME              STATUS   AGE
        default           Active   3h34m
        develop           Active   27s
 
#刪除
3、刪除這個名稱空間     #引用資源刪除,要先指定型別,在指明資源名,當刪除名稱空間時,名稱空間下的所有資源都將被刪除,此名稱空間下的pod也會被刪除
    ~]# kubectl delete namespaces develop           #等價命令   kubectl delete ns/develop      =   kubectl delete namespaces/develop
            namespace "develop" deleted
 
 
#查詢
4、查詢預設的default名稱空間資訊
    ~]# kubectl get ns
    ~]# kubectl get ns/default    #指定名稱空間顯示
     
5、檢視名稱空間的詳細資訊yaml格式
    ~]# kubectl get ns/default -o yaml
    apiVersion: v1                             #api版本
    kind: Namespace                            #型別為名稱空間
    metadata:                                  #元資料
      creationTimestamp: "2020-02-17T02:07:43Z"
      name: default
      resourceVersion: "147"
      selfLink: /api/v1/namespaces/default
      uid: 844c83d8-5d9d-4787-b0fc-ba088c55f8b1
    spec:                                      #使用者期望的狀態
      finalizers:
      - kubernetes
    status:                                    #當前狀態
      phase: Active
 
6、看名稱空間的詳細資訊json格式
    ~]# kubectl get ns/default -o json
    {
        "apiVersion": "v1",
        "kind": "Namespace",
        "metadata": {
            "creationTimestamp": "2020-02-17T02:07:43Z",
            "name": "default",
            "resourceVersion": "147",
            "selfLink": "/api/v1/namespaces/default",
            "uid": "844c83d8-5d9d-4787-b0fc-ba088c55f8b1"
        },
        "spec": {
            "finalizers": [
                "kubernetes"
            ]
        },
        "status": {
            "phase": "Active"
        }
    }
 
#描述資訊
7、檢視指定的名稱空間的描述資訊
    ~]# kubectl describe ns/default
    Name:         default
    Labels:       <none>
    Annotations:  <none>
    Status:       Active
    No resource quota.
    No resource limits.

1.4.3、deployment控制器建立pod資源

1.4.3.1、k8s名稱deployment控制器建立pod資源

#建立
1、檢視建立幫助deployment控制器
    ~]# kubectl create deployment -h
        --image=[]: Image name to run.    #指定使用哪個映象執行為一個容器
        --save-config=false/true          #是否儲存建立時的命令資訊進行儲存
        --dry-run=false                   #幹跑、測試一下
         
 
2、建立一個deployment控制器靠 nginx映象執行 pod
    ~]# kubectl create deploy ngx-dep --image=nginx:1.14-alpine   #此時會建立一個ngx-dep控制器,未知定名稱空間則為default,這個控制器則試圖建立一個pod,pod中會靠nginx映象執行
        deployment.apps/ngx-dep created
 
3、顯示default名稱空間下的所有資源  
    #(已經建立了三個資源:1、deployment.apps/ngx-dep 控制器, 2、中間層replicaset.apps/ngx-dep-d554574bd 3、pod/ngx-dep-d554574bd-q59fj)
    ~]# kubectl get all
        NAME                                READY   STATUS    RESTARTS   AGE
        pod/ngx-dep-d554574bd-q59fj         1/1     Running   0          29m
 
        NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
        service/kubernetes   ClusterIP   10.2.0.1     <none>        443/TCP   4h57m
 
        NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
        deployment.apps/ngx-dep        1/1     1            1           29m
 
        NAME                                      DESIRED   CURRENT   READY   AGE
        replicaset.apps/ngx-dep-d554574bd         1         1         1       29m
 
#資訊
4、檢視當前defaults中的pods以及詳細資訊
    ~]# kubectl get pods
    NAME                            READY   STATUS    RESTARTS   AGE
    ngx-dep-d554574bd-q59fj         1/1     Running   0          40m
 
    ~]# kubectl get pods -o wide
    NAME                            READY   STATUS    RESTARTS   AGE     IP     pod地址         NODE            NOMINATED NODE   READINESS GATES
    ngx-dep-d554574bd-q59fj         1/1     Running   0          41m     192.168.1.125      192.168.1.51         <none>           <none>
     
5、訪問此pod IP
    ~]# curl -I 192.168.1.125
        HTTP/1.1 200 OK
        Server: nginx/1.14.2
        Date: Mon, 17 Feb 2020 07:17:39 GMT
        Content-Type: text/html
        Content-Length: 612
        Last-Modified: Wed, 10 Apr 2019 01:08:42 GMT
        Connection: keep-alive
        ETag: "5cad421a-264"
        Accept-Ranges: bytes
 
 
#刪除pod
5、刪除defalut資源下的pod
    刪除此pod發生的結果,此pod由deployment.apps/ngx-dep 控制器控制著此pod,一刪除此pod,控制器發現此pod沒了,但是控制器已經定義必須要有一個pod,則會重新啟動一個pod
    ~]# kubectl delete pods/ngx-dep-d554574bd-q59fj    
        pod "ngx-dep-d554574bd-q59fj" deleted
 
    ~]# kubectl get pods
        NAME                            READY   STATUS    RESTARTS   AGE
        ngx-dep-d554574bd-c5sjp         1/1     Running   0          2m41s
    ~]# kubectl get pods -o wide
        NAME                            READY   STATUS    RESTARTS   AGE     IP              NODE            NOMINATED NODE   READINESS GATES
        ngx-dep-d554574bd-c5sjp         1/1     Running   0          3m36s   192.168.1.160   192.168.1.247   <none>           <none>
 
    ~]# curl -I 192.168.1.160    訪問新的pod地址
        HTTP/1.1 200 OK
 
 
 
總結:由於建立pod,沒有新增service直接供使用者訪問,則如果pod出現問題時會生成一個全新的pod,則使用者訪問的IP則會發生變化,如果使得Pod資源發生變化時使用者訪問的還是一個地址則需要新增service中間層(排程)
    在建立service時明確指定自身使用什麼埠,後端pod上使用什麼埠(埠可以一致,但是也可以不一致,但是在一般情況下都保持一致),建立一個service就是建立一個iptables規則或者ipvs規則
    類似一個DNET規則,但是此規則在每一個node節點上都會生成

1.4.4、service型別示例

1.4.4.1、k8s名稱deployment控制器下建立一個service繫結pod資源 (型別為clusterip)

  • service有四種類型:
    • clusterip :最簡單也是最常用
    • externalname
    • loadbalancer
    • nodeport
1、檢視建立一個service幫助
    ~]# kubectl create service -h
        Create a service using specified subcommand.
 
        Aliases:
        service, svc
 
        Available Commands:
          clusterip    Create a ClusterIP service.
          externalname Create an ExternalName service.
          loadbalancer Create a LoadBalancer service.
          nodeport     Create a NodePort service.
 
        Usage:
          kubectl create service [flags] [options]
 
2、檢視建立clusterip型別的service的幫助
    ~]# kubectl create service clusterip -h
        --tcp=[]: Port pairs can be specified as '<port>:<targetPort>'.    # 建立service時要指定本地ip及遠端ip  (service埠稱為本地埠,targetPort指的是被代理的後端的pod的埠)
        --dry-run=false   #幹跑
        --clusterip=''    #指定叢集的ip,如果不指定則動態指定
 
 
 
 
------------------------------------------------------------------------------------------錯誤示例由於沒有指定後端pod--------------------------------------------------------------------------------
3、為了執行一個nginx建立一個clusterip型別的service
    ~]# kubectl create service clusterip ngx-svc --tcp=80:80 --dry-run
        service/ngx-svc created (dry run)
    ~]# kubectl create service clusterip ngx-svc --tcp=80:80
        service/ngx-svc created
 
4、檢視已經建立的service
    ~]# kubectl get svc
                                #建立時未指定--clusterip=''則為動態生成的
        NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
        kubernetes   ClusterIP   10.2.0.1       <none>        443/TCP   5h45m
        ngx-svc      ClusterIP   10.2.135.254   <none>        80/TCP    41s
 
    #顯示詳細資訊
    ~]# kubectl get svc/ngx-svc -o yaml
        apiVersion: v1
        kind: Service
        metadata:
          creationTimestamp: "2020-02-17T07:52:16Z"
          labels:
            app: ngx-svc
          name: ngx-svc
          namespace: default
          resourceVersion: "66291"
          selfLink: /api/v1/namespaces/default/services/ngx-svc
          uid: c6b6062e-fd7b-4363-ac30-c53816ffb147
        spec:
          clusterIP: 10.2.135.254
          ports:
          - name: 80-80
            port: 80         #本地service埠
            protocol: TCP
            targetPort: 80   #遠端pod埠
          selector:
            app: ngx-svc
          sessionAffinity: None
          type: ClusterIP
        status:
          loadBalancer: {}
 
5、刪除已經建立的service
    ~]# kubectl delete svc/ngx-svc
        service "ngx-svc" deleted
 
    ~]# kubectl get service
        NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
        kubernetes   ClusterIP   10.2.0.1     <none>        443/TCP   5h50m
 
------------------------------------------------------------------------------------------以上為錯誤示例--------------------------------------------------------------------------------
------------------------------------------------------------------------------------------以下為正確示例--------------------------------------------------------------------------------
 
6、正確的建立一個clusterip型別的service   #當建立的service與deployment同名時,會自動將此deployment 下的pod自動關聯
    # 檢視已經建立的deployment控制器
    ~]# kubectl get deployment
        NAME           READY   UP-TO-DATE   AVAILABLE   AGE
        ngx-dep        1/1     1            1           104m
 
 
    # 建立一個和deployment控制同名的service
    ~]# kubectl create service clusterip ngx-dep --tcp=80:80            # <port>:<targetport> 指定本地埠及遠端被代理的pods埠
        service/ngx-dep created
 
7、檢視已經建立的service
    ~]# kubectl get svc/ngx-dep -o yaml
        apiVersion: v1
        kind: Service
        metadata:
          creationTimestamp: "2020-02-17T08:20:16Z"
          labels:                           #service labels
            app: ngx-dep
          name: ngx-dep
          namespace: default
          resourceVersion: "71648"
          selfLink: /api/v1/namespaces/default/services/ngx-dep
          uid: e9332ba6-29f7-4407-8c7e-6927d0e23d45
        spec:
          clusterIP: 10.2.138.37           # service地址
          ports:
          - name: 80-80
            port: 80
            protocol: TCP
            targetPort: 80
          selector:
            app: ngx-dep
          sessionAffinity: None
          type: ClusterIP
        status:
          loadBalancer: {}
 
    #可以檢視到後端被自動關聯的pod
    ~]# kubectl describe svc/ngx-dep
        Name:              ngx-dep
        Namespace:         default
        Labels:            app=ngx-dep
        Annotations:       <none>
        Selector:          app=ngx-dep
        Type:              ClusterIP
        IP:                10.2.138.37
        Port:              80-80  80/TCP
        TargetPort:        80/TCP
        Endpoints:         192.168.1.160:80      #自動被關聯的pod(當建立的service與deployment同名時,會自動將此deployment 下的pod自動關聯)
        Session Affinity:  None
        Events:            <none>
 
8、此時訪問service地址則會被對映到訪問到後端的pod資源
    ~]# curl -I 10.2.138.37
        HTTP/1.1 200 OK
        Server: nginx/1.14.2
 
 
9、測試手動刪除當前執行的pod,則控制器則會自動建立一個新的pod,新的pod和之前的pod地址完全不相同,此時再次訪問service
    ~]# kubectl get pods
        NAME                            READY   STATUS    RESTARTS   AGE
        ngx-dep-d554574bd-c5sjp         1/1     Running   0          67m
     
    ~]# kubectl delete pods ngx-dep-d554574bd-c5sjp
        pod "ngx-dep-d554574bd-c5sjp" deleted
 
 
    ~]# kubectl get pods -o wide
        NAME                            READY   STATUS    RESTARTS   AGE     IP              NODE            NOMINATED NODE   READINESS GATES
        ngx-dep-d554574bd-mg7jg         1/1     Running   0          3m57s   192.168.1.68    192.168.1.51    <none>           <none>
 
    ~]# kubectl describe svc/ngx-dep
        Name:              ngx-dep
        Namespace:         default
        Labels:            app=ngx-dep
    Annotations:       <none>
        Selector:          app=ngx-dep
        Type:              ClusterIP
        IP:                10.2.138.37
        Port:              80-80  80/TCP
        TargetPort:        80/TCP
        Endpoints:         192.168.1.68:80    #新的pod地址
        Session Affinity:  None
        Events:            <none>
 
    ~]# curl -I 10.2.138.37                   #訪問service可以正常訪問
        HTTP/1.1 200 OK
        Server: nginx/1.14.2
 
 
#總結:在控制器的控制下,pod被幹掉時,生成一個新的pod,重建的結果還會響應的反應到service上,所以使用者可以通過service的地址固定的來訪問pod資源

1.4.4.2、如果service的發生改變時使用者訪問地址改變則使用service的名稱空間來訪問

1、名稱空間訪問原理
    ~]# kubectl get svc
        NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
        kubernetes   ClusterIP   10.2.0.1      <none>        443/TCP   6h31m
        ngx-dep      ClusterIP   10.2.138.37   <none>        80/TCP    19m
     
    ~]# curl ngx-dep
        curl: (6) Could not resolve host: ngx-dep; Unknown error
    # ~]# curl ngx-dep.default.svc.cluster.local
 
 
    # 這個名稱空間為預設在k8s中執行的dns即 coredns
    ~]# kubectl get pods -n kube-system
        NAME                                    READY   STATUS    RESTARTS   AGE
        coredns-68cccdd88-7g46d                 1/1     Running   0          6h33m
        coredns-68cccdd88-q8gmg                 1/1     Running   0          6h33m
 
    # coredns也有一個ip地址
    ~]# kubectl get svc -n kube-system
        NAME                   TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                  AGE
        csi-udisk-controller   ClusterIP   10.2.235.189   <none>        12345/TCP                6h35m
        csi-ufile-controller   ClusterIP   10.2.77.27     <none>        12345/TCP                6h35m
        kube-dns               ClusterIP   10.2.0.2       <none>        53/UDP,53/TCP,9153/TCP   6h35m   ##
        metrics-server         ClusterIP   10.2.190.58    <none>        443/TCP                  6h35m
     
    #所以即使service地址變了,但是service名稱沒變,都可以通過service的名稱訪問

1.4.4.3、deployment可以按需求對後端的pod伸縮資源 (kubectl scale)

1、建立一個deployment     ##此時會建立一個myapp控制器,未知定名稱空間則為default,這個控制器則試圖建立一個pod,pod中會靠myapp:v1映象執行
    ~]#  kubectl create deploy myapp --image=ikubernetes/myapp:v1
        deployment.apps/myapp created
     
2、檢視已經建立的deploy控制器
    ~]# kubectl get deploy
        NAME           READY   UP-TO-DATE   AVAILABLE   AGE
        myapp          1/1     1            1           91s
 
3、檢視此控制器下的pod
    ~]# kubectl get pods
        NAME                            READY   STATUS    RESTARTS   AGE
        myapp-5c6976696c-8kpqh          1/1     Running   0          2m22s
 
    ~]# kubectl get pods -o wide
        NAME                            READY   STATUS    RESTARTS   AGE     IP              NODE            NOMINATED NODE   READINESS GATES
        myapp-5c6976696c-8kpqh          1/1     Running   0          3m14s   192.168.1.236   192.168.1.141   <none>           <none>
 
 
 
4、訪問此pod
    ~]# curl 192.168.1.236
        Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
 
    ~]# curl 192.168.1.236/hostname.html
        myapp-5c6976696c-8kpqh
 
5、給myapp的控制器建立一個對應的service
    ~]# kubectl create service clusterip myapp --tcp=80:80
        service/myapp created
 
6、由於建立的service和控制器名稱一致,則自動被關聯的此控制器下的pod
    ~]# kubectl get svc
        NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
        kubernetes   ClusterIP   10.2.0.1      <none>        443/TCP   6h55m
        myapp        ClusterIP   10.2.35.177   <none>        80/TCP    2m8s
        ngx-dep      ClusterIP   10.2.138.37   <none>        80/TCP    42m
 
7、檢視此service的詳細資訊
    ~]# kubectl get svc/myapp -o yaml
 
 
    ~]# kubectl describe svc/myapp
        Name:              myapp
        Namespace:         default
        Labels:            app=myapp
        Annotations:       <none>
        Selector:          app=myapp
        Type:              ClusterIP
        IP:                10.2.35.177
        Port:              80-80  80/TCP
        TargetPort:        80/TCP
        Endpoints:         192.168.1.236:80
        Session Affinity:  None
        Events:            <none>
 
8、通過service的ip訪問後端的pod
    ~]# curl 10.2.35.177
        Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
 
    ~]# curl 10.2.35.177/hostname.html
        myapp-5c6976696c-8kpqh
    # curl myapp.default.svc.cluster.local.
 
 
9、控制器可以對後端的pod擴縮容
    ~]# kubectl scale -h
        kubectl scale [--resource-version=version] [--current-replicas=count] --replicas=COUNT (-f FILENAME | TYPE NAME) [options]
 
    #指定擴容的pod資源數量, 控制器名稱
    ~]# kubectl scale --replicas=3 deployment myapp
        deployment.apps/myapp scaled
 
10、檢視已經擴充套件的pod資源
    ~]# kubectl get pods
        NAME                            READY   STATUS    RESTARTS   AGE
        myapp-5c6976696c-8kpqh          1/1     Running   0          23m
        myapp-5c6976696c-sxt79          1/1     Running   0          2m7s
        myapp-5c6976696c-xsvn2          1/1     Running   0          2m7s
 
    ~]# kubectl get pods -o wide
        NAME                            READY   STATUS    RESTARTS   AGE     IP              NODE            NOMINATED NODE   READINESS GATES
        myapp-5c6976696c-8kpqh          1/1     Running   0          24m     192.168.1.236   192.168.1.141   <none>           <none>
        myapp-5c6976696c-sxt79          1/1     Running   0          2m43s   192.168.1.67    192.168.1.247   <none>           <none>
        myapp-5c6976696c-xsvn2          1/1     Running   0          2m43s   192.168.1.233   192.168.1.51    <none>           <none>
 
 
 
11、檢視service,會自動的將新建立pod關聯到service的Endpoints地址
    ~]# kubectl describe svc/myapp
        Name:              myapp
        Namespace:         default
        Labels:            app=myapp
        Annotations:       <none>
        Selector:          app=myapp
        Type:              ClusterIP
        IP:                10.2.35.177
        Port:              80-80  80/TCP
        TargetPort:        80/TCP
        Endpoints:         192.168.1.233:80,192.168.1.236:80,192.168.1.67:80
        Session Affinity:  None
        Events:            <none>
 
12、此時訪問service地址會實現pod的資源排程  #預設的排程方式是隨機排程
    ~]# curl 10.2.35.177/hostname.html
            myapp-5c6976696c-sxt79
    ~]# curl 10.2.35.177/hostname.html
            myapp-5c6976696c-xsvn2
    ~]# curl 10.2.35.177/hostname.html
            myapp-5c6976696c-8kpqh
 
 
 
13、pod資源縮容
    ~]# kubectl scale --replicas=2 deployment myapp
        deployment.apps/myapp scaled
 
    ~]# kubectl get pods
        NAME                            READY   STATUS    RESTARTS   AGE
        myapp-5c6976696c-8kpqh          1/1     Running   0          34m
        myapp-5c6976696c-sxt79          1/1     Running   0          13m

1.4.4.5、deployment控制器下建立一個service繫結pod資源 (型別為nodeport即節點埠型別)使得叢集外部訪問

1、刪除之前建立的service
    ~]# kubectl delete svc/myapp
        service "myapp" deleted
 
     ~]# kubectl get service
     ~]# kubectl get deploy
        NAME    READY   UP-TO-DATE   AVAILABLE   AGE
        myapp   3/3     3            3           42s
 
 
2、建立一個nodeport型別的service
    ~]# kubectl create service nodeport -h
        kubectl create service nodeport NAME [--tcp=port:targetPort] [--dry-run] [options]
 
    ~]# kubectl create service nodeport myapp --tcp=80:80
        service/myapp created
    ~]# kubectl get service
        NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
        kubernetes   ClusterIP   10.2.0.1       <none>        443/TCP        8h
        myapp        NodePort    10.2.236.100   <none>        80:34765/TCP   4s      #80為service埠,34765為宿主機的埠
 
 
3、由於建立的service和控制器名稱一致,則自動被關聯的此控制器下的pod
    ~]# kubectl get deploy
        NAME           READY   UP-TO-DATE   AVAILABLE   AGE
        myapp          2/2     2            2           77m
 
    ~]# kubectl describe service/myapp
        Name:                     myapp
        Namespace:                default
        Labels:                   app=myapp
        Annotations:              <none>
        Selector:                 app=myapp
        Type:                     NodePort
        IP:                       10.2.236.100
        Port:                     80-80  80/TCP
        TargetPort:               80/TCP
        NodePort:                 80-80  34765/TCP
        Endpoints:                192.168.1.236:80,192.168.1.67:80
        Session Affinity:         None
        External Traffic Policy:  Cluster
        Events:                   <none>
 
 
4、通過叢集中任何節點主機訪問34765埠 (其實是反應在每一個主機的iptables規則中  ~]# iptables -t nat -vnL)
    ~]# curl 192.168.1.141:34765
        Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
    ~]# curl 192.168.1.185:34765
        Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
    ~]# curl 192.168.1.211:34765
        Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
 
 
 
5、防火牆策略檢視
    會生成NodePort型別的防火牆規則,這些都是kube-proxy自動轉換的iptable或ipvs規則
~]# iptables -t nat -vnL
Chain KUBE-NODEPORTS (1 references)
 pkts bytes target     prot opt in     out     source               destination        
    0     0 KUBE-MARK-MASQ  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            /* default/myapp:80-80 */ tcp dpt:32474
    0     0 KUBE-SVC-IJFIQBSXQ4XPPRV7  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            /* default/myapp:80-80 */ tcp dpt:32474