kubernetes有兩種類型的節點 master 與 node 節點,master負責調度任務,node也叫worker節點,負責具體運算,默認使用docker容器運行時
master上有4大組件:Api-Server、Scheduler、Etcd、ControllerManager
worker上有2大組件:kubelet、kube-proxy、docker
1.k8s具體工作情況如下:
k8s通過 kubectl 客戶端向 api-server 發送請求,我要創建一個容器,api-server會把記錄存儲 etcd,同時向 scheduler 調度器發請求,scheduler 通過一系列分析得出可以在那個 node 節點有資源,能創建容器,把信息反饋給api-server,api-server記錄到 etcd 中,api-server給該node 節點的 kubelet 發送請求,讓 kubelet 調用本節點的容器運行時創建容器,ControllerManager 控制器會監控容器是否正常運行,並保證它正常運行
在K8s中,容器運行在Pod中,Pod中可以有多個容器,多個容器可使用localhost訪問對方,一般一個Pod運行一個容器
2.k8s創建容器有兩種方式
- 1.通過 kubectl run 命令
- 2.通過配置清單文件,然後使用 kubectl create/apply -f xxx.yaml
下面使用這兩種編排容器方式,演示 nginx 如何創建,而安裝好k8s集羣,輸入 kubectl 命令,查看幫助文檔,裏面有 kubectl 操作 k8s 集羣的各種命令,而kubectl run 就是基於命令創建容器的一種簡單方式
3.使用 kubectl run 命令創建 nginx pod
在命令行輸入:kubectl run --help,可看到幫助文檔提供的語法格式,提供了多個屬性,每個屬性都有英文註釋
使用: kubectl run nginx --image=nginx --replicas=2 --port=80 命令創建名爲 nginx 的 deployment 控制器,鏡像爲nginx,創建2個實例,綁定容器的80端口
查看deploy:kubectl get deploy
查看Pod:kubectl get pods
查看Pod的 IP:kubectl get pods -o wide
查看Pod的詳細內容:kubectl inspect nginx-7c45b84548-b2m5j
可以看到 nginx 的狀態爲 Running 表示運行起來了,有 IP,NODE等信息,在集羣內使用curl命令訪問
curl 10.244.1.9 訪問nginx的主頁,主頁內容正確返回了,這是內網IP,只能在集羣內訪問,無法在外網訪問
要在集羣外訪問 nginx,需要使用 kubectl expose --help 命令,暴露一個 Service 服務,請求代理到容器
kubectl expose deployment nginx --port=80 --target-port=80 --type=NodePort
Type=NodePort,表示監聽宿主機端口,通過kubectl get svc,可以看到 nginx service的Port,內網是80,外網是30733,也就是說,通過內外網訪問nginx
內網訪問:curl 10.106.143.0
外網訪問:在瀏覽器中輸入任意節點IP + 30733
4.使用配置清單文件創建 nginx pod
使用 kubectl run 命令創建的容器,其實最後也轉換成了 yaml 格式的配置文件
- 1.通過 kubectl get pods 查看 nginx pod
- 2.把其中某個pod輸出爲 yaml 格式,kubectl get pods nginx-7c45b84548-b2m5j -o yaml
刪除kubectl run 命令創建的 pod,重新通過配置清單的方式創建Pod - 3.該nginx pod是一個deployment控制器,刪除deploy即可,kubectl get deploy,然後kubectl delete deploy nginx,刪除Service,kubectl delete svc nginx
- 4.把上面通過 kubectl get pods nginx-7c45b84548-b2m5j -o yaml 的配置內容複製到一個名爲 nginx-deploy.yaml的文件中,只複製部分內容就好
vi nginx-deploy.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: nginx
namespace: default
spec:
replicas: 1
selector:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx
imagePullPolicy: Always
name: nginx
ports:
- containerPort: 80
protocol: TCP
-
5.創建Pod,kubectl apply -f nginx-deploy.yaml
-
6.查看Pod,kubectl get pods -o wide,再通過內網 IP 訪問
-
7.暴露到外網:kubectl expose rc nginx --port=80 --target-port=80 --type=NodePort
-
8.查看Service:kubectl get svc ,CLUSTER-IP變了,監聽宿主機的端口也變成了30789
通過任意Node節點的IP + 30789 訪問 nginx 主頁,之前 192.168.68.149,現在是 192.168.68.151 -
9.擴容與縮容,通過 kubectl scale --help 完成自動擴容,kubectl scale --replicas=2 -f nginx-deploy.yaml
本篇介紹瞭如何通過 k8s run命令和 清單配置文件創建Pod,k8s run 命令可以跑一些簡單的測試容器,通過配置文件可以創建更定製化的容器
最重要的是如何查看幫助文檔,通過 kubectl ,得到一個幫助文檔列表,然後
kubectl create --help
kubectl run --help
kubectl expose --help
等等,次列表中的任意命令的語法格式都可以查看幫助文檔來操作
配置清單文件的語法格式,k8s也提供了幫助文明,kubectl explain 命令
kubectl explain pods
kubectl explain pods.spec
kubectl explain pods.spec.containers 可以一層層進去
kubectl explain service
k8s怎麼操作,看文檔會有很大的幫助
下面彙總一些常用的kubectl操作命令
查看所有Pod列表:kubectl get pods
查看RC和Service:kubectl get rc,service
查看Pod詳細內容:kubectl describe pods < pod-name >
查看Node詳細內容:kubectl describe nodes < node-name >
創建或更新資源:kubectl apply -f xxx.yaml
刪除資源:kubectl delete -f xxx.yaml
執行容器中date命令:kubectl exec < pod-name > date
查看容器日誌:kubectl logs < pod-name >
在線編輯運行中的資源:kubectl edit deploy nginx
在Pod和本地之間複製文件:kubectl cp nginx-xxxx:/etc/fstab /tmp
資源對象設置標籤:kubectl label pods < pod-name > frontend=release
查看Pod的label標籤:kubectl get pods --show-labels