通过 《容器集群管理工具 Docker Swarm》可以知道,在部署、调度、扩展和管理较多的容器时,如果有一个工具帮忙做这些事,那无疑会大大提高工作效率了。那 Docker Swarm 就是这样的工具,同样 Kubernetes(简称k8s)也是这样的一个工具,相对于 Docker Swarm, Kubernetes 生态比较庞大,有更多的支持、服务和工具。至于用哪个,萝卜青菜各有所爱吧。
本文对 Kubernetes 的概念、常用命令、部署脚本进行简单介绍,更多详细内容可以前往 Kubernetes官网 或 Kuboard 官网 (推荐)进行了解。
Kuboard 是一款免费的 Kubernetes 图形化管理工具,相较于 Kubernetes Dashboard 的管理界面功能和体验友好的多。当然也有其他的 Kubernetes 图形化管理工具 ,比如 Kubesphere。
老样子下面还有投票,一起参与进来吧
Kubernetes官网 和 Kuboard 官网 都有详细介绍,这里不做过多赘述,由于官网中的下载地址为外网,网络不稳定,推荐 Kuboard 的安装教程。
Kubernetes 除部署外还支持自动伸缩、故障自愈、服务发现和负载均衡、金丝雀多种部署模式以及监控等功能,可以非常健壮地运行分布式系统。
很多初学者在入门 Kubernetes 时,都会被各种名词所困扰,比如:Pod、Deployment、Service,可以通过下图进行理解。
so,如何部署一个应用,首先要声明一个 Deployment 脚本,在 Kubernetes 集群中发布 Deployment 后,master 节点将应用程序实例调度到集群中的具体的节点上。
这里创建一个部署文件 nginx-deployment.yaml,内容如下:
apiVersion: apps/v1 #与k8s集群版本有关,使用 kubectl api-versions 即可查看当前集群支持的版本
kind: Deployment #配置的类型,部署是 Deployment
metadata: #译名为元数据,即 Deployment 的一些基本属性和信息
name: nginx-deployment #Deployment 的名称
labels: #标签
app: nginx #为该Deployment设置key为app,value为nginx的标签
spec: #这是关于该Deployment的描述,可以理解为你期待该Deployment在k8s中如何使用
replicas: 1 #replicas 副本集应该维护几个 Pod 副本(实例),这里指使用该Deployment创建一个应用程序实例,
selector: #标签选择器,与上面的标签共同作用
matchLabels: #选择包含标签app:nginx的资源
app: nginx
template: #这是选择或创建的Pod的模板
metadata: #Pod的元数据
labels: #Pod的标签,上面的selector即选择包含标签app:nginx的Pod
app: nginx
spec: #期望Pod实现的功能(即在pod中部署)
containers: #生成container,与docker中的container是同一种
- name: nginx #container的名称
image: nginx:1.7.9 #使用镜像nginx:1.7.9创建container,该container默认80端口可访问
执行 kubectl apply -f nginx-deployment.yaml
进行部署之后,通过 kubectl get pods
查看部署情况。
应用在发布后只能在集群内部进行访问,且需要获得容器的 IP,如何通过节点 IP 即可访问服务?Kubernetes 中的 Service 提供了这样的功能,且 Service 提供了 Pods(容器组)的负载均衡。
为 Nginx Deployment 创建一个 Service 脚本 nginx-service.yaml,内容如下:
apiVersion: v1
kind: Service #配置的类型,服务是 Service
metadata:
name: nginx-service #Service 的名称
spec: #这是关于该 Service 的定义,描述了 Service 如何选择 Pod,如何被访问
selector: #标签选择器
app: nginx #选择包含标签 app:nginx 的 Pod
ports:
- name: nginx-port #端口的名字
protocol: TCP #协议类型 TCP/UDP
port: 80 #集群内的其他容器组可通过 80 端口访问 Service
nodePort: 32600 #通过任意节点的 32600 端口访问 Service
targetPort: 80 #将请求转发到匹配 Pod 的 80 端口
type: NodePort # Serive的类型,ClusterIP(默认)/NodePort/LoaderBalancer
执行 kubectl apply -f nginx-service.yaml
进行部署之后,就可以通过集群中<任意节点的 IP>:32600 访问服务。
Ingress 可以将集群内部的 Service 通过 HTTP/HTTPS 方式暴露到集群外部,并通过规则定义 HTTP/HTTPS 的路由。
为 Nginx Service 创建一个 Service 脚本 nginx-ingress.yaml,内容如下:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-ingress # Ingress 的名字,仅用于标识
spec:
rules: # Ingress 中定义 L7 路由规则
- host: demo.com # 根据 virtual hostname 进行路由(请使用您自己的域名)
http:
paths: # 按路径进行路由
- path: /
backend:
serviceName: nginx-service # 指定后端的 Service 为之前创建的 nginx-service
servicePort: 80
Kubernetes 中 Horizontal Pod Autoscaler 根据观察到的 CPU 利用率(或某些由应用程序提供的指标)自动调整 Pod 的数量。
以文中的 nginx-deployment 为例子,部署脚本中对其进行资源限制,发布后创建自动伸缩指令,脚本内容如下:
apiVersion: apps/v1 #与k8s集群版本有关,使用 kubectl api-versions 即可查看当前集群支持的版本
kind: Deployment #配置的类型,部署是 Deployment
metadata: #译名为元数据,即 Deployment 的一些基本属性和信息
name: nginx-deployment #Deployment 的名称
labels: #标签
app: nginx #为该Deployment设置key为app,value为nginx的标签
spec: #这是关于该Deployment的描述,可以理解为你期待该Deployment在k8s中如何使用
replicas: 1 #replicas 副本集应该维护几个 Pod 副本(实例),这里指使用该Deployment创建一个应用程序实例,
selector: #标签选择器,与上面的标签共同作用
matchLabels: #选择包含标签app:nginx的资源
app: nginx
template: #这是选择或创建的Pod的模板
metadata: #Pod的元数据
labels: #Pod的标签,上面的selector即选择包含标签app:nginx的Pod
app: nginx
spec: #期望Pod实现的功能(即在pod中部署)
containers: #生成container,与docker中的container是同一种
- name: nginx #container的名称
image: nginx:1.7.9 #使用镜像nginx:1.7.9创建container,该container默认80端口可访问
resources:
limits:
cpu: 1000m # 该容器使用的cpu资源不能超过1核
requests:
cpu: 500m # 该容器最少使用的cpu资源为0.5核
发布后执行自动伸缩指令,这条指令的意思是 nginx-deployment 在 1 到 10 个副本之间伸缩,通过增加或减少 Deployment 的副本数,使得所有 Pod 的平均 CPU 利用率维持在 50% 左右。
kubectl autoscale deployment nginx-deployment --cpu-percent=50 --min=1 --max=10
# 部署资源
kubectl apply -f
# 删除部署资源
kubectl delete -f
# 查看 Deployment
kubectl get deployments
# 查看 service
kubectl get service
# 查看 Pod
kubectl get pods
#获取类型为Node的资源列表
kubectl get nodes
#查看Pod的信息
kubectl describe pod
#查看Deployment的信息
kubectl describe deployment
#查看Pod内的容器打印的日志
kubectl logs -f
#在Pod中运行bash
kubectl exec -it pod-xxxxxx /bin/bash
#查看名称空间
kubectl get namespaces
#查看名称空间的概要信息
kubectl describe namespaces
#创建命名空间
kubectl create namespace
#删除命名空间
kubectl delete namespace
#切换命名空间
kubectl config use-context
#查看当前命名空间
kubectl config current-context
在Kubernetes中进行故障排除可能是一项艰巨的任务,从下至上解决问题:从Pod开始,然后通过Service和Ingress向上移动堆栈。可以参考下图:Deployment 故障排除图解。