tnblog
首页
视频
资源
登录

k8s详解基本对象

6967人阅读 2020/4/11 9:38 总访问:3250969 评论:0 收藏:1 手机
分类: 容器编排

Kubernetes

k8s详解基本对象


参考yaml代码如下

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: k8s-demo
  5. namespace: netcore
  6. labels:
  7. name: k8s-demo
  8. spec:
  9. replicas: 2
  10. selector:
  11. matchLabels:
  12. name: k8s-demo
  13. template:
  14. metadata:
  15. labels:
  16. name: k8s-demo
  17. spec:
  18. containers:
  19. - name: k8s-demo
  20. image: aidasi/k8sdemoapi:v1
  21. ports:
  22. - containerPort: 80
  23. imagePullPolicy: Always
  24. ---
  25. kind: Service
  26. apiVersion: v1
  27. metadata:
  28. name: k8s-demo
  29. namespace: netcore
  30. spec:
  31. type: NodePort
  32. ports:
  33. - port: 80
  34. targetPort: 80
  35. selector:
  36. name: k8s-demo


Lable & Selector

特点

  • 自定义标签方便分组与筛选


Service 关联 Pod


Created with Raphaël 2.1.2kind:Service(k8s-demo)Selector筛选Lables中name为k8s-demo的Pod发布服务

【注意】此时的Pod为template->metadata->labels


MatchLabels 关联 Containers


Created with Raphaël 2.1.2MatchLabelsSelector 筛选条件(=,!=,in,not in,and)name筛选Containers中条件符合筛选容器结束

当然还可以这样进行筛选

  1. selector:
  2. matchLabels:
  3. component: redis
  4. matchExpressions:
  5. - {key: tier, operator: In, values: [cache]}
  6. - {key: environment, operator: NotIn, values: [dev]}

Kind Job Deployment Replica Set Daemon Set

matchLabels 是由 {key,value} 对组成的映射。matchLabels 映射中的单个 {key,value } 等同于 matchExpressions 的元素,其 key字段为 “key”,operator 为 “In”,而 values 数组仅包含 “value”。matchExpressions 是 pod 选择器要求的列表。有效的运算符包括 In,NotIn,Exists 和 DoesNotExist。在 In 和 NotIn 的情况下,设置的值必须是非空的。来自 matchLabels 和 matchExpressions 的所有要求都是合在一起 – 它们必须都满足才能匹配。


Deployment.metadata.labels 关联 MatchLabels


Created with Raphaël 2.1.2Deployment.metadata.labelslabels 筛选 MatchLabels筛选Replica Set结束


Pod


特点

  • 解耦控制器和服务,管理器只需要监控Pod即可
  • 无状态
  • 高可用,当出现一些删除pod的操作时,会自动创建新的pod


livenessProbe Pod探针



在yaml文件中的代码如下代码

  1. livenessProbe:
  2. httpGet:
  3. path: /healthz
  4. port: 80
  5. timeoutSeconds: 5

完整代码如下

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: k8s-demo
  5. namespace: netcore
  6. labels:
  7. name: k8s-demo
  8. spec:
  9. replicas: 2
  10. selector:
  11. matchLabels:
  12. name: k8s-demo
  13. template:
  14. metadata:
  15. labels:
  16. name: k8s-demo
  17. spec:
  18. containers:
  19. - name: k8s-demo
  20. image: aidasi/k8sdemoapi:v1
  21. ports:
  22. - containerPort: 80
  23. imagePullPolicy: Always
  24. livenessProbe:
  25. httpGet:
  26. path: /healthz
  27. port: 80
  28. timeoutSeconds: 5
  29. ---
  30. kind: Service
  31. apiVersion: v1
  32. metadata:
  33. name: k8s-demo
  34. namespace: netcore
  35. spec:
  36. type: NodePort
  37. ports:
  38. - port: 80
  39. targetPort: 80
  40. selector:
  41. name: k8s-demo

部署的时候,当没有相关接口做探针时
通过Kubernetes Dashboard来查看
探针报错图片

结果也是不可以被访问的


readinessProbe Pod探针



在yaml文件中的代码如下代码

  1. readinessProbe:
  2. httpGet:
  3. path: /healthz
  4. port: 80
  5. timeoutSeconds: 5

