ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Kuberneters的NameSpace、Pod、Label、Deployment、Service 作用及用法

2022-05-26 11:31:07  阅读:157  来源: 互联网

标签:kubectl Service -- NameSpace dev Label nginx Pod pod


十年河东,十年河西,莫欺少年穷

学无止境,精益求精

1、NameSpace 命名空间,简称 ns

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

K8s集群搭建成功后,会默认创建几个命名空间,如下

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

常用命令如下

kubectl get namespace  --查看所有ns
kubectl get ns
kubectl get namespace default
kubectl get ns default -o wide  --查看详细信息
kubectl get ns default -o json  --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  --删除一个命名空间,在删除过程中会有一个非actice的状态
kubectl get pods -n kube-system  --查看系统命名空间中的Pod信息,这里面包含了集群中master节点及子节点所需的工作单元

也可以通过 yaml 文件来创建/删除命名空间

通过vim指令,编写一个名为:namespace.yaml 的 yaml 文件,如下 

apiVersion: v1
kind: Namespace
metadata:
  name: dev

执行如下创建指令

kubectl create -f namespace.yaml --通过yaml文件创建命名空间

kubectl delete -f namespace.yaml  --通过yaml文件删除命名空间

注意,yaml 文件中严格区分大小写。

2、Pod ,k8s的最小工作单元

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

创建并运行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
常用指令
kubectl get pods -n dev
kubectl describe pod nginx -n dev
kubectl get pods -n dev -o wide
kubectl get pods -n dev -o  json
kubectl get pods -n dev -o  yaml
kubectl delete pod nginx -n dev

需要说明的是,在指令   kubectl describe pod nginx -n dev 中 有个Events节,Events节中展示了该Pod声明周期内的详细日志,我们可以通过Events节来排查错误及Pod生命周期解读

[root@master yaml]# kubectl describe pod nginx -n dev
Name:         nginx
Namespace:    dev
Priority:     0
Node:         node1/192.168.136.139
Start Time:   Wed, 25 May 2022 16:51:53 +0800
Labels:       run=nginx
Annotations:  <none>
Status:       Running
IP:           10.244.1.9
IPs:
  IP:  10.244.1.9
