文章 59
评论 0
浏览 30513
k8s资源对象yaml文件详解

k8s资源对象yaml文件详解

一、Namespace

namespace用来在k8s集群中进行逻辑隔离资源,也可以使用ResourceQuota进行整个namespace资源限制

apiVersion: v1  #API版本
kind: Namespace #类型为namespace
metadata:   #定义元数据
  name: zhangzhuo #namespace名称

namespace相关查看命令

#查看namespaces
[18:09:37 root@k8s-master1 mnt]#kubectl get namespaces 
NAME                   STATUS   AGE
default                Active   29h
kube-node-lease        Active   29h
kube-public            Active   29h
kube-system            Active   29h
kubernetes-dashboard   Active   37m
nide                   Active   77s
zhangzhuo              Active   5h32m

#查看namespace详细信息
[18:10:11 root@k8s-master1 mnt]#kubectl describe namespaces nide 
Name:         nide
Labels:       <none>
Annotations:  <none>
Status:       Active

Resource Quotas
 Name:                    quota-zhangzhuo
 Resource                 Used  Hard
 --------                 ---   ---
 limits.cpu               0     2
 limits.memory            0     4Gi
 pods                     0     20
 requests.cpu             0     1
 requests.memory          0     1Gi
 requests.nvidia.com/gpu  0     4
 services                 0     10

No LimitRange resource.

二、ResourceQuota

作用:用来对整个namespace进行资源限制,如果namespace开启资源限制之后在这个namespace中创建的所有pod必须设置资源限制

apiVersion: v1  #api版本
kind: ResourceQuota  #类型ResourceQuota
metadata:   #元数据
  name: quota-zhangzhuo  #名称
  namespace: zhangzhuo #创建在那个namespace
spec:
  hard:
    requests.cpu: "1"     #单个pod的cpu最大值
    requests.memory: 1Gi  #单个pod的内存最大值
    limits.cpu: "2"       #namespace的cpu最大值
    limits.memory: 4Gi    #namespace的内存最大值
    requests.nvidia.com/gpu: 4   #namespace使用nvidia的gpu最大核心数
    pods: "20"      #namespace最多能创建几个pod
    services: "10"  #namespace最多能创建几个service

ResourceQuota相关命令

#查看特点的namespaces资源限制,以及资源使用情况
[18:12:42 root@k8s-master1 mnt]#kubectl get resourcequotas -n nide
NAME              AGE     REQUEST                                                                                               LIMIT
quota-zhangzhuo   3m51s   pods: 0/20, requests.cpu: 0/1, requests.memory: 0/1Gi, requests.nvidia.com/gpu: 0/4, services: 0/10   limits.cpu: 0/2, limits.memory: 0/4Gi
#查看详细的信息
[18:13:29 root@k8s-master1 mnt]#kubectl describe resourcequotas -n nide
Name:                    quota-zhangzhuo
Namespace:               nide
Resource                 Used  Hard
--------                 ----  ----
limits.cpu               0     2
limits.memory            0     4Gi
pods                     0     20
requests.cpu             0     1
requests.memory          0     1Gi
requests.nvidia.com/gpu  0     4
services                 0     10

三、service

作用:对内提供服务发现,可以让pod通过service访问其他pod,提供pod的高可用,对外可以暴露端口让外部访问k8s集群的pod

apiVersion: v1    #service API版本
kind: Service     #类型为service
metadata:         #定义service元数据
  labels:         #自定义标签
    app: zhangzhuo-nginx   #定义service标签的内容
  name: zhangzhuo-nginx-spec   #定义service的名称,此名称会被DNS解析
  namespace: zhangzhuo         #该service隶属于的namespaces名称
