1. 程式人生 > >Kubernetes入門學習--在Ubuntu16.0.4安裝配置Minikube

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

目 錄

  • 一、 安裝minikube環境
    • 1.1. 安裝前準備
    • 1.2. 安裝Lantern
      • 1.2.1. Lantern下載網站
      • 1.2.2. Lantern下載地址
      • 1.2.3. Lantern安裝
      • 1.2.4. Lantern啟動
      • 1.2.5. Lantern使用
      • 1.2.6. Lantern使用問題
    • 1.3. 安裝Docker
      • 1.3.1. 獲取docker_17.03.2~ce的deb下載地址
      • 1.3.2. 下載安裝docker-ce_17.03.2~ce版本
      • 1.3.3. 獲取docker-1.13.1的tgz包下載地址
      • 1.3.4. 下載docker-1.13.1.tgz版本
    • 1.4. 設定dockerFQ代理
    • 1.5. 安裝virtualbox
    • 1.6. 安裝kuberctl
      • 1.6.1. 方法一
      • 1.6.2. 方法二
    • 1.7. 關閉swap交換分割槽
    • 1.8. 安裝minikube
  • 二、使用minikube命令
    • 2.1. Minikube檢視kubernetes管理
    • 2.2. Minikube檢視最新支援的kubernetes版本
    • 2.3. Minikube刪除minikube虛擬機器
  • 三、 使用Kubectl命令
    • 3.1. Kubectl檢視kubernetes叢集狀態
    • 3.2. Kubectl檢視kubernetes的版本資訊
    • 3.3. Kubectl檢視支援的api版本資訊
    • 3.4. Kubectl檢視叢集節點數
    • 3.5. Kubectl啟動一個容器
    • 3.6. Kubectl檢查deploy部署資訊
    • 3.7. Kubectl檢視詳細deploy部署資訊
    • 3.8. Kubectl檢視ReplicaSet資訊
    • 3.9. Kubectl檢視詳細ReplicaSet資訊
    • 3.10. Kubectl檢視pod執行資訊
    • 3.11. Kubectl檢視pod執行在哪個node上
    • 3.12. Kubectl檢視pod日誌資訊
    • 3.13. Kubectl進入pod容器中
    • 3.14. Kubectl檢視service資訊
    • 3.15. Kubectl建立service
      • 3.15.1. 使用yaml檔案建立方法
      • 3.15.2. 使用kubectl expose建立方法
    • 3.16. Kubectl刪除service
    • 3.17. Kubectl檢視service和pod關聯
    • 3.18. Kubectl擴容pod
    • 3.19. Kubectl縮容pod
    • 3.20. Kubectl升級pod
      • 3.20.1. 升級pod(成功)
      • 3.20.2. 檢視pod升級過程
      • 3.20.3. 檢視pod版本歷史
      • 3.20.4. 升級pod(失敗)判斷
      • 3.20.5. 回滾pod
    • 3.21. Kubectl殺死pod-instance

一、安裝minikube環境

 1.1.安裝前準備

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

 1.2. 安裝Lantern

設定過程可以參考:docker在Ubuntu下FQ

 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. 設定dockerFQ代理

設定過程可以參考:docker在Ubuntu下FQ

 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,主要原因是需要FQ到google雲服務,直接使用FQ軟體也是無法解決,因此可以使用,大神修改映象源的版本,下載地址如下:
    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