k8s运维基础

发布时间 2023-09-06 17:40:56作者: Tatataaa

基础组件与常用命令

1.pod

  1. 概念:pod是k8s最基础的调度单位,一个pod是一组紧密相关的容器,这组容器运行在同一个工作节点上,每个pod就像一个独立的逻辑机器,拥有自己的ip,进程名,主机名等。
  2. 常用命令

    a.创建pod:pod使用yaml文件创造,该描述文件包括了pod使用的api服务版本,pod名称,pod中所需运行的容器信息等,如下:

apiVersion: v1 #必选,api版本号
kind: Pod   #必选,资源对象名称
metadata: #b必选,元数据 map类型
  name: <your-pod-name> #必选,pod名称
  namespace: <your-pod-namespace>   #默认default,pod所属的命名空间
spec:   #必选,pod中container的详细属性
  containers: #必选,pod中容器列表,list类型
  - name: <your-container-name>  #必选,容器名称
    image: <your-container-name>  #必选,容器镜像
    ports:
    - containerPort: <your-container-pod> #容器对外暴露的端口
      protocol: <your-container-protocol> #容器对外网络协议

   例如:

apiVersion: v1
kind: Pod
metadata:
  name: multi-container-pod
spec:
  containers:
    - name: main-container
      image: my-app:latest
      ports:
        - containerPort: 80
    - name: sidecar-container
      image: sidecar-app:latest
  # 其他Pod配置选项...

  创建一个pod:

kubectl create -f [podname] [pod.yaml]

  b.列出pod:

kubectl get pods -o wide

  c.查看pod的详细信息:

kubectl describe pod [podName]

  d.查看创建pod的yaml描述文件信息:

kubectl get pod [podname] -o yaml

  e.查看pod中运行的容器日志:

kubectl logs [podname]

  f.设置本地端口转发远程pod端口

kubectl port-forward [portname] [localport:remoteport]

  g.删除pod

kubectl delete pod [podname]

删除pod的过程是向pod中运行的进行发送一个SIGTERM信号并等待一定时间(默认30秒),等待时间过后若k8s发现进程没有正常关闭则通过SIGKILL信号青雉关闭,为了优雅退出,程序需要添加针对SIGTERM信号的处理逻辑

2.label

  1. 概念:标签是可以放假到任意资源(pod/service/rc/rs/depoly等)的键值对,由于标识某一类资源,通过标签可以方便地对一组资源进行批量处理;
  2. 命令

    a.给资源添加标签:一般是在资源描述配置文件中指定标签值,如下所示:

apiVersion: v1 #必选,api版本号
kind: Pod   #必选,资源对象名称
metadata: #b必选,元数据 map类型
  name: <your-pod-name> #必选,pod名称
  namespace: <your-pod-namespace>   #默认default,pod所属的命名空间
  labels: 
    name: <your-labes-name>  #自定义的pod标签

    b.查看资源的标签,以pod为例:

kebuctl get pods [portname] --show-labels  

    c.修改资源标签,以pod为例

kubectl label pods [portname] [labelKey=newLabelValue] --overwrite

    d.获取统一标签的资源,以pod为例:

kubectl get pods -l [labelkey=labelvalue]

    e.通过标签将pod调度到指定标签节点,如下所示

      给节点资源添加标签

kubectl label  node [nodeName] gpu=true

      在pod描述文件中添加节点选择条件:

apiVersion: v1 #必选,api版本号
kind: Pod   #必选,资源对象名称
metadata: #b必选,元数据 map类型
  name: <your-pod-name> #必选,pod名称
spec:
  nodeSelector:
    gpu:"true" #通过标签指定部署的节点类型

3.namespace

  1. 概念:命名空间与label类似,也是一个分组概念,但是label是兼容的,一个k8s资源对象可以有多个标签,但是一个资源只能有一个命名空间。命令空间通过这种分组互斥性简单地为k8s对象提供了一个作用域。在实际应用中,一般使用命令空间来标识k8s对象属于生产环境还是测试环境。
  2. 命令:
  • 首先创建命令空间的描述文件ns.yaml,如下:
    apiVersion: v1 #必选,api版本号
    kind: Namespace   #必选,资源对象名称
    metadata: #b必选,元数据 map类型
      name: <your-pod-name> #必选,pod名称

    基于描述文件创建资源:

    kubectl create -f ns.yaml
  • 为k8s资源对象指定命名空间:
    kubectl create -f [object].yaml -n [namespace]
  • 设置某一命名空间为默认命名空间:
    kubectl config set-context [namespace] --namespace
  • 根据命名空间批量操作对象,如批量查看某一命名空间下的所有pod:
    kubectl get pods -n [namespace]

   

