//建立一個deployment資源對象。(pod控制器) [root@master ~]# kubectl run test --image=httpd --port=80 --replicas=2 //刪除控制器: [root@master ~]# kubectl delete deployments. test //刪除全部pod: [root@master ~]# kubectl delete deployments. --all //查看deployment資源對象 [root@master ~]# kubectl get deployments. //查看pod運行在哪一個節點之上 [root@master ~]# kubectl get pod -o wide //查看service映射出來的資源對象 [root@master ~]# kubectl get svc //查看一個資源(service)的詳細信息。 [root@master ~]# kubectl describe svc test //刪除資源對象: [root@master ~]#kubectl delete services test //查看deployment資源的詳細信息: [root@master ~]# kubectl describe deployments. test-web //查看一個pod的詳細信息: [root@master ~]# kubectl describe pod test-web-8697566669-52tq //查看replicas的詳細信息 [root@master ~]# kubectl get replicasets. replicas:和controller manager都是一種控制器 //編輯一個資源對象(servie,pod,namespace均可以進行編輯): [root@master ~]# kubectl edit deployments. test-web //把輸出json格式的信息導入(轉爲)yaml格式的文本中:(反之也是相同的) [root@master ~]# kubectl get deployments. test-web -o json > test2.yaml
方法一:命令行的方式:node
1)建立一個deployment的資源對象: [root@master ~]# kubectl run test --image=httpd --port=80 --replicas=2 kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead. deployment.apps/test created //回車後會有正常提示(如上所示),提示這種deployment控制器會在未來的版本中移除,之後會有pod來代替。
[root@master ~]# kubectl get deployments. -o wide NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR test 2/2 2 2 68s test httpd run=test
2)進行擴容操做nginx
//將資源對象的副本擴容爲4個: [root@master ~]# kubectl scale deployment test --replicas=4 deployment.extensions/test scaled
//查看是否擴容成功:web
[root@master ~]# kubectl get deployments. -o wide NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR test 4/4 4 4 3m40s test httpd run=test
3)進行縮容操做(跟擴容相同,減小便可)docker
//將資源對象的副本縮容爲3個: [root@master ~]# kubectl scale deployment test --replicas=3 deployment.extensions/test scaled
[root@master ~]# kubectl get deployments. -o wide NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR test 3/3 3 3 7m14s test httpd run=test
方法二:也能夠利用edit編輯器:json
//將該deployment的副本數量擴容爲4個: [root@master ~]# kubectl edit deployments. test
//再次查看副本數量,已經擴容成功: [root@master ~]# kubectl get deployments. -o wide NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR test 4/4 4 4 11m test httpd run=test
1)搭建registry私有倉庫,上傳自定義鏡像:
搭建私有倉庫過程略,能夠參考以前的博文點擊連接。vim
//鏡像重命名: [root@master ~]# docker tag nginx:latest 172.16.1.30:5000/nginx:v1.0 [root@master ~]# docker tag nginx:latest 172.16.1.30:5000/nginx:v2.0 [root@master ~]# docker tag nginx:latest 172.16.1.30:5000/nginx:v3.0
//上傳鏡像: [root@master ~]# docker push 172.16.1.30:5000/nginx:v1.0 [root@master ~]# docker push 172.16.1.30:5000/nginx:v2.0 [root@master ~]# docker push 172.16.1.30:5000/nginx:v3.0
2)建立一個deployment:[root@master ~]# kubectl run mynginx --image=172.16.1.30:5000/nginx:v1.0 --replicas=4
api
//查看鏡像版本信息: [root@master ~]# kubectl get deployments. -o wide NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR mynginx 4/4 4 4 4m51s mynginx 172.16.1.30:5000/nginx:v1.0 run=mynginx
##若是pod沒有正常運行,排錯思路:架構
1,經過describe命令進行查看詳細信息。 [root@master ~]# kubectl describe pod bdqn-web-7ff466c8f5-p6wcw
2,經過查看kubelet的日誌信息。 [root@master ~]# cat /var/log/messages | grep kubelet
更新服務的鏡像版本app
//更新鏡像爲nginx:v2.0 [root@master ~]# kubectl set image deployment mynginx mynginx=172.16.1.30:5000/nginx:v2.0 deployment.extensions/mynginx image updated
//查看是否更新成功: [root@master ~]# kubectl get deployments. -o wide NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR mynginx 4/4 4 4 11m mynginx 172.16.1.30:5000/nginx:v2.0 run=mynginx
能夠看到鏡像已經更新成功。負載均衡
##############方法二:一樣能夠經過edit編輯器進行修改:
//將鏡像版本更新爲nginx:v3.0 [root@master ~]# kubectl edit deployments. mynginx
//保存退出後(與vim編輯器操做相同),查看鏡像版本: [root@master ~]# kubectl get deployments. -o wide NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR mynginx 4/4 4 4 16m mynginx 172.16.1.30:5000/nginx:v3.0 run=mynginx
進行回滾鏡像操做
//執行回滾操做: [root@master ~]# kubectl rollout undo deployment mynginx deployment.extensions/mynginx rolled back
[root@master ~]# kubectl get deployments. -o wide #能夠看到已經回滾成功 NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR mynginx 4/4 4 4 18m mynginx 172.16.1.30:5000/nginx:v2.0 run=mynginx
//二次執行回滾操做: [root@master ~]# kubectl rollout undo deployment mynginx deployment.extensions/mynginx rolled back
//查看回滾後的鏡像版本: [root@master ~]# kubectl get deployments. -o wide NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR mynginx 4/4 4 4 20m mynginx 172.16.1.30:5000/nginx:v3.0 run=mynginx
能夠很清楚的看到,k8s默認的回滾操做跟docker swarm集羣的是同樣,只在先後兩個版本之間進行回滾。
建立資源清單必需要知道而且記住如下幾個必寫的一級字段:
1,查看api全部的版本:(每一個版本都有各自的功能,固然你還能夠本身添加版本) [root@master ~]# kubectl api-versions
admissionregistration.k8s.io/v1beta1
apiextensions.k8s.io/v1beta1
apiregistration.k8s.io/v1
apiregistration.k8s.io/v1beta1
apps/v1
apps/v1beta1
apps/v1beta2
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
events.k8s.io/v1beta1
extensions/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
2,幫助你編寫yaml文件的工具(explain):
必定要用熟悉,很是有用。
//好比建立pod,須要用到那些字段以及對應的版本和提示: [root@master ~]# kubectl explain pod
//查看幫助deployment的metadata字段是怎樣寫的: [root@master ~]# kubectl explain deploy.metadata #部分資源對象名能夠簡寫,也能夠補全
它會給予一些相對應的子字段,好比name名稱,namespace名稱空間等。
3,接下來咱們編寫一個簡單的部署nginx的yaml文件
提示:編寫yaml文件時必定要注意格式(縮進)[root@master yaml]# vim nginx.yaml #注意,要以.yaml結尾
kind: Deployment #類型爲deployment apiVersion: extensions/v1beta1 #對應的版本爲v1beta1 metadata: name: nginx-deploy #定義該資源對象的名稱 spec: replicas: 2 #副本數量爲2 template: #定義模板 metadata: labels: #在模板中定義標籤,標籤的做用用於後面鏈接service使用 app: web-server spec: containers: - name: nginx #定義pod名稱(自定義) image: nginx #指定鏡像
//運行yaml文件:(有如下兩種方法) [root@master yaml]# kubectl apply -f nginx.yaml #推薦使用該種方法 deployment.extensions/nginx-deploy created
或者:[root@master yaml]# kubectl create nginx.yaml
//查看pod是否運行成功: [root@master yaml]# kubectl get pod NAME READY STATUS RESTARTS AGE nginx-deploy-56558c8dc7-pjdkk 1/1 Running 0 117s nginx-deploy-56558c8dc7-rxbpb 1/1 Running 0 117s
//若是須要經過yaml文件將資源對象進行刪除: [root@master yaml]# kubectl delete -f nginx.yaml deployment.extensions "nginx-deploy" deleted
該種方法也是經常使用的,不用本身手動去一個一個的將pod刪除。
4,建立一個service的資源對象,用於關聯上述的deployment
service的做用主要用於提供一個訪問服務的統一接口。k8s集羣維護service和endpoint的映射關係。
//編寫service的yaml文件: [root@master yaml]# vim nginx-svc.yaml
apiVersion: v1 kind: Service metadata: name: nginx-svc spec: type: NodePort #定義service的類型爲nodeport selector: #標籤選擇器,用於關聯deployment app: web-server #注意,該標籤必需要deployment的標籤一致,否則沒法與deployment進行關聯 ports: #定義端口 - protocol: TCP #協議爲TCP port: 8080 #定義cluster ip對應的端口 targetPort: 80 #定義容器內的端口 nodePort: 30000 #暴露給外網的端口
//執行yaml文件:
[root@master yaml]# kubectl apply -f nginx-svc.yaml
service/nginx-svc created
//查看service的信息:
解釋:
service默認爲Cluster ip的類型。Cluster ip僅支持集羣內部的訪問,且集羣內部每個節點均可以經過該ip地址相互訪問。
而nodeport的類型是暴露給外網的端口,外網能夠經過宿主機的ip地址+映射的端口來進行訪問。
//測試訪問nginx頁面:
咱們k8s架構中知道,集羣中的master節點默認是不參加工做的,若是須要master參加工做,該怎麼作呢?
1)執行如下命令設置處於工做狀態: [root@master yaml]# kubectl taint node master node-role.kubernetes.io/master- node/master untainted
2)修改上面的yaml文件,將副本數量改成3個。 [root@master yaml]# vim nginx.yaml
kind: Deployment apiVersion: extensions/v1beta1 metadata: name: nginx-deploy spec: replicas: 3 template: metadata: labels: app: web-server spec: containers: - name: nginx image: nginx
3)從新執行yaml文件: [root@master yaml]# kubectl apply -f nginx.yaml deployment.extensions/nginx-deploy configured
4)驗證pod會分配給master:(默認是不會分配給master的) [root@master yaml]# kubectl get pod -o wide
能夠看到會均勻的分配給集羣中每一個節點,以實現負載均衡。
[root@master yaml]# kubectl taint node master node-role.kubernetes.io/master="":NoSchedule node/master tainted
//從新運行yaml文件,查看pod是否還會分配給master [root@master yaml]# kubectl delete -f nginx.yaml deployment.extensions "nginx-deploy" deleted [root@master yaml]# kubectl apply -f nginx.yaml deployment.extensions/nginx-deploy created
注意:我這上面的pod,已是新的pod了,跟docker swarm同樣,原來分配在master上的pod還會存在,只是後生成的pod會隨機分配給其餘節點。
咱們知道pod是經過kube-proxy組件隨機分配給節點的,但若是要指定pod運行在哪一個節點上,該怎麼作?
跟docker swarm同樣,咱們能夠經過給節點打標籤的方式來實現。
1)//定義標籤: [root@master yaml]# kubectl label nodes node01 test=123 #標籤自定義 node/node01 labeled
//若是要刪除標籤: [root@master yaml]# kubectl label nodes node01 disktype-
2)//驗證節點標籤,並顯示它們的標籤狀態: [root@master yaml]# kubectl get nodes --show-labels
咱們查看node01,能夠查看到剛剛定義的標籤。
3)//修改yaml文件: [root@master yaml]# vim nginx.yaml
kind: Deployment apiVersion: extensions/v1beta1 metadata: name: nginx-deploy spec: replicas: 6 template: metadata: labels: app: web-server spec: containers: - name: nginx image: nginx nodeSelector: #添加節點選擇器 test: '123' #指定剛剛自定義的標籤,若是有數字則須要用單引或者雙引號括起來
//從新執行yaml文件: [root@master yaml]# kubectl apply -f nginx.yaml deployment.extensions/nginx-deploy configured
4)//查看pod是否會運行在指定的node01上: [root@master yaml]# kubectl get pod -o wide
注意:會將原來運行在該節點上的pod進行替換。
———————— 本文至此結束,感謝閱讀 ————————