Kubernetes入門學習--在Ubuntu16.0.4安裝配置Minikube


一、安裝minikube環境

 1.1.安裝前准備

  • 需要在ubuntu16.04物理機上安裝virtualbox軟件
  • 下載kubectl
  • 下載minikube
  • 下載lantern
  • 下載docker

 1.2. 安裝Lantern

設置過程可以參考:docker在Ubuntu下翻牆

 1.3. 安裝Docker

如果需要詳細了解docker有他相關操作,請詳見docker在Ubuntu下1小時快速學習
以下操作步驟均在root用戶下操作,2個版本任選其一

 1.3.1. 獲取docker_17.03.2~ce的deb下載地址

  1. 進入https://download.docker.com/linux/ubuntu/dists/ 頁面
  2. 在頁面中會看到ubuntu不同版本的代號,選擇自己對應的版本進入,此次安裝的是ubuntu16.04,因此選擇xenial連接進入
  3. 然后一路選擇xenial/pool/stable/amd64/,stable是穩定版本,ubuntu需要的是amd64的軟件格式
  4. https://download.docker.com/linux/ubuntu/dists/xenial/pool/stable/amd64/ 頁面就能找打所需要的穩定版本docker
  5. 右鍵點擊在所需要的版本上,選擇復制連接地址,即可得到下載地址路徑,如下:
    https://download.docker.com/linux/ubuntu/dists/xenial/pool/stable/amd64/docker-ce_17.03.2~ce-0~ubuntu-xenial_amd64.deb

 1.3.2. 下載安裝docker-ce_17.03.2~ce版本

序列 操作步驟 詳細說明
1 檢查內核是否符合要求 Docker 要求 Ubuntu 系統的內核版本高於 3.10 ,建議在 Ubuntu14.04 版本

root@duke:/var/cache/apt/archives# uname -r
3.13.0-135-generic

2 安裝docker

root@duke:~# wget https://download.docker.com/linux/ubuntu/dists/xenial/pool/stable/amd64/docker-ce_17.03.2~ce-0~ubuntu-xenial_amd64.deb
--2017-12-19 19:30:29-- https://download.docker.com/linux/ubuntu/dists/xenial/pool/stable/amd64/docker-ce_17.03.2~ce-0~ubuntu-xenial_amd64.deb
正在解析主機 download.docker.com (download.docker.com)... 52.85.158.200, 52.85.158.223, 52.85.158.109, ...
正在連接 download.docker.com (download.docker.com) | 52.85.158.200 | :443... 已連接。
已發出 HTTP 請求,正在等待回應... 200 OK
長度: 19183424 (18M) [application/x-debian-package]
正在保存至: “docker-ce17.03.2~ce-0~ubuntu-xenial_amd64.deb”

docker-ce_17.03.2~ce-0~ubuntu-xenial
100%

3 啟動docker 后台服務

root@duke: service docker start
start: Job is already running: docker
root@duke:

4 測試運行hello-world

root@duke: docker run hello-world

 1.3.3. 獲取docker-1.13.1的tgz包下載地址

  1. 進入https://github.com/moby/moby/releases頁面
  2. 點擊 按鈕,進入以頁面就可以根據選擇選取版本
  3. 當前要選擇docker-ce_17.03.2~ce或者docker-1.13.1,因此經過翻頁后,找到對應版本,點擊進入頁面,找到downloads信息后,就可以找ubuntu系統上進行下載
  4. Docker的tgz包加壓后,並不能加載到系統服務中,所以不太推薦此種方式安裝,建議還是采用deb包安裝方式,可以省去不必要的麻煩

 1.3.4. 下載docker-1.13.1.tgz版本

序列 操作步驟 詳細說明
1 檢查內核是否符合要求 Docker 要求 Ubuntu 系統的內核版本高於 3.10 ,建議在 Ubuntu14.04 版本

root@duke:/var/cache/apt/archives# uname -r
3.13.0-135-generic

2 安裝docker

