k8s——services资源+pod详解1

services资源+pod详解1

一、service

通过上节课的学习,已经能够利用Deployment来创建一组Pod来提供具有高可用性的服务。

虽然每个Pod都会分配一个单独的Pod IP,然而却存在如下两问题:

· Pod IP 会随着Pod的重建产生变化
· Pod IP 仅仅是集群内可见的虚拟IP,外部无法访问

二、问题解释

(1)控制器创建三个pod
powershell 复制代码
[root@master ~]# vim deploy.yaml 
[root@master ~]# cat deploy.yaml 
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
[root@master ~]# kubectl apply -f deploy.yaml 
deployment.apps/nginx created
[root@master ~]# kubectl get deploy -n dev
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   2/3     3            2           16s
[root@master ~]# kubectl get pod -n dev
NAME                     READY   STATUS    RESTARTS   AGE
nginx-6c45cbd8c5-gzvnd   1/1     Running   0          27s
nginx-6c45cbd8c5-tz458   1/1     Running   0          27s
nginx-6c45cbd8c5-vrmdw   1/1     Running   0          27s
[root@master ~]# kubectl get pod -n dev -o wide
NAME                     READY   STATUS    RESTARTS   AGE   IP               NODE    NOMINATED NODE   READINESS GATES
nginx-6c45cbd8c5-gzvnd   1/1     Running   0          41s   172.16.166.142   node1   <none>           <none>
nginx-6c45cbd8c5-tz458   1/1     Running   0          41s   172.16.104.16    node2   <none>           <none>
nginx-6c45cbd8c5-vrmdw   1/1     Running   0          41s   172.16.166.143   node1   <none>           <none>
(2)内部可以通过pod的IP地址进行访问(三个都可以进行访问)
powershell 复制代码
[root@node1 ~]# curl 172.16.166.142
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
......
(3)手动删除一个pod(会再自动生成一个pod,但IP不一致)
powershell 复制代码
[root@master ~]# kubectl delete pod nginx-6c45cbd8c5-gzvnd -n dev
pod "nginx-6c45cbd8c5-gzvnd" deleted
[root@master ~]# kubectl get pod -n dev -o wide
NAME                     READY   STATUS    RESTARTS   AGE     IP               NODE    NOMINATED NODE   READINESS GATES
nginx-6c45cbd8c5-2jgdb   1/1     Running   0          8s      172.16.104.17    node2   <none>           <none>
nginx-6c45cbd8c5-tz458   1/1     Running   0          5m21s   172.16.104.16    node2   <none>           <none>
nginx-6c45cbd8c5-vrmdw   1/1     Running   0          5m21s   172.16.166.143   node1   <none>           <none>

在实际生产中如果固定了查找的IP,但是此IP出现问题后,就查找不到pod了,且Pod IP 仅仅是集群内可见的虚拟IP,外部无法访问

三、service解决问题

这样对于访问这个服务带来了难度。因此,kubernetes设计了Service来解决这个问题。

Service可以看作是一组同类Pod对外的访问接口。借助Service,应用可以方便地实现服务发现和负载均衡。

1、操作一:创建集群内部可访问的Service(解决IP可变问题)
(1)暴露service(ClusterIP)
powershell 复制代码
[root@master ~]# kubectl expose deploy nginx --name=svc-nginx1 --type=ClusterIP --port=80 --target-port=80 -n dev
service/svc-nginx1 exposed
(2)查看service
powershell 复制代码
[root@master ~]# kubectl get svc -n dev
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
svc-nginx1   ClusterIP   10.108.73.165   <none>        80/TCP    11s
#这里产生了一个CLUSTER-IP,这就是service的IP,在Service的生命周期中,这个地址是不会变动的
(3)通过service的IP访问对应的pod
powershell 复制代码
[root@node1 ~]# curl 10.108.73.165
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
......

上面创建的Service的type类型为ClusterIP,这个ip地址只用集群内部可访问# 如果需要创建外部也可以访问的Service,需要修改type为NodePort

