k8s简单入门操作(三)

Namespace

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

kubernetes在集群启动之后,会默认有几个namespace,根据以下命令查看。

[root@master ~]# kubectl get namespace

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

 相关命令:

#ns代表namespace简写

创建命名空间

[root@master ~]# kubectl create ns dev

删除命名空间

[root@master ~]# kubectl delete ns dev

查看指定的命名空间

[root@master ~]# kubectl get ns default

指定命名空间的输出格式namespace信息

[root@master ~]# kubectl get ns default -o wide  #wide表示查看更多的参数

[root@master ~]# kubectl get ns default -o json

[root@master ~]# kubectl get ns default -o yaml

查看命名空间的详情,#describe:描述 

[root@master ~]# kubectl describe namespace default

yaml命令式对象配置

新建ns-dev.yaml:

apiVersion: v1 #版本
kind: Namespace #资源
metadata:
  name: dev

 通过命令式对象配置进行创建和删除:

[root@master ~]# kubectl create -f ns-dev.yaml

[root@master ~]# kubectl delete -f ns-dev.yaml

pod

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

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

[root@master ~]# kubectl get pods -n kube-system


NAME(名称)       READY   STATUS(运行状态)    RESTARTS(重启次数)   AGE(运行时间)   IP           
                          ImagePullBackoff(表示尝试创建,可以用表述命令kubectl describe查看具体信息)
                          Running(正在运行)

语法及应用示例

创建并运行Pod

[root@master ~] #kubectl run (Pod控制器的名称) [参数]
# --image 指定Pod的镜像
# --port 指定端口
# --namespace 指定namespace

在名称为dev的namespace下创建一个Nginx的Pod
[root@master ~] #kubectl run nginx --image=nginx:1.17.1 --port=80 --namespace=dev

删除指定的Pod

#直接删除pod
kubectl delete pod pod的名称 [-n 命名空间]

#如果直接删除pod又重新创建了一个新的,是因为pod由pod控制器deploymen管理的,需要删除pod控制器中的pod
#先查看pod控制器
[root@master ~]# kubectl get deployment -n dev
#删除pod控制器中指定的pod
[root@master ~]# kubectl delete deployment pod的名称 -n dev

查看pod命令

# -n表示命名空间,-o 展现格式
[root@master ~]# kubectl get pods -o wide -n dev

#describe描述pod为nginx的信息 
[root@master ~]# kubectl describe pod nginx -n dev

Pod的访问

#先查看pod信息,获取到ip
[root@master ~]# kubectl get pods -n dev -o wide

# 通过curl访问nginx
[root@master ~]# curl 10.244.2.7:80

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

执行创建和删除命令:

[root@master ~]# kubectl create -f pod-nginx.yaml

[root@master ~]# kubectl delete -f pod-nginx.yaml

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,即:

  1. Label用于给某个资源对象定义标识。
  2. Label Selector用于查询和筛选拥有某些标签的资源对象。

当前有两种Label Selector:

  • 基于等式的Label Selector。
  1. name=slave:选择所有包含Label中的key=“name”并且value=“slave”的对象。
  2. env!=production:选择所有包含Label中的key=“env”并且value!=“production”的对象。
  • 基于集合的Label Selector。
  1. name in (master,slave):选择所有包含Label中的key=“name”并且value=“master”或value=“slave”的对象。
  2. name not in (master,slave):选择所有包含Label中的key=“name”并且value!=“master”和value!=“slave”的对象。

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

  1. name=salve,env!=production。
  2. name not in (master,slave),env!=production。

语法及应用示例

为资源打标签

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

#nginx pod打标签
[root@master ~]# kubectl label pod nginx version=1.0 -n dev

更新资源的标签

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

#更新nginx pod标签
[root@master ~]# kubectl label pod nginx version=2.0 -n dev --overwrite

查看标签

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

#显示Nginx Pod的标签
[root@master ~]# kubectl get pod nginx -n dev --show-labels

筛选标签

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

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

删除标签

kubectl label pod 名称 key- -n 命名空间名

#删除nignx pod标签
[root@master ~]# kubectl label pod nginx version- -n dev

yaml命令式对象配置

新建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

执行创建和删除命令

[root@master ~]# kubectl create -f pod-nginx.yaml

[root@master ~]# kubectl delete -f pod-nginx.yaml

Deployment(pod控制器)

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

语法及应用示例

特别注意:在v1.18版之后,kubectl run nginx --image=nginx --replicas=3 --port=80,会反馈Flag --replicas has been deprecated, has no effect and will be removed in the future,并且只会创建一个Nginx容器实例。

 创建指定名称的deployement,deploy为缩写

[root@master ~]# kubectl create deploy xxx [-n 命名空间]

#在名称为test的命名空间下创建名为nginx的deployment
[root@master ~]# kubectl create deployment nginx --image=nginx:1.17.1 -n test

