• pod详解


    每个Pod中都可以包含一个或者多个容器,这些容器可以分为两类:

    • 用户程序所在的容器,数量可多可少

    • Pause容器,这是每个Pod都会有的一个根容器,它的作用有两个:

      • 可以以它为依据,评估整个Pod的健康状态

      • 可以在根容器上设置Ip地址,其它容器都此Ip(Pod IP),以实现Pod内部的网路通信

      这里是Pod内部的通讯,Pod的之间的通讯采用虚拟二层网络技术来实现,我们当前环境用的是Flannel

     Pod定义

    下面是Pod的资源清单:

    1. apiVersion: v1 #必选,版本号,例如v1
    2. kind: Pod   #必选,资源类型,例如 Pod
    3. metadata:   #必选,元数据
    4. name: string #必选,Pod名称
    5. namespace: string #Pod所属的命名空间,默认为"default"
    6. labels:    #自定义标签列表
    7. - name: string  
    8. spec: #必选,Pod中容器的详细定义
    9. containers: #必选,Pod中容器列表
    10. - name: string #必选,容器名称
    11. image: string #必选,容器的镜像名称
    12. imagePullPolicy: [ Always|Never|IfNotPresent ] #获取镜像的策略
    13. command: [string] #容器的启动命令列表,如不指定,使用打包时使用的启动命令
    14. args: [string] #容器的启动命令参数列表
    15. workingDir: string #容器的工作目录
    16. volumeMounts: #挂载到容器内部的存储卷配置
    17. - name: string #引用pod定义的共享存储卷的名称,需用volumes[]部分定义的的卷名
    18. mountPath: string #存储卷在容器内mount的绝对路径,应少于512字符
    19. readOnly: boolean #是否为只读模式
    20. ports: #需要暴露的端口库号列表
    21. - name: string #端口的名称
    22. containerPort: int #容器需要监听的端口号
    23. hostPort: int #容器所在主机需要监听的端口号,默认与Container相同
    24. protocol: string #端口协议,支持TCP和UDP,默认TCP
    25. env: #容器运行前需设置的环境变量列表
    26. - name: string #环境变量名称
    27. value: string #环境变量的值
    28. resources: #资源限制和请求的设置
    29. limits: #资源限制的设置
    30. cpu: string #Cpu的限制,单位为core数,将用于docker run --cpu-shares参数
    31. memory: string #内存限制,单位可以为Mib/Gib,将用于docker run --memory参数
    32. requests: #资源请求的设置
    33. cpu: string #Cpu请求,容器启动的初始可用数量
    34. memory: string #内存请求,容器启动的初始可用数量
    35. lifecycle: #生命周期钩子
    36. postStart: #容器启动后立即执行此钩子,如果执行失败,会根据重启策略进行重启
    37. preStop: #容器终止前执行此钩子,无论结果如何,容器都会终止
    38. livenessProbe: #对Pod内各容器健康检查的设置,当探测无响应几次后将自动重启该容器
    39. exec:   #对Pod容器内检查方式设置为exec方式
    40. command: [string] #exec方式需要制定的命令或脚本
    41. httpGet: #对Pod内个容器健康检查方法设置为HttpGet,需要制定Path、port
    42. path: string
    43. port: number
    44. host: string
    45. scheme: string
    46. HttpHeaders:
    47. - name: string
    48. value: string
    49. tcpSocket: #对Pod内个容器健康检查方式设置为tcpSocket方式
    50. port: number
    51. initialDelaySeconds: 0 #容器启动完成后首次探测的时间,单位为秒
    52. timeoutSeconds: 0    #对容器健康检查探测等待响应的超时时间,单位秒,默认1秒
    53. periodSeconds: 0    #对容器监控检查的定期探测时间设置,单位秒,默认10秒一次
    54. successThreshold: 0
    55. failureThreshold: 0
    56. securityContext:
    57. privileged: false
    58. restartPolicy: [Always | Never | OnFailure] #Pod的重启策略
    59. nodeName: #设置NodeName表示将该Pod调度到指定到名称的node节点上
    60. nodeSelector: obeject #设置NodeSelector表示将该Pod调度到包含这个label的node上
    61. imagePullSecrets: #Pull镜像时使用的secret名称,以key:secretkey格式指定
    62. - name: string
    63. hostNetwork: false #是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络
    64. volumes: #在该pod上定义共享存储卷列表
    65. - name: string #共享存储卷名称 (volumes类型有很多种)
    66. emptyDir: {} #类型为emtyDir的存储卷,与Pod同生命周期的一个临时目录。为空值
    67. hostPath: string #类型为hostPath的存储卷,表示挂载Pod所在宿主机的目录
    68. path: string    #Pod所在宿主机的目录,将被用于同期中mount的目录
    69. secret:    #类型为secret的存储卷,挂载集群与定义的secret对象到容器内部
    70. scretname: string
    71. items:
    72. - key: string
    73. path: string
    74. configMap: #类型为configMap的存储卷,挂载预定义的configMap对象到容器内部
    75. name: string
    76. items:
    77. - key: string
    78. path: string

    1. #小提示:
    2. # 在这里,可通过一个命令来查看每种资源的可配置项
    3. # kubectl explain 资源类型 查看某种资源可以配置的一级属性
    4. # kubectl explain 资源类型.属性 查看属性的子属性
    5. [root@k8s-master01 ~]# kubectl explain pod
    6. KIND: Pod
    7. VERSION: v1
    8. FIELDS:
    9. apiVersion <string>
    10. kind <string>
    11. metadata <Object>
    12. spec <Object>
    13. status <Object>
    14. [root@k8s-master01 ~]# kubectl explain pod.metadata
    15. KIND: Pod
    16. VERSION: v1
    17. RESOURCE: metadata <Object>
    18. FIELDS:
    19. annotations <map[string]string>
    20. clusterName <string>
    21. creationTimestamp <string>
    22. deletionGracePeriodSeconds <integer>
    23. deletionTimestamp <string>
    24. finalizers <[]string>
    25. generateName <string>
    26. generation <integer>
    27. labels <map[string]string>
    28. managedFields <[]Object>
    29. name <string>
    30. namespace <string>
    31. ownerReferences <[]Object>
    32. resourceVersion <string>
    33. selfLink <string>
    34. uid <string>

    Deployment

    在kubernetes中,Pod是最小的控制单元,但是kubernetes很少直接控制Pod,一般都是通过Pod控制器来完成的。Pod控制器用于pod的管理,确保pod资源符合预期的状态,当pod的资源出现故障时,会尝试进行重启或重建pod。

    在kubernetes中Pod控制器的种类有很多,本章节只介绍一种:Deployment。

    命令操作

    1. # 命令格式: kubectl create deployment 名称 [参数]
    2. # --image 指定pod的镜像
    3. # --port 指定端口
    4. # --replicas 指定创建pod数量
    5. # --namespace 指定namespace
    6. [root@master ~]# kubectl create deploy nginx --image=nginx:latest --port=80 --replicas=3 -n dev
    7. deployment.apps/nginx created
    8. # 查看创建的Pod
    9. [root@master ~]# kubectl get pods -n dev
    10. NAME READY STATUS RESTARTS AGE
    11. nginx-cd55c47f5-9fkp5 1/1 Running 0 2m23s
    12. nginx-cd55c47f5-lz82t 1/1 Running 0 2m23s
    13. nginx-cd55c47f5-ssrpd 1/1 Running 0 2m23s
    14. nginxpod 1/1 Running 1 (79m ago) 24h
    15. 查看deployment的信息
    16. [root@master ~]# kubectl get deploy -n dev
    17. NAME READY UP-TO-DATE AVAILABLE AGE
    18. nginx 3/3 3 3 2m50s
    19. # UP-TO-DATE:成功升级的副本数量
    20. # AVAILABLE:可用副本的数量
    21. [root@master ~]# kubectl get deploy -n dev -o wide
    22. NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
    23. nginx 3/3 3 3 3m15s nginx nginx:latest app=nginx
    24. # 查看deployment的详细信息
    25. [root@master ~]# kubectl get deploy -n dev
    26. NAME READY UP-TO-DATE AVAILABLE AGE
    27. nginx 3/3 3 3 2m50s
    28. [root@master ~]# kubectl get deploy -n dev -o wide
    29. NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
    30. nginx 3/3 3 3 3m15s nginx nginx:latest app=nginx
    31. [root@master ~]# kubectl describe deploy nginx -n dev
    32. Name: nginx
    33. Namespace: dev
    34. CreationTimestamp: Fri, 09 Sep 2022 11:35:19 +0800
    35. Labels: app=nginx
    36. Annotations: deployment.kubernetes.io/revision: 1
    37. Selector: app=nginx
    38. Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable
    39. StrategyType: RollingUpdate
    40. MinReadySeconds: 0
    41. RollingUpdateStrategy: 25% max unavailable, 25% max surge
    42. Pod Template:
    43. Labels: app=nginx
    44. Containers:
    45. nginx:
    46. Image: nginx:latest
    47. Port: 80/TCP
    48. Host Port: 0/TCP
    49. Environment: <none>
    50. Mounts: <none>
    51. Volumes: <none>
    52. Conditions:
    53. Type Status Reason
    54. ---- ------ ------
    55. Available True MinimumReplicasAvailable
    56. Progressing True NewReplicaSetAvailable
    57. OldReplicaSets: <none>
    58. NewReplicaSet: nginx-cd55c47f5 (3/3 replicas created)
    59. Events:
    60. Type Reason Age From Message
    61. ---- ------ ---- ---- -------
    62. Normal ScalingReplicaSet 3m41s deployment-controller Scaled up replica set nginx-cd55c47f5 to
    63. //删除
    64. [root@master ~]# kubectl delete deploy nginx -n dev
    65. deployment.apps "nginx" deleted
    1. [root@master ~]# vim deploy-nginx.yaml
    2. apiVersion: apps/v1
    3. kind: Deployment
    4. metadata:
    5. name: nginx
    6. namespace: dev
    7. spec:
    8. replicas: 3
    9. selector:
    10. matchLabels:
    11. run: nginx
    12. template:
    13. metadata:
    14. labels:
    15. run: nginx
    16. spec:
    17. containers:
    18. - image: nginx:latest
    19. name: nginx
    20. ports:
    21. - containerPort: 80
    22. protocol: TCP
    23. //配置操作
    24. [root@master ~]# kubectl create -f deploy-nginx.yaml
    25. deployment.apps/nginx created
    26. //创建

    Service

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

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

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

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

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

    1. # 暴露Service
    2. [root@master ~]# kubectl expose deploy nginx --name=svc-nginx1 --type=ClusterIP --port=80 --target-port=80 -n dev
    3. service/svc-nginx1 exposed
    4. [root@master ~]# kubectl get svc svc-nginx1 -n dev -o wide
    5. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
    6. svc-nginx1 ClusterIP 10.108.2.17 <none> 80/TCP 18s run=nginx
    7. //查看service
    8. # 这里产生了一个CLUSTER-IP,这就是service的IP,在Service的生命周期中,这个地址是不会变动的
    9. # 可以通过这个IP访问当前service对应的POD
    10. [root@master ~]# curl 10.108.2.17:80
    11. <!DOCTYPE html>
    12. <html>
    13. <head>
    14. <title>Welcome to nginx!</title>
    15. <style>
    16. html { color-scheme: light dark; }
    17. body { width: 35em; margin: 0 auto;
    18. font-family: Tahoma, Verdana, Arial, sans-serif; }
    19. </style>
    20. </head>
    21. <body>
    22. <h1>Welcome to nginx!</h1>
    23. <p>If you see this page, the nginx web server is successfully installed and
    24. working. Further configuration is required.</p>
    25. <p>For online documentation and support please refer to
    26. <a href="http://nginx.org/">nginx.org</a>.<br/>
    27. Commercial support is available at
    28. <a href="http://nginx.com/">nginx.com</a>.</p>
    29. <p><em>Thank you for using nginx.</em></p>
    30. </body>
    31. </html>
    32. //master访问,在node1 node2上也可以访问
    33. [root@node1 ~]# curl 10.108.2.17:80
    34. <!DOCTYPE html>
    35. <html>
    36. <head>
    37. <title>Welcome to nginx!</title>
    38. <style>
    39. html { color-scheme: light dark; }
    40. body { width: 35em; margin: 0 auto;
    41. font-family: Tahoma, Verdana, Arial, sans-serif; }
    42. </style>
    43. </head>
    44. <body>
    45. <h1>Welcome to nginx!</h1>
    46. <p>If you see this page, the nginx web server is successfully installed and
    47. working. Further configuration is required.</p>
    48. <p>For online documentation and support please refer to
    49. <a href="http://nginx.org/">nginx.org</a>.<br/>
    50. Commercial support is available at
    51. <a href="http://nginx.com/">nginx.com</a>.</p>
    52. <p><em>Thank you for using nginx.</em></p>
    53. </body>
    54. </html>
    55. [root@node2 ~]# curl 10.108.2.17:80
    56. <!DOCTYPE html>
    57. <html>
    58. <head>
    59. <title>Welcome to nginx!</title>
    60. <style>
    61. html { color-scheme: light dark; }
    62. body { width: 35em; margin: 0 auto;
    63. font-family: Tahoma, Verdana, Arial, sans-serif; }
    64. </style>
    65. </head>
    66. <body>
    67. <h1>Welcome to nginx!</h1>
    68. <p>If you see this page, the nginx web server is successfully installed and
    69. working. Further configuration is required.</p>
    70. <p>For online documentation and support please refer to
    71. <a href="http://nginx.org/">nginx.org</a>.<br/>
    72. Commercial support is available at
    73. <a href="http://nginx.com/">nginx.com</a>.</p>
    74. <p><em>Thank you for using nginx.</em></p>
    75. </body>
    76. </html>

    创建集群外部也可访问的Service

    可以作为负载均衡

    1. # 如果需要创建外部也可以访问的Service,需要修改type为NodePort
    2. [root@master ~]# kubectl expose deploy nginx --name=svc-nginx2 --type=NodePort --port=80 --target-port=80 -n dev
    3. service/svc-nginx2 exposed
    4. #此时查看,会发现出现了NodePort类型的Service,而且有一对Port(80:31928/TC)
    5. [root@master ~]# kubectl get svc svc-nginx2 -n dev -o wide
    6. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
    7. svc-nginx2 NodePort 10.98.158.216 <none> 80:32316/TCP 38s run=nginx
    8. # 接下来就可以通过集群外的主机访问 节点IP:31928访问服务了
    9. # 例如在的电脑主机上通过浏览器访问下面的地址
    10. //如要删除的话
    11. [root@master ~]# kubectl delete svc svc-nginx-1 -n dev
    12. service "svc-nginx-1" deleted

     

    master访问

     node1访问

     node2访问 

    配置方式

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

    1. [root@master ~]# vi nginx.yaml
    2. apiVersion: v1
    3. kind: Service
    4. metadata:
    5. name: svc-nginx
    6. namespace: dev
    7. spec:
    8. clusterIP: 10.109.179.231
    9. ports:
    10. - port: 80
    11. protocol: TCP
    12. targetPort: 80
    13. selector:
    14. run: nginx
    15. type: ClusterIP
    16. //创建
    17. [root@master ~]# kubectl create -f nginx.yaml
    18. service/svc-nginx created
    19. [root@master ~]# kubectl get svc nginx
    20. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    21. nginx NodePort 10.103.112.159 <none> 80:31150/TCP 47h
  • 相关阅读:
    前端JavaScript入门到精通,javascript核心进阶ES6语法、API、js高级等基础知识和实战 —— JS基础(五)
    实现8086汇编编译器(四)——生成可执行程序
    QT下载安装和Visual Studio环境配置
    MATLAB集合操作
    【工具门户】Linux平台安装Backstage(二)
    【Rust日报】2023-10-16 为什么要异步 Rust
    Linux ————​文件权限
    手机app测试用例怎么写?手机app测试点有哪些?
    第10章 自编码器
    分布式事务之DTP(XA规范)
  • 原文地址:https://blog.csdn.net/Mingzi540/article/details/126779136