2、操作二:创建集群外部也可访问的Service(解决外部访问问题)
(1)暴露service(NodePort)
powershell 复制代码
[root@master ~]# kubectl expose deploy nginx --name=svc-nginx2 --type=NodePort --port=80 --target-port=80 -n dev
service/svc-nginx2 exposed
(2)查看service
powershell 复制代码
[root@master ~]# kubectl get svc -n dev -o wide
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE     SELECTOR
svc-nginx1   ClusterIP   10.108.73.165   <none>        80/TCP         9m14s   run=nginx
svc-nginx2   NodePort    10.109.74.9     <none>        80:32755/TCP   16s     run=nginx
(3)外部访问(用master、node1、node2节点的IP都可以访问)
3、删除service
powershell 复制代码
[root@master ~]# kubectl delete svc svc-nginx1 -n dev
service "svc-nginx1" deleted
[root@master ~]# kubectl delete svc svc-nginx2 -n dev
service "svc-nginx2" deleted
[root@master ~]# kubectl get svc -n dev
No resources found in dev namespace.
4、配置方式
4.1 创建集群内部可访问的Service
(1)创建一个svc-nginx.yaml,应用此文件
powershell 复制代码
[root@master ~]# vim svc-nginx.yaml
[root@master ~]# cat 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 apply -f svc-nginx.yaml 
service/svc-nginx created
(2)访问(内部)
powershell 复制代码
[root@node1 ~]# curl 10.109.179.231
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
......
(3)删除
powershell 复制代码
[root@master ~]# kubectl delete -f svc-nginx.yaml 
service "svc-nginx" deleted
[root@master ~]# kubectl get svc -n dev
No resources found in dev namespace.
4.2 创建集群外部也可访问的Service
(1)创建一个svc-nginx.yaml,应用此文件
powershell 复制代码
[root@master ~]# vim svc2-nginx.yaml
[root@master ~]# cat svc2-nginx.yaml
apiVersion: v1
kind: Service
metadata:
  name: svc2-nginx
  namespace: dev
spec:
  type: NodePort
  selector:
    run: nginx
  ports:
    - port: 80
      targetPort: 80
      nodePort: 30007
[root@master ~]# kubectl apply -f svc2-nginx.yaml 
service/svc2-nginx created
[root@master ~]# kubectl get svc -n dev
NAME         TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
svc2-nginx   NodePort   10.97.248.129   <none>        80:30007/TCP   12s
(2)访问(外部)
(3)删除
powershell 复制代码
[root@master ~]# kubectl delete -f svc2-nginx.yaml
service "svc2-nginx" deleted
[root@master ~]# kubectl get svc -n dev
No resources found in dev namespace.

四、pod详解

1、pod的资源清单解析
powershell 复制代码
apiVersion: v1     #必选,版本号,例如v1
kind: Pod         #必选,资源类型,例如 Pod
metadata:         #必选,元数据
  name: string     #必选,Pod名称
  namespace: string  #Pod所属的命名空间,默认为"default"
  labels:           #自定义标签列表
    - name: string                 
