学习研究,使用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