K8S学习笔记(四)- 实战入门

K8S学习笔记(四)- 实战入门

三月 06, 2022

介绍如何在kubernetes集群中部署一个Nginx服务,并且能够对其访问

Namespace

概述

  • Namespace是kubernetes系统中一种非常重要的资源,它的主要作用是用来实现多套系统的资源隔离或者多租户的资源隔离
  • 默认情况下,kubernetes集群中的所有Pod都是可以相互访问的。但是在实际中,可能不想让两个Pod之间进行互相的访问,那么此时就可以将两个Pod划分到不同的Namespace下。kubernetes通过将集群内部的资源分配到不同的Namespace中,可以形成逻辑上的“组”,以方便不同的组的资源进行隔离使用和管理
  • 可以通过kubernetes的授权机制,将不同的Namespace交给不同租户进行管理,这样就实现了多租户的资源隔离。此时还能结合kubernetes的资源配额机制,限定不同租户能占用的资源,例如CPU使用量、内存使用量等等,来实现租户可用资源的管理

默认的几个namespace

  • default:所有未指定的Namespace的对象都会被分配在default命名空间。
  • kube-node-lease:集群节点之间的心跳维护,v1.13开始引入。
  • kube-public:此命名空间的资源可以被所有人访问(包括未认证用户)。
  • kube-system:所有由kubernetes系统创建的资源都处于这个命名空间。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 新建一个ns dev 
kubectl create ns dev

# 查看ns
kubectl get ns dev -o wide
kubectl get ns dev -o json
kubectl get ns dev -o yaml

# 查看ns详情
# 这里会显示出命名空间的资源限制(包括每个组件的资源限制)
kubectl describe ns dev

# 删除ns dev
kubectl delete ns dev

Pod

概述

  • Pod是kubernetes集群进行管理的最小单元,程序要运行必须部署在容器中,而容器必须存在于Pod中。
  • Pod可以认为是容器的封装,一个Pod中可以存在一个或多个容器。

示例

1
2
3
4
5
6
7
8
9
10
11
12
# 创建一个pod
kubectl run nginx --image=nginx:1.17.1 --port=80 -n dev

# 查询名称为dev的namespace下的所有Pod的基本信息
kubectl get pod nginx -n dev
kubectl get pod nginx -n dev -o wide

# 查看Pod的详细信息
kubectl describe pod nginx -n dev

# 删除Nginx的Pod
kubectl delete pod nginx -n dev

Label

概述

  • Label是kubernetes的一个重要概念。它的作用就是在资源上添加标识,用来对它们进行区分和选择。
  • Label的特点
    • 一个Label会以key/value键值对的形式附加到各种对象上,如Node、Pod、Service等
    • 一个资源对象可以定义任意数量的Label,同一个Label也可以被添加到任意数量的资源对象上去
    • Label通常在资源对象定义时确定,当然也可以在对象创建后动态的添加或删除
  • 可以通过Label实现资源的多纬度分组,以便灵活、方便地进行资源分配、调度、配置和部署等管理工作
  • 标签定义完毕之后,还要考虑到标签的选择,这就要用到Label Selector,即
    • Label用于给某个资源对象定义标识
    • Label Selector用于查询和筛选拥有某些标签的资源对象
  • 当前有两种Label Selector
    • 基于等式的Label Selector
      • name=slave:选择所有包含Label中的key=“name”并且value=“slave”的对象
      • env!=production:选择所有包含Label中的key=“env”并且value!=“production”的对象
    • 基于集合的Label Selector
      • name in (master,slave):选择所有包含Label中的key=“name”并且value=“master”或value=“slave”的对象
      • name not in (master,slave):选择所有包含Label中的key=“name”并且value!=“master”和value!=“slave”的对象
    • 标签的选择条件可以使用多个,此时将多个Label Selector进行组合,使用逗号(,)进行分隔即可
      • name=salve,env!=production
      • name not in (master,slave),env!=production

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 为Nginx的Pod打上标签
kubectl label pod nginx version=1.0 -n dev

# 为Nginx的Pod更新标签
kubectl label pod nginx version=2.0 -n dev --overwrite

# 显示Nginx的Pod的标签
kubectl get pod nginx -n dev --show-labels

# 筛选版本号是2.0的在名称为dev的namespace下的Pod
kubectl get pod -l version=2.0 -n dev --show-labels

# 删除名称为dev的namespace下的Nginx的Pod上的标签
kubectl label pod nginx version- -n dev

Deployment

概述

  • 在kubernetes中,Pod是最小的控制单元,但是kubernetes很少直接控制Pod,一般都是通过Pod控制器来完成的。
  • Pod控制器用于Pod的管理,确保Pod资源符合预期的状态,当Pod的资源出现故障的时候,会尝试进行重启或重建Pod。
  • 在kubernetes中Pod控制器的种类有很多,本章节只介绍一种:Deployment。

示例

1
2
3
4
5
6
7
8
9
10
11
# 在名称为test的命名空间下创建名为nginx的deployment
kubectl create deployment nginx --image=nginx:1.17.1 -n dev

# 在名称为test的命名空间下根据名为nginx的deployment创建4个Pod
kubectl scale deployment nginx --replicas=4 -n dev

# 查看名为dev的namespace下的名为nginx的deployment的详细信息
kubectl describe deployment nginx -n dev

# 删除名为dev的namespace下的名为nginx的deployment
kubectl delete deployment nginx -n dev

Service

概述

  • 我们已经能够利用Deployment来创建一组Pod来提供具有高可用性的服务,虽然每个Pod都会分配一个单独的Pod的IP地址,但是却存在如下的问题
    • Pod的IP会随着Pod的重建产生变化
    • Pod的IP仅仅是集群内部可见的虚拟的IP,外部无法访问
  • 这样对于访问这个服务带来了难度,因此,kubernetes设计了Service来解决这个问题。
  • Service可以看做是一组同类的Pod对外的访问接口,借助Service,应用可以方便的实现服务发现和负载均衡。
    1

示例

集群内部访问

1
2
3
4
5
# 暴露名为dev的namespace下的名为nginx的deployment,并设置服务名为svc-nginx1
kubectl expose deployment nginx --name=svc-nginx1 --type=ClusterIP --port=80 --target-port=80 -n dev

# 查看名为dev的命名空间的所有Service
kubectl get service -n dev

集群外部访问

1
2
3
4
5
6
7
8
9
# 暴露名为dev的namespace下的名为nginx的deployment,并设置服务名为svc-nginx2
kubectl expose deploy nginx --name=svc-nginx2 --type=NodePort --port=80 --target-port=80 -n dev

# 查看名为dev的命名空间的所有Service
kubectl get service -n dev

# 删除服务
kubectl delete service svc-nginx1 -n dev
kubectl delete service svc-nginx2 -n dev