spec:  #必选,Pod中容器的详细定义
  containers:  #必选,Pod中容器列表
  - name: string   #必选,容器名称
    image: string  #必选,容器的镜像名称
    imagePullPolicy: [ Always|Never|IfNotPresent ]  #获取镜像的策略 
    command: [string]   #容器的启动命令列表,如不指定,使用打包时使用的启动命令
    args: [string]      #容器的启动命令参数列表
    workingDir: string  #容器的工作目录
    volumeMounts:       #挂载到容器内部的存储卷配置
    - name: string      #引用pod定义的共享存储卷的名称,需用volumes[]部分定义的的卷名
      mountPath: string #存储卷在容器内mount的绝对路径,应少于512字符
      readOnly: boolean #是否为只读模式
    ports: #需要暴露的端口库号列表
    - name: string        #端口的名称
      containerPort: int  #容器需要监听的端口号
      hostPort: int       #容器所在主机需要监听的端口号,默认与Container相同
      protocol: string    #端口协议,支持TCP和UDP,默认TCP
    env:   #容器运行前需设置的环境变量列表
    - name: string  #环境变量名称
      value: string #环境变量的值
    resources: #资源限制和请求的设置
      limits:  #资源限制的设置
        cpu: string     #Cpu的限制,单位为core数,将用于docker run --cpu-shares参数
        memory: string  #内存限制,单位可以为Mib/Gib,将用于docker run --memory参数
      requests: #资源请求的设置
        cpu: string    #Cpu请求,容器启动的初始可用数量
        memory: string #内存请求,容器启动的初始可用数量
    lifecycle: #生命周期钩子
        postStart: #容器启动后立即执行此钩子,如果执行失败,会根据重启策略进行重启
        preStop: #容器终止前执行此钩子,无论结果如何,容器都会终止
    livenessProbe:  #对Pod内各容器健康检查的设置,当探测无响应几次后将自动重启该容器
      exec:         #对Pod容器内检查方式设置为exec方式
        command: [string]  #exec方式需要制定的命令或脚本
      httpGet:       #对Pod内个容器健康检查方法设置为HttpGet,需要制定Path、port
        path: string
        port: number
        host: string
        scheme: string
        HttpHeaders:
        - name: string
          value: string
      tcpSocket:     #对Pod内个容器健康检查方式设置为tcpSocket方式
         port: number
       initialDelaySeconds: 0       #容器启动完成后首次探测的时间,单位为秒
       timeoutSeconds: 0          #对容器健康检查探测等待响应的超时时间,单位秒,默认1秒
       periodSeconds: 0           #对容器监控检查的定期探测时间设置,单位秒,默认10秒一次
       successThreshold: 0
       failureThreshold: 0
       securityContext:
         privileged: false
  restartPolicy: [Always | Never | OnFailure]  #Pod的重启策略
  nodeName: <string> #设置NodeName表示将该Pod调度到指定到名称的node节点上
  nodeSelector: obeject #设置NodeSelector表示将该Pod调度到包含这个label的node上
  imagePullSecrets: #Pull镜像时使用的secret名称,以key:secretkey格式指定
  - name: string
  hostNetwork: false   #是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络
  volumes:   #在该pod上定义共享存储卷列表
  - name: string    #共享存储卷名称 (volumes类型有很多种)
    emptyDir: {}       #类型为emptyDir的存储卷,与Pod同生命周期的一个临时目录。为空值
    hostPath: string   #类型为hostPath的存储卷,表示挂载Pod所在宿主机的目录
      path: string                #Pod所在宿主机的目录,将被用于同期中mount的目录
    secret:          #类型为secret的存储卷,挂载集群与定义的secret对象到容器内部
      scretname: string  
      items:     
      - key: string
        path: string
    configMap:         #类型为configMap的存储卷,挂载预定义的configMap对象到容器内部
      name: string
      items:
      - key: string
        path: string

imagePullPolicy,用于设置镜像拉取策略,kubernetes支持配置三种拉取策略:

Always:总是从远程仓库拉取镜像(一直远程下载)

IfNotPresent:本地有则使用本地镜像,本地没有则从远程仓库拉取镜像(本地有就本地 本地没远程下载)

Never:只使用本地镜像,从不去远程仓库拉取,本地没有就报错 (一直使用本地)

默认值说明:

如果镜像tag为具体版本号, 默认策略是:IfNotPresent

如果镜像tag为:latest(最终版本) ,默认策略是always

2、命令查看每种资源解析
powershell 复制代码
[root@master ~]# kubectl explain pod
KIND:       Pod
VERSION:    v1

DESCRIPTION:
  
FIELDS:
 
  kind	<string>
   ......
  metadata	<ObjectMeta>
  ......
  spec	<PodSpec>
  ......
  status	<PodStatus>
   ......
[root@master ~]# kubectl explain pod.spec
KIND:       Pod
VERSION:    v1

FIELD: spec <PodSpec>

FIELDS:
  activeDeadlineSeconds	<integer>
  
  affinity	<Affinity>
   
  automountServiceAccountToken	<boolean>
   
  containers	<[]Container> -required-

  dnsConfig	<PodDNSConfig>
   
  dnsPolicy	<string>
   ......
   ......

在kubernetes中基本所有资源的一级属性都是一样的,主要包含5部分:

1、apiVersion 版本,由kubernetes内部定义,版本号必须可以用 kubectl api-versions 查询到

2、kind 类型,由kubernetes内部定义,版本号必须可以用 kubectl api-resources 查询到

3、metadata 元数据,主要是资源标识和说明,常用的有name、namespace、labels等

4、spec描述,这是配置中最重要的一部分,里面是对各种资源配置的详细描述

5、status状态信息,里面的内容不需要定义,由kubernetes自动生成

在上面的属性中,spec是接下来研究的重点,继续看下它的常见子属性:

1、containers <[]Object> 容器列表,用于定义容器的详细信息

2、nodeName 根据nodeName的值将pod调度到指定的Node节点上

3、nodeSelector <map[]> 根据NodeSelector中定义的信息选择将该Pod调度到包含这些label的Node 上

4、hostNetwork 是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络

5、volumes <[]Object> 存储卷,用于定义Pod上面挂载的存储信息

6、restartPolicy 重启策略,表示Pod在遇到故障的时候的处理策略

3、使用较多的spec配置
powershell 复制代码
KIND:     Pod
VERSION:  v1
RESOURCE: containers <[ ]Object>   # 数组,代表可以有多个容器
FIELDS:
   name  <string>     # 容器名称
   image <string>     # 容器需要的镜像地址
   imagePullPolicy  <string> # 镜像拉取策略 
   command  <[ ]string> # 容器的启动命令列表,如不指定,使用打包时使用的启动命令
   args     <[ ]string> # 容器的启动命令需要的参数列表
   env      <[ ]Object> # 容器环境变量的配置
   ports    <[ ]Object>     # 容器需要暴露的端口号列表
   resources <Object>      # 资源限制和资源请求的设置
4、基本配置
(1)创建pod-base.yaml文件
powershell 复制代码
[root@master ~]# vim pod-base.yaml
[root@master ~]# cat pod-base.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-base
  namespace: dev
  labels:
    user: user1
spec:
  containers:
  - name: nginx
    image: nginx:1.17.1
  - name: busybox
    image: busybox:1.30
[root@master ~]# kubectl apply -f pod-base.yaml 
pod/pod-base created
[root@master ~]# kubectl get pods -n dev
NAME                     READY   STATUS              RESTARTS   AGE
nginx-6c45cbd8c5-2jgdb   1/1     Running             0          70m
nginx-6c45cbd8c5-tz458   1/1     Running             0          75m
nginx-6c45cbd8c5-vrmdw   1/1     Running             0          75m
pod-base                 0/2     ContainerCreating   0          12s

上面定义了一个比较简单Pod的配置,里面有两个容器:

nginx:用1.17.1版本的nginx镜像创建,(nginx是一个轻量级web容器)

busybox:用1.30版本的busybox镜像创建,(busybox是一个小巧的linux命令集合)

(2)查看
powershell 复制代码
[root@master ~]# kubectl get pods -n dev
NAME                     READY   STATUS     RESTARTS      AGE
nginx-6c45cbd8c5-2jgdb   1/1     Running    0             72m
nginx-6c45cbd8c5-tz458   1/1     Running    0             77m
nginx-6c45cbd8c5-vrmdw   1/1     Running    0             77m
pod-base                 1/2     NotReady   4 (42s ago)   2m9s
[root@master ~]# kubectl get pods -n dev
NAME                     READY   STATUS             RESTARTS      AGE
nginx-6c45cbd8c5-2jgdb   1/1     Running            0             77m
nginx-6c45cbd8c5-tz458   1/1     Running            0             82m
nginx-6c45cbd8c5-vrmdw   1/1     Running            0             82m
pod-base                 1/2     CrashLoopBackOff   6 (76s ago)   7m35s

busybox并不是一个程序,而是类似于一个工具类的集合,kubernetes集群启动管理后,它会自动关闭。解决方法就是让其一直在运行,这就用到了command配置。

(3)创建pod-command.yaml文件
powershell 复制代码
[root@master ~]# vim pod-command.yaml
[root@master ~]# cat pod-command.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-command1
  namespace: dev
