K8S
- K8S官網(wǎng)文檔:https://kubernetes.io/zh/docs/home/
- 學習東西還是要從官方文檔入手;
- 用于管理、擴展、自動部署容器; 其實就是 對多個跨機器的Docker集群;
K8S特性
- 服務發(fā)現(xiàn)和負載均衡
Kubernetes 可以使用 DNS 名稱或自己的 IP 地址來暴露容器。 如果進入容器的流量很大, Kubernetes 可以負載均衡并分配網(wǎng)絡流量,從而使部署穩(wěn)定。 - 自動部署和回滾
創(chuàng)建新容器, 刪除現(xiàn)有容器并將它們的所有資源用于新容器。 - 自我修復
Kubernetes 將重新啟動失敗的容器、替換容器、殺死不響應用戶定義的運行狀況檢查的容器, 并且在準備好服務之前不將其通告給客戶端。
Docker編排常用命令
K8S 的核心功能:自動化運維管理多個容器化程序;
核心架構角色:
-
kube-apiserver
負責公開了 Kubernetes API,負責處理接受請求的工作; -
etcd
分布式數(shù)據(jù)庫;一致且高可用的鍵值存儲,用作 Kubernetes 所有集群數(shù)據(jù)的后臺數(shù)據(jù)庫。需要保證高可用、避免單點故障; -
kube-scheduler
- 分布式調度器;用來調度在指定節(jié)點上創(chuàng)建pod;
- 調度決策考慮的因素包括單個 Pod 及 Pods 集合的資源需求、軟硬件及策略約束、工作負載;簡單可以理解為選擇空閑的機器創(chuàng)建pod;
-
kube-controller-manager
- 節(jié)點控制器(Node Controller):負責在節(jié)點出現(xiàn)故障時進行通知和響應
- 任務控制器(Job Controller):監(jiān)測代表一次性任務的 Job 對象,然后創(chuàng)建 Pods 來運行這些任務直至完成
- 還有其他控制器、暫時不涉及;
-
kubelet
- Worker Node 的監(jiān)視器,以及與 Master Node 的通訊器
- kubelet 會在集群中每個節(jié)點(node)上運行。 它保證容器(containers)都運行在 Pod 中。
- 會向Master node匯報自身node服務運行的狀態(tài);并接受來自 Master Node 的指示采取調整措施
- kubelet 只管理由 Kubernetes 創(chuàng)建的容器。
-
kube-proxy
- kube-proxy 是集群中每個節(jié)點(node)上所運行的網(wǎng)絡代理, 負責 Node 在 K8S 的網(wǎng)絡通訊
-
Container Runtime
- Worker Node 的運行環(huán)境 ,負責運行容器的軟件。例如Docker Engine引擎;
簡單命令執(zhí)行流程
當我們執(zhí)行創(chuàng)建Ngnix的容器時、執(zhí)行以下K8S命令
kubectl create deployment nginx --image=nginx
命令的執(zhí)行流程如下:
- API Server收到命令請求;
- API Server將命令交給Controller Manager 、CM生成應用部署記錄;
- CM調用 API Server 將 應用部署記錄 存入 etcd數(shù)據(jù)庫;
- Scheduler調度器 定時調用 API Server 查詢 etcd,獲取到應用部署記錄 與 worker node運行情況、 根據(jù)調度算法 決定 要在哪臺node上部署應用;
- Scheduler 調用 API Server將調度結果記錄放入etcd數(shù)據(jù);
- 每個worker node的Kubelet 定時與 Master Node API Server 保持心跳與通信、獲取到etcd中的調度結果記錄, 每個節(jié)點判斷是否要在本機上部署、 是則創(chuàng)建Pod、并隨時匯報Pod運行情況;
- 每一個機器上的kube-proxy能知道集群的所有網(wǎng)絡,只要node訪問別人或者別人訪問node,node上的kube-proxy網(wǎng)絡代理自動計算進行流量轉發(fā)
kubectl命令使用
語法:
kubectl [command] [TYPE] [NAME] [flags]
- command :操作類型、例如 create、get、describe、delete
- TYPE: 資源類型、 資源類型不區(qū)分大小寫;
- NAME: 指定資源的名稱。名稱區(qū)分大小寫。 如果省略名稱,則顯示所有資源的詳細信息。例如:kubectl get pod
你需要幫助,在終端窗口中運行 kubectl help
創(chuàng)建一個Tomcat應用程序
kubectl create deployment my-tomcat --image=tomcat:7.0.75-alpine
查詢部署信息
kubectl get deployment
獲取pod信息
kubectl get pod -o wide
根據(jù)name查詢pod信息
kubectl get pod my-tomcat -o wide
查看容器日志
kubectl logs my-tomcat-685b8fd9c9-rw42d(pod名稱)
使用 exec 可以在Pod的容器中執(zhí)行命令,這里使用 env 命令查看環(huán)境變量
kubectl exec my-tomcat-685b8fd9c9-rw42d – env
kubectl exec my-tomcat-685b8fd9c9-rw42d – ls / # 查看容器的根目錄下面內容
進入Pod容器內部并執(zhí)行bash命令,如果想退出容器可以使用exit命令
kubectl exec -it my-tomcat-685b8fd9c9-rw42d – sh
訪問一下這個tomcat pod
集群內訪問(在集群里任一worker節(jié)點都可以訪問)
curl 10.244.36.69:8080
集群外部訪問
K8S中、將服務暴露到外網(wǎng)訪問、需要使用service;
kubectl expose deployment my-tomcat --name=tomcat --port=8080 --type=NodePort
查看service
kubectl get svc -o wide
svc 是 service簡寫
K8S的service服務端口號為8080, 宿主機映射的隨機端口為32224, 因此可通過 集群工作節(jié)點IP : 隨機端口 訪問
service服務有個特點,如果端口暴露類型為NodePort,那么可以通過集群內所有worker主機加暴露的端口進行訪問
刪除Pod:
- 查看 pod運行情況、 -w代表一直等待、可查看變化;類似tail -f 命令
#查看pod信息,-w意思是一直等待觀察pod信息的變動
kubectl get pod -w
- 開另外一個命令窗口執(zhí)行刪除命令、 并觀察1中的內容變化;
kubectl delete pod my-tomcat-685b8fd9c9-rw42d
3. 重啟了一個Pod;
這意味著、每次執(zhí)行del都會重新創(chuàng)建運行Pod, 相當于是Pod重啟命令、 也是 K8S的核心特性、服務自愈;
- 查看下deployment和service的狀態(tài)
kubectl get pod,svc
- 查看服務運行情況, 還是可以訪問成功;
服務擴縮容
- 執(zhí)行scale擴容
kubectl scale --replicas=5 deployment my-tomcat
- 查看pod
3. 執(zhí)行scale縮容
kubectl scale --replicas=3 deployment my-tomcat
滾動升級與回滾
對my-tomcat這個deployment進行滾動升級和回滾,將tomcat版本由tomcat:7.0.75-alpine升級到tomcat:8.0.41-jre8-alpine,再回滾到tomcat:7.0.75-alpine
- 滾動升級:
使用set image設置鏡像
kubectl set image deployement my-tomcat tomcat= tomcat:8.0.41-jre8-alpine
- 執(zhí)行 kubectl get pod -w 觀察pod的變動情況,可以看到有的pod在銷毀,有的pod在創(chuàng)建
- 查看pod信息
- 查看某個pod的詳細信息
kubectl describe pod my-tomcat-547db86547-4btmd
鏡像已經(jīng)升級了;
5. 訪問下tomcat
- 版本回滾
- 查看歷史版本
kubectl rollout history deploy my-tomcat
- 回滾到上一個版本
kubectl rollout undo deployment my-tomcat #–to-revision 參數(shù)可以指定回退的版本
- 再次訪問tomcat,發(fā)現(xiàn)版本已經(jīng)回退
標簽的使用
通過給資源添加Label,可以方便地管理資源(如Deployment、Pod、Service等)。
- 查看Deployment中所包含的Label
kubectl subscribe deployment my-tomcat
- 通過Label查詢Pod
kubectl get pod -l app=my-tomcat
4. 通過Label查詢Service
kubectl get service -l app=my-tomcat
5. 給Pod添加Label
kubectl label pod my-tomcat-685b8fd9c9-lrwst version = v1
- 查看Pod的詳細信息,可以查看Label信息:
kubectl describe pods my-tomcat-685b8fd9c9-lrwst
7. 通過Label查詢Pod
kubectl get pod -l version=v1
- 通過Label刪除服務
kubectl delete service -l version=v1
命令總結:
kubectl create deployment #創(chuàng)建一個deployment來管理創(chuàng)建的容器
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 #更改現(xiàn)有的應用程序資源
kubectl rollout #資源回滾管理
kubectl delete #刪除資源
K8S 核心概念
Deployment
負責創(chuàng)建和更新應用程序的實力、 應用程序可以理解為Pod;
創(chuàng)建Deployment后,Master Node將應用程序實例調度到各個工作節(jié)點上運行;
如果工作節(jié)點上的應用程序關閉停止、則Master Node會將應用程序實例調度到其他的工作節(jié)點上、也是服務自愈;
Pod
相當于邏輯主機、 托管應用程序實例; 內部包含一個或者多個程序容器(Docker層);
可以理解為 在Docker容器層之上、再封裝了一層的容器;
Service
為Pod提供外部訪問暴露、負載均衡、服務發(fā)現(xiàn);即Pod的網(wǎng)絡代理;
若Pod沒有設置Service、則只能在集群內部訪問、集群外部無法訪問;
在ServiceSpec標記type的方式暴露,type類型如下:
- ClusterIP(默認):在集群的內部IP上公開Service。這種類型使得Service只能從集群內訪問。
- NodePort:使用NAT在集群中每個選定Node的相同端口上公開Service。使用 : 從集群外部訪問Service。是ClusterIP的超集。
- LoadBalancer:在當前云中創(chuàng)建一個外部負載均衡器(如果支持的話),并為Service分配一個固定的外部IP。是NodePort的超集。
- ExternalName:通過返回帶有該名稱的CNAME記錄,使用任意名稱(由spec中的externalName指定)公開Service。不使用代理
k8s中的資源
-
工作負載型資源(workload): Pod,ReplicaSet,Deployment,StatefulSet,DaemonSet等等
-
服務發(fā)現(xiàn)及負載均衡型資源(ServiceDiscovery LoadBalance): Service,Ingress等等
-
配置與存儲型資源: Volume(存儲卷),CSI(容器存儲接口,可以擴展各種各樣的第三方存儲卷)
-
特殊類型的存儲卷:ConfigMap(當配置中心來使用的資源類型),Secret(保存敏感數(shù)據(jù)),DownwardAPI(把外部環(huán)境中的信息輸出給容器)
-
集群級資源:Namespace,Node,Role,ClusterRole,RoleBinding(角色綁定),ClusterRoleBinding(集群角色綁定)
-
元數(shù)據(jù)型資源:HPA(Pod水平擴展),PodTemplate(Pod模板,用于讓控制器創(chuàng)建Pod時使用的模板),LimitRange(用來定義硬件資源限制的)
就業(yè)務開發(fā)來看、涉及頻率高的是Pod、Deployment、 Ingress、Service, Volume、其他比較少涉及實用;
資源清單
在k8s中,我們一般都會使用yaml格式的文件來創(chuàng)建符合我們預期期望的資源,這樣的yaml文件我們一般稱為資源清單
資源清單yaml的格式
apiVersion: group/apiversion # 如果沒有給定group名稱,那么默認為croe,可以使用kubectl api-versions 獲取當前k8s版本上所有的apiVersion版本信息(每個版本可能不同)
kind: #資源類別
metadata: #資源元數(shù)據(jù)
name
namespace #k8s自身的namespace
lables
annotations #主要目的是方便用戶閱讀查找
spec:期望的狀態(tài)(disired state)
status:當前狀態(tài),本字段由kubernetes自身維護,用戶不能去定義
#配置清單主要有五個一級字段,其中status字段用戶不能定義,由k8s自身維護
使用資源清單yaml來創(chuàng)建k8s的資源對象
用創(chuàng)建deployment的命令加上參數(shù) --dry-run -o yaml 輸出部署的資源清單yaml
kubectl create deployment my-tomcat --image=tomcat:7.0.75-alpine --dry-run -o yaml
使用yaml部署tomcat
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: my-tomcat-yaml
name: my-tomcat-yaml #修改deployment的名稱
spec:
replicas: 2 #修改pod副本為兩個
selector:
matchLabels:
app: my-tomcat-yaml
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: my-tomcat-yaml
spec:
containers:
- image: tomcat:7.0.75-alpine #容器的鏡像(核心)
name: tomcat
resources: {}
status: {}
使用apply命令
kubectl apply -f deployment-demo.yaml
用yaml創(chuàng)建service資源的對象
同樣使用dry-run yaml獲取yaml
kubectl expose deployment my-tomcat --name=tomcat --port=8080 --type=NodePort --dry-run -o yaml
創(chuàng)建service的yaml文件
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
app: my-tomcat-yaml
name: tomcat-service-yaml #修改service名稱
spec:
ports:
- port: 80 # service的虛擬ip對應的端口,在集群內網(wǎng)機器可以訪問用service的虛擬ip加該端口號訪問服務
nodePort: 30001 # service在宿主機上映射的外網(wǎng)訪問端口,端口范圍必須在30000-32767之間
protocol: TCP
targetPort: 8080 # pod暴露的端口,一般與pod內部容器暴露的端口一致
selector:
app: my-tomcat-yaml #應用名稱
type: NodePort
status:
loadBalancer: {}
執(zhí)行apply命令創(chuàng)建service資源
kubectl apply -f service-demo.yaml
查看已存在資源的yaml
業(yè)務開發(fā)中、服務已經(jīng)在運行了,我們需要查看yaml、就無需使用創(chuàng)建方式來查看了;
可以根據(jù)已運行的資源查看其yaml內容;
- 查看資源
- 將資源的配置以yaml的格式輸出出來
使用 -o yaml輸入;
kubectl get pod nginx-deploy-7db697dfbd-2qh7v -o yaml
Ingress
Ingress類型Nginx, 可以基于域名訪問、實現(xiàn)訪問的負載均衡;
- 使用K8S安裝Ingress
- 創(chuàng)建Ingress訪問配置yaml文件
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: web-ingress
spec:
rules:
- host: tomcat.com #轉發(fā)域名
http:
paths:
- path: /
backend:
serviceName: tomcat-service-yaml
servicePort: 80 #service的端口
- 執(zhí)行apply應用;
kubectl apply -f ingress-tomcat.yaml
- 查看生效的ingress規(guī)則
kubectl get ing #ingress 縮寫 ing
- C:\Windows\System32\drivers\etc,在host里增加如下host
192.168.65.203 (服務器IP) tomcat.com
或者
192.168.65.210 (服務器IP) tomcat.com
- 訪問
客戶機瀏覽器訪問http://tomcat.com/ ,能正常訪問tomcat。
存儲卷使用
通過存儲卷,我們可以把外部數(shù)據(jù)掛載到容器中去,供容器中的應用訪問,這樣就算容器崩潰了,數(shù)據(jù)也不會丟失;
docker的掛載:
docker run -p 80:80 --name nginx
-v /mydata/nginx/html:/usr/share/nginx/html
-v /mydata/nginx/logs:/var/log/nginx
-v /mydata/nginx/conf:/etc/nginx
-d nginx:1.10
K8S也可以掛載文件,添加配置文件nginx-volume-deployment.yaml用于創(chuàng)建Deployment:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-volume-deployment
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.10
ports:
- containerPort: 80
volumeMounts:
- mountPath: /usr/share/nginx/html
name: html-volume
- mountPath: /var/log/nginx
name: logs-volume
- mountPath: /etc/nginx
name: conf-volume
volumes:
- name: html-volume
hostPath:
path: /home/docker/mydata/nginx/html
type: Directory
- name: logs-volume
hostPath:
path: /home/docker/mydata/nginx/logs
type: Directory
- name: conf-volume
hostPath:
path: /home/docker/mydata/nginx/conf
type: Directory
kubectl 進行故障排除
若是服務部署失敗、則可通過subscribe查看問題
kubectl describe ${RESOURCE} ${NAME}
拉到最后看到Events部分,會顯示出 K8S 在部署這個服務過程的關鍵日志。
若是服務部署成功、業(yè)務運行出現(xiàn)異常、則通過logs查看問題;
kubectl logs ${POD_NAME}
進入容器內部;文章來源:http://www.zghlxwxcb.cn/news/detail-700657.html
kubectl exec -it [options] ${POD_NAME} -c ${CONTAINER_NAME} [args]
kubectl exec -ti $POD_NAME – bash文章來源地址http://www.zghlxwxcb.cn/news/detail-700657.html
總結
- Service 是 K8S 服務的核心,屏蔽了服務細節(jié),統(tǒng)一對外暴露服務接口,真正做到了“微服務”。
- 一方面外部用戶不需要感知因為 Pod 上服務的意外崩潰、K8S 重新拉起 Pod 而造成的 IP 變更,外部用戶也不需要感知因升級、變更服務帶來的 Pod 替換而造成的 IP 變化,另一方面,Service 還可以做流量負載均衡。
到了這里,關于K8S - 架構、常用K8S命令、yaml資源清單部署、Ingress、故障排查、存儲卷的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!