spec:    #定义service的详细信息
  type: NodePort   #service的类型,定义服务的访问方式,默认为ClusterIP
  ports:   #定义访问端口
  - name: http   #定义一个端口名称
    port: 80     #service 提供访问的端口
    protocol: TCP  #协议类型
    targetPort: 80   #目标pod的端口,即pod端口
    nodePort: 30080  #node节点暴露的端口
  - name: https   #SSL 端口
    port: 443      #service 443端口
    protocol: TCP  #端口协议
    targetPort: 443 #目标pod端口
    nodePort: 30443 #node节点暴露的SSL端口
  selector:         #service的标签选择器,定义要访问的目标pod
    app: zhangzhuo-nginx-selector #将流量路到选择的pod上,须等于Deployment.spec.selector.matchLabels

Service.spec.type:提供2种类型分别是ClusterIP与NodePort,如果service不需要提供外部访问就使用ClusterIP,如果提供外部访问k8s内部的pod可以使用NodePort,之后需要在下面指定nodePort端口。

service常用命令

#查看service
[19:19:31 root@k8s-master1 mnt]#kubectl get service -n nide
NAME                   TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
zhangzhuo-nginx-spec   NodePort   10.200.121.114   <none>        80:30080/TCP,443:30443/TCP   62m
#查看service详细信息
[19:19:34 root@k8s-master1 mnt]#kubectl describe service -n nide zhangzhuo-nginx-spec 
Name:                     zhangzhuo-nginx-spec
Namespace:                nide
Labels:                   app=zhangzhuo-nginx
Annotations:              <none>
Selector:                 app=zhangzhuo-nginx-selector
Type:                     NodePort
IP:                       10.200.121.114
Port:                     http  80/TCP
TargetPort:               80/TCP
NodePort:                 http  30080/TCP
Endpoints:                10.100.224.149:80
Port:                     https  443/TCP
TargetPort:               443/TCP
NodePort:                 https  30443/TCP
Endpoints:                10.100.224.149:443
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>
#查看service后端pod
[19:20:07 root@k8s-master1 mnt]#kubectl get endpoints -n nide zhangzhuo-nginx-spec 
NAME                   ENDPOINTS                              AGE
zhangzhuo-nginx-spec   10.100.224.149:443,10.100.224.149:80   63m

四、Deployment

作用:控制器主要用来,控制pod副本数量

apiVersion: apps/v1  #API版本
kind: Deployment  #类型,是deployment控制器,kubectl explain Deployment
metadata:  #pod的元数据信息
  labels: #自定义pod的标签
    app: zhangzhuo-nginx-deployment-label #标签名称为app值
  name: zhangzhuo-nginx-deployment #pod的名称
  namespace: zhangzhuo    #控制器的namespace,不指定默认是defaule