spec:
  containers:
  - name: nginx
    image: nginx:1.17.1
    imagePullPolicy: Never
  - name: busybox
    image: busybox:1.30
    imagePullPolicy: Never
    command: ["/bin/sh", "-c", "touch /tmp/hello.txt;while true;do /bin/echo $(date +%T) >> /tmp/hello.txt; sleep 3; done;"]
#"/bin/sh","-c", 使用sh执行命令
#touch /tmp/hello.txt; 创建一个/tmp/hello.txt 文件
#while true;do /bin/echo $(date +%T) >> /tmp/hello.txt; sleep 3; done; 每隔3秒向文件中写入当前时间

[root@master ~]# kubectl apply -f pod-command.yaml 
pod/pod-command1 created
[root@master ~]# kubectl get pods -n dev
NAME                     READY   STATUS    RESTARTS   AGE
nginx-6c45cbd8c5-2jgdb   1/1     Running   0          84m
nginx-6c45cbd8c5-tz458   1/1     Running   0          89m
nginx-6c45cbd8c5-vrmdw   1/1     Running   0          89m
pod-command1             2/2     Running   0          34s
(4)进入pod中的busybox容器,查看文件内容
powershell 复制代码
[root@master ~]# kubectl exec pod-command1 -n dev -it -c busybox /bin/sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
/ # tail -f /tmp/hello.txt   #实时监控查看hello.txt文件
05:00:15
05:00:18
05:00:21
05:00:24
05:00:27
05:00:30
05:00:33
05:00:36
05:00:39
05:00:42

特别说明:

​ 通过上面发现command已经可以完成启动命令和传递参数的功能,为什么这里还要提供一个args选项,用于传递参数呢?这其实跟docker有点关系,kubernetes中的command、args两项其实是实现覆盖Dockerfile中ENTRYPOINT的功能。

1、如果command和args均没有写,那么用Dockerfile的配置。

2、如果command写了,但args没有写,那么Dockerfile默认的配置会被忽略,执行输入的command

3、如果command没写,但args写了,那么Dockerfile中配置的ENTRYPOINT的命令会被执行,使用args的参数

4、如果command和args都写了,那么Dockerfile的配置被忽略,执行command并追加上args参数

5、端口配置

本小节来介绍容器的端口设置,也就是containers的ports选项。

(1)首先看下ports支持的子选项:
powershell 复制代码
[root@master ~]# kubectl explain pod.spec.containers.ports
KIND:       Pod
VERSION:    v1

FIELD: ports <[]ContainerPort>

FIELDS:
  containerPort	<integer> -required-  # 容器要监听的端口(0<x<65536)
    Number of port to expose on the pod's IP address. This must be a valid port
    number, 0 < x < 65536.

  hostIP	<string>  # 要将外部端口绑定到的主机IP(一般省略)
    What host IP to bind the external port to.

  hostPort	<integer>  # 容器要在主机上公开的端口,如果设置,主机上只能运行容器的一个副本(一般省略)
    Number of port to expose on the host. If specified, this must be a valid
    port number, 0 < x < 65536. If HostNetwork is specified, this must match
    ContainerPort. Most containers do not need this.

  name	<string>  # 端口名称,如果指定,必须保证name在pod中是唯一的
    If specified, this must be an IANA_SVC_NAME and unique within the pod. Each
    named port in a pod must have a unique name. Name for the port that can be
    referred to by services.

  protocol	<string>  # 要将外部端口绑定到的主机IP(一般省略)
    Protocol for port. Must be UDP, TCP, or SCTP. Defaults to "TCP".
    
    Possible enum values:
     - `"SCTP"` is the SCTP protocol.
     - `"TCP"` is the TCP protocol.
     - `"UDP"` is the UDP protocol.
(2)创建pod-ports.yaml文件
powershell 复制代码
[root@master ~]# vim pod-ports.yaml
[root@master ~]# cat pod-ports.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-ports
  namespace: dev
spec:
  containers:
  - name: nginx
    image: nginx:1.17.1
    ports:
    - name: nginx-port
      containerPort: 80
      protocol: TCP