root@duke:~# wget https://get.docker.com/builds/Linux/x86_64/docker-1.13.1.tgz
--2017-12-20 13:57:23-- https://get.docker.com/builds/Linux/x86_64/docker-1.13.1.tgz
正在解析主機 get.docker.com (get.docker.com)... 54.182.1.40, 54.182.1.36, 54.182.1.148, ...
正在連接 get.docker.com (get.docker.com) | 54.182.1.40 |:443... 已連接。
已發出 HTTP 請求,正在等待回應... 200 OK
長度: 27851024 (27M) [application/x-tar]
正在保存至: “docker-1.13.1.tgz”

docker-1.13.1.tgz 100%[======================================================================>] 26.56M 56.1KB/s in 9m 35s

2017-12-20 14:07:00 (47.3 KB/s) - 已保存 “docker-1.13.1.tgz” [27851024/27851024])

root@duke2:~/docker#

3 啟動docker 后台服務

root@duke: service docker start
start: Job is already running: docker
root@duke:

4 測試運行hello-world

root@duke: docker run hello-world

 1.4. 設置docker翻牆代理

設置過程可以參考:docker在Ubuntu下翻牆

 1.5. 安裝virtualbox

  1. 更新ubuntu16.04系統
    sudo apt update && sudo apt upgrade
    
  2. 安裝依賴包
    sudo apt install gdebi build-essential
    
  3. virtualbox源網站下載版本,下載命令如下:
    wget http://download.virtualbox.org/virtualbox/5.2.8/virtualbox-5.2_5.2.8-121009~Ubuntu~xenial_amd64.deb
    
  4. 安裝virtualbox
    gdebi  virtualbox-5.2_5.2.8-121009~Ubuntu~xenial_amd64.deb
    
  5. 會提示缺少什么依賴包,如libqt5x11extras5 和 libsdl1.2debian,可能是別的,安裝依賴如下:
    apt-get install libqt5x11extras5 libsdl1.2debian
    
  6. 安裝完缺失的包后,再次安裝virtualbox,即可成功

 1.6. 安裝kuberctl

 1.6.1. 方法一

  1. 安裝最新版kubectl
    curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/amd64/kubectl
    
  2. 賦二進制文件執行權限
    chmod +x ./kubectl
    
  3. 將二進制文件移到 PATH 中
    cp kubectl /usr/local/bin
    

 1.6.2. 方法二

官方安裝方法,命令如下:

apt-get update && apt-get install -y apt-transport-https
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF
apt-get update
apt-get install -y kubectl

 1.7. 關閉swap交換分區

如果系統啟用了swap交換分區是無法正常啟動系統的。在使用minikube進行啟動時會報以下錯誤,導致minikube無法正常啟動:

[WARNING Swap]: running with swap on is not supported. Please disable swap

因此執行以下操作,將swap關閉

root@duke:~# swapoff -a
root@duke:~# vi /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
#
# / was on /dev/sda2 during installation
UUID=fc889839-8795-431c-98a8-2d0a53c848ac / ext4 errors=remount-ro 0 1
# swap was on /dev/sda3 during installation
#UUID=88e98aaf-0bfe-4521-85ca-610836c244c6 none swap sw 0 0 注釋掉swap配置
~
"/etc/fstab" 11L, 595C written

 1.8. 安裝minikube

  1. 官方版本地址

    【注意】:由於官方版本在進行minikube start時,會卡死在Starting cluster components...處,而無法正常啟動minikube,主要原因是需要翻牆到google雲服務,直接使用翻牆軟件也是無法解決,因此可以使用,大神修改鏡像源的版本,下載地址如下:
    https://yq.aliyun.com/articles/221687
  2. 下載安裝
    【官方下載地址】:

    curl -Lo minikube https://storage.googleapis.com/minikube/releases/v0.26.0/minikube-linux-amd64 && chmod +x minikube && sudo cp minikube /usr/local/bin/
    

    【阿里雲地址】:

    curl -Lo minikube http://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/releases/v0.26.0/minikube-linux-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/
    
  3. 啟動minikue,minikube缺省啟動的是使用virtualbox虛擬環境,

    【注意】:如果用戶是duke登陸,使用root用戶去minikube start,會卡在Starting cluster components無法繼續執行下去,並且在virtualbox中不會生成minikube的虛擬機
    duke@duke:~/minikube$ minikube start
    Starting local Kubernetes v1.10.0 cluster...
    Starting VM...
    Downloading Minikube ISO
    150.53 MB / 150.53 MB [============================================] 100.00% 0s
    Getting VM IP address...
    Moving files into cluster...
    Downloading kubeadm v1.10.0
    Downloading kubelet v1.10.0
    Finished Downloading kubeadm v1.10.0
    Finished Downloading kubelet v1.10.0
    Setting up certs...
    Connecting to cluster...
    Setting up kubeconfig...
    Starting cluster components...
    Kubectl is now configured to use the cluster.
    Loading cached images from config file.
  4. 查看minikube狀態

    duke@duke:~/minikube$ minikube status
    minikube: Running
    cluster: Running
    kubectl: Correctly Configured: pointing to minikube-vm at 192.168.99.110

