kubernetes—五个概念入门(一)

简介: kubernetes—五个概念入门(一)

前言

本博文将介绍如何在k8s集群中部署一个nginx服务,并且能够对其进行访问。本文对下面五个都是简单的概念介绍,详细内容在专栏后续博文。

Namespace

介绍

Namespace是k8s系统中的一种非常重要资源,它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。

 默认情况下,kubernetes集群中的所有的Pod都是可以相互访问的。但是在实际中,可能不想让两个Pod之间进行互相的访问,那此时就可以将两个Pod划分到不同的namespace下。k8s通过将集群内部的资源分配到不同的Namespace中,可以形成逻辑上的“组”,以方便不同的组的资源进行隔离使用和管理。

 可以通过k8s的授权机制,将不同的namespace交给不同租户进行管理,这样就实现了多租户的资源隔离。此时还能结合kubernetes的资源配额机制,限定不同租户能占用的资源,例如CPU使用量、内存使用量等等,来实现租户可用资源的管理。

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

[root@master k8sYamlForCSDN]# kubectl get namespaces 
NAME              STATUS   AGE
default           Active   8h # 所有未指定Namespace的对象都会被分配在default命名空间
kube-node-lease   Active   8h # 集群节点之间的心跳维护,v1.13开始引入
kube-public       Active   8h # 此命名空间下的资源可以被所有人访问(包括未认证用户)
kube-system       Active   8h # 所有由Kubernetes系统创建的资源都处于这个命名空间

操作

查看

# 1 查看所有的ns  命令:kubectl get ns
[root@master k8sYamlForCSDN]# kubectl get ns
NAME              STATUS   AGE
default           Active   8h
kube-node-lease   Active   8h
kube-public       Active   8h
kube-system       Active   8h
# 2 查看指定的ns   命令:kubectl get ns ns名称
[root@master k8sYamlForCSDN]# kubectl get ns default 
NAME      STATUS   AGE
default   Active   8h
# 3 指定输出格式  命令:kubectl get ns ns名称  -o 格式参数
# kubernetes支持的格式有很多,比较常见的是wide、json、yaml
[root@master k8sYamlForCSDN]# kubectl get ns default -o yaml
apiVersion: v1
kind: Namespace
metadata:
  creationTimestamp: "2022-02-28T03:07:56Z"
  labels:
    kubernetes.io/metadata.name: default
  name: default
  resourceVersion: "205"
  uid: 0ba523b8-7614-4681-9260-bf15f85c0524
spec:
  finalizers:
  - kubernetes
status:
  phase: Active
# 4 查看ns详情  命令:kubectl describe ns ns名称
[root@master k8sYamlForCSDN]# kubectl describe ns default 
Name:         default
Labels:       kubernetes.io/metadata.name=default
Annotations:  <none>
Status:       Active # Active 命名空间正在使用中  Terminating 正在删除命名空间
# 删除命名空间,将会删除其中所有的pod,所以需要时间,那么在这段时间内就是Terminating

创建

# 创建namespace
[root@master k8sYamlForCSDN]# kubectl create ns dev
namespace/dev created

删除

# 删除namespace
[root@master k8sYamlForCSDN]# kubectl delete ns dev
namespace "dev" deleted

配置方式

# 首先准备一个yaml文件:ns-dev.yaml
vi ns-dev.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: dev
# 然后就可以执行对应的创建和删除命令了:
​# 创建:kubectl  create  -f  ns-dev.yaml
[root@master k8sYamlForCSDN]# kubectl create -f ns-dev.yaml 
namespace/dev created
# 删除:kubectl  delete  -f  ns-dev.yaml
[root@master k8sYamlForCSDN]# kubectl delete -f ns-dev.yaml 
namespace "dev" deleted

Pod

介绍

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

至于什么是用户容器什么是根容器,会在专栏的下一篇博文详细介绍,这里就不做赘述了

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