[root@master ~]# kubectl apply -f pod-ports.yaml 
pod/pod-ports created
[root@master ~]# kubectl get pod -n dev
NAME                     READY   STATUS    RESTARTS   AGE
nginx-6c45cbd8c5-2jgdb   1/1     Running   0          111m
nginx-6c45cbd8c5-tz458   1/1     Running   0          116m
nginx-6c45cbd8c5-vrmdw   1/1     Running   0          116m
pod-command1             2/2     Running   0          27m
pod-ports                1/1     Running   0          16s
[root@master ~]# kubectl get pod -n dev -o wide
NAME                     READY   STATUS    RESTARTS   AGE    IP               NODE    NOMINATED NODE   READINESS GATES
nginx-6c45cbd8c5-2jgdb   1/1     Running   0          112m   172.16.104.17    node2   <none>           <none>
nginx-6c45cbd8c5-tz458   1/1     Running   0          117m   172.16.104.16    node2   <none>           <none>
nginx-6c45cbd8c5-vrmdw   1/1     Running   0          117m   172.16.166.143   node1   <none>           <none>
pod-command1             2/2     Running   0          28m    172.16.166.145   node1   <none>           <none>
pod-ports                1/1     Running   0          78s    172.16.104.19    node2   <none>           <none>
(3)访问
powershell 复制代码
[root@master ~]# curl 172.16.104.19:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
......
(4)再创建pod-ports2.yaml文件(将容器端口改为8080)
powershell 复制代码
[root@master ~]# vim pod-ports2.yaml
[root@master ~]# cat pod-ports2.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-ports2
  namespace: dev
spec:
  containers:
  - name: nginx
    image: nginx:1.17.1
    ports:
    - name: nginx-port2
      containerPort: 8080
      protocol: TCP
