当前位置: 首页 > article >正文

k8s常用知识点总结

1.常用的命令

创建pod

kubectl apply -f pod的yaml文件路径

kubectl create -f pod的yaml文件路径

删除pod

kubectl delete pod - f pod的yaml文件路径

kubectl delete pod pod名

删除其他资源类似,如删除cm资源

kubectl delete cm -f cm的yaml文件路径

kubectl delete cm cm名字

查看pod

kubectl get pod pod名 -o wide

kubectl describe pod pod名

kubectl get pod pod名 -o yaml

进入容器

kubectl exec pod名 -it -- sh

一个pod多个容器进入指定容器

kubectl exec pod名 -c 容器名 -it --sh

使用容器执行命令(如查看环境变量)

kubectl exec pod名 -- env

复制容器文件到宿主机

kubectl cp pod名:容器文件路径 本地路径

复制宿主机文件到容器内

kubectl cp 本地文件 pod名:容器路径

查看容器日志

kubectl logs -f pod名

查看容器日志近10分钟

kubectl logs -f pod名 --since=10m

查看pod特定容器日志

kubectl logs -f pod名 -c 容器名

查看容器上一个实例(上一个挂掉的容器的日志)

kubectl logs -f pod名 -p

2.镜像的拉取策略

po.spec.container.imagePullpolicy(对单个容器生效)

never从不拉取,如果本地没有镜像则启动失败

always一直从远程仓库拉取,默认配置

ifNotPresent 优先运行本地镜像(即使远程版本较新),本地无镜像远程拉取

3.容器的重启策略

po.spec.restartPolicy

always:遇到关闭则重启

OnFailure:异常关闭重启

never:从不重启

4.数据卷

k8s中有多种数据卷,比如emptyDir,hostPath,nfs,数据卷的使用分为数据卷的定义和数据卷的挂载

emptyDir 卷是一个在 Pod 被分 配到节点时创建的临时目录。Pod 中的所有容器都可以访问这个目录,但一旦 Pod 被删除,存储在 emptyDir 卷中的数据也会被永久删除,主要是实现了pod中不同的容器的数据共享,生命周期和pod一致。使用hostPath解决了pod删除,数据丢失的问题。但是不同节点的pod之间的容器无法做到数据共享,此时使用nfs便解决了这个问题

在spec下定义和container同级

emptyDir,hostPath,nfs数据卷的定义

volumes:
- name: data01
  emptyDir: {}
- name: data02
  hostPath:
    path: 宿主机路径
- name: data03
  nfs:
    server: nfs服务器ip
    path: nfs服务器共享的目录 

在container下定义

数据卷的使用,将数据卷挂载到 Pod 中的容器,name为使用的数据卷名,mountPath为挂载点,如下

volumeMounts:
  name:data01
  mountPath: /usr/share/nginx/html

cm数据卷的使用见下文7.configMap

5.变量

定义完成变量,可以通过这条命令查看,kubectl exec pod名 -- env

变量的定义:

env:
- name: AA
  value: aa
- name: BB
  valueFrom:
    fieldRef:
      fieldPath: "status.hostIP"
#使用cm资源定义的变量作为变量
- name: CC 
  valueFrom:
    configMapKeyRef:
      name: cm资源名
      key: 定义里面的key
#secret资源定义的变量也可以作为变量,用法见下面secret资源部分

6.容器的资源限制

容器的资源限制

1️⃣ po.spec.container.resources.requests

2️⃣ po.spec.container.resources.limits

1️⃣是运行pod宿主机需要达到的资源,并不会一启动pod立刻就消耗这么多资源,如果没有节点达到,pod会处于pendding状态

2️⃣是对pod的资源限制,即pod消耗的资源的上限

spec:
  container:
    - name: xxx
      resources:
        requests:
          #这里1核心为1000m
          cpu: 500m
          memory:256M
        limits:
          #这里1.5表示1.5核
          cpu: 1.5
          memory: 10G

7.configMap资源

主要用于更改配置文件,或者修改变量

apiVersion: v1
kind: ConfigMap
metadata:
  name: mycm
data:
  chunjie: "kuaile"
  shijian: "yuanyuechusan"
  ngconf: |
    # 用户和组,通常设置为nginx或www-data,具体取决于你的系统和安装方式
    user nginx;
    worker_processes auto;  # 自动根据CPU核心数设置工作进程数
    # 全局错误日志和PID文件路径
    error_log /var/log/nginx/error.log warn;
    pid /var/run/nginx.pid;
    ...

查看cm资源:kubectl get cm

查看cm资源及其定义的变量:kubectl describe cm cm名字

cm资源的使用:

一种是env使用cm的变量:如上5.变量章节说明,这里为了方便阅读,便把上述代码贴于此处

env:
#使用cm资源定义的变量作为变量
- name: CC 
  valueFrom:
    configMapKeyRef:
      name: cm资源名
      key: 定义里面的key