二、 使用minikube命令

Minikube啟動后,會在用戶的根目錄下創建一個.minikube的文件夾,里面包含了所下載的minikube iso等信息。

 2.1. Minikube查看kubernetes管理

duke@duke:~$ minikube dashboard
Opening kubernetes dashboard in default browser...

執行minikube dashboard后,就會在本機自動打開kubernetes的管理頁面

 2.2. Minikube查看最新支持的kubernetes版本

duke@duke:~$ minikube get-k8s-versions
The following Kubernetes versions are available when using the localkube bootstrapper:

    - v1.10.0
    - v1.9.4
    - v1.9.0
    - v1.8.0
    - v1.7.5
    - v1.7.4
    - v1.7.3
    - v1.7.2
    - v1.7.0
    - v1.7.0-rc.1
    - v1.7.0-alpha.2
    - v1.6.4
    - v1.6.3
    - v1.6.0
    - v1.6.0-rc.1
    - v1.6.0-beta.4
    - v1.6.0-beta.3
    - v1.6.0-beta.2
    - v1.6.0-alpha.1
    - v1.6.0-alpha.0
    - v1.5.3
    - v1.5.2
    - v1.5.1
    - v1.4.5
    - v1.4.3
    - v1.4.2
    - v1.4.1
    - v1.4.0
    - v1.3.7
    - v1.3.6
    - v1.3.5
    - v1.3.4
    - v1.3.3
    - v1.3.0

表示當前最高支持v1.10.0版本

 2.3. Minikube刪除minikube虛擬機

duke@duke:~$ minikube delete
Deleting local Kubernetes cluster...
Machine deleted.

執行該命令后,minikube會將virtualbox中的minikube虛擬機刪除。

三、 使用Kubectl命令

 3.1. Kubectl查看kubernetes集群狀態

duke@duke:~$ kubectl cluster-info
Kubernetes master is running at https://192.168.99.111:8443
KubeDNS is running at https://192.168.99.111:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

表示集群的master啟動在192.168.99.110上

 3.2. Kubectl查看kubernetes的版本信息

duke@duke:~$ kubectl version
Client Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.1", GitCommit:"d4ab47518836c750f9949b9e0d387f20fb92260b", GitTreeState:"clean", BuildDate:"2018-04-12T14:26:04Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.0", GitCommit:"fc32d2f3698e36b93322a3465f63a14e9f0eaead", GitTreeState:"clean", BuildDate:"2018-03-26T16:44:10Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"linux/amd64"}

表示當前啟動的client是v1.10.1版本,啟動的server是v1.10.0版本

 3.3. Kubectl查看支持的api版本信息

duke@duke:~$ 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
batch/v1
batch/v1beta1
certificates.k8s.io/v1beta1
events.k8s.io/v1beta1
extensions/v1beta1
networking.k8s.io/v1
policy/v1beta1
rbac.authorization.k8s.io/v1
rbac.authorization.k8s.io/v1beta1
storage.k8s.io/v1
storage.k8s.io/v1beta1
v1

 3.4. Kubectl查看集群節點數

duke@duke:~$ kubectl get no
NAME STATUS ROLES AGE VERSION
minikube Ready master 1h v1.10.0

當前只有一個節點

 3.5. Kubectl啟動一個容器

duke@duke:~$ kubectl run nginx --image=nginx:1.7.9
deployment.apps "nginx" created

表示啟動一個名為nginx的容器,鏡像版本為nginx:1.7.9

 3.6. Kubectl檢查deploy部署信息

duke@duke:~$ kubectl get deploy
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx 1 1 1 1 14h

查看所有資源運行的狀態,關鍵字說明如下表

