3.入门 - 图2

namespace

namespace(命名空间),主要用多环境资源隔离或者多租户资源隔离。
默认情况下,k8s集群中的所有pod是可以互相访问的。通过建立namespace的方式进行资源分配,做到逻辑上的组分离从而实现资源隔离和管理。
可以通过k8s的授权机制,将不同的namespace交给不同租户进行管理,这样就实现了多租户资源隔离,还可以结合k8s的资源配额机制,限定不同租户能占用的资源,比如内存,cpu使用量,来实租户可用资源的管理。

k8s在集群启动后会创建几个namespace:

  1. [root@k8s-master ~]# kubectl get ns
  2. NAME STATUS AGE
  3. default Active 116d 所有未指定namespace的对象都会分配在这
  4. kube-node-lease Active 116d 集群节点间的心跳维护
  5. kube-public Active 116d 此命名空间下可以被所有人访问
  6. kube-system Active 116d 所有由k8s系统创建的资源都在这里

创建namespace

  1. kubectl create ns [nsname]

删除namespace(会删除该ns中所有pod)

  1. kubectl delete ns [nsname]

pod

pod是K8s集群进行管理的最小单元,程序的运行必须在容器内,而容器必须存在于pod内。pod可以看作是对容器的一种封装,一个pod可以有一个或多个容器。
k8s在集群启动之后,集群的各个组件也都是以pod的方式运行

  1. [root@k8s-master ~]# kubectl get po -n kube-system
  2. NAME READY STATUS RESTARTS AGE
  3. coredns-7f9c544f75-9kfz9 1/1 Running 48 116d
  4. coredns-7f9c544f75-nd8f6 1/1 Running 48 116d
  5. etcd-k8s-master 1/1 Running 4 116d
  6. kube-apiserver-k8s-master 1/1 Running 4 116d
  7. kube-controller-manager-k8s-master 1/1 Running 4 116d
  8. kube-flannel-ds-8d5jl 1/1 Running 4 116d
  9. kube-flannel-ds-bhh9j 1/1 Running 4 116d
  10. kube-flannel-ds-gl766 1/1 Running 4 116d
  11. kube-proxy-t278c 1/1 Running 5 116d
  12. kube-proxy-x4gqf 1/1 Running 4 116d
  13. kube-proxy-xs6ms 1/1 Running 5 116d
  14. kube-scheduler-k8s-master 1/1 Running 4 116d

创建并运行

k8s并没有提供单独运行pod的命令,都是通过pod控制器来实现的

  1. #创建一个名未nginx的pod控制器,使用的镜像未ngix,端口未80,并指定命名空间
  2. kubectl run nginx --image=nginx:1.21.5 --port=80 -n [nsname]
  3. kubectl run pod控制器名称
  4. --image 镜像
  5. --port 端口
  6. -n 指定命名空间

查看指定命名空间下的所有pod信息

  1. kubectl get po -n [nsname]

查看pod详细信息

  1. kubectl describe po [poname] -n [nsname]

删除pod

  1. kubectl delete po [poname] -n [nsname]
  2. #这里只是删除pod本身,如果该pod是由pod控制器控制则删除后会立即创建一个新的pod

查询pod控制器

  1. kubectl get deploy -n [nsname]

删除pod控制器

  1. kubectl delete deploy [deploymentname] -n [nsname]
  2. -- 删除pod控制器后,其对应的pod会被完全删除掉

创建一个pod.yaml脚本

创建一个nginx.yaml

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: nginx
  5. namespace: dev
  6. spec:
  7. containers:
  8. - image: nginx:1.21.5
  9. imagePullPolicy: IfNotPresent
  10. name: pod
  11. ports:
  12. - name: nginx-port
  13. containerPort: 80
  14. protocol: TCP

基于yaml创建和删除

创建
kubectl create -f nginx-pod.yaml
删除
kubectl delete -f nginx-pod.yaml

Label

