Kubernetes Demo

2020/02/18 k8s

学习研究,使用minikube模拟。做下记录,方便回顾,加深理解。

通过Kubernetes的命令行工具kubectl远程管理集群

术语

Cluster

Cluster是计算、存储和网络资源的集合,Kubernetes利用这些资源运行各种基于容器的应用

Master

Master是Cluster的大脑,它的主要职责是调度,即决定将应用放在哪里运行。Master运行Linux操作系统,可以是物理机或者虚拟机。为了实现高可用,可以运行多个Master。

Node

Node的职责是运行容器应用。Node由Master管理,Node负责监控并汇报容器的状态,同时根据Master的要求管理容器的生命周期。Node运行在Linux操作系统上,可以是物理机或者是虚拟机。

Deployment

是Kubernetes的术语,可以理解为应用

Pod

Pod是容器的集合,通常会将紧密相关的一组容器放到一个Pod中,==同一个Pod中的所有容器共享IP地址和Port空间==,也就是说它们在一个network namespace中。

Pod是Kubernetes调度的最小单位,同一Pod中的容器始终被一起调度。

Pod中的容器会作为一个整体被Master调度到一个Node上运行。

Controller

Kubernetes通常不会直接创建Pod,而是通过Controller来管理Pod的。Controller中定义了Pod的部署特性,比如有几个副本、在什么样的Node上运行等。为了满足不同的业务场景,Kubernetes提供了多种Controller,包括Deployment、ReplicaSet、DaemonSet、StatefuleSet、Job等。

  • Deployment是最常用的Controller。Deployment可以管理Pod的多个副本,并确保Pod按照期望的状态运行。
  • ReplicaSet实现了Pod的多副本管理。使用Deployment时会自动创建ReplicaSet,也就是说Deployment是通过ReplicaSet来管理Pod的多个副本的,我们通常不需要直接使用ReplicaSet。
  • DaemonSet用于每个Node最多只运行一个Pod副本的场景。正如其名称所揭示的,DaemonSet通常用于运行daemon。
  • StatefuleSet能够保证Pod的每个副本在整个生命周期中名称是不变的,而其他Controller不提供这个功能。当某个Pod发生故障需要删除并重新启动时,Pod的名称会发生变化,同时StatefuleSet会保证副本按照固定的顺序启动、更新或者删除。
  • Job用于运行结束就删除的应用,而其他Controller中的Pod通常是长期持续运行。

Service

Deployment可以部署多个副本,每个Pod都有自己的IP,外界如何访问这些副本呢?通过Pod的IP吗?

要知道Pod很可能会被频繁地销毁和重启,它们的IP会发生变化,用IP来访问不太现实。

Kubernetes Service定义了外界访问一组特定Pod的方式。Service有自己的IP和端口,Service为Pod提供了负载均衡。

Kubernetes运行容器(Pod)与访问容器(Pod)这两项任务分别由Controller和Service执行。

Namespace

如果有多个用户或项目组使用同一个Kubernetes Cluster,如何将他们创建的Controller、Pod等资源分开呢?

Namespace可以将一个物理的Cluster逻辑上划分成多个虚拟Cluster,每个Cluster就是一个Namespace。不同Namespace里的资源是完全隔离的。

$ kubectl get namespace
NAME              STATUS   AGE
default           Active   2d20h
kube-node-lease   Active   2d20h
kube-public       Active   2d20h
kube-system       Active   2d20h

default:创建资源时如果不指定,将被放到这个Namespace中。

kube-system:Kubernetes自己创建的系统资源将放到这个Namespace中。

跑个demo

创建应用

kubectl run部署了一个应用,命名为kubernetes-bootcamp

kubectl run kubernetes-bootcamp \
 --image=docker.io/jocatalin/kubernetes-bootcamp:v1 \
 --port=8080

https://blog.csdn.net/textdemo123/article/details/100519187

–image-pull-progress-deadline=3h

查看应用信息

kubectl describe deploy kubernetes-bootcamp

查看当前Pod

kubectl get pods

NAME                                 READY   STATUS    RESTARTS   AGE
kubernetes-bootcamp-dd9784f6-fgf84   1/1     Running   0          4m36s