關鍵字
說明
DESIRED 表示創建nginx時想要創建的幾個instance
URRENT 表示當前創建了nginx幾個instance
UP-TO-DATE 表示當前已經升級到最新版本的instance個數
AVAILABLE 表示可以應用於服務為的幾個instance
AGE 表示當前nginx已經存活了多久

 3.7. Kubectl查看詳細deploy部署信息

duke@duke:~$ kubectl describe deploy nginx
Name: nginx
Namespace: default
CreationTimestamp: Tue, 17 Apr 2018 20:29:43 +0800
Labels: run=nginx
Annotations: deployment.kubernetes.io/revision=1
Selector: run=nginx
Replicas: 1 desired | 1 updated | 1 total | 1 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 1 max unavailable, 1 max surge
Pod Template:
Labels: run=nginx 后期要用到service生成pod時,就和labels相關
Containers:
nginx:
Image: nginx:1.7.9
Port:
Host Port:
Environment:
Mounts:
Volumes:
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets:
NewReplicaSet: nginx-6bcd55cfd6 (1/1 replicas created)

#保證pod有且只有一個nginx被啟動,當nginx被殺死或存在多個時,NewReplicaSet會保證只有一個存在,啟動或者殺死,
#當然如果在啟動nginx時指定了是3個,那么NewReplicaSet會保證有且只有3個nginx處於活動狀態。
#NewReplicaSet只能控制單一版本的控制,無法做多版本控制

Events:

 3.8. Kubectl查看ReplicaSet信息

duke@duke:~$ kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-6bcd55cfd6 1 1 1 14h

此處的nginx-6bcd55cfd6和用kubectl describe deploy nginx 查看的NewReplicaSet信息是一致的

 3.9. Kubectl查看詳細ReplicaSet信息

duke@duke:~$  kubectl describe rs
Name: nginx-6bcd55cfd6
Namespace: default
Selector: pod-template-hash=2678117982,run=nginx
Labels: pod-template-hash=2678117982
run=nginx
Annotations: deployment.kubernetes.io/desired-replicas=1
deployment.kubernetes.io/max-replicas=2
deployment.kubernetes.io/revision=1
Controlled By: Deployment/nginx
Replicas: 1 current / 1 desired
Pods Status: 1 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
Labels: pod-template-hash=2678117982
run=nginx
Containers:
nginx:
Image: nginx:1.7.9
Port:
Host Port:
Environment:
Mounts:
Volumes:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulCreate 1m replicaset-controller Created pod: nginx-6bcd55cfd6-kt2vc

replicaset-controller 表示replicaset的控制,創建了pod節點容器nginx-6bcd55cfd6-kt2vc

 3.10. Kubectl查看pod運行信息

duke@duke:~$ duke@duke:~$ kubectl get po
NAME READY STATUS RESTARTS AGE
nginx-6bcd55cfd6-kt2vc 1/1 Running 0 14h

 3.11. Kubectl查看pod運行在哪個node上

duke@duke:~$ kubectl get po nginx-6bcd55cfd6-kt2vc -o wide
NAME READY STATUS RESTARTS AGE IP NODE
nginx-6bcd55cfd6-kt2vc 1/1 Running 0 14h 172.17.0.4 minikube

表示運行在172.17.0.4的docker容器中,運行的node節點是minikbe中(即在服務器名為minikube的節點上運行)
所以查看virtualbox中的minikube服務器中的docker情況,信息如下圖。

 3.12. Kubectl查看pod日志信息

duke@duke:~$ kubectl logs nginx-6bcd55cfd6-kt2vc

由於nginx的日志是非標准輸出,所以沒有日志打印

 3.13. Kubectl進入pod容器中

duke@duke:~$ kubectl logs exec -it nginx-6bcd55cfd6-kt2vc /bin/bash
root@nginx-6bcd55cfd6-kt2vc:/
root@nginx-6bcd55cfd6-kt2vc:/# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: sit0@NONE: mtu 1480 qdisc noop state DOWN qlen 1
link/sit 0.0.0.0 brd 0.0.0.0
10: eth0@if11: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:11:00:04 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.4/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
root@nginx-6bcd55cfd6-kt2vc:/# nginx -v
nginx version: nginx/1.7.9