spec: #定义deployment中容器的详细信息
  replicas: 1 #创建出的pod的副本数,默认即为1
  selector: #定义标签选择器
    matchLabels: #定义匹配的标签,必须要设置
      app: zhangzhuo-nginx-selector  #匹配的目标标签
  template: #定义模板,必须定义,模板是起到描述要创建的pod的作用
    metadata: #定义模板元数据
      labels: #定义模板label
        app: zhangzhuo-nginx-selector #定义标签
    spec:  #定义pod信息
      volumes:     #声明volumes
      - name: zhangzhuo-image  #名称
        nfs:   #类型nfs
          server: 192.168.10.185 #服务器地址
          path: /data/zhangzhuo/images #共享目录
      - name: zhangzhuo-static  #名称
        nfs:   #类型
          server: 192.168.10.185  #服务器地址
          path: /data/zhangzhuo/static #共享目录
      nodeSelector:   #位置在当前containers参数结束后的部分,设置pod运行在那个服务器
        project: zhangzhuo  #匹配的标签
      containers: #定义pod中容器列表,可以多个至少一个,pod不能动态增减容器
      - name: zhangzhuo-nginx-container #容器名称
        image: harbor.zhangzhuo.org/zhangzhuo/nginx-web1:v1 #镜像地址
        imagePullPolicy: Always #拉取策略,默认IfNotPresent本地有的化就不拉取,推荐使用Always
        ports:  #定义容器端口列表
        - containerPort: 80 #定义一个端口
          protocol: TCP #端口协议
          name: http    #端口名称
        - containerPort: 443
          protocol: TCP
          name: https
        readinessProbe:   #探针类型就绪探针
          httpGet:       #检测方式httpGet请求,还有命令探测command与tcpSocket的tcp探测
            scheme: HTTP #http协议,默认就是http,如果是https需要写https
            path: /index.html  #访问http路径
            port: 80           #访问端口
          initialDelaySeconds: 10 #第一次探测等待60秒
          periodSeconds: 3     #多少秒进行一次探测
          timeoutSeconds: 5    #探测超时等待多少秒
          successThreshold: 1  #从失败转为成功的次数
          failureThreshold: 3  #从成功转为失败的重试次数
        livenessProbe:  #探针类型存活探针     
          tcpSocket:    #探测方式TCP探测
            port: 80
          initialDelaySeconds: 10 #第一次探测等待60秒
          periodSeconds: 3     #多少秒进行一次探测
          timeoutSeconds: 5    #探测超时等待多少秒
          successThreshold: 1  #从失败转为成功的次数
          failureThreshold: 3  #从成功转为失败的重试次数 
        volumeMounts:   #pod的容器引用volume
        - name: zhangzhuo-image #引用的volume名称
          mountPath: /apps/nginx/html/zhangzhuo/image #挂载目录 
          readOnly: false
        - name: zhangzhuo-static   #引用的volume名称
          mountPath: /apps/nginx/html/zhangzhuo/static #挂载的目录 
          readOnly: false
        env:  #配置环境变量
        - name: "password" #变量名称。必须要用引号引起来
          value: "123456"  #当前变量的值
        - name: "age"      #另一个变量名称
          value: "18"      #另一个变量的值
        resources:         #对资源的请求设置和限制设置
          limits:          #资源限制设置,上限
            memory: "50Mi" #内存限制,单位可以为Mib/Gib,将用于docker run --memory参数
            cpu: "100m"    #cpu的限制,单位为core数,可以写0.5或者500m等CPU压缩值
          requests:        #资源请求的设置
            cpu: "100m"    #cpu请求数,容器启动的初始可用数量,可以写0.5或者500m等CPU压缩值
            memory: "50Mi" #内存请求大小,容器启动的初始可用数量,用于调度pod时候使用

容器挂载存储:需要使用Deployment.spec.template.spec.volumes声明存储类型以及挂载信息,之后在Deployment.spec.template.spec.containers.pod-name.volumeMounts引用之前定义的信息使用

探针:分为存活探针与就绪探针,他们实现的功能并不相同推荐一起使用。存活探针如果如果检测错误会重启容器,就绪探针如果检测错误会把pod从service后端去除。

资源限制:资源限制如果namespace开启资源限制那么容器必须设置资源限制,不然无法创建pod。limits是这个容器最大的资源数量,requests是容器创建之初所申请的资源大小

五、configmap

主要作用:主要用来给pod注入配置文件,或者变量

apiVersion: v1     #api版本
kind: ConfigMap    #资源类型
metadata:
  name: nginx-config   #名称
  namespace: nide  #namespace名称
data:
  nginx.conf: |     #key名称,之后用来引用,可以写多个
    user  nginx;
    daemon off;
    worker_processes  auth;
    worker_rlimit_nofile 65536;
    events {
      worker_connections  1024;
      use epoll;
      accept_mutex on;
      multi_accept on;
    }
    http {
      include       mime.types;
      default_type  application/octet-stream;
      sendfile        yes;
      sendfile        on;
      gzip  yes;
      server_tokens off;
      log_format access_json '{"@timestamp":"$time_iso8601",'   
        '"host":"$server_addr",'       
        '"clientip":"$remote_addr",'   
        '"size":$body_bytes_sent,'     
        '"responsetime":$request_time,'  
        '"upstreamtime":"$upstream_response_time",' 
        '"upstreamhost":"$upstream_addr",'
        '"http_host":"$host",'         
        '"uri":"$uri",'                      
        '"domain":"$host",'            
        '"xff":"$http_x_forwarded_for",'  
        '"referer":"$http_referer",'      
        '"tcp_xff":"$proxy_protocol_addr",' 
        '"http_user_agent":"$http_user_agent",'  
        '"status":"$status"}';                 
      access_log logs/access.log access_json;  
      server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
      }
    }
  username: zhangzhuo   #变量
  
  
  