[root@master ~]# kubectl apply -f pod-ports2.yaml 
pod/pod-ports2 created
[root@master ~]# kubectl get pod -n dev -o wide
NAME                     READY   STATUS    RESTARTS   AGE    IP               NODE    NOMINATED NODE   READINESS GATES
nginx-6c45cbd8c5-2jgdb   1/1     Running   0          118m   172.16.104.17    node2   <none>           <none>
nginx-6c45cbd8c5-tz458   1/1     Running   0          123m   172.16.104.16    node2   <none>           <none>
nginx-6c45cbd8c5-vrmdw   1/1     Running   0          123m   172.16.166.143   node1   <none>           <none>
pod-command1             2/2     Running   0          34m    172.16.166.145   node1   <none>           <none>
pod-ports                1/1     Running   0          7m1s   172.16.104.19    node2   <none>           <none>
pod-ports2               1/1     Running   0          25s    172.16.104.20    node2   <none>           <none>
(5)访问(还是只能通过80端口访问)
powershell 复制代码
[root@master ~]# curl 172.16.104.20:8080
curl: (7) Failed to connect to 172.16.104.20 port 8080: Connection refused
[root@master ~]# curl 172.16.104.20:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
......
只更改文件中的端口不行,因为配置文件中默认为80端口
powershell 复制代码
[root@master ~]# kubectl exec pod-ports2 -n dev -it -c nginx bin/bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@pod-ports2:/# cd /etc/nginx
root@pod-ports2:/etc/nginx# ls
conf.d		koi-utf  mime.types  nginx.conf   uwsgi_params
fastcgi_params	koi-win  modules     scgi_params  win-utf
root@pod-ports2:/etc/nginx# cd conf.d
root@pod-ports2:/etc/nginx/conf.d# ls
default.conf
root@pod-ports2:/etc/nginx/conf.d# cat default.conf 
server {
    listen       80;        #侦听端口依旧是80
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
(6)同一个pod里面的两个容器不能用同一个端口(端口冲突)
powershell 复制代码
[root@master ~]# vim pod2-base.yaml 
[root@master ~]# cat pod2-base.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod2-base
  namespace: dev
  labels:
    user: user1
spec:
  containers:
  - name: nginx
    image: nginx:1.17.1
    ports:
    - name: nginx-port
      containerPort: 80
      protocol: TCP
  - name: nginx1
    image: nginx:1.17.1
    ports:
    - name: nginx1-port
      containerPort: 80
      protocol: TCP
[root@master ~]# kubectl apply -f pod2-base.yaml 
Warning: spec.containers[1].ports[0]: duplicate port definition with spec.containers[0].ports[0]
pod/pod2-base created
[root@master ~]# kubectl get -f pod2-base.yaml 
NAME        READY   STATUS   RESTARTS     AGE
pod2-base   1/2     Error    1 (7s ago)   17s
6、资源配额

容器中的程序要运行,肯定是要占用一定资源的,比如cpu和内存等,如果不对某个容器的资源做限制,那么它就可能吃掉大量资源,导致其它容器无法运行。针对这种情况,kubernetes提供了对内存和cpu的资源进行配额的机制,这种机制主要通过resources选项实现,他有两个子选项:

limits:用于限制运行时容器的最大占用资源,当容器占用资源超过limits时会被终止,并进行重启

requests :用于设置容器需要的最小资源,如果环境资源不够,容器将无法启动

可以通过上面两个选项设置资源的上下限。

(1)创建pod-resources.yaml
powershell 复制代码
[root@master ~]# vim pod-resources.yaml
[root@master ~]# cat pod-resources.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-resources
  namespace: dev
spec:
  containers:
  - name: nginx
    image: nginx:1.17.1
    resources:
      limits:
        cpu: "2"
        memory: "10Gi"
      requests:
        cpu: "1"     
        memory: "10Mi"
#cpu:core数,可以为整数或小数
#memory: 内存大小,可以使用Gi、Mi、G、M等形式
[root@master ~]# kubectl apply -f pod-resources.yaml 
pod/pod-resources created
[root@master ~]# kubectl get -f pod-resources.yaml 
NAME            READY   STATUS    RESTARTS   AGE
pod-resources   1/1     Running   0          14s
(2)先停止删除该pod
powershell 复制代码
[root@master ~]# kubectl delete -f pod-resources.yaml 
pod "pod-resources" deleted
(3)编辑pod,修改resources.requests.memory的值为10Gi,memory的值为100Gi
powershell 复制代码
[root@master ~]# vim pod-resources.yaml
[root@master ~]# kubectl apply -f pod-resources.yaml 
pod/pod-resources created
[root@master ~]# kubectl get -f pod-resources.yaml 
NAME            READY   STATUS    RESTARTS   AGE
pod-resources   0/1     Pending   0          5s
[root@master ~]# kubectl describe pod pod-resources -n dev
 Warning  FailedScheduling  39s   default-scheduler  0/3 nodes are available: 1 node(s) had untolerated taint {node-role.kubernetes.io/control-plane: }, 2 Insufficient memory. preemption: 0/3 nodes are available: 1 Preemption is not helpful for scheduling, 2 No preemption victims found for incoming pod..
 [root@master ~]# free -m
               total        used        free      shared  buff/cache   available
Mem:            3883        1545        1126          10        1446        2338
Swap:              0           0           0
#内存不足以创建下线为10GI的pod
相关推荐
hello_2508 小时前
k8s证书过期时间扫描
云原生·容器·kubernetes
2302_799525748 小时前
【k8s】Deployment、StatefulSet、DaemonSet
云原生·容器·kubernetes
维尔切8 小时前
K8s 资源管理与操作
云原生·容器·kubernetes
IndulgeCui8 小时前
【金仓数据库产品体验官】KSQL Developer Linux版安装使用体验
linux·运维·数据库
半旧夜夏8 小时前
【分布式缓存】Redis持久化和集群部署攻略
java·运维·redis·分布式·缓存
苹果醋39 小时前
element-ui源码阅读-样式
java·运维·spring boot·mysql·nginx
Biomamba生信基地9 小时前
Linux| 二.计算机软件组成与Linux
linux·运维·服务器·生信·医药
code_ing-9 小时前
【Linux】命令行参数与环境变量
linux·c++·windows·笔记
j_xxx404_10 小时前
Linux:权限复盘扩展|粘滞位|软件包管理器|Linux软件生态
linux·1024程序员节