這條命令在minikube情況下,必須在宿主機上執行,通過遠程ssh終端連接宿主機后,執行該命令,會報以下錯誤:

duke@duke:~$ kubectl exec nginx-6bcd55cfd6-kt2vc hostsname
error: error sending request: Post https://192.168.99.111:8443/api/v1/namespaces/default/pods/nginx-6bcd55cfd6-kt2vc/exec?command=hostsname&container=nginx&container=nginx&stderr=true&stdout=true: EOF

 3.14. Kubectl查看service信息

duke@duke:~$  kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 443/TCP 1h

 3.15. Kubectl創建service

 3.15.1. 使用yaml文件創建方法

創建一個名為nginx.svc.yaml的nginx的服務配置文件,內容如下:

apiVersion: v1
kind: Service
metadata:
 name: nginx
 labels:
  app: nginx
spec:
 ports:
 - name: http
   port: 8888
   nodePort: 30001
   targetPort: 80
 selector:
  run: nginx
 type: NodePort

其中selector選擇的就是run: nginx,就是之前使用kubectl describe deploy nginx
命令查看到的Labels信息。
創建service服務如下:

duke@duke:~$ kubectl create -f nginx.svc.yaml
service "nginx" created

查看當前環境有沒有啟動了nginx服務

duke@duke:~$  kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 443/TCP 1h
nginx NodePort 10.103.210.101 8888:30001/TCP 5m

在宿主機登陸瀏覽器,訪問:192.168.99.111:30001,就可以看見pod容器對外提供的service服務。
30001是從容器中暴露出來給外部訪問用的。

 3.15.2. 使用kubectl expose創建方法

duke@duke:~$ kubectl expose deploy nginx --type=NodePort --name=nginx-hzw --port=80
service "nginx-hzw" exposed

關鍵字
說明
tpye 創建服務的類型
name 創建service的名稱
port 對外暴露的service端口

查看是否存在創建名為nginx-hzw的service服務:

duke@duke:~$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 443/TCP 1h
nginx NodePort 10.103.210.101 8888:30001/TCP 21m
nginx-hzw NodePort 10.108.38.219 <none> 80:31874/TCP 14s

通過查看上面信息得知,容器內部的80端口,被暴露為31874端口用於外部訪問,而10.108.38.219地址為容器內部地址,所以訪問地址依舊為192.168.99.111,因此瀏覽器訪問192.168.99.111:31874。

 3.16. Kubectl刪除service

duke@duke:~$  kubectl delete svc nginx-hzw
service "nginx-hzw" deleted
duke@duke:~$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 443/TCP 2h
nginx NodePort 10.103.210.101 8888:30001/TCP 32m

 3.17. Kubectl查看service和pod關聯

duke@duke:~$  kubectl get ep    ep是endpoints簡寫
NAME ENDPOINTS AGE
kubernetes 192.168.99.111:8443 2h
nginx 172.17.0.4:80 35m
nginx-hzw 172.17.0.4:80 36s

從上面可以看出service的nginx和nginx-hzw和pod的nginx進行了關聯,因為他們都使用的endpoints是172.17.0.4:80,都使用的是 Labels為run: nginx的原因,采用的是路由的方式。

 3.18. Kubectl擴容pod

duke@duke:~$  kubectl get deploy
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx 1 1 1 1 2h
duke@duke:~$ kubectl scale deploy nginx --replicas=3
deployment.extensions "nginx" scaled
duke@duke:~$ kubectl get deploy
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx 3 3 3 1 2h
duke@duke:~$ kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-6bcd55cfd6 3 3 3 2h
duke@duke:~$ kubectl get po
NAME READY STATUS RESTARTS AGE
nginx-6bcd55cfd6-2g6dl 1/1 Running 0 5m
nginx-6bcd55cfd6-4sngz 1/1 Running 0 5m
nginx-6bcd55cfd6-kt2vc 1/1 Running 0 2h
duke@duke:~$ kubectl get ep
NAME ENDPOINTS AGE
kubernetes 192.168.99.111:8443 2h
nginx 172.17.0.4:80,172.17.0.5:80,172.17.0.6:80 56m
nginx-hzw 172.17.0.4:80,172.17.0.5:80,172.17.0.6:80 22m