#使用configmap
      volumes:    #声明volumes
      - name: nginx-conf  #volumes名称后面容器会引用
        configMap:        #类型configMap
          name: nginx-config   #引用的configMap名称
          items: 
            - key: nginx.conf  #多个key可以选择
              path: nginx.conf #生成的文件
        volumeMounts:   #pod的容器引用volume
        - name: nginx-conf    #名称
          mountPath: /apps/nginx/conf/123 #挂载的目录
        env:  #配置环境变量
        - name: USERNAME  #变量名称
          valueFrom:      #类型
            configMapKeyRef: #从configMap中获取
              name: nginx-config  #configMap名称
              key: username       #那个变量,configMap中变量的名称

六、Ingress

作用:ingress是kubernetes API中的标准资源类型之一,ingress实现的功能是将客户端请求的hostmc或请求的URL路径把请求转发到指定的service资源的规则,即用于将kubernetes集群外的请求资源转发至集群内部的service,在被service转发至pod处理客户端请求。

使用Ingress需要安装ingress controller控制器

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: zhangzhuo-web-ingress
  namespace: zhangzhuo
  labels:
    name: zhangzhuo-web-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"      #指定Ingress Controller的类型
    nginx.ingress.kubernetes.io/use-regex: "true"   #指定后面rules定义的path可以使用正则表达式
    nginx.ingress.kubernetes.io/proxy-connect-timeout: "600" #连接超时时间,默认5秒
    nginx.ingress.kubernetes.io/proxy-send-timeout: "600"    #后端服务器回传数据超时时间,默认60秒
    nginx.ingress.kubernetes.io/proxy-read-timeout: "600"    #后端服务器响应超时时间,默认60秒
    nginx.ingress.kubernetes.io/proxy-body-size: "50m"       #客户端上传文件,最大大小,默认20m
#    nginx.ingress.kubernetes.io/rewrite-target: /index.html            #URL重写,当用户访问的页面不存在跳转首页
#    nginx.ingress.kubernetes.io/app-root: /index.html        #当客户端不写URL时,补全
spec:
  tls:   #使用tls
  - hosts:  #主机配置
    - nginx.zhangzhuo.org   #主机名
    secretName: zhangzhuo-nginx-tls #使用的证书
  - hosts:
    - tomcat.zhangzhuo.org 
    secretName: zhangzhuo-tomcat-tls
  rules:   #路由规则
  - host: www.zhangzhuo.org  #主机名称,也就是匹配域名
    http:   #协议
      paths:
      - pathType: Prefix   #path类型,分为Prefix,Exact
        path: "/"          #匹配的URL
        backend:           #转发至那个service
          service:
            name: zhangzhuo-nginx-spec   #service名称
            port: 
              number: 80  #service端口
      - pathType: Prefix
        path: "/app1"
        backend:
          service:
            name: zhangzhuo-tomcat-app1-spec
            port:
              number: 8080
  - host: tomcat.zhangzhuo.org
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: zhangzhuo-tomcat-app1-spec
            port: 
              number: 8080
  - host:   #不写主机名称表示除了上面匹配的转发到对应的service,其他的访问都转到这里
    http:
      paths:
      - pathType: Prefix
        path: "/" 
        backend:
          service:
            name: zhangzhuo-nginx-spec
            port: 
              number: 80   

标题:k8s资源对象yaml文件详解
作者:Carey
地址:HTTPS://zhangzhuo.ltd/articles/2021/06/20/1624190655976.html

生而为人

取消