[root@master k8sYamlForCSDN]# kubectl get pod -n kube-system 
NAME                             READY   STATUS             RESTARTS   AGE
coredns-64897985d-4w7gt          0/1     ImagePullBackOff   0          8h
coredns-64897985d-5jpxz          0/1     ImagePullBackOff   0          8h
etcd-master                      1/1     Running            0          8h
kube-apiserver-master            1/1     Running            0          8h
kube-controller-manager-master   1/1     Running            0          8h
kube-flannel-ds-78vrj            1/1     Running            0          8h
kube-flannel-ds-84dvq            1/1     Running            0          8h
kube-flannel-ds-lv5jf            1/1     Running            0          8h
kube-proxy-vxflz                 1/1     Running            0          8h
kube-proxy-w886d                 1/1     Running            0          8h
kube-proxy-xb7kp                 1/1     Running            0          8h
kube-scheduler-master            1/1     Running            0          8h


操作

创建并运行

# kubernetes提供单独运行Pod的命令,别的都是通过Pod控制器来实现的
# 如果是Pod控制器来创建的话,指定pod删除则会自动创建
# 而run是单独运行pod的命令,不会自动创建
# 命令格式: kubectl run (pod控制器名称) [参数] 
# --image  指定Pod的镜像
# --port   指定端口
# --namespace  指定namespace
[root@master k8sYamlForCSDN]# kubectl run pod-nginx --image=nginx --port=80 --namespace=dev
pod/pod-nginx created

查看pod信息

# 查看Pod基本信息
[root@master k8sYamlForCSDN]# kubectl get pods -n dev
NAME        READY   STATUS    RESTARTS   AGE
pod-nginx   1/1     Running   0          18s
# 查看Pod的详细信息
[root@master k8sYamlForCSDN]# kubectl describe pods pod-nginx -n dev
  ...
  ...

访问Pod

# # 获取podIP
[root@master k8sYamlForCSDN]# kubectl get pods pod-nginx -n dev -o wide
NAME        READY   STATUS    RESTARTS   AGE   IP           NODE    NOMINATED NODE   READINESS GATES
pod-nginx   1/1     Running   0          77s   10.244.2.7   node2   <none>           <none>
# #访问POD
[root@master k8sYamlForCSDN]# curl 10.244.2.7:80
<!DOCTYPE html>
  ...
</html>

删除指定Pod

# 删除指定Pod
[root@master k8sYamlForCSDN]# kubectl delete pods pod-nginx -n dev
pod "pod-nginx" deleted
[root@master k8sYamlForCSDN]# kubectl get pods -n dev
No resources found in dev namespace.
# 如果当前Pod是由Pod控制器创建的,控制器会监控Pod状况,一旦发现Pod死亡,会立即重建
# 此时要想删除Pod,必须删除Pod控制器,删除pod控制器则其对应的pod会自动被删除
# 1. 先查询当前namespace下的Pod控制器
[root@master ~]# kubectl get deploy -n  dev
[root@master k8sYamlForCSDN]# kubectl get deployments -n dev
# No resources found in dev namespace.目前没有控制器,因为是run命令,下面是假设
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   1/1     1            1           9m7s
# 接下来,删除此PodPod控制器
[root@master k8sYamlForCSDN]# kubectl delete deploy nginx -n dev
deployment.apps "nginx" deleted
# 稍等片刻,再查询Pod,发现Pod被删除了
[root@master k8sYamlForCSDN]#kubectl get pods -n dev
No resources found in dev namespace.

配置操作

  创建一个pod-nginx.yaml,内容如下:

apiVersion: v1
kind: Pod
metadata:
  name: pod-nginx
  namespace: dev
spec:
  containers:
    - name: pod
      image: nginx
      ports:
        - containerPort: 80
          name: nginx-port
          protocol: TCP