另外一种用法是将cm资源挂载为pod的配置文件,比如想在cm资源定义nginx容器的配置文件,直接将配置文件写在|的下一行后两格(yaml语法)

定义数据卷:

  volumes:
  - name: data01
    configMap:
      #cm资源名字
      name: mycm
      items:
      #比方说想要使用cm资源定义的nginx配置文件,对应cm资源下data的key名
      - key: ngconf
        #当subPath的值和configMap.items.path相同时,mountPath的挂载点是一个文件而非目录
        path: ng

挂载到容器的配置文件

    volumeMounts:
    - name: data01
      mountPath: /etc/nginx/conf.d/default.conf
      subPath: ng

8.容器端口映射

作用将pod容器端口映射到宿主机

ports:
  #指定容器的端口号
- containerPort: 80
  #指定绑定的宿主机的端口号
  hostPort: 88
  #指定容器的协议
  protocol: tcp

9.sercet资源

sercet资源用法和configMap资源用法类似,定义资源清单时,value值需要先经过base64加密。

创建sercet资源清单:

apiVersion: v1
kind: Secret
metadata:
  name: mysec
data:
  yinxiong: ZGlqaWEK
  ngconf: 配置文件base64编码之后

secret两种用法同cm资源类似

1.变量方式使用

 env:
 - name: dongman
   valueFrom:
     secretKeyRef:
       #secret资源的名字
       name: mysec
       key: yinxiong

2.数据卷形式挂载

定义数据卷

volumes:
- name: data01
  secret:
  #secret资源的名字
  secretName: mysec
  items:
  - key: ngconf
    #当subPath的值和secret.items.path相同时,mountPath的挂载点是一个文件而非目录
    path: ng

挂载

    volumeMounts:
    - name: data01
      mountPath: /etc/nginx/conf.d/default.conf
      subPath: ng

10.pod的标签管理

1.响应式创建标签

查看标签

kubectl get pods --show-labels

创建标签

kubectl label -f 清单文件 key=value 或者 kubectl label pod pod名 key=value

覆盖原来标签

kubectl label --overwrite pod pod名 key=value

移除标签

kubectl label pod pod名 key-

节点打标签

kubectl label nodes node_name key=value

所有节点删除标签

kubectl label nodes --all key-

2.声明式创建标签

apiVersion: v1
kind: Pod
metadata:
  name:podlabel
  label:
    jiang:zhi
    key:value
spec:
  ...

标签的作用:

1.指定标签进行删除

kubectl delete pods -l key=value

2.查看标签有某个键的资源

kubectl get pods -l kk (查看标签有kk的pod)

11.探针

探针一共有三种,分别为startupProbe启动检查探针readinessProbe就绪探针livenessProbe存活探针。

如果提供了启动探针,则所有其他的探针都会被禁用,直到此探针成功为止。

如果启动探测失败,kubelet杀死容器,而容器依照重启策略重启。

如果就绪探针探测失败,pod会处于未就绪状态。

如果就绪探针未开始检测,pod会处于未就绪状态。

如果存活探针检查失败,将重启容器,与前两者不同,存活探针会周期性检查。

检查方法有exec(自定义检查命令),httpGet(http请求结果),tcpsocket(端口是否监听)。

总结:当一个pod提供了这三种探针,首先是startupProbe启动检查探针,如果不通过,则重启pod,检查通过则进行就绪探针和存活探针检查。就绪探针检查通过pod为就绪状态,存活探针检测失败,按重启策略重启。就绪探针和存活探针属于并行关系。

三种探针详细使用方式详见博客。

12.名称空间

名称空间是用来隔离K8S集群的资源。我们通常使用名称空间对企业业务进行逻辑上划分。

全局资源不支持名称空间,局部资源支持名称空间。

同一个名称空间下,同一种资源类型,无法同时创建多个名称相同的资源。

1.查看名称空间

kubectl get namespace

kubectl get ns

2.默认名称空间为default,不指定名称空间默认为default名称空间

3.查看所有名称空间,使用-A或者--all-namespaces

如:kubectl get pods --all-namespaces 或者 kubectl get pods -A

4.describe或者查看yaml文件(-o yaml)的方式也可以查看名称空间

5.创建名称空间

apiVersion: v1
kind: Namespace
metadata:
  name: myns

6.使用名称空间

metadata:
  name: xxx
  namespace: myns

7.注意事项,名称空间一旦被删除,其下所有资源也会被删除

13.ReplicationController(rc控制器)

作用:RC的主要作用是确保在任何时候,Kubernetes集群中都有指定数量的Pod在运行。如果实际运行的Pod数量少于RC中定义的副本数量(replicas),RC会自动创建额外的Pod来达到目标数量。

资源清单如下:

​
apiVersion: v1
kind: ReplicationController
metadata:
  name: web-rc
spec:
  # 指定Pod的副本数量,默认值为1
  replicas: 3
  # 指定标签选择器
  selector:
    name: lxc
    zuoyong: web
  # 指定创建Pod的模板
  template:
    metadata:
  #指定模板的标签,只有当模板标签包含标签选择器的所有标签才能创建成功,可以比选择器标签多
      labels:
        name: lxc
        zuoyong: web
    spec:
      containers:
      - name: nginx
        image: harbor.lxcedu.com/base-img/nginx:1.14.2
