您现在的位置是:首页 >技术杂谈 >了解和使用 Kubernetes网站首页技术杂谈

了解和使用 Kubernetes

叫我二蛋 2024-10-27 00:01:04
简介了解和使用 Kubernetes

前言

通过 《容器集群管理工具 Docker Swarm》可以知道,在部署、调度、扩展和管理较多的容器时,如果有一个工具帮忙做这些事,那无疑会大大提高工作效率了。那 Docker Swarm 就是这样的工具,同样 Kubernetes(简称k8s)也是这样的一个工具,相对于 Docker Swarm, Kubernetes 生态比较庞大,有更多的支持、服务和工具。至于用哪个,萝卜青菜各有所爱吧。

本文对 Kubernetes 的概念、常用命令、部署脚本进行简单介绍,更多详细内容可以前往 Kubernetes官网Kuboard 官网 (推荐)进行了解。

Kuboard 是一款免费的 Kubernetes 图形化管理工具,相较于 Kubernetes Dashboard 的管理界面功能和体验友好的多。当然也有其他的 Kubernetes 图形化管理工具 ,比如 Kubesphere。

老样子下面还有投票,一起参与进来吧?

Kubernetes 集群安装

Kubernetes官网Kuboard 官网 都有详细介绍,这里不做过多赘述,由于官网中的下载地址为外网,网络不稳定,推荐 Kuboard 的安装教程。

Kubernetes 功能

Kubernetes 除部署外还支持自动伸缩、故障自愈、服务发现和负载均衡、金丝雀多种部署模式以及监控等功能,可以非常健壮地运行分布式系统。

  • 服务发现和负载均衡:通过 Kubernetes 部署,同一应用的容器可以实现负载均衡的效果,也不用担心容器的 IP 的变动。
  • 自动伸缩:Kubernetes会根据部署时的声明对容器的实际运行状态进行调整。比如,设置最小及最大副本数量,根据 cpu 使用率进行动态伸缩。
  • 故障自愈:Kubernetes 可以重启已经停机的容器;替换、kill 那些不满足自定义健康检查条件的容器。
  • 金丝雀发布:通过对 Pod 打相同的 Label,可以请求到同一应用的不同版本,达到灰度效果。

Kubernetes 核心概念

很多初学者在入门 Kubernetes 时,都会被各种名词所困扰,比如:Pod、Deployment、Service,可以通过下图进行理解。

在这里插入图片描述

  • Kubernetes Master:集群中的主节点,起部署、调度、管理容器等作用,所有操作在此节点。
  • Node :集群中的工作节点,相当于一个物理机或虚拟机。
  • Pod : 最小调度的单位,可以承载多个 Docker 容器,可以理解成容器的“容器”。
  • Service :同 Docker Swarm 中的 Service,可以起到相同 Pod 的负载作用,并且同 Service 中的 Pod 可以相互通信。
  • Label:为 Pod 打标签,可以起到分流、金丝雀部署的效果或者指派开发、测试、生产环境。
  • Deployment:Deployment 指示 Kubernetes 如何创建和更新应用程序的实例,这个实例就是被包含在 Pod 中的容器。

Kubernetes 部署应用

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

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

Kubernetes 常用命令

# 部署资源
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 故障排查

在Kubernetes中进行故障排除可能是一项艰巨的任务,从下至上解决问题:从Pod开始,然后通过Service和Ingress向上移动堆栈。可以参考下图:Deployment 故障排除图解。

在这里插入图片描述

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。