3.k8s常用的資源
3.1 創建pod資源
k8s yaml的主要組成
apiVersion: v1 api版本
kind: pod 資源類型
metadata: 屬性
spec: 詳細
上傳nginx鏡像文件,并且上傳私有倉庫里面
k8s_pod.yaml
apiVersion: v1
kind: Pod
metadata:name: nginxlabels:app: web
spec:containers:- name: nginximage: 192.168.111.11:5000/nginx:1.13ports:- containerPort: 80
指定文件創建pod
#指定文件創建pod
kubectl create -f k8s_pod.yaml
#查看pod類型的nginx服務運行狀態
kubectl get pod nginx -o wide
#pod類型的nginx服務的詳細信息
kubectl describe pod nginx
可以看到nodeIP地址和一個容器IP地址,從本地私有倉庫pull的鏡像文件
nginx詳細信息
下圖可以看到容器ID與上圖nginx服務信息顯示一致,創建并啟動容器
注釋:啟動一個pod下圖會起兩個容器,
下圖可以看到pod容器有IP地址,nginx容器沒有IP地址
docker inspect 8405c6ebc78a |tail -20
nginx容器詳細信息
docker inspect 731c1535d85e |tail -20
nginx沒有IP地址,是因為網絡類型為Container:一個容器與另一個運行中的容器共享網絡,也就是nginx容器共享pod容器網絡;
注釋:使用pod也就是為了實現k8s的核心功能,單單考簡單的容器無法實現k8s核心功能。
一個pod資源:至少由兩個容器組成,pod基礎容器和業務容器組成
舉例子:pod配置文件2,一個pod資源多個業務容器:
apiVersion: v1
kind: Pod
metadata:name: testlabels:app: web
spec:containers:- name: nginximage: 192.168.111.11:5000/nginx:1.13ports:- containerPort: 80- name: busyboximage: 192.168.111.11:5000/busybox:latestcommand: ["sleep","10000"]
創建一個pod兩個業務容器
在192.168.111.13的宿主機上可以看到3個容器,兩個業務容器公用pod容器網絡,也就是3個容器使用一個IP地址;
業務容器端口分配方式:端口誰先占誰先得。
pod是k8s最小的資源單位
3.2 ReplicationController資源
rc:保證指定數量的pod始終存活,rc通過標簽選擇器(selector)來關聯pod
rc即:ReplicationController:副本控制器:功能就是起多個相同的pod,而且保證pod數量,多了就刪除,少了就增加
k8s資源的常見操作:
#指定文件創建yaml
kubectl create -f xxx.yaml
#查看pod和rc資源列表
kubectl get pod|rc
#查看pod類型nginx服務的詳情信息
kubectl describe pod nginx
#刪除pod資源nginx服務
kubectl delete pod nginx 或者kubectl delete -f xxx.yaml
#編輯修改資源配置文件
kubectl edit pod nginx
創建一個rc
apiVersion: v1
kind: ReplicationController
metadata:name: nginx
spec:replicas: 5 #自動創建pod,為5個podselector: #標簽選擇器,根據pod標簽識別,哪些pod是我的,如果多了,我就要干掉年輕的app: mywebtemplate: #給pod定義模板,便于創建podmetadata: #從改行以下就是pod配置文件一致的,多個pod不能設置一樣的name,隨機生產labels: #標簽,與rc標簽選擇器一致,否側該pod不屬于rcapp: mywebspec:containers:- name: mywebimage: 192.168.111.11:5000/nginx:1.13ports:- containerPort: 80
查看同一瞬間起一個rc和5個pod,并且分配宿主機均衡,
rc的名字為nginx,5個pod都是根據rc的名字后面接隨機組成的名字
測試刪除一個pod,rc會自動有創建出一個pod
測試刪除一個node192.168.111.13節點,rc會將pod轉移到12上自動創建pod,始終保持5個pod,就是這么倔
將刪除的node節點添加回來,在支節點node13上重啟服務
systemctl restart kubelet.service
master節點11會自動納管node13
標簽選擇器作用測試,始終保持5個pod
注釋:rc創建5個pod的標簽是myweb;則單獨一個pod:nginx的標簽為web
手動編輯nginx的標簽,與rc標簽一致
上下對比查看,rc保持5個pod,優先刪除年齡小的3s的pod,刪除一個資歷淺的
rc的滾動升級
查看當前nginx版本為nginx.1.13
拷貝rc配置文件
新建一個k8s_rc2.yaml并且編輯內容,進行與之前的進行對比
升級
#rolling-update:滾動升級
#nginx:表示rc的名字為nginx
#--update-period:表示更新周期,我這里設置了10s升級一次
kubectl rolling-update nginx -f k8s_rc2.yaml --update-period=10s
如下圖所示:首先會創建一個nginx2的rc升級pod從0到5,降級nginx的rc從5到0,最后nginx2升級成功,刪除舊得rc的nginx
同時查看pod之間間隔時間為10s,并且每個pod的名字為nginx2****
在查看nginx的版本為nginx1.15,升級成功
回滾,就是將升級的步驟反過就可以,指定舊版本的yaml文件即可
kubectl rolling-update nginx2 -f k8s_rc.yaml --update-period=1s
回滾完成
回滾時間
查看nginx版本為1.13,回滾成功
3.3 service資源
service幫助pod暴露端口
cluster實現負載均衡的功能(輪詢,rr策略),如果pod存活,cluster會自動將pod加入到vip里面;
每個nodeip端口都會映射到VIP上面
創建一個service
apiVersion: v1
kind: Service
metadata:name: myweb
spec:type: NodePort #端口映射類型ports:- port: 80 #clusterIP端口nodePort: 30000 #node port,如果刪除該行定義,則會起隨機端口targetPort: 80 #pod portselector: #標簽選擇器:關聯podapp: myweb
創建svc
kubectl create -f nginx_svc.yaml
可以看到標簽、端口映射、VIP
關聯的pod
瀏覽器訪問node節點IP地址加30000端口即可,出現nginx
修改nodePort范圍擴大
vim /etc/kubernetes/apiserver
KUBE_API_ARGS="--service-node-port-range=3000-50000"
systemctl restart kube-apiserver.service
service默認使用iptables來實現負載均衡, k8s 1.8新版本中推薦使用lvs(四層負載均衡)
3.4 deployment資源
有rc在滾動升級之后,會造成服務訪問中斷(就是標簽不一致導致的),于是k8s引入了deployment資源
創建deployment
apiVersion: extensions/v1beta1 #擴展的
kind: Deployment
metadata:name: nginx-deployment
spec:replicas: 3template:metadata:labels:app: nginxspec:containers:- name: nginximage: 192.168.111.11:5000/nginx:1.13ports:- containerPort: 80resources: #資源,該配置可加可不加limits: #最多能使用多少cpu: 100mrequests: #這個pod需要多少資源cpu: 100m
創建deploy.yaml文件,rs的標簽:app=nginx,pod-template-hash=642398064與rc的標簽不一樣
deployment,先啟動一個rs資源,rs控制pod的數量;
rs 90%的功能和rc一樣,甚至比rc更強;
在根據deploy.yaml文件創建一個svc;
注意:nodePort不能和其他的svc端口發生沖突;selector標簽選擇器要和上面的deploy中pod的nginx一致;
apiVersion: v1
kind: Service
metadata:name: mynginx
spec:type: NodePort ports:- port: 80 nodePort: 3000targetPort: 80selector:app: nginx
創建svc與rs一致的標簽,node端口3000,curl node的IP:3000請求信息為200狀態碼
deployment升級和回滾
編輯修改deployment配置文件,進行升級NG
kubectl edit deployment
由原來的nginx:1.13改為nginx:1.15,保存即可
會重新啟一個rs,nginx版本為15,又新啟動3個pod,訪問NG服務版本為15
回滾歷史版本
查看歷史版本
kubectl rollout history deployment
回滾上一個版本,可以看到NG版本回到了13版本
kubectl rollout undo deployment
由原來的1版本變成了3版本
回滾到指定的版本
kubectl rollout undo deployment --to-revision=2
歷史版本查看,有一點不好的地方就是change一直為空,不美觀
命令行創建deployment
#--record:表示記錄歷史變化
kubectl run nginx --image=192.168.111.11:5000/nginx:1.13 --replicas=3 --record
歷史變化會記錄
命令行升級到指定的版本
kubectl set image deploy nginx nginx=192.168.111.11:5000/nginx:1.15
上面的nginx=192.168.111.11:5000/nginx:1.15;就是指定容器的名字nginx
因為一個pod里面可能存在多個業務的容器,每個容器的業務版本也不一致,使用的鏡像也不一致,所以要指定容器
舉例子說明
常用操作命令如下:
#命令行升級版本
kubectl set image deploy nginx nginx=192.168.111.11:5000/nginx:1.15
#查看deployment所有歷史版本
kubectl rollout history deployment nginx
#deployment回滾到上一個版本
kubectl rollout undo deployment nginx
#deployment回滾到指定版本
kubectl rollout undo deployment nginx --to-revision=2
3.5 tomcat+mysql測試
在k8s中容器之間相互訪問,通過VIP地址!保證不管pod或者node死掉了,都可以互相通信
先創建mysql-rc.yaml文件,啟動pod
apiVersion: v1
kind: ReplicationController
metadata:name: mysql
spec:replicas: 1selector:app: mysqltemplate:metadata:labels:app: mysqlspec:containers:- name: mysqlimage: 192.168.111.11:5000/mysql:5.7ports:- containerPort: 3306env:- name: MYSQL_ROOT_PASSWORDvalue: '123456'
在創建mysql-svc.yaml文件,為pod添加一個clusterIP關聯pod
apiVersion: v1
kind: Service
metadata:name: mysql
spec: #詳細下面沒有指定類型,默認就是clusterIP類型ports:- port: 3306targetPort: 3306selector:app: mysql
創建mysql-svc.yaml之后過去clusterIP,然后將該IP地址添加到tomcat-rc.yaml配置文件中,讓pod通過VIP地址找mysql數據庫
創建tomcat-rc.yaml文件,啟動pod
apiVersion: v1
kind: ReplicationController
metadata:name: myweb
spec:replicas: 1selector:app: mywebtemplate:metadata:labels:app: mywebspec:containers:- name: mywebimage: 192.168.111.11:5000/tomcat-app:v2ports:- containerPort: 8080env:- name: MYSQL_SERVICE_HOSTvalue: 'mysql' #該值要添加mysql的svc的clusterIP地址,可以查看,在添加- name: MYSQL_SERVICE_PORTvalue: '3306'
創建tomcat-svc.yaml文件,為pod添加一個clusterIP關聯pod
apiVersion: v1
kind: Service
metadata:name: myweb
spec:type: NodePortports:- port: 8080nodePort: 30008selector:app: myweb
創建完成,查看狀態
瀏覽器訪問nodeip地址http://192.168.111.12:30008/
在訪問一下http://192.168.111.12:30008/demo/
這是要連接數據庫的,也可以提交數據
點擊啊上圖的Add,添加名字和等級,隨意添加然后提交即可
信息添加到數據庫成功
去系統數據庫中查看提交的數據,進數據庫中的操作命令和docker命令幾乎一樣
可以看到數據庫中的數據和提交的一樣