​

更新:当需要更新Pod的镜像或其他配置时,可以通过更新RC的模板来实现。RC会创建带有新配置的新Pod,并逐渐替换掉旧的Pod,直到所有的Pod都被更新为止。这种滚动更新的方式可以减少对业务的影响。

升级:

更改资源清单文件,containers下的image使用新的镜像

更新资源清单文件:kubectl apply -f get rc-xx.xxx.yaml

逐个删除原来的pod: kubectl delete -f pods xxx

由于pod是被rc维护的,删除的pod会重新拉起,代替新的pod

回滚与升级类似

14.ReplicaSet(rs控制器)

ReplicaSet控制器简称rs资源,也是用于控制pod副本数量。

类似与rc资源,也可以控制pod的存活数量,但是其标签匹配更灵活,可以基于标签匹配,也可以基于表达式比配,基于表达式匹配可以匹配是否存在key。

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: rs-nginx
spec:
  # 指定创建Pod的副本数量,默认值为1.
  replicas: 4
  # 定义标签选择器,rs资源基于标签选择器关联对应的Pod哟~
  selector:
    # 基于标签匹配
    #matchLabels:
    #  hobby: sleep
    # 基于表达式匹配
    matchExpressions:
    - key: apps
      # values:
      # - haha
      # - xixi
      # - hehe
      # - web
      # 当operator的值为In或者NotIn时,values的值不能为空。
      #   - In:
      #      key的值必须在values定义的数组内。
      #   - NotIn:
      #      key的值必须不在values定义的数组内。
      # operator: In
      # operator: NotIn
      # 当operator的值为Exists或者DoesNotExist时,values的值必须为空.
      #    - Exists:
      #       只要存在key即可。
      #    - DoesNotExist:
      #       只要不存在指定的key即可。
      # operator: Exists
      operator: DoesNotExist
  # 定义Pod资源创建的模板
  template:
    metadata:
      labels:
        # apps: web
        hobby: sleep
    spec:
      containers:
      - name: web
        image: harbor.lxcedu.com/base-img/nginx:1.14.2

15.deployments资源

1.将rs资源的kind的值改为Deployment即可。

2.相比rs资源,升级时无须删除pod,

3.deployments资源不会直接控制pod,而是通过控制rs资源控制pod

4.strategy升级策略(与template同级)

strategy:
    # 升级的类型,"Recreate" or "RollingUpdate"
    # Recreate:
    #   先停止所有的Pod运行,然后在批量创建更新。
    #   生产环节中不推荐使用这种策略,因为升级过程中用户将无法访问服务!
    # RollingUpdate:
    #   滚动更新,即先实现部分更新,逐步替换原有的pod,是默认策略。
    # type: Recreate
    type: RollingUpdate
    # 自定义滚动更新的策略
    rollingUpdate:
      # 在原有Pod的副本基础上,多启动Pod的数量。
      # maxSurge: 2
      maxSurge: 2
      # 在升级过程中最大不可访问的Pod数量.
      # maxUnavailable: 2
      maxUnavailable: 2

deployments资源的交互升级和非交互式升级

交互式升级:

kubectl edit -f 01-deploy-update.yaml

kubectl edit deployments.apps

非交互式升级:

kubectl set image deploy web-deploy nginx=harbor.lxcedu.com/base-img/nginx:3

即kubectl set image deploy deploy资源名 容器名=镜像名

16.service资源(svc资源)

1.ClusterIP:对内提供Pod服务的动态发现,对外提供统一的访问入口,进行pod的负载均衡。

apiVersion: v1
kind: Service
metadata:
  name: sc-web-lb
  namespace: default
spec:
  # 关联后端的Pod
  selector:
    name: lxc
    zuoyong: web
  # 指定svc的类型,有效值为: ExternalName, ClusterIP, NodePort, and LoadBalancer
  #    ExternalName:
  #       可以将K8S集群外部的服务映射为一个svc服务。类似于一种CNAME技术.
  #    ClusterIP:
  #       仅用于K8S集群内部使用。提供统一的VIP地址。默认值!
  #    NodePort:
  #       基于ClusterIP基础之上,会监听所有的Worker工作节点的端口,K8S外部可以基于监听端口访问K8S内部服务。
  #    LoadBalancer:
  #       主要用于云平台的LB等产品。
  type: ClusterIP
  # 指定端口映射相关信息
  ports:
    # 指定svc的端口号
  - port: 88
    # 指定Pod端口号
    targetPort: 80
    # 指定协议
    protocol: TCP
  # 指定ClusterIP的地址
  clusterIP: 10.200.100.100

