了解和使用 Kubernetes

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
网络型负载均衡 NLB,每月750个小时 15LCU
简介: 通过 [《容器集群管理工具 Docker Swarm》](https://wangbinguang.blog.csdn.net/article/details/131082281)可以知道,在部署、调度、扩展和管理较多的容器时,如果有一个工具帮忙做这些事,那无疑会大大提高工作效率了。那 Docker Swarm 就是这样的工具,同样 Kubernetes(简称k8s)也是这样的一个工具,相对于 Docker Swarm, Kubernetes 生态比较庞大,有更多的支持、服务和工具。至于用哪个,萝卜青菜各有所爱吧。

@[TOC]

前言

通过 《容器集群管理工具 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 故障排除图解。

在这里插入图片描述

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
2月前
|
Kubernetes 负载均衡 Linux
Kubernetes的应用
Kubernetes的应用
41 0
|
运维 Kubernetes 负载均衡
Kubernetes介绍篇:是什么?为什么要用?
是时候该学习Kubernetes了,不然都不敢说自己了解容器、了解Docker。
1196 0
Kubernetes介绍篇:是什么?为什么要用?
|
2月前
|
Kubernetes 虚拟化 容器
带你一分钟看懂 “kubernetes”
从官方网站上可以看到,它是一个工业级的容器编排平台。Kubernetes 这个单词是希腊语,它的中文翻译是“舵手”或者“飞行员”。在一些常见的资料中也会看到“ks”这个词,也就是“K8s”,它是通过将 8 个字母“ubernete ”替换为“8”而导致的一个缩写。
65 2
|
2月前
|
Kubernetes 监控 关系型数据库
了解Kubernetes
kubernetes入门
26 0
|
11月前
|
Kubernetes 容器
Kubernetes的ExternalName详解
ExternalName类型的Service在Kubernetes中用于将外部服务(不是Kubernetes集群内的服务)映射到Kubernetes集群内的Service。 # 样例 其创建方法如下: ``` kind: Service apiVersion: v1 metadata: name: my-external-service namespace: cv-console-dev labels: app: my-external-service annotations: kubesphere.io/creator: sunjq kubesph
209 0
|
12月前
|
运维 Kubernetes 安全
Kubernetes 之 Egress 思考
“网络周边安全”是任何一个企业运维团队所必须关注的重点。当我们谈到网络界面控制时,我们往往潜意识地先会想到入站安全(入口)。然而,基于流量的运作,例如,何时可以离开网络(出口)以及流向哪里同样至关重要。在这篇文章中,我们将不深入讨论为什么控制出口流量如此重要的理论细节,毕竟,前人已经说的口都干了。因此,本文仅从技术演进层面来探讨关于在云原生生态中“出口”的选型及实现场景。
127 0
|
存储 Kubernetes 监控
kubernetes 安全
kubernetes 安全
|
Kubernetes 容器
什么是 Kubernetes
什么是 Kubernetes
136 0
|
Kubernetes 监控 Cloud Native
Kubernetes介绍
Docker系列文章: 1. 为什么要学习Docker 2. Docker基本概念 3. Docker镜像基本原理 4. Docker容器数据卷 5. Dockerfile 6. Docker单机网络上 7. Docker单机网络下 8. Docker单机网络实战 9. Docker隔离技术 10. Docker限制 11. Docker Compose