kubernetes
kubernetes是一个开源的容器管理平台,帮助我们更方便进行容器应用的部署和维护。
1、创建一个集群cluster
集群包含两种资源:
Master:负责管理集群,只有一个
Nodes:节点是运行容器服务的机器,可以有多个,可以是虚拟机或者物理机
节点与master之间通过k8s API进行通信。
2、部署应用deploy
- Deployment
负责创建和更新容器应用实例,创建时需要声明用哪个镜像、副本数量
- Deployment Controller
负责监控实例状态,提供了一种自我恢复机制,如果有节点down或者被删除了,会自动启另一个节点来替代。
- kubectl
kubectl是k8s集群的命令行工具,通过API与集群通信。
常用命令:
#查看版本
kubectl version
#查看nodes
kubectl get nodes
# 创建deployment
kubectl create deployment kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1
#查看deployments
kubectl get deployments
3、探索应用
Pod
pod是容器实例运行的地方,一个pod可以承载单个或多个容器实例,它们将共享存储(数据卷)、网络(集群内部IP)等资源。
一个pod中的多个容器通常是需要协同工作的,它们将共用一个IP。
pod是k8s集群的最小单元
pod运行在node上,一个node可运行一个或多个pod
Nodes
一个node可以是虚拟机或物理机,每个node正常运行都需要2个部分:
kubelet:一个进程,负责node和master通信,并负责管理该node上的pods与containers
a container runtime:负责拉取镜像、解包容器、运行容器实例,e.g.docker
kubectl get - list resources
kubectl describe - show detailed information about a resource
kubectl logs - print the logs from a container in a pod
kubectl exec - execute a command on a container in a pod
`kubectl get pods`
`kubectl describe pods`
`kubectl logs $pod_name`
4、对外服务service
Service
pod是有生命周期的,node不在的话,上面的pods跟着消亡。虽然ReplicaSet会驱使集群动态的创建新的pods以满足预期的状态,但新pods的IP是会改变的(即使在同一个node上),这无法保证服务的持续可用性。为了解决这一问题,出现了service的概念。
service使用yaml/json格式定义一组逻辑上的pods集合,并向外部暴露服务,这些pods通常被LabelSelector指定。
type
service有几种类型,需要在ServiceSpec指定type:
ClusterIP(default):暴露集群内部IP,这样的service只在集群内部可访问
NodePort:暴露node节点本身的IP和端口,集群外部可通过
: 访问service NodeBalancer:对外部负载均衡,该service拥有固定的外部IP端口
ExternalName:通过任意外部名称(spec中externalName定义)暴露服务,要求v1.7及以上版本的kube-dns
labels
标签是为了方便标识、识别对象,它们是关联到对象的键值对组合,可以在对象创建时就指定,也可以后面随时添加、更改。
kubectl get pods
kubectl get services
kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080
kubectl describe services/kubernetes-bootcamp
# using labels
kubectl describe deployment
kubectl get pods -l run=kubernetes-bootcamp
kubectl get services -l run=kubernetes-bootcamp
kubectl label pod $POD_NAME app=v1
kubectl get pods -l app=v1
kubectl delete service -l run=kubernetes-bootcamp
5、扩容scale
扩容通过改变Deployment中的replicas副本数实现。
$ kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
kubernetes-bootcamp 1/1 1 1 36s
$ kubectl scale deployments/kubernetes-bootcamp --replicas=4
deployment.extensions/kubernetes-bootcamp scaled
$ kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
kubernetes-bootcamp 4/4 4 4 70s
6、更新应用update
Rolling update:通过增量的以新pods实例替换老pods的方式,实现“零停机”发布。
k8s中的发布都是有版本控制的,Deployment可以回退到之前的稳定版本。
kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2
kubectl rollout status deployments/kubernetes-bootcamp