2.NodePort:基于ClusterIP基础之上,会监听所有的Worker工作节点的端口,K8S外部可以基于监听端口访问K8S内部服务。NodePort类型的Service允许从集群外部访问集群内部的服务,如下配置,访问宿主机的30080端口相当于访问pod的80端口。

 type: NodePort
   selector:
     app: blue
   # 指定端口映射相关信息
   ports:
     # 指定svc的端口号
   - port: 80
     # 指定Pod端口号
     targetPort: 80
     # 指定协议
     protocol: TCP
     # 指定访问宿主机的端口,该端口的报文会被转发后端的容器端口
     # 默认svc有效端口范围是:"30000-32767"
     nodePort: 30080
  # 指定ClusterIP的地址
  clusterIP: 10.200.100.200

17.deployments资源实现蓝绿发布和灰度发布

实现蓝绿发布步骤:

1.部署当前版本(旧版本)

kind: Deployment
apiVersion: apps/v1
metadata:
  name: blue
spec:
  replicas: 3
  selector:
    matchLabels:
      app: blue
  template:
    metadata:
      labels:
        app: blue
    spec:
      containers:
      - name: myweb
        image: 旧版本镜像

2.部署service

kind: Service
apiVersion: v1
metadata:
  name: web-svc
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 80
    nodePort: 30080
  selector:
    app: blue

3.部署新版本(使用新的deployment名称或label标签)

kind: Deployment
apiVersion: apps/v1
metadata:
  name: green
spec:
  replicas: 3
  selector:
    matchLabels:
      app: green
  template:
    metadata:
      labels:
        app: green
    spec:
      containers:
      - name: myweb
        image: 新版本镜像

4.切换service标签到新的pod

将svc的spec的selector的app的值改为grenn即可。

缺点:浪费资源

实现灰度发布步骤:

1.部署当前版本(旧版本)

2.部署service

3.部署新版本deployments,pod数量为一个,标签与旧版本一致

4.无异常时,逐渐减小旧版本pod数量,增大新版本pod数量,直至所有pod变为新版本

18.DaemonSet控制器

作用:DaemonSet确保全部worker节点上运行一个Pod的副本。

DaemonSet的一些典型用法: (1)在每个节点上运行集群守护进程(flannel网络插件等)

(2)在每个节点上运行日志收集守护进程(flume,filebeat,fluentd等)

(3)在每个节点上运行监控守护进程(zabbix agent,node_exportor等)

补充: (1)当有新节点加入集群时,也会为新节点新增一个Pod

(2)当有节点从集群移除时,这些Pod也会被回收

(3)删除DaemonSet将会删除它创建的所有Pod

(4)如果节点被打了污点的话,且DaemonSet中未定义污点容忍,则Pod并不会被调度到该节点上

19.coreDNS

使用:<service name>.<namespace name>.集群域名

20.影响pod调度的因素

1.nodename 节点名字

2.hostnetwork 宿主机网络

3.污点

4.污点容忍

5.Pod亲和性

6.Pod反亲和性

7.节点亲和性

8.resources 资源情况

21.污点

作用于worker节点上,影响容器的调度。

key[=value]:effect

污点的类型:NoSchedule、PreferNoSchedule或NoExecute

NoExecute:该节点不再接收新的Pod调度,与此同时,会立刻驱逐已经调度到该节点的Pod。

NoSchedule:该节点不再接收新的Pod调度,但不会驱赶已经调度到该节点的Pod

PreferNoSchedule:该节点可以接受调度,但会尽可能将Pod调度到其他节点,换句话说,让该节点的调度优先级降低啦。

1.查看容器污点:kubectl describe nodes|grep Taints

2.给节点打上污点:kubectl taint node node_name wudianmingzi=wudain:NoSchedule (wudianmingzi污点的key,wudian污点的值,下同)

3.移除污点:kubectl taint node node_name wudianmingzi-

22.污点容忍
spec:
  # 配置Pod的污点容忍
  tolerations:
  # 指定污点的key
  # 若不指定key,则operator的值必须为Exists,表示匹配所有的key
  - key: qq
  # 指定污点的value
  value: ww
  # 指定污点的effect,有效值为: NoSchedule, PreferNoSchedule,NoExecute
  # 若不指定则匹配所有的影响度。
  effect: NoExecute
  # 表示key和value的关系,有效值为Exists, Equal。
  #    Exists
  #      表示存在指定的key即可,若配置,则要求value字段为空。
  #    Equal:
  #      默认值,表示key=value。
  operator: Equal
  - key: web
  operator: Exists
  - key: node-role.kubernetes.io/master
  operator: Exists
  # 如果不指定key,value,effect,仅配置"operator: Exists"表示无视任何污点!
  #- operator: Exists

对以上总结一下,配置污点容忍,要先指明是哪一个key的污点,若不指明则oprator的值必须为Exists,再配置operator,operator为Exists则下面无需再写value,匹配key即可,operator为Equal,表示key的value值和下面的value的值相等,下面需要再写一行value:xxx。effect匹配污点类型,若不指定则匹配所有。

参考下图:

spec:
  tolerations:
  - key:
    oprator:
    value:
    effect:

到这里还不理解,可以参考几个常见的例子(对照流程图观看)

例1:匹配所有key为web,value值为空,effect为NoExecute的污点(kubectl taint node node_name web:NoExecute)

spec:
  tolerations:
  - key: web
    oprator: Exists
    effect: NoExecute

例2:匹配所有key为test,值为version1,effect为所有的污点

spec:
  tolerations:
  - key: test
    oprator: Equal
    value: version1

例3:忽略所有污点

spec:
  tolerations:
  - oprator: Exists

23.节点选择器

应用场景:当需要将pod调度到指定节点时候。

给指定的节点打标签

kubectl label nodes node_name keyaa=valueaa

spec:
  tolerations:
  - oprator: Exists
  nodeSelector:
    keyaa: valueaa

24.节点亲和性

节点选择器,当这样子当两个节点,比如节点a,keyaa=value1,节点b,keyaa=value2,此时节点选择器无法满足,所以引入了节点亲和性。

如下,这样子两个节点都会被调度到

spec:  
  affinity:
    # 定义节点的亲和性
    nodeAffinity:
      # 定义硬限制
      requiredDuringSchedulingIgnoredDuringExecution:
        # 定义节点的匹配条件
        nodeSelectorTerms:
          - # 基于节点的标签进行匹配
            matchExpressions:
              - # 指定标签的key
                key: keyaa
                # 指定key和value之间的对应关系
                operator: In
                # 指定标签的value(可以是一个或多个)
                values:
                  - value1
                  - value2
                  
​
# 指定key和value之间的对应关系,有效值如下:
                #   In:
                #     key的值必须在vlaues内。要求values不能为空。
                #   NotIn:
                #     和In相反。要求values不能为空。
                #   Exists:
                #     只要存在指定key即可,vlaues的值必须为空。
                #   DoesNotExist:
                #     只要不存在指定key即可,vlaues的值必须为空。
                #   Gt:
                #     表示大于的意思,values的值会被解释为整数。
                #   Lt:
                #     表示小于的意思,values的值会被解释为整数。

24.Pod亲和性与反亲和性

pod亲和性的理解:将全部pod调度到同一个拓扑域上(拓扑域指定节点的标签,指定的这个节点标签相同为同一个拓扑域,如下例子中节点k8s231和k8s234属于同一个拓扑域)

pod亲和性的理解:将全部pod调度到同一个拓扑域上

Pod亲和性应用场景:

比方说在广州,深圳,佛山三地都有服务器,想让所有pod都调度到其中一地。如何实现: 1.给不同地址的节点打标签

kubectl label node k8s231 place=guangzhou

kubectl label node k8s232 place=shenzhun

kubectl label node k8s233 place=foshan

kubectl label node k8s234 place=guangzhou

2.将拓扑域设置为place

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment_name  # 请替换为实际的Deployment名称
spec:
  replicas: 3  # 副本数量,可根据需求调整
  selector:
    matchLabels:
      name: lxc  # 请替换为实际的应用标签
  template:
    metadata:
      labels:
        name: lxc  # 请替换为实际的应用标签
    spec:
      affinity:
        #定义pod亲和性
        podAffinity:
          #硬限制
          requiredDuringSchedulingIgnoredDuringExecution:
          #指定拓扑域为place
          - topologyKey: place
            labelSelector:
              #基于标签进行匹配
              matchExpressions:
              #指的是pod标签的key
              - key: name
                operator: In
                #pod标签key的values
                values:
                - lxc
      tolerations:
      - operator: Exists
      containers:
      ...

反亲和性:将podAddinity改为podAntiAffinity,其他不变,此时每个拓扑域只能调度一个pod。若没有足够的节点(每个节点的标签place的值应该与其他不同),则剩下的pod将会处于penging状态。假设此时副本数量为5,那么有一个pod处于penging状态。(补充说明:前提是上面指定的是硬限制,软限制则第5个pod可以调度成功)

25.k8s服务代理模式转换

(1)所有worker节点安装ipvs相关组件 yum -y install conntrack-tools ipvsadm.x86_64

(2)编写加载ipvs的配置文件

cat > /etc/sysconfig/modules/ipvs.modules <<EOF #!/bin/bash

modprobe -- ip_vs modprobe -- ip_vs_rr modprobe -- ip_vs_wrr modprobe -- ip_vs_sh modprobe -- nf_conntrack_ipv4 EOF

(3)加载ipvs相关模块并查看 chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4

4.1仅需修改工作模式("mode")为ipvs即可。 kubectl -n kube-system edit cm kube-proxy

4.2 验证是否修改成功:kubectl -n kube-system describe cm kube-proxy | grep mode

(5)删除旧的kube-proxy,最好逐个删除pod kubectl get pods -A | grep kube-proxy | awk '{print $2}' | xargs kubectl -n kube-system delete pods

(6)验证kube-proxy组件工作模式是否生效

kubectl get pods -A | grep kube-proxy kubectl logs kube-proxy-k6mrc -n kube-system

