Kubernetes入门学习--在Ubuntu16.0.4安装配置Minikube

一、安装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
原文地址:https://www.cnblogs.com/hzw97/p/11776933.html