完整代码如下

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: k8s-demo
  5. namespace: netcore
  6. labels:
  7. name: k8s-demo
  8. spec:
  9. replicas: 2
  10. selector:
  11. matchLabels:
  12. name: k8s-demo
  13. template:
  14. metadata:
  15. labels:
  16. name: k8s-demo
  17. spec:
  18. containers:
  19. - name: k8s-demo
  20. image: aidasi/k8sdemoapi:v1
  21. ports:
  22. - containerPort: 80
  23. imagePullPolicy: Always
  24. livenessProbe:
  25. httpGet:
  26. path: /WeatherForecast/1
  27. port: 80
  28. timeoutSeconds: 5
  29. readinessProbe:
  30. httpGet:
  31. path: /healthz
  32. port: 80
  33. timeoutSeconds: 5
  34. ---
  35. kind: Service
  36. apiVersion: v1
  37. metadata:
  38. name: k8s-demo
  39. namespace: netcore
  40. spec:
  41. type: NodePort
  42. ports:
  43. - port: 80
  44. targetPort: 80
  45. selector:
  46. name: k8s-demo

查看结果
我这边仍然不可访问
但据教程说是可以继续被请求的
readinessProbe探针结果

当对代码进行一定的修改
这个时候是都可以访问的时候

  1. livenessProbe:
  2. httpGet:
  3. path: /WeatherForecast/1
  4. port: 80
  5. timeoutSeconds: 5
  6. readinessProbe:
  7. httpGet:
  8. path: /WeatherForecast/1
  9. port: 80
  10. timeoutSeconds: 5

通过kubectl apply -f deploy.yaml
结果如下:
探针结果

探针大致就这些!


RestartPolicy 重启策略


PodSpec 中有一个 restartPolicy 字段,可能的值为 AlwaysOnFailureNever。默认为 AlwaysrestartPolicy 适用于 Pod 中的所有容器。restartPolicy 仅指通过同一节点上的 kubelet 重新启动容器。

  1. 失败的容器由 kubelet 以五分钟为上限的指数退避延迟(10秒,20秒,40秒…)重新启动,并在成功执行十分钟后重置。如 Pod 文档 中所述,一旦绑定到一个节点,Pod 将永远不会重新绑定到另一个节点。


imagePullPolicy 拉取镜像策略