ipvsadm -ln | grep 10.200.100.200 -A 3

26.RBAC基于角色的访问控制

角色(Role):定义了一组对资源的访问权限。Role作用于特定的命名空间

角色绑定(RoleBinding):将Role绑定到具体的用户、用户组或ServiceAccount上,从而在集群或命名空间级别授予用户或用户组对资源的访问权限。RoleBinding通常绑定到特定命名空间内的主体。

集群角色(ClusterRole):与Role类似,但ClusterRole作用于整个集群,而不是单个命名空间

集群角色绑定(ClusterRoleBinding):将ClusterRole绑定到具体的用户、用户组或ServiceAccount上,用于集群范围的操作,如创建命名空间或管理集群配置。ClusterRoleBinding是跨集群的。

查看角色:kubectl get clusterrole

User:用户自定义名称,一般是给人用的

ServiceAccount:服务账号,一般是给程序用的

Group:给一个组使用

K8S内置集群角色: cluster-admin:超级管理员,有集群所有权限。 admin:主要用于授权命名空间所有读写权限。 edit:允许对大多数对象读写操作,不允许查看或者修改角色,角色绑定。 view: 允许对命名空间大多数对象只读权限,不允许查看角色,角色绑定和secret。

1.基于用户的权限管理,简单来讲,通过用户与角色的绑定来管理k8s资源。

2.基于用户组的权限管理,用户组的权限就是角色绑定到用户组的角色权限,然后属于用户组的用户持有的kubeconfig具有用户组的权限

3.基于serviceAccount服务账号的权限管理,sa资源使用步骤:1.创建服务账号,2.创建角色,3.角色绑定将sa和role绑定,4.pod资源使用服务账号。

以上此部分角色创建,角色绑定,用户组及用户配置,sa资源详细使用见博客。

27.PV,PVC,SC资源

PV:持久卷,用于定义持久卷,如大小,存储卷类型

PVC:持久卷声明,声明了对持久卷的需求

使用PV和PVC,可以实现应用与存储的解耦,使得应用在迁移或扩展时无需关心底层存储资源的变化。

PV的回收策略: Retain: "保留回收"策略允许手动回收资源,删除pvc时,pv仍然存在,并且该卷被视为"已释放(Released)"。 在管理员手动回收资源之前,使用该策略其他Pod将无法直接使用。 手动回收资源:将原有资源移动,删除pv,重新创建pv。pv将重新处于Available。

Recycle: 对于"回收利用"策略官方已弃用。相反,推荐的方法是使用动态资源调配。

StorageClass:动态存储卷,简称sc,作用可以根据pvc,自动创建pv。在Kubernetes中,当有了合适的StorageClass后,通常无需手动创建PV,只需要创建PVC,StorageClass会根据PVC的请求自动创建相应的PV。

对于k8s不支持的动态不支持的存储类型,如NFS,需要使用第三方的动态供应器。我已经把项目导出(k8s-external-storage/nfs-client/deploy)。

对于k8s-external-storage/nfs-client/deploy的补充:

1.class.yaml是sc资源,rbac.yaml角色创建和角色绑定,deployment.yaml是nfs动态存储配置器。

2.项目里面test-claim.yaml,创建pvc资源,test-pod.yaml,创建pod并使用“test-claim.yaml,创建pvc资源”。这两个文件可以用于测试。

3.基本上只需要修改deployment.yaml (修改nfs服务器地址和挂载点即共享路径,env里面的变量)

kubectl apply -f class.yaml -f rbac.yaml -f deployment.yaml

28.StatefulSet控制器

作用:(1)提供,稳定唯一的网络标识符。 (2)提供,稳定独立持久的存储。

稳定的网络标识:
其本质对应的是一个service资源,只不过这个service没有定义VIP,我们称之为headless service,即"无头服务"。
1.通过"headless service"来维护Pod的网络身份,会为每个Pod分配一个数字编号并且按照编号顺序部署。

综上所述,无头服务("headless service")要求满足以下两点: (1)将svc资源的clusterIP字段设置None,即"clusterIP: None"; (2)将sts资源的serviceName字段声明为无头服务的名称;

pod的域名:<pod-name>.<svc-name>.<namespace>.svc.cluster.local

svc.cluster.local为集群域名

sts无头服务固定资源清单:

vim 01-statefulset-headless-network.yaml

apiVersion: v1
kind: Service
metadata:
  name: linux-headless
spec:
  ports:
  - port: 80
    name: web
  # 将clusterIP字段设置为None表示为一个无头服务,即svc将不会分配VIP。
  clusterIP: None
  selector:
    app: nginx
​
---
​
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: linux-web-sts
spec:
  selector:
    matchLabels:
      app: nginx
  # 声明无头服务    
  serviceName: linux-headless
  replicas: 3 
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: harbor.lxcedu.com/base-img/nginx:1
​

sts提供稳定唯一的网络标识符。,简单来讲,就是固定了域名,pod重启不影响域名。假如我的pod运行的mysql的主库和从库,sts可以确保每次连的是同一个数据库,不会说这次连主库,下次给连成从库。