【replicas】:表示需要幾個instance
生成了3個pod,instance也擴容到了3個
並且endpoints也自動變為了3個,所以會有172.17.0.4:80,172.17.0.5:80,172.17.0.6:80這3個pod服務於service的nginx和nginx-hzw

 3.19. Kubectl縮容pod

duke@duke:~$  kubectl get deploy
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx 3 3 3 1 2h
duke@duke:~$ kubectl scale deploy nginx --replicas=2
deployment.extensions "nginx" scaled
duke@duke:~$ kubectl get deploy
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx 2 2 2 2 2h
duke@duke:~$ kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-6bcd55cfd6 2 2 2 2h
duke@duke:~$ kubectl get po
NAME READY STATUS RESTARTS AGE
nginx-6bcd55cfd6-4sngz 1/1 Running 0 12m
nginx-6bcd55cfd6-kt2vc 1/1 Running 0 2h
duke@duke:~$ kubectl get ep
NAME ENDPOINTS AGE
kubernetes 192.168.99.111:8443 2h
nginx 172.17.0.4:80,172.17.0.5:80 1h
nginx-hzw 172.17.0.4:80,172.17.0.5:80 27m

Kubectl的縮容命令和擴容命令是一致的,只是自動通過判別【replicas】參數的大小,自動進行擴容或者縮容pod操作。

 3.20. Kubectl升級pod

 3.20.1. 升級pod(成功)

duke@duke:~$ kubectl set image deploy nginx nginx=nginx:1.9.1
deployment.apps "nginx" image updated

升級名為nginx的pod,從原來的1.7.05版本升級到1.9.1版本

 3.20.2. 查看pod升級過程

方法一(過程跟蹤):

duke@duke:~$ kubectl rollout status deploy nginx
deployment "nginx" successfully rolled out

如果升級過程比較慢,就會看到升級的過程,此處是已經升級完成的結果。

方法二:
通過kubectl describe deploy [pod名稱] ,會在Events中顯示整個升級的滾動過程。
在events中可以發現nginx-6bcd55cfd6逐漸滾動到最后,並有新的nginx-6bf8748584所代替。

