一、安裝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下載地址
- 進入https://download.docker.com/linux/ubuntu/dists/ 頁面
- 在頁面中會看到ubuntu不同版本的代號,選擇自己對應的版本進入,此次安裝的是ubuntu16.04,因此選擇xenial連接進入
- 然后一路選擇xenial/pool/stable/amd64/,stable是穩定版本,ubuntu需要的是amd64的軟件格式
- 在https://download.docker.com/linux/ubuntu/dists/xenial/pool/stable/amd64/ 頁面就能找打所需要的穩定版本docker
- 右鍵點擊在所需要的版本上,選擇復制連接地址,即可得到下載地址路徑,如下:
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 |
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 |
3 | 啟動docker 后台服務 | root@duke: service docker start |
4 | 測試運行hello-world | root@duke: docker run hello-world |
1.3.3. 獲取docker-1.13.1的tgz包下載地址
- 進入https://github.com/moby/moby/releases頁面
- 點擊 按鈕,進入以頁面就可以根據選擇選取版本
- 當前要選擇docker-ce_17.03.2~ce或者docker-1.13.1,因此經過翻頁后,找到對應版本,點擊進入頁面,找到downloads信息后,就可以找ubuntu系統上進行下載
- 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 |
2 | 安裝docker | root@duke:~# wget https://get.docker.com/builds/Linux/x86_64/docker-1.13.1.tgz |
3 | 啟動docker 后台服務 | root@duke: service docker start |
4 | 測試運行hello-world | root@duke: docker run hello-world |
1.4. 設置docker翻牆代理
設置過程可以參考:docker在Ubuntu下翻牆
1.5. 安裝virtualbox
- 更新ubuntu16.04系統
sudo apt update && sudo apt upgrade
- 安裝依賴包
sudo apt install gdebi build-essential
- 去virtualbox源網站下載版本,下載命令如下:
wget http://download.virtualbox.org/virtualbox/5.2.8/virtualbox-5.2_5.2.8-121009~Ubuntu~xenial_amd64.deb
- 安裝virtualbox
gdebi virtualbox-5.2_5.2.8-121009~Ubuntu~xenial_amd64.deb
- 會提示缺少什么依賴包,如libqt5x11extras5 和 libsdl1.2debian,可能是別的,安裝依賴如下:
apt-get install libqt5x11extras5 libsdl1.2debian
- 安裝完缺失的包后,再次安裝virtualbox,即可成功
1.6. 安裝kuberctl
1.6.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
- 賦二進制文件執行權限
chmod +x ./kubectl
- 將二進制文件移到 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
-
【注意】:由於官方版本在進行minikube start時,會卡死在Starting cluster components...處,而無法正常啟動minikube,主要原因是需要翻牆到google雲服務,直接使用翻牆軟件也是無法解決,因此可以使用,大神修改鏡像源的版本,下載地址如下:
https://yq.aliyun.com/articles/221687 -
下載安裝
【官方下載地址】: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/
-
啟動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. -
查看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/proxyTo 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(失敗)判斷
-
模擬升級錯誤
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提示依舊是升級成功。
-
查看升級過程,發現一只處於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個歷史版本
duke@duke:~$ kubectl rollout history deploy nginx
deployments "nginx"
REVISION CHANGE-CAUSE
1
2
3 -
查看指定的版本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: -
查看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 -
通過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 -
通過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 -
通過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