k8s实战入门

发布时间 2023-07-07 11:18:22作者: 卡卡Kk
 

k8s的实战入门

1 前言

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

2 Namespace

2.1 概述

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

 

  • kubernetes在集群启动之后,会默认创建几个namespace。

 kubectl get namespace

 

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

 

2.2 应用示例

  • 示例:查看所有的命名空间

 kubectl get namespace

 kubectl get ns

 

  • 示例:查看指定的命名空间

 kubectl get namespace default

 kubectl get ns default

 

  • 示例:指定命名空间的输出格式

 kubectl get ns default -o wide

 kubectl get ns default -o json

 kubectl get ns default -o yaml

  • 示例:查看命名空间的详情

kubectl describe namespace default

kubectl describe ns default

  • 示例:创建命名空间

 kubectl create namespace dev

 kubectl create ns dev

  • 示例:删除命名空间

 kubectl delete ns dev

 

  • 示例:命令式对象配置
  • ① 新建ns-dev.yaml:
apiVersion: v1
kind: Namespace
metadata:
  name: dev
  • ② 通过命令式对象配置进行创建和删除:

 kubectl create -f ns-dev.yaml

 kubectl delete -f ns-dev.yaml

3 Pod

3.1 概述

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

 

  • kubernetes在集群启动之后,集群中的各个组件也是以Pod方式运行的,可以通过下面的命令查看:

 kubectl get pods -n kube-system

 

3.2 语法及应用示例

  • 语法:创建并运行Pod
kubectl run (Pod的名称) [参数]
# --image 指定Pod的镜像
# --port 指定端口
# --namespace 指定namespace
  • 示例:在名称为dev的namespace下创建一个Nginx的Pod

 kubectl run nginx --image=nginx:1.17.1 --port=80 --namespace=dev

 

  • 语法: 查询所有Pod的基本信息

 kubectl get pods [-n 命名空间的名称]

  • 语法:查看Pod的详细信息

kubectl describe pod pod的名称 [-n 命名空间名称]

  • 示例:查看名称为dev的namespace下的Pod的名称为nginx的详细信息

 kubectl describe pod nginx -n dev

 

  • 语法:Pod的访问
# 获取Pod的IP
kubectl get pods [-n dev] -o wide
# 通过curl访问
curl ip:端口
  • 示例:访问Nginx的Pod

 kubectl get pods -n dev -o wide

curl 10.244.2.7:80

  • 语法:删除指定的Pod

 kubectl delete pod pod的名称 [-n 命名空间]

  • 示例:删除Nginx的Pod

 kubectl delete pod nginx -n dev

 

  • 示例:命令式对象配置
  • ① 新建pod-nginx.yaml:
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: dev
spec:
  containers:
  - image: nginx:1.17.1
    imagePullPolicy: IfNotPresent
    name: pod
    ports: 
    - name: nginx-port
      containerPort: 80
      protocol: TCP
  • ② 执行创建和删除命令:

 kubectl create -f pod-nginx.yaml

 kubectl delete -f pod-nginx.yaml

4 Label

4.1 概述

  • Label是kubernetes的一个重要概念。它的作用就是在资源上添加标识,用来对它们进行区分和选择。
  • Label的特点:
    • 一个Label会以key/value键值对的形式附加到各种对象上,如Node、Pod、Service等。
    • 一个资源对象可以定义任意数量的Label,同一个Label也可以被添加到任意数量的资源对象上去。
    • Label通常在资源对象定义时确定,当然也可以在对象创建后动态的添加或删除。
  • 可以通过Label实现资源的多纬度分组,以便灵活、方便地进行资源分配、调度、配置和部署等管理工作。

一些常用的Label标签示例如下:

  • 版本标签:“version”:”release”,”version”:”stable”。。。
  • 环境标签:“environment”:”dev”,“environment”:”test”,“environment”:”pro”。。。
  • 架构标签:“tier”:”frontend”,”tier”:”backend”。。。

  • 标签定义完毕之后,还要考虑到标签的选择,这就要用到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。

4.2 语法及应用示例

  • 语法:为资源打标签

kubectl label pod xxx key=value [-n 命名空间]

  • 示例:为Nginx的Pod打上标签

 kubectl label pod nginx version=1.0 -n dev

 

  • 语法:更新资源的标签

 kubectl label pod xxx key=value [-n 命名空间] --overwrite

  • 示例:为Nginx的Pod更新标签

 kubectl label pod nginx version=2.0 -n dev --overwrite

 

  • 语法:查看标签

 kubectl get pod xxx [-n 命名空间] --show-labels

  • 示例:显示Nginx的Pod的标签

 kubectl get pod nginx -n dev --show-labels

 

  • 语法:筛选标签

 kubectl get pod -l key=value [-n 命名空间] --show-labels

  • 示例:筛选版本号是2.0的在名称为dev的namespace下的Pod

 kubectl get pod -l version=2.0 -n dev --show-labels

  • 语法:删除标签

 kubectl label pod xxx key- [-n 命名空间]

  •  示例:删除名称为dev的namespace下的Nginx的Pod上的标签

kubectl label pod nginx version- -n dev

  • 示例:命令式对象配置
  • ① 新建pod-nginx.yaml:
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: dev
  labels:
    version: "3.0"
    env: "test"        
spec:
  containers:
  - image: nginx:1.17.1
    imagePullPolicy: IfNotPresent
    name: pod
    ports: 
    - name: nginx-port
      containerPort: 80
      protocol: TCP
  • ② 执行创建和删除命令:

 kubectl create -f pod-nginx.yaml

 kubectl delete -f pod-nginx.yaml