kubenetes建立一個pod應用

 Pod是能夠建立和管理Kubernetes計算的最小可部署單元。一個Pod表明着集羣中運行的一個進程。每一個pod都有一個惟一的ip。html

一個pod相似一個豌豆莢,包含一個或多個容器(一般是docker),多個容器間共享IPC、Network和UTC namespacenode

 

Deployment爲Pod和ReplicaSet提供了一個聲明式定義(declarative)方法,用來替代之前的ReplicationController來方便的管理應用。典型的應用場景包括:nginx

  • 定義Deployment來建立Pod和ReplicaSet
  • 滾動升級和回滾應用
  • 擴容和縮容
  • 暫停和繼續Deployment

 

建立一個pod應用

kubectl  run -h  查看run命令的用法docker

master01 # kubectl run nginx-deploy --image=nginx:1.14-alpine --port=80 --replicas=1 --record
              控制器名稱 容器鏡像           容器的端口  pod的數量 在Deployment revision中能夠查看到執行的歷史命令

查看後端

[master01 ]# kubectl get pods -o wide
NAME                           READY   STATUS    RESTARTS   AGE     IP NODE     NOMINATED NODE   READINESS GATES
nginx-deploy-55d8d67cf-kckf9   1/1     Running   0          2m55s   10.244.1.3   node01   <none>           <none>
能夠看到pod已經運行在一個工做節點上, 這裏的ip是cni0橋的ip
[node01] # ifconfig cni0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1450
        inet 10.244.1.1  netmask 255.255.255.0  broadcast 0.0.0.0 

 在集羣內部任意的節點能夠訪問pod。集羣外部沒法直接訪問podapp

 刪除pods     查看會看到自動起來另外一個,由於 replicas個數爲1ide

# kubectl delete pod nginx-deploy-55d8d67cf-kckf9
pod "nginx-deploy-55d8d67cf-kckf9" deleted
# kubectl get pods -o wide
NAME                           READY   STATUS    RESTARTS   AGE     IP           NODE     NOMINATED NODE   READINESS GATES
nginx-deploy-55d8d67cf-lf5xb   1/1     Running   0          2m55s   10.244.1.3   node01   <none>           <none>

 

service

service是一個抽象概念,定義了一個服務的多個pod邏輯合集和訪問pod的策略,通常把service稱爲微服務。

舉個例子:a服務運行3個pod,b服務怎麼訪問a服務的pod,pod的ip都不是持久化的重啓以後就會有變化。
這時候b服務能夠訪問跟a服務綁定的service,service信息是固定的提早告訴b就好了,service經過Label Selector跟a服務的pod綁定,不管a的pod如何變化對b來講都是透明的。微服務

建立service 

kubectl  expose  -h  查看命令的用法spa

# kubectl expose deployment nginx-deploy --name=nginx80 --port=80 --target-port=80 --protocol=TCP
service_name service_port pod_port service
/nginx exposed

查看service3d

# kubectl get svc -o wide
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE     SELECTOR
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP          26d     <none>
nginx80      ClusterIP   10.105.125.134   <none>        80/TCP           118s    run=nginx-deploy

 pod客戶端訪問可使用 service_name:service_port 訪問pod。  說明service能夠爲pod提供固定訪問端點。

# kubectl run client --image=busybox --replicas=1 -it --restart=Never

 \# wget -O - -q http://nginx:80 能夠訪問到pod 

 kubectl describe svc nginx    查看service詳細信息

 

  • selector:run=nginx-deploy 標籤選擇器,pod被刪除掉,訪問nginx:80依然能訪問到。kubectl get pods --show-labels 查看標籤
  • endpoints能夠看到後端pod資源

實踐:

建立兩個pod

# kubectl run myapp --image=ikubernetes/myapp:v1 --replicas=2
# kubectl get pods -o wide 

 

建立一個service

# kubectl expose deployment myapp --port=8000 --target-port=80

查看svc

# kubectl describe svc myapp
Name:              myapp
Namespace:         default
Labels:            run=myapp
Annotations:       <none>
Selector:          run=myapp
Type:              ClusterIP
IP:                10.99.71.37       
Port:              <unset>  8000/TCP
TargetPort:        80/TCP
Endpoints:         10.244.1.35:80,10.244.1.36:80  #service後端的兩個pod
Session Affinity:  None
Events:            <none>

 建立一個pod客戶端訪問service_name:service_port,能夠看到service是隨機的將請求分發到後端的兩個pod的

# kubectl run client --image=busybox -it 

/ # wget -O - -q http://myapp:8000/hostname.html

  

使外部客戶端能夠訪問pod

 若是端口暴露類型爲NodePort,那麼能夠經過集羣內任意一臺主機ip加暴露的端口進行訪問

1. #  kubectl edit svc myapp   修改service的type爲NodePort

  ClusterIP: 默認類型,自動分配一個僅集羣內部能夠訪問的虛擬IP
  NodePort: 在ClusterIP基礎上爲Service在每臺機器上綁定一個端口,這樣就能夠經過  NodeIP:NodePort 來訪問該服務

2. 也能夠在建立service時指定type

 kubectl expose deployment nginx-deploy  --name=nginx   --port=80 --target-port=80 --type=NodePort

 # kubectl get svc -o wide

NAME         TYPE        CLUSTER-IP       EXTERNAL-IP PORT(S) AGE SELECTOR kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 26d <none> nginx80 NodePort 10.105.125.134 <none> 80:32441/TCP 35m run=nginx-deploy

使用集羣外客戶端訪問,須要使用集羣任意一個節點的IP地址加上暴露的端口號

 

 

動態擴容縮容

  kubectl scale --replicas=5 deployment  nginx-deploy     # replicas指定pod數便可 

升級鏡像

 將鏡像升級爲1.16-alpine:

# kubectl set image deployment nginx-deploy nginx-deploy=nginx:1.16-alpine  --record
deployment.extensions/nginx-deploy image updated

另開一個窗口監控升級過程:
# kubectl get pod -w

  升級完成後查看:

# kubectl get pods
NAME                            READY   STATUS    RESTARTS   AGE
nginx-deploy-56457775df-ptx9f   1/1     Running   0          2m25s
# kubectl get deployment
-o wide NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR nginx-deploy 1/1 1 1 23d nginx-deploy nginx:1.16-alpine run=nginx-deploy

# kubectl describe pod nginx-deploy-56457775df-ptx9f

  

回滾操做

# kubectl rollout undo deployment/nginx-deploy
deployment.extensions/nginx-deploy rolled back

--to-revision 參數能夠指定回退的版本

# kubectl rollout undo deploy/nginx-deploy --to-revision=1

# kubectl rollout history deployment/nginx-deploy     #查看歷史版本

這裏CHANGE-CAUSE顯示爲空是由於操做deployment的時候沒有加--record。若是加上應該顯示:

相關文章
相關標籤/搜索