查看pod详细信息

kubectl describe pods kubernetes-bootcamp-dd9784f6-fgf84

访问应用

默认情况下,所有Pod只能在集群内部访问。

为了能够从外部访问应用,我们需要将容器的8080端口映射到节点的端口。

kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080

结果

service/kubernetes-bootcamp exposed

查看服务

$ kubectl get services
NAME                  TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
kubernetes            ClusterIP   10.96.0.1       <none>        443/TCP          47h
kubernetes-bootcamp   NodePort    10.97.210.182   <none>        8080:31356/TCP   56s

暴露服务,查看url

$ minikube service kubernetes-bootcamp --url
http://192.168.99.102:32093

访问内容:

Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-7dc9765bf6-gz8nr | v=1

scale应用

$ kubectl get deployments
NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
kubernetes-bootcamp   1/1     1            1           18h

副本增加到3个

$ kubectl scale deployments/kubernetes-bootcamp --replicas=3
deployment.extensions/kubernetes-bootcamp scaled

查看应用、pod数量

$ kubectl get deployments
NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
kubernetes-bootcamp   3/3     3            3           18h

$ kubectl get pods
NAME                                   READY   STATUS    RESTARTS   AGE
kubernetes-bootcamp-7dc9765bf6-dtsr9   1/1     Running   0          52s
kubernetes-bootcamp-7dc9765bf6-gz8nr   1/1     Running   0          18h
kubernetes-bootcamp-7dc9765bf6-jn88c   1/1     Running   0          52s

curl访问

$ curl http://192.168.99.102:32093/
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    84    0    84    0     0    413      0 --:--:-- --:--:-- --:--:--   413Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-7dc9765bf6-dtsr9 | v=1


$ curl http://192.168.99.102:32093/
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    84    0    84    0     0    413      0 --:--:-- --:--:-- --:--:--   413Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-7dc9765bf6-jn88c | v=1


$ curl http://192.168.99.102:32093/
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    84    0    84    0     0    415      0 --:--:-- --:--:-- --:--:--   415Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-7dc9765bf6-gz8nr | v=1

可以看到每次请求发送到不同的Pod,3个副本轮询处理,这样就实现了负载均衡

scale down 来删除副本

kubectl scale deployments/kubernetes-bootcamp --replicas=2

滚动更新

当前应用使用的image版本为v1,执行如下命令将其升级到v2

 kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2

kubectl get pods可以观察滚动更新的过程:v1的Pod被逐个删除,同时启动了新的v2Pod。

$ kubectl get pods
NAME                                   READY   STATUS        RESTARTS   AGE
kubernetes-bootcamp-7dc9765bf6-dtsr9   1/1     Terminating   0          15m
kubernetes-bootcamp-7dc9765bf6-gz8nr   1/1     Terminating   0          19h
kubernetes-bootcamp-cfc74666-8tpqz     1/1     Running       0          13s
kubernetes-bootcamp-cfc74666-gz9l2     1/1     Running       0          2s

$ kubectl get pods
NAME                                 READY   STATUS    RESTARTS   AGE
kubernetes-bootcamp-cfc74666-8tpqz   1/1     Running   0          58s
kubernetes-bootcamp-cfc74666-gz9l2   1/1     Running   0          47s

回退到v1版本,kubectl rollout undo

$ kubectl rollout undo deployments/kubernetes-bootcamp
deployment.extensions/kubernetes-bootcamp rolled back

查看节点

kubectl get nodes

查看集群信息

kubectl cluster-info

Kubernetes master is running at https://172.17.0.37:8443
KubeDNS is running at https://172.17.0.37:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

检查pod是否启动并运行

kubectl get pod

ContainerCreating 正在创建

Running 运行中

获取暴露 Service 的 URL 以查看 Service 的详细信息

minikube service hello-minikube –url

删除 Service:

kubectl delete services hello-minikube

删除deployment

kubectl delete deployment hello-minikube

停止本地 Minikube 集群:

minikube stop

删除本地 Minikube 集群:

minikube delete

# 删除pod
 kubectl delete pod  hello-minikube-856979d68c-s4sb2

Search

    Table of Contents