sts提供稳定独立持久的存储案例:

此案例无需设置无头服务。

StatefulSet 确保每个 Pod 都有一个稳定且唯一的标识符,这使得它能够为每个 Pod 分配一个持久的存储卷。

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name:  linux-web-sts-volume
spec:
  selector:
    matchLabels:
      apps: nginx
  serviceName: linux-headless
  replicas: 3 
  # 卷申请模板,会为每个Pod去创建唯一的pvc并与之关联哟!
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      # 声明自定义的动态存储类,即sc资源。
      storageClassName: "managed-nfs-storage"
      resources:
        requests:
          storage: 2Gi
  template:
    metadata:
      labels:
        apps: nginx
    spec:
      containers:
      - name: nginx
        image: harbor.lxcedu.com/base-img/nginx:1
        volumeMounts:
        - name: data
          mountPath: /usr/share/nginx/html
---
apiVersion: v1
kind: Service
metadata:
  name: linux-sts-svc
spec:
  selector:
     apps: nginx
  ports:
  - port: 80
    targetPort: 80
​

29.Metric Server

Metric Server是一种用于提供Kubernetes集群内Pod和节点资源使用情况(如CPU、内存等)的标准接口。它是Kubernetes内置自动缩放管道的可扩展、高效的容器资源指标来源。

作用:提供资源使用情况数据,支持自动缩放,支持集群的容量规划、性能调优和故障排查。

用法:

1.下载起源清单:

wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/high-availability-1.21+.yaml

2.修改资源清单,如图所示,增加- --kubelet-insecure-tls,修改镜像。 img

3.创建应用:kubectl apply -f high-availability-1.21+.yaml

4.检查状态:kubectl -n kube-system get pods| grep metrics-server

5.验证 metrics-server是否正常

查看pod资源情况:kubectl top pods

查看节点资源情况:kubectl top node

30.HPA

Kubernetes的 HPA (Horizontal Pod Autoscaler) 是一种用于自动扩缩(伸缩)Pod副本数的机制,根据指标(如 CPU 使用率、内存使用率或自定义指标)动态调整部署的Pod数量,从而保证应用程序的性能和资源的高效使用。

简单来讲就是根据pod的性能指标,动态调整pod的数量,HPA调整的是Pod的数量,而不是节点上的Pod分布。它不会关心Pod具体运行在哪个节点上,只会根据集群的整体负载和指定的监控指标来调整Pod的总数

响应式创建HPA:kubectl autoscale deployment deployment资源名字 --min=2 --max=5 --cpu-percent=80

声明式创建HPA:

# 指定Api的版本号
apiVersion: autoscaling/v2
# 指定资源类型
kind: HorizontalPodAutoscaler
# 指定hpa源数据信息
metadata:
  # 指定名称
  name: deploy01-hpa
  # 指定名称空间
  namespace: default
# 用户的期望状态
spec:
  # 指定最大的Pod副本数量
  maxReplicas: 5
  # 指定监控指标
  metrics:
    # 指定资源限制
  - resource:
      # 指定资源限制的名称
      name: cpu
      # 指定限制的阈值
      target:
        #限制cpu为百分之八十
        averageUtilization: 80
        type: Utilization
    type: Resource
  # 指定最小的Pod副本数量
  minReplicas: 2
  # 当前的hpa规则应用在哪个资源
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    #deploy资源名字
    name: deploy-hpa

上述代码,动态调整部署的Pod数量为2-5,关联的是名字为deploy-hpa的Deployment,限制的是cpu资源为百分之八十。当pods消耗资源超过限定的值,pod会自动扩容至5个,当资源消耗降低,则pod数量减少。

deploy资源例子

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-hpa
spec:
  replicas: 3
  selector:
    matchExpressions:
    - key: apps
      operator: Exists
  template:
    metadata:
      labels:
        apps: hpa
    spec:
      containers:
      - name: web
        image: harbor.lxcedu.com/base-img/nginx:1
        resources:
          requests:
             cpu: 500m
             memory: 200M
          limits:
             cpu: 1
             memory: 500M

值得注意的是:Pod 的资源请求(requests)需要为 CPU 设置一个值。HPA 需要根据 CPU 的请求量来计算当前的 CPU 使用率。否则hpa功能无法实现。

31.helm和traefik

helm的使用及traefik基于helm的安装及启用,详见博客。

补充:建议将traefik的副本数调大,values的replica。

32.Ingress

相比于NodePort方式,使用Ingress可以节约端口资源,并且能够通过域名匹配将流量分配到不同的Pod上(这些Pod可能由不同的Deployment控制)。

  • 工作原理:Ingress是Kubernetes中的一个API对象,它定义了外部用户如何访问集群内部的服务。Ingress控制器负责实现Ingress规则,将外部流量根据域名、路径等信息转发到集群内部相应的服务上。

  • 端口占用:Ingress方式通常只需要一个或少量的NodePort(或LoadBalancer)来暴露Ingress控制器。由于Ingress控制器可以根据域名和路径等信息将流量转发到不同的服务上,因此不需要为每个服务都分配一个独立的NodePort。

  • 流量分配:Ingress提供了灵活的流量分配功能。用户可以根据域名、路径、HTTP头部等信息来定义路由规则,实现基于域名的虚拟托管和基于路径的流量拆分。这使得Ingress成为微服务架构中管理外部流量的理想选择。