支持三种imagePullPolicy

  • Always: 不管镜像是否存在都会进行一次拉取 (使用时修改yaml:image: aidasi/k8sdemoapi:latest
  • Never: 不管镜像是否存在都不会进行拉取
  • IfNotPresent: 只有镜像不存在时,才会进行镜像拉取 (default)


Resources 资源限制



在containers中添加如下yaml

  1. resources:
  2. requests:
  3. cpu: "300m"
  4. memory: "56Mi"
  5. limits:
  6. cpu: "500m"
  7. memory: "128Mi"

Kubernetes通过cgroups限制容器的CPU和内存等计算资源,包括requests(请求,调度器保证调度到资源充足的Node上)和limits(上限)等:

  • spec.containers[].resources.limits.cpu:CPU上限,可以短暂超过,容器也不会被停止
  • spec.containers[].resources.limits.memory:内存上限,不可以超过;如果超过,容器可能会被停止或调度到其他资源充足的机器上
  • spec.containers[].resources.requests.cpu:CPU请求,可以超过
  • spec.containers[].resources.requests.memory:内存请求,可以超过;但如果超过,容器可能会在Node内存不足时清理


初始容器 Container (Init Container)


Init Container在所有容器运行之前执行(run-to-completion),常用来初始化配置。

在spec下添加如下操作

  1. initContainers:
  2. - name: install
  3. image: busybox
  4. command:
  5. - wget
  6. - "-O"
  7. - "/work-dir/index.html"
  8. - http://kubernetes.io
  9. volumeMounts:
  10. - name: workdir
  11. mountPath: "/work-dir"


容器生命周期钩子


容器生命周期钩子(Container Lifecycle Hooks)监听容器生命周期的特定事件,并在事件发生时执行已注册的回调函数。支持两种钩子。

postStart: 容器启动后执行,注意由于是异步执行,它无法保证一定在ENTRYPOINT之后运行。如果失败,容器会被杀死,并根据RestartPolicy决定是否重启
preStop:容器停止前执行,常用于资源清理。如果失败,容器同样也会被杀死

而钩子的回调函数支持两种方式:

exec:在容器内执行命令
httpGet:向指定URL发起GET请求

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: lifecycle-demo
  5. spec:
  6. containers:
  7. - name: lifecycle-demo-container
  8. image: nginx
  9. lifecycle:
  10. postStart:
  11. exec:
  12. command: ["/bin/sh", "-c", "echo Hello from the postStart handler > /usr/share/message"]
  13. preStop:
  14. exec:
  15. command: ["/usr/sbin/nginx","-s","quit"]


指定Node


通过nodeSelector,一个Pod可以指定它所想要运行的Node节点。

首先给Node加上标签:

  1. kubectl label nodes <YourNodeName> nodetypeis=hmy

接着,指定该Pod只想运行在带有nodetypeis=hmy标签的Node上:

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: nginx
  5. labels:
  6. env: test
  7. spec:
  8. containers:
  9. - name: nginx
  10. image: nginx
  11. imagePullPolicy: IfNotPresent
  12. nodeSelector:
  13. nodetypeis: hmy


使用Capabilities


默认情况下,容器都是以非特权容器的方式运行。比如,不能在容器中创建虚拟网卡、配置虚拟网络。

Kubernetes提供了修改Capabilities的机制,可以按需要给给容器增加或删除。比如下面的配置给容器增加了CAP_NET_ADMIN并删除了CAP_KILL。
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: hello-world
  5. spec:
  6. containers:
  7. - name: friendly-container
  8. image: "alpine:3.4"
  9. command: ["/bin/echo", "hello", "world"]
  10. securityContext:
  11. capabilities:
  12. add:
  13. - NET_ADMIN
  14. drop:
  15. - KILL


限制网络带宽


Ingress

可以通过给Pod增加kubernetes.io/ingress-bandwidthkubernetes.io/egress-bandwidth这两个annotation来限制Pod的网络带宽

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: qos
  5. annotations:
  6. kubernetes.io/ingress-bandwidth: 3M
  7. kubernetes.io/egress-bandwidth: 4M
  8. spec:
  9. containers:
  10. - name: iperf3
  11. image: networkstatic/iperf3
  12. command:
  13. - iperf3
  14. - -s


Service


Service版本发展史

  • 初代Service客户端通过kubectl-proxy作代理访问,算法基于轮询的方式
  • 二代Service客户端通过集群ip进行访问,算法是通过负载均衡的方式进行分发请求
  • 三代Service与二代相通,只是请求访问的算法方式增加了

特点

  • 解耦控制器和服务,管理器只需要监控Pod即可
  • 无状态
  • 高可用,当出现一些删除pod的操作时,会自动创建新的pod

Service大致图


Namespace

特点

  • 有些对象和namespace相关,而有些则不受namespace管辖
  • 可以借助于 resource quote 来控制 namespace 的资源


namespace 相关常规操作


查询所有namespace

  1. kubectl get namespace
  2. kubectl get ns

创建namespace

  1. kubectl create namespace myspace

删除namespace
注意:把namespace删除也就意味着删除下面的所有资源

  1. kubectl delete namespace myspace


通过 quote 对 namespace 的请求与限制


创建一个名为myspacenamespace

  1. kubectl create namespace myspace

创建一个基本的compute-resources.yaml 限制yaml

  1. cat <<EOF > compute-resources.yaml
  2. apiVersion: v1
  3. kind: ResourceQuota
  4. metadata:
  5. name: compute-resources
  6. spec:
  7. hard:
  8. requests.cpu: "1"
  9. requests.memory: 1Gi
  10. limits.cpu: "2"
  11. limits.memory: 2Gi
  12. requests.nvidia.com/gpu: 4
  13. EOF
名称 定义
requests.cpu 需要的cpu个数
requests.memory 需要的内存大小
limits.cpu 限制cpu的个数
limits.memory 限制memory的内存大小
requests.nvidia.com/gpu 请求的GPU总数限制为4

限制到namespace myspace中去

  1. kubectl create -f ./compute-resources.yaml --namespace=myspace

创建一个高级的object-counts.yaml 限制yaml

  1. cat <<EOF > object-counts.yaml
  2. apiVersion: v1
  3. kind: ResourceQuota
  4. metadata:
  5. name: object-counts
  6. spec:
  7. hard:
  8. configmaps: "10"
  9. persistentvolumeclaims: "4"
  10. pods: "4"
  11. replicationcontrollers: "20"
  12. secrets: "10"
  13. services: "10"
  14. services.loadbalancers: "2"
  15. EOF
名称 定义
configmaps 命名空间中可以存在的配置映射总数。
persistentvolumeclaims 命名空间中可以存在的持久卷声明的总数。
pods 命名空间中可以存在的处于非终端状态的Pod总数。如果.status.phase in (Failed, Succeeded)为true,则Pod处于终端状态。
replicationcontrollers 命名空间中可以存在的复制控制器的总数。
secrets 命名空间中可以存在的秘密总数。
services 命名空间中可以存在的服务总数。
services.loadbalancers 命名空间中可以存在的负载均衡器类型的服务总数。

限制到namespace myspace中去

  1. kubectl create -f ./compute-resources.yaml --namespace=myspace

查看限制

  1. kubectl get quota --namespace=myspace

查看指定命名空间详细配置

  1. kubectl describe quota compute-resources --namespace=myspace

更多请参考
https://kubernetes.io/docs/concepts/policy/resource-quotas/


Volume

特点

  • 对资源进行存储并管理


emptyDir


一个 emptyDir 第一次创建是在一个 pod 被指定到具体 node 的时候,并且会一直存在在 pod 的生命周期当中,正如它的名字一样,它初始化是一个空的目录,pod 中的容器都可以读写这个目录,这个目录可以被挂在到各个容器相同或者不相同的的路径下。当一个 pod 因为任何原因被移除的时候,这些数据会被永久删除。


如下图所示:


Created with Raphaël 2.1.2创建pod创建emptyDir(no,yes无效)pod挂掉emptyDir数据被删除,node上的数据也被删除在node上创建一块新的空间yesno


hostPath


挂载到本机(可进行长期存储)


secret


可以以键值对的方式存储密码与数据


persistentVolumeClaim


可以实现一些云存储或分布式存储


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

k8s编写yaml文件的一些小问题

Yaml文件编写的小毛病kubenetes yaml 随在编写yaml文件中难免会出现一些磕磕碰碰的问题 建议大家去这个网站编写 yaml 文...

初探k8s

概念补充Deployment 是在 Pod 这个抽象上更为上层的一个抽象层,它可以定义一组 Pod 的副本数量,以及这个 Pod 的版本。一...

k8s 结合 Service 与 Deployment 部署容器

前言最近看到了学习k8s的网站,在文章末尾分享给大家,所以我最近的教程也会根据上面的课程来进行一些总结Service:暴露容...

k8s理论整理(持续更新)

整理一GOKubernetes 的工作节点负责运行应用程序 Pod 等工作负载;还可以运行网络或存储等扩展功能;每个节点上都运行了 ku...

.netcore 通过Flurl验证k8s内部访问与获取环境变量

.netcore验证k8s内部访问与获取环境变量[TOC] 创建k8s-name项目 项目结构如下 实验过程 st=>start: k8s-demo项...

.netcore 通过Flurl验证k8s内部访问与获取环境变量 (二)

.netcore验证k8s内部访问与获取环境变量 (二)[TOC] 修改k8s-name项目 NameController.cs [ApiController] ...

Mysql k8s部署Volume(hostPath)

Mysql K8s部署Volume[TOC] Mysql 与 Yaml 稍作修改这里提供的是官网的链接:https://kubernetes.io/docs/tasks/run-a...

k8s ConfigMap 配置中心

k8s ConfigMap 配置中心[TOC] ConfigMap 简介 ConfigMap用于保存配置数据的键值对,可以用来保存单个属性,也可以用...

k8s Deployment中Rollout与Rollback使用与滚动更新

k8s Deployment中Rollout与Rollback使用[TOC] Rollout 简介 Deployment 的 rollout 当且仅当 Deployment 的 pod temp...

kubectl proxy 让外部网络访问k8s service的ClusterIP

kubectl proxy 让外部网络访问K8S service的ClusterIP[TOC] 使用kubectl proxy命令就可以使API server监听在本地的800...

k8s 网络(笔记)

K8s 网络(笔记)[TOC] K8s 网络 Docker容器网络回顾K8s CNIFlannel 网络插件跨node的 pod to podCluster Service是什么...

Jenkins在k8s中的安装

Jenkins在k8s中的安装[TOC] k8s部署Jenkins.yaml--- apiVersion: apps/v1 kind: Deployment #设置资源的类型为Deploym...

Centos7安装k8s(基于kubeadm)

Centos7安装k8s(基于kubeadm)[TOC] 下载相关包 链接:https://pan.baidu.com/s/1H9MuZsf28f_3uyVHBUS8jQ提取码:w9tv ...

Docker和k8s的区别与介绍

2010年,几个搞IT的年轻人,在美国旧金山成立了一家名叫“dotCloud”的公司。这家公司主要提供基于PaaS的云计算技术服务。...

如何把阿里云的主机加入到腾讯云的k8s节点中,或者如何把外网的服务器用到自建的k8s节点

如何把阿里云的主机加入到腾讯云的k8s节点中 考虑使用iptables转换了下就好了
这一世以无限游戏为使命!
排名
2
文章
620
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术