Containers:
  nginx:
    Container ID:   docker://30a7680ab1ee57d89bb859a2e9e9b5130ca60e539d5e832cf7e932c5c6f7f2db
    Image:          nginx
    Image ID:       docker-pullable://nginx@sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
    Port:           80/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Wed, 25 May 2022 16:52:09 +0800
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-jx64r (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  default-token-jx64r:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-jx64r
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type    Reason     Age        From               Message
  ----    ------     ----       ----               -------
  Normal  Scheduled  <unknown>  default-scheduler  Successfully assigned dev/nginx to node1
  Normal  Pulling    9m22s      kubelet, node1     Pulling image "nginx"
  Normal  Pulled     9m6s       kubelet, node1     Successfully pulled image "nginx"
  Normal  Created    9m6s       kubelet, node1     Created container nginx
  Normal  Started    9m6s       kubelet, node1     Started container nginx
[root@master yaml]# ^C
[root@master yaml]# 
View Code

 从上至下依次解读为:scheduled 通过计算,将该任务分配到 node1 节点, node1 节点拉取镜像、拉取镜像成功,通过镜像创建容器成功,容器启动成功。

通过  kubectl get pods -n dev -o wide 指令获取Pod的 IP地址及端口号,然后访问Pod,如下:

[root@master yaml]# kubectl get pods -n dev -o wide
NAME    READY   STATUS    RESTARTS   AGE   IP           NODE    NOMINATED NODE   READINESS GATES
nginx   1/1     Running   0          15m   10.244.1.9   node1   <none>           <none>
[root@master yaml]# curl 10.244.1.9
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
View Code

 

 Pod的Ip地址不是固定的,会随着pod的销毁而消失,随着Pod的创建而改变

基于Yaml文件的Pod操作

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: dev
spec:
  containers:
  - image: nginx
    imagePullPolicy: IfNotPresent
    name: pod
    ports:
    - name: nginx-port
      containerPort: 80
      protocol: TCP

执行命令

kubectl create -f pod-nginx.yaml  --创建

kubectl delete -f pod-nginx.yaml  --删除

 3、Label 标签

  • 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。
kubectl label pod nginx version=1.0 -n dev --打标签
kubectl label pod nginx version=2.0 -n dev --overwrite --更新标签
kubectl get pod nginx -n dev --show-labels  --查看标签
kubectl get pod -l version=2.0 -n dev --show-labels  --通过标签选择
kubectl label pod nginx version- -n dev  --删除标签

通过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

4、Deployment ,Pod控制器

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

test命名空间下创建一个pod控制器deployment,用于管理nginx,deployment的缩写为deploy

kubectl create deployment nginx --image=nginx  -n test

语法解释:

kubectl create deployment  --创建deployment控制器

nginx  --为deployment控制器的名字

--image=nginx  --是指用于运行nginx容器,创建pod控制器时,必须指定镜像名称

-n test  --指定运行在 test 命名空间

根据指定的deplyment创建指定数量的Pod
kubectl scale deployment nginx --replicas=4 -n test

deploy控制器其他操作

kubectl delete deployment nginx -n test

kubectl describe deployment nginx -n test  --describe 展示的events 节点中包含 deploy 控制器生命周期的详细信息,可以通过该节点进行排错

kubectl get deployment -n test

kubectl get pods -n test

kubectl get pods,deployment,service -n test   --一次性查询 pod  deploy  service 的信息


通过yaml文件创建deploy控制器

创建名称为:deploy-nginx.yaml 文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: dev
spec:
  replicas: 3
  selector:
    matchLabels:
      run: nginx
  template:
    metadata:
      labels:
        run: nginx
    spec:
      containers:
      - image: nginx:1.17.1
        name: nginx
        ports:
        - containerPort: 80
          protocol: TCP

解释:

template 为 pod模板, replicas 为副本数,代表创建三个运行nginx容器的 pod。

labels 为 pod 指定的标签,selector 为标签选择器,选择标签为 nginx的pod.

执行命令如下

kubectl create -f deploy-nginx.yaml

kubectl delete -f deploy-nginx.yaml

5、service ,同类 Pod 的对外访问接口,pod的IP不固定,且删除后重建Pod时,Ip会变化,因此,k8s引入了pod

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

创建只允许集群内部访问的service

kubectl expose deployment nginx --name=nginxsvc01 --type=ClusterIP --port=80 --target-port=80 -n test
  • 示例:暴露名为test的namespace下的名为nginx的deployment,并设置服务名为nginxsvc01 
  • 该service借助deployment控制器关联控制器管理的pod

--port 是service的端口号, --target-port 是指 Pod 的端口号,访问servie 的 80端口相当于访问pod的端口,且各个请求会做自动的负载均衡。例如 service下有三个pod,三个请求会分发到桑三个pod

 其他指令

kubectl get service -n test   --获取 
kubectl delete service svc-nginx1 -n test --删除

创建集群外可以访问的service 

kubectl expose deploy nginx --name=svc-nginx2 --type=NodePort --port=80 --target-port=80 -n test

效果图

Yaml 格式创建service

apiVersion: v1
kind: Service
metadata:
  name: svc-nginx
  namespace: dev
spec:
  clusterIP: 10.109.179.231
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    run: nginx
  type: ClusterIP

z

kubectl  delete  -f  svc-nginx.yaml

kubectl  create -f  svc-nginx.yaml

 

@天才卧龙的博客

 

 

标签:kubectl,Service,--,NameSpace,dev,Label,nginx,Pod,pod
来源: https://www.cnblogs.com/chenwolong/p/16310029.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有