duke@duke:~$  kubectl describe deploy nginx
Name: nginx
Namespace: default
CreationTimestamp: Wed, 18 Apr 2018 13:48:02 +0800
Labels: run=nginx
Annotations: deployment.kubernetes.io/revision=2
Selector: run=nginx
Replicas: 2 desired | 2 updated | 2 total | 2 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 1 max unavailable, 1 max surge
Pod Template:
Labels: run=nginx
Containers:
nginx:
Image: nginx:1.9.1
Port:
Host Port:
Environment:
Mounts:
Volumes:
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets:
NewReplicaSet: nginx-6bf8748584 (2/2 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 56m deployment-controller Scaled down replica set nginx-6bcd55cfd6 to 2
Normal ScalingReplicaSet 8m deployment-controller Scaled up replica set nginx-6bf8748584 to 1
Normal ScalingReplicaSet 8m deployment-controller Scaled down replica set nginx-6bcd55cfd6 to 1
Normal ScalingReplicaSet 8m deployment-controller Scaled up replica set nginx-6bf8748584 to 2
Normal ScalingReplicaSet 8m deployment-controller Scaled down replica set nginx-6bcd55cfd6 to 0

 3.20.3. 查看pod版本歷史

duke@duke:~$  kubectl rollout history deploy nginx
deployments "nginx"
REVISION CHANGE-CAUSE
1
2

可以看到nginx的版本從1個變為了2個

查看指定歷史版本

duke@duke:~$  kubectl rollout history deploy nginx --revision=2
deployments "nginx" with revision #2
Pod Template:
Labels: pod-template-hash=2694304140
run=nginx
Containers:
nginx:
Image: nginx:1.9.1
Port:
Host Port:
Environment:
Mounts:
Volumes:

通過kubectl get rs可以發現老的版本已經已經不存在instance,而新的pod已經成功上線2個instance

duke@duke:~$  kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-6bcd55cfd6 0 0 0 3h
nginx-6bf8748584 2 2 2 15m

 3.20.4. 升級pod(失敗)判斷

  1. 模擬升級錯誤

    duke@duke:~$ kubectl set image deploy nginx nginx=nginx:1.95
    deployment.apps "nginx" image updated

    升級名為nginx的pod,從原來的1.7.05版本升級到1.95版本,而1.95版本在docker倉庫中是不存在的。因此會升級錯誤,但是kubernetes提示依舊是升級成功。

  2. 查看升級過程,發現一只處於pending狀態,無法成功,

    duke@duke:~$ kubectl rollout status deploy nginx
    Waiting for rollout to finish: 1 out of 2 new replicas have been updated...
    Waiting for rollout to finish: 1 old replicas are pending termination...

  3. 查看歷史信息,發現是3個歷史版本

    duke@duke:~$ kubectl rollout history deploy nginx
    deployments "nginx"
    REVISION CHANGE-CAUSE
    1
    2
    3
  4. 查看指定的版本3歷史信息

    duke@duke:~$ kubectl rollout history deploy nginx --revision=3
    deployments "nginx" with revision #3
    Pod Template:
    Labels: pod-template-hash=1048884340
    run=nginx
    Containers:
    nginx:
    Image: nginx:1.95
    Port:
    Host Port:
    Environment:
    Mounts:
    Volumes:
  5. 查看kubectl的rs信息,可以發現nginx-548ddd8784一個instance都沒有創建成功,可用數為0

    duke@duke:~$ kubectl get rs
    NAME DESIRED CURRENT READY AGE
    nginx-548ddd8784 2 2 0 13m
    nginx-6bcd55cfd6 0 0 0 3h
    nginx-6bf8748584 1 1 1 31m
  6. 通過kubectl describe rs [rs名稱],可以發現創建了2個pod

    duke@duke:~$ kubectl describe rs nginx-548ddd8784
    Name: nginx-548ddd8784
    Namespace: default
    Selector: pod-template-hash=1048884340,run=nginx
    Labels: pod-template-hash=1048884340
    run=nginx
    Annotations: deployment.kubernetes.io/desired-replicas=2
    deployment.kubernetes.io/max-replicas=3
    deployment.kubernetes.io/revision=3
    Controlled By: Deployment/nginx
    Replicas: 2 current / 2 desired
    Pods Status: 0 Running / 2 Waiting / 0 Succeeded / 0 Failed
    Pod Template:
    Labels: pod-template-hash=1048884340
    run=nginx
    Containers:
    nginx:
    Image: nginx:1.95
    Port:
    Host Port:
    Environment:
    Mounts:
    Volumes:
    Events:
    Type Reason Age From Message
    ---- ------ ---- ---- -------
    Normal SuccessfulCreate 16m replicaset-controller Created pod: nginx-548ddd8784-pt8nd
    Normal SuccessfulCreate 16m replicaset-controller Created pod: nginx-548ddd8784-pv4xl
  7. 通過kubectl get po 可以發現以nginx-548ddd8784為前綴的pod都沒有正常運行

    duke@duke:~$ kubectl get po
    NAME READY STATUS RESTARTS AGE
    nginx-548ddd8784-pt8nd 0/1 ImagePullBackOff 0 21m
    nginx-548ddd8784-pv4xl 0/1 ImagePullBackOff 0 21m
    nginx-6bf8748584-qgq8m 1/1 Running 0 40m
  8. 通過kubectl describe po [pod instance名稱]選取其中一個失敗的pod節點查看詳細原因,可以在events中看到,是因為images獲取不到而失敗

    duke@duke:~$ kubectl describe po nginx-548ddd8784-pv4xl
    Name: nginx-548ddd8784-pv4xl
    Namespace: default
    Node: minikube/10.0.2.15
    Start Time: Wed, 18 Apr 2018 17:27:06 +0800
    Labels: pod-template-hash=1048884340
    run=nginx
    Annotations: <none>
    Status: Pending
    IP: 172.17.0.5
    Controlled By: ReplicaSet/nginx-548ddd8784
    Containers:
    nginx:
    Container ID:
    Image: nginx:1.95
    Image ID:
    Port: <none>
    Host Port: <none>
    State: Waiting
    Reason: ErrImagePull
    Ready: False
    Restart Count: 0
    Environment: <none>
    Mounts:
    /var/run/secrets/kubernetes.io/serviceaccount from default-token-f999h (ro)
    Conditions:
    Type Status
    Initialized True
    Ready False
    PodScheduled True
    Volumes:
    default-token-f999h:
    Type: Secret (a volume populated by a Secret)
    SecretName: default-token-f999h
    Optional: false
    QoS Class: BestEffort
    Node-Selectors: <none>
    Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
    node.kubernetes.io/unreachable:NoExecute for 300s
    Events:
    Type Reason Age From Message
    --- ------ ---- ---- -------
    Normal Pulling 29m (x234 over 20h) kubelet, minikube pulling image "nginx:1.95"
    Normal BackOff 9m (x5130 over 20h) kubelet, minikube Back-off pulling image "nginx:1.95"
    Warning Failed 4m (x5150 over 20h) kubelet, minikube Error: ImagePullBackOff
    【注意】:雖然升級失敗,但是 http://192.168.99.111:31874 依舊是可以正常訪問,原因在於老的pod並沒有被替換,是仍然 存活的,保證了,環境的持續運行。

 3.20.5. 回滾pod

升級操作失敗了,就需要進行回滾操作,終止之前的升級,否則會一致處於pending狀態。命令格式為:kubectl rollout undo deploy [pod名稱]

duke@duke:~$  kubectl rollout undo deploy nginx
deployment.apps "nginx"
duke@duke:~$ kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-548ddd8784 0 0 0 21h
nginx-6bcd55cfd6 0 0 0 1d
nginx-6bf8748584 2 2 2 21h

可以發現升級錯誤版本的nginx-548ddd8784(replicaset)已經都變為了0,並且nginx-6bf8748584也從1個恢復到了2個啟動

duke@duke:~$  kubectl get po
NAME READY STATUS RESTARTS AGE
nginx-6bf8748584-52mgf 1/1 Running 0 2m
nginx-6bf8748584-qgq8m 1/1 Running 0 21h

Pod也從1個running恢復到了2個

duke@duke:~$  kubectl get ep
NAME ENDPOINTS AGE
kubernetes 192.168.99.111:8443 1d
nginx 172.17.0.4:80,172.17.0.6:80 23h
nginx-hzw 172.17.0.4:80,172.17.0.6:80 22h

通過查看endpoint,可以發現原來的172.17.0.5已經變為了172.17.0.6

 3.21. Kubectl殺死pod-instance

命令格式:

kubectl delete po [pod-instance名稱]
duke@duke:~$  kubectl get po
#可以看到存在2個pod-instance,其中一個名為nginx-6bf8748584-52mgf
NAME READY STATUS RESTARTS AGE
nginx-6bf8748584-52mgf 1/1 Running 0 2m
nginx-6bf8748584-qgq8m 1/1 Running 0 21h
duke@duke:~$ kubectl get ep
#查看endpoint也可發現2個地址都是正常活動的
NAME ENDPOINTS AGE
kubernetes 192.168.99.111:8443 1d
nginx 172.17.0.4:80,172.17.0.6:80 23h
nginx-hzw 172.17.0.4:80,172.17.0.6:80 22h
duke@duke:~$ kubectl delete po nginx-6bf8748584-52mgf
pod "nginx-6bf8748584-52mgf" deleted
duke@duke:~$ kubectl get ep
#在殺死一個pod-instance后,endpoint信息中少了一個ip地址信息
NAME ENDPOINTS AGE
kubernetes 192.168.99.111:8443 1d
nginx 172.17.0.6:80 23h
nginx-hzw 172.17.0.6:80 22h
duke@duke:~$ kubectl get ep
#等待一段時間后在一次查詢endpoint時,rs已經恢復到了原先設定的2個instance的個數,pod的地址也是啟動成為原先的2個
NAME ENDPOINTS AGE
kubernetes 192.168.99.111:8443 1d
nginx 172.17.0.4:80,172.17.0.6:80 23h
nginx-hzw 172.17.0.4:80,172.17.0.6:80 22h
duke@duke:~$ kubectl get po
#再查看po信息時,發現原先的nginx-6bf8748584-52mgf已經不存在了,生成了只有2分鍾的新的pod-instance節點為nginx-6bf8748584-bpqkb
NAME READY STATUS RESTARTS AGE
nginx-6bf8748584-bpqkb 1/1 Running 0 2m


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM