03-K8S Basic-kubernetes應用快速入門
阿新 • • 發佈:2021-06-13
回顧
- 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
- 1.平面控制 API Server(唯一可以接入API Server就是master主機的6443埠)
一、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)不間斷地監控著相關地物件地狀態,在物件地當前狀態發生改變時執行合適地操作當前狀態無限接近期望地狀態
- 客戶端向API Server提交POST請求以建立物件
- 管理資源物件
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