它的作用是在资源上添加标识,用来做区分和选择
Label特点:

  • 一个Label会以键值对的形式存在附加在各种资源上。如pod,node,service等等。
  • 一个资源对象可以定义任意数量的label,而同一个label也可以被添加到任意资源上。
  • Label通常在资源定义时确定,也可以在后续添加或删除。

使用label可以方便灵活地对资源进行管理,资源分配,调度,部署等。

一些常用的label示例
    版本标签:"version":"release","version":"GA"
  环境标签:"environment":"dev","environment":"test","environment":"pro"
  架构标签:"tier":"frontend","tier":"backed"

标签定义完以后还要考虑到标签的选择,这就使用到Label Selector
label是用于给某个资源对象定义标识。
label selector用于查询和筛选拥有某些标签的资源对象。
当前有两种Label Selector

  • 基于等式:
    • name = slave,选择标签key为name,value为slave的资源。
    • env != production,选择标签key为env,value不为production。
  • 基于集合
    • name in (master,slave),选择标签key为name,value包含master或者slave的资源。
    • name not in (master,slave),选择标签key为name,value不包含master或slave的资源。

标签的选择条件可以使用多个,用“,”进行分割即可。
name=slave,env!=productionm
name not in (forntend),env!=productionm
常用命令

  • 打标签

    kubectl label pod nginx [key]=[value] -n [nsname]
    
  • 更新标签

    kubectl label pod nginx [key]=[value] --overwrite -n [nsname]
    
  • 查看标签

    kubectl get po -n [nsname] --show-labels
    
  • 筛选标签

    kubectl get po -n dev -l [key]=[value]
    kubectl get po -n dev -l [key]!=[value]
    kubectl get po -n dev -l [key] in ([value1],[value2])
    kubectl get po -n dev -l [key] not in ([value1],[value2])
    
  • 删除标签

    kubectl label po nginx -n dev [key]-
    

    deployment

    pod是k8s中最小的控制单元,一般通过pod控制器来完成对pod的控制,deployment就是pod控制器中的一种。
    deployment通过标签选择器和pod进行关联
    3.入门 - 图3

    创建

    ```bash kubectl run [deployment] —image=[image] —port=[port] —replicas=[rs] -n [nsname] —deplyment:deployment的名称 —image:镜像地址 —port:容器内端口号 —replicas:副本数 —nsname:命名空间 示例: kubectl run nginx —image=nginx:1.21.5 —port=3 —replicas=3 -n dev

<a name="PAYS4"></a>
## 查看
```bash
kubectl get deploy -n [nsname]

删除

kubectl delete deploy [deploy] -n [nsname]

脚本

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:latest
        name: nginx
        ports:
        - containerPort: 80
          protocol: TCP

Service

每一个pod都会对其分配一个ip,然而缺存在两个问题

  • Pod IP会随pod的重建产生变化。
  • Pod IP只可以在集群内部访问。

这样就给访问服务带来困难,于是k8s设计了service来解决这个问题
service可以看作是一组同类Pod对外的访问接口,借助service,应用可以方便的访问服务。
3.入门 - 图4
创建集群内部可访问的Service

创建集群内service

kubectl expose deploy [deploy] --name=[svcname] --type=[ClusterIP,NodeIP] --port=[port] --target-port=[target-port] -n [nsname]
--deploy deployment的name
--name service的name
--type ClusterIP集群内可见,NodeIP所有剋按
--port 访问端口
--target-port 目标pod端口

示例:
kubectl expose deploy nginx --name=svc-nginx1 --type=ClusterIP --port=80 --target-port=80 -n dev

查看service

kubectl get svc -n [nsname]

在service的生命周期中,service的ip是不可变的。

删除service

kubectl delete svc [svcname] -n [nsname]

配置方式

apiVersion: v1
kind: Service
metadata:
  name: svc-nginx
  namespace: dev
spec:
  clusterIP: 10.109.179.231 #固定svc的内网ip,可以不写,不写由系统分配
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    run: nginx
  type: ClusterIP