# 编写yaml文件
[root@master k8sYamlForCSDN]# vi pod-nginx.yaml
# 创建
[root@master k8sYamlForCSDN]# kubectl apply -f pod-nginx.yaml 
pod/pod-nginx created
# 查询
[root@master k8sYamlForCSDN]# kubectl get pods -n dev
NAME        READY   STATUS    RESTARTS   AGE
pod-nginx   1/1     Running   0          11s
# 删除
[root@master k8sYamlForCSDN]# kubectl delete -f pod-nginx.yaml 
pod "pod-nginx" deleted

Label

介绍

Label是k8s系统中的一个重要概念。它的作用就是在资源上添加标识,用来对它们进行区分和选择。

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"或"slave"的对象

 name not in (frontend): 选择所有包含Label中的key="name"且value不等于"frontend"的对象

标签的选择条件可以使用多个,此时将多个Label Selector进行组合,使用逗号","进行分隔即可。例如:

​name=slave,env!=production
​name not in (frontend),env!=production

操作

命令方式

# 创建一个pod
[root@master k8sYamlForCSDN]# kubectl create -f pod-nginx.yaml 
pod/pod-nginx created
# 查看pod的label
[root@master k8sYamlForCSDN]# kubectl get pod -n dev --show-labels 
NAME        READY   STATUS    RESTARTS   AGE   LABELS
pod-nginx   1/1     Running   0          17s   <none>
# 为pod资源打标签
[root@master k8sYamlForCSDN]# kubectl label pods pod-nginx -n dev version=2.0
pod/pod-nginx labeled
# 查看pod的label
[root@master k8sYamlForCSDN]# kubectl get pod -n dev --show-labels 
NAME        READY   STATUS    RESTARTS   AGE   LABELS
pod-nginx   1/1     Running   0          59s   version=2.0
# 为pod更新标签【失败】
[root@master k8sYamlForCSDN]# kubectl label pods pod-nginx -n dev version=3.0
error: 'version' already has a value (2.0), and --overwrite is false
# 为pod更新标签【成功】(overwrite)
[root@master k8sYamlForCSDN]# kubectl label pods pod-nginx -n dev version=3.0 --overwrite 
pod/pod-nginx labeled
# 查看pod的label
[root@master k8sYamlForCSDN]# kubectl get pod -n dev --show-labels
NAME        READY   STATUS    RESTARTS   AGE   LABELS
pod-nginx   1/1     Running   0          90s   version=3.0
# 筛选标签
[root@master k8sYamlForCSDN]# kubectl get pods -n dev -l version=1.0 --show-labels
No resources found in dev namespace.
# 筛选标签
[root@master k8sYamlForCSDN]# kubectl get pods -n dev -l version!=1.0 --show-labels
NAME        READY   STATUS    RESTARTS   AGE     LABELS
pod-nginx   1/1     Running   0          2m52s   version=3.0
# 删除标签,删除就是在key后面跟个减号,即“-”
[root@master k8sYamlForCSDN]# kubectl label pods pod-nginx -n dev version-
pod/pod-nginx unlabeled
# 查看pod的label
[root@master k8sYamlForCSDN]# kubectl get pod -n dev --show-labels
NAME        READY   STATUS    RESTARTS   AGE     LABELS
pod-nginx   1/1     Running   0          3m27s   <none>

配置方式

apiVersion: v1
kind: Pod
metadata:
  name: pod-nginx
  namespace: dev
  labels:
    version: "4.0"
    env: "test"
    created: "wxf"
spec:
  containers:
    - name: pod
      image: nginx
      ports:
        - containerPort: 80
          name: nginx-port
          protocol: TCP
# 创建
[root@master k8sYamlForCSDN]# kubectl apply -f pod-nginx.yaml 
pod/pod-nginx created
# 查看pod信息
[root@master k8sYamlForCSDN]# kubectl get pod -n dev --show-labels
NAME        READY   STATUS              RESTARTS   AGE   LABELS
pod-nginx   0/1     ContainerCreating   0          4s    created=wxf,env=test,version=4.0

kubernetes—五个概念入门:(二):https://developer.aliyun.com/article/1417671