生产环境可以这样子配置,两台nginx服务器做了高可用,配置upstreem模块,将流量反向代理打到k8s集群的ingress的8000端口,配置了ingress规则,自动关联了pod,允许外部请求通过Ingress控制器访问到集群内部的指定Service。

ingress资源清单:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: yiliao
  annotations:
    kubernetes.io/ingress.class: traefik  # 指定Ingress 控制器为"traefik"
spec:
  rules:
  - host: yiliao.lxcedu.com
    http:
      paths:
      - backend:
          service:
            name: lxcedu-linux-yiliao-svc
            port:
              number: 80
        path: "/"
        pathType: "Prefix"

通过Ingress资源配置了一个规则,允许外部请求通过Ingress控制器访问到集群内部的指定Service。

基于traefik的ingress需要将流量转发

kubectl port-forward kubectl get pods -l "app.kubernetes.io/name=traefik" -o name` --address=0.0.0.0 8000:8000

40.job控制器

job概述:一次性任务,pod完成作业后并不重启,重启策略为restartPolicy:Never,作业完成之后,pod的状态为competed。

apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    spec:
      containers:
      - name: pi
        image: perl:5.34
        # 它计算π到2000个位置并打印出来。大约需要 10 秒才能完成。
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never
  # 指定标记此作业失败之前的重试次数。默认值为6
  backoffLimit: 4

41.cron job控制器

cronjob概述:周期性任务,CronJob底层逻辑是周期性创建Job控制器来实现周期性任务的。

apiVersion: batch/v1
kind: CronJob
metadata:
  name: hello
spec:
  # 定义调度格式,参考链接:https://en.wikipedia.org/wiki/Cron
  # ┌───────────── 分钟 (0 - 59)
  # │ ┌───────────── 小时 (0 - 23)
  # │ │ ┌───────────── 月的某天 (1 - 31)
  # │ │ │ ┌───────────── 月份 (1 - 12)
  # │ │ │ │ ┌───────────── 周的某天 (0 - 6)(周日到周一;在某些系统上,7 也是星期日)
  # │ │ │ │ │                          或者是 sun,mon,tue,web,thu,fri,sat
  # │ │ │ │ │
  # │ │ │ │ │
  # * * * * *
  schedule: "* * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox:1.28
            imagePullPolicy: IfNotPresent
            command:
            - /bin/sh
            - -c
            - date; echo Hello 
          restartPolicy: OnFailure
​

42.pod的驱逐与节点退出集群
43.kubeadm快速将节点加入集群

44.补充:

1.对于harbor仓库私有项目的拉取,需要现在harbor上创建对应的用户,其次通过kubectl create secret 创建凭证,拉取时候指定imagepullSecrets:- name:xxx,方可拉取镜像。

2.初始化容器应用场景:主容器使用StorageClass(简称SC)来动态分配持久卷(Persistent Volume,简称PV),由于持久卷没有代码,可以使用初始化容器从代码仓库拉取代码,初始化容器和主容器挂载到同一个sc。 过程: 在Pod的YAML定义文件中,添加初始化容器和主容器。 初始化容器负责从远程仓库(如Git)拉取代码,并将其存储到一个临时目录或PV中(如果PV已经被挂载到Pod中)。 主容器则挂载相同的PV,并可以从PV中访问初始化容器拉取的代码。


http://www.kler.cn/a/592426.html

相关文章:

  • Matlab 汽车振动多自由度非线性悬挂系统和参数研究
  • USB(Universal Serial Bus)详解
  • ETL中的实用功能以及数据集成方式
  • 基于Spring Boot的流浪动物救助平台的设计与实现(LW+源码+讲解)
  • Vmware中的centos7连接上网
  • ==和equals的区别?
  • VLLM专题(三十六)—自动前缀缓存
  • Java 中的引导类加载器(Bootstrap ClassLoader) 详解
  • 如何理解分布式光纤传感器?
  • 49.71.79.51和49.71.79.42算不算同一个子网中的ip地址吗?
  • Day20:丑数
  • 解码软件需求的三个维度:从满足基础到创造惊喜
  • dart学习记录3(函数)
  • 蓝桥杯备考----》快速幂算法之乘方
  • 大模型开发(六):LoRA项目——新媒体评论智能分类与信息抽取系统
  • 力扣100二刷——图论、回溯
  • electron框架(1.0)认识electron和基础创建
  • 使用PyMongo操作MongoDB(一)
  • MR-Flink-Spark任务提交-常用命令
  • 物联网的数据传输与处理!