根据指定的deplyment创建Pod

[root@master ~]# kubectl scale deployment xxx [--replicas=正整数] [-n 命名空间]

#在名称为test的命名空间下根据名为nginx的deployment创建4个Pod
[root@master ~]# kubectl scale deployment nginx --replicas=4 -n test

查看deployment的信息

[root@master ~]# kubectl get deploy [-n 命名空间]

#查看deployment的详细信息
[root@master ~]# kubectl describe deployment xxx [-n 命名空间]

#查看名为dev的namespace下的名为nginx的deployment的详细信息
[root@master ~]# kubectl describe deployment nginx -n test

nginx pod 创建后看状态已经正常运行 

 删除deployment 

[root@master ~]# kubectl delete deploy xxx [-n 命名空间]

#删除名为dev的namespace下的名为nginx的deployment
[root@master ~]# kubectl delete deployment nginx -n test

 直接运行三个nginx pod

[root@master ~]# kubectl run nginx --image=nginx:1.17.1 --port=80 --replicas=3 --namespace test

 但会提示:Flag --replicas has been deprecated, has no effect and will be removed in the future.并且只会创建一个容器,推荐用 deployment 命令式或声明试对象 apply 创建 pod

yaml命令式对象配置

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

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: test
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

执行创建和删除命令:

[root@master ~]# kubectl create -f deploy-nginx.yaml

[root@master ~]# kubectl delete -f deploy-nginx.yaml

以下使用的声明试创建,需要先创建命名空间namespace 

service

  • 如果通过Deployment控制器控制pod的话,pod异常导致停止运行然后pod控制器会重启该pod,但重启后ip会变动,这时可以用到service解决这个问题
  • Service可以看做是一组同类的Pod对外的访问接口,借助Service,应用可以方便的实现服务发现和负载均衡
  • 通过seletot:env=dev标签选择器分发

 语法及应用示例

创建集群内部可访问的Service

语法:暴露Service命令说明

# expose :暴露
# deployment xxx:指定pod控制器和pod
# --name:服务名
# --type=ClusterIP:指定集群内部直接访问类型
# --port: service的端口
# --target-port:映射到pod的端口
kubectl expose deployment xxx --name=服务名 --type=ClusterIP --port=暴露的端口 --target-port=指向集群中的Pod的端口 [-n 命名空间]
# 会产生一个CLUSTER-IP,这个就是service的IP,在Service的生命周期内,这个地址是不会变化的

示例: 暴露名为test的namespace下的名为nginx的deployment,并设置服务名为svc-nginx

前提条件(有则直接执行expose):
需要有名称为test的namespace
[root@master ~]# kubectl create ns test
需要有名称为nginx的depolyment
[root@master ~]# kubectl create deployment nginx --image=nginx:1.17.1 -n tes                                                                                                             t


[root@master ~]# kubectl expose deployment nginx --name=svc-nginx1 --type=ClusterIP --port=80 --target-port=80 -n test


查看Service

语法:
kubectl get service [-n 命名空间] [-o wide]

实例:查看名为test的命名空间的所有Service
kubectl get service -n test
创建集群外部可访问的Service

语法:暴露Service命令说明

# expose :暴露
# deployment xxx:指定pod控制器和pod
# --name:服务名
# --type=NodePort :指定外部集群访问类型
# --port: service的端口
# --target-port:映射到pod的端口

kubectl expose deployment xxx --name=服务名 --type=NodePort --port=暴露的端口 --target-port=指向集群中的Pod的端口 [-n 命名空间]
# 会产生一个外部也可以访问的Service

示例:暴露名为test的namespace下的名为nginx的deployment,并设置服务名为svc-nginx2

前提条件(有则直接执行expose):
需要有名称为test的namespace
[root@master ~]# kubectl create ns test
需要有名称为nginx的depolyment
[root@master ~]# kubectl create deployment nginx --image=nginx:1.17.1 -n tes                                                                                                             t


[root@master ~]# kubectl expose deploy nginx --name=svc-nginx2 --type=NodePort --port=80 --target-port=80 -n test

需要注意的是:目前只有一个nginx pod ,因为是通过deployment创建的并没有指定创建多少个pod, 如果要创建多个可以设置replicas=?,但建议用声明试命令配置yaml文件创建,可以查看Deployment(pod控制器)章节

删除服务 

语法: 
kubectl delete service xxx [-n 命名空间]

示例:删除服务
[root@master ~]# kubectl delete service svc-nginx1 -n test

yaml对象配置方式 

新建svc-nginx.yaml,内容如下:

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

执行创建和删除命令:

[root@master ~]# kubectl  create  -f  svc-nginx.yaml

[root@master ~]# kubectl  delete  -f  svc-nginx.yaml

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值