相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
3月前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
167 2
|
2月前
|
关系型数据库 MySQL Docker
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
145 24
|
2月前
|
关系型数据库 MySQL Docker
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
201 6
|
3月前
|
Kubernetes Cloud Native 微服务
云原生入门与实践:Kubernetes的简易部署
云原生技术正改变着现代应用的开发和部署方式。本文将引导你了解云原生的基础概念,并重点介绍如何使用Kubernetes进行容器编排。我们将通过一个简易的示例来展示如何快速启动一个Kubernetes集群,并在其上运行一个简单的应用。无论你是云原生新手还是希望扩展现有知识,本文都将为你提供实用的信息和启发性的见解。
|
3月前
|
Kubernetes Cloud Native 开发者
云原生入门:Kubernetes的简易指南
【10月更文挑战第41天】本文将带你进入云原生的世界,特别是Kubernetes——一个强大的容器编排平台。我们将一起探索它的基本概念和操作,让你能够轻松管理和部署应用。无论你是新手还是有经验的开发者,这篇文章都能让你对Kubernetes有更深入的理解。
|
3月前
|
运维 Kubernetes Cloud Native
云原生技术入门:Kubernetes和Docker的协同工作
【10月更文挑战第43天】在云计算时代,云原生技术成为推动现代软件部署和运行的关键力量。本篇文章将带你了解云原生的基本概念,重点探讨Kubernetes和Docker如何协同工作以支持容器化应用的生命周期管理。通过实际代码示例,我们将展示如何在Kubernetes集群中部署和管理Docker容器,从而为初学者提供一条清晰的学习路径。
|
3月前
|
Kubernetes 关系型数据库 MySQL
Kubernetes入门:搭建高可用微服务架构
【10月更文挑战第25天】在快速发展的云计算时代,微服务架构因其灵活性和可扩展性备受青睐。本文通过一个案例分析,展示了如何使用Kubernetes将传统Java Web应用迁移到Kubernetes平台并改造成微服务架构。通过定义Kubernetes服务、创建MySQL的Deployment/RC、改造Web应用以及部署Web应用,最终实现了高可用的微服务架构。Kubernetes不仅提供了服务发现和负载均衡的能力,还通过各种资源管理工具,提升了系统的可扩展性和容错性。
194 3
|
3月前
|
Kubernetes Cloud Native 开发者
云原生技术入门:Kubernetes和Docker的协作之旅
【10月更文挑战第22天】在数字化转型的浪潮中,云原生技术成为推动企业创新的重要力量。本文旨在通过浅显易懂的语言,引领读者步入云原生的世界,着重介绍Kubernetes和Docker如何携手打造弹性、可扩展的云环境。我们将从基础概念入手,逐步深入到它们在实际场景中的应用,以及如何简化部署和管理过程。文章不仅为初学者提供入门指南,还为有一定基础的开发者提供实践参考,共同探索云原生技术的无限可能。
75 3
|
3月前
|
运维 Kubernetes Cloud Native
云原生入门:Kubernetes和容器化的未来
【10月更文挑战第23天】本文将带你走进云原生的世界,探索Kubernetes如何成为现代软件部署的心脏。我们将一起揭开容器化技术的神秘面纱,了解它如何改变软件开发和运维的方式。通过实际的代码示例,你将看到理论与实践的结合,感受到云原生技术带来的革命性影响。无论你是初学者还是有经验的开发者,这篇文章都将为你开启一段新的旅程。让我们一起踏上这段探索之旅,解锁云原生技术的力量吧!
|
3月前
|
Kubernetes Cloud Native 云计算
云原生入门:Kubernetes 和容器化基础
在这篇文章中,我们将一起揭开云原生技术的神秘面纱。通过简单易懂的语言,我们将探索如何利用Kubernetes和容器化技术简化应用的部署和管理。无论你是初学者还是有一定经验的开发者,本文都将为你提供一条清晰的道路,帮助你理解和运用这些强大的工具。让我们从基础开始,逐步深入了解,最终能够自信地使用这些技术来优化我们的工作流程。

热门文章

最新文章