4.存活指针

  1. 概念:存活指针不是一种k8s资源,而是k8s的一种容灾机制,通过定时向容器中运行的应用发送网络请求来判断应用是否正常运行,若判断应用没有正常运行则重启容器。存活指针分别为http get指针、tcp连接指针和exec探针三种类型。
  2. 为容器创建存活指针livenessProbe,以http get指针为例:
    apiVersion: v1 #必选,api版本号
    kind: Pod   #必选,资源对象名称
    metadata: #b必选,元数据 map类型
      name: <your-pod-name> #必选,pod名称
      namespace: <your-pod-namespace>   #默认default,pod所属的命名空间
    spec:   #必选,pod中container的详细属性
      containers: #必选,pod中容器列表,list类型
      - name: <your-container-name>  #必选,容器名称
        image: <your-container-name>  #必选,容器镜像
        livenessProbe: #设置存活指针
          httpGet:  #指定指针类型
            path: [path]
            port: [port]
          initialDelaySeconds: [second]  #延迟探测时间,容器启动后过多少秒才开始探测

 5.ReplicationController

  1. 概念:rc是一种管理pod数量的k8s资源,在创建rc是可以指定期望pod数量,当运行中pod数量不等于预先设置好的数量时,rc会通过拉起或删除pod的方式保证pod数量等于预先设置的期望值。创建一个rc时,rc会根据配置文件中设定pod模板和期望数量自动拉起对应数量pod,无需手动创建pod;
  2. rc的配置文件由标签选择器(通过标签判断pod数量)、副本数量和pod模板(用于创建pod)组成,其中标签选择器的标签必须保证与pod模板中的标签值相同,如下所示:
    apiVersion: v1
    kind: ReplicationController
    metadata:
      name: [rcName]
    spec: #指定期望副本数和操作的pod标签
      replicas: [podNum]
      selector:
        [labelKey]: [labelValue]
      template: #pod模板信息
        metadata:
          name: [podName]
          labels:
            [labelKey]: [labelValue]
        spec:
          containers:
    apiVersion: v1
    kind: ReplicationController
    metadata:
      name: my-app-rc
    spec:
      replicas: 3
      selector:
        app: my-app
      template:
        metadata:
          labels:
            app: my-app
        spec:
          containers:
          - name: my-app-container
            image: my-app-image:latest
            ports:
            - containerPort: 80

    创建rc:

    kubectl create -f [rcName].yaml
  3. 扩容或缩容pod副本数量:通过重新编辑rc配置文件实现:
    kubectl edit rc [rcName]
  4. 删除rc
  • 删除rc及其管理的pod:
    kubectl delete rc [rcName]
  • 删除rc但保留pod:

    kubectl delete rc [rcName] --cascade=false

6.ReplicationSet

  1. 概念:rs可以视为一个具有标签选择器的rc,标签选择器以表达式来指定标签,更加灵活;
  2. rs的配置文件格式如下,通过标签表达式来指定管理的标签:
    apiVersion: app/v1beta2  #注:v1版本的api服务器无法创建rs
    kind: ReplicaSet
    metadata:
      name: [rcName]
    spec: #指定期望副本数和操作的pod标签
      replicas: [podNum]
      selector:
        matchExpressions:
          - key: [labeKey]  #指定标签的key
            operator: In    #运算符
            values:         #指定标签的value
              - [labelValue1]
              - [labelValue2]
              ......

    注:表达式的运算符有In、Notln、Exists、DoesNotExist四种;

    # 创建rs
    kubectl create -f [rsName].yaml

7.DaemonSet

  1. 概念:ds是类似rs和rc的一种管理pod的k8s资源,但rs和rc的pod部署在集群上是随机的,而ds是可以控制pod部署到特定节点的。一般情况下,若不特别指定,ds会在集群上所有实例节点部署pod,也可以通过标签向特定节点部署pod。一般情况下,ds用于创建基础服务如日志服务或监控服务。
  2. 通过nodeSelector向特定节点部署pod,这需要提前给节点实例添加标签值,如下:
    kubectl label node [nodeName] [labelkey]=[labelvalue]

    然后通过nodeSelector指定部署到特定标签节点,如下所示:

    apiVersion: app/v1beta2  #注:v1版本的api服务器无法创建rs
    kind: DaemonSet
    metadata:
      name: [dsName]
    spec: 
      selector:
        nodeSelector:  #指定要部署的节点,通过标签实现
          [labelKey]:[labelValue]
      ......

    创建ds:

    kubectl create -f [dsName].yaml