k8s資源的建立方式之命令行&資源清單(yaml)

命令行資源建立的基本操做命令

//建立一個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

k8s資源的建立方式之命令行&資源清單(yaml)

//再次查看副本數量,已經擴容成功:
[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=4api

//查看鏡像版本信息:
[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

k8s資源的建立方式之命令行&資源清單(yaml)

//保存退出後(與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集羣的是同樣,只在先後兩個版本之間進行回滾。

資源的傳建立方式之資源清單(yaml)

建立資源清單必需要知道而且記住如下幾個必寫的一級字段:

  • apiVersion: api的版本
  • kind:要建立的資源對象的類型
  • metadata:元數據。(描述資源對象的基本信息)其中name字段是必寫字段。
  • spec:描述用戶指望的狀態。container和image字段是必寫字段,container------>image.
  • status: 如今pod所處的狀態。(隨着pod容器的運行自動生成的)
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

k8s資源的建立方式之命令行&資源清單(yaml)

//查看幫助deployment的metadata字段是怎樣寫的:
[root@master ~]# kubectl  explain  deploy.metadata  #部分資源對象名能夠簡寫,也能夠補全

k8s資源的建立方式之命令行&資源清單(yaml)
它會給予一些相對應的子字段,好比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的信息:
k8s資源的建立方式之命令行&資源清單(yaml)

解釋:
service默認爲Cluster ip的類型。Cluster ip僅支持集羣內部的訪問,且集羣內部每個節點均可以經過該ip地址相互訪問。
而nodeport的類型是暴露給外網的端口,外網能夠經過宿主機的ip地址+映射的端口來進行訪問。

//測試訪問nginx頁面:
k8s資源的建立方式之命令行&資源清單(yaml)

設置master節點參加工做:

咱們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

k8s資源的建立方式之命令行&資源清單(yaml)
能夠看到會均勻的分配給集羣中每一個節點,以實現負載均衡。

恢復master節點(不參加工做)

[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

k8s資源的建立方式之命令行&資源清單(yaml)

注意:我這上面的pod,已是新的pod了,跟docker swarm同樣,原來分配在master上的pod還會存在,只是後生成的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

k8s資源的建立方式之命令行&資源清單(yaml)
咱們查看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

k8s資源的建立方式之命令行&資源清單(yaml)
注意:會將原來運行在該節點上的pod進行替換。

———————— 本文至此結束,感謝閱讀 ————————

相關文章
相關標籤/搜索