最新要闻
- 《消失的她》票房破5亿:打破44项影史纪录 端午档最强国产悬疑电影诞生 全球最新
- 五年来最火端午假期正式结束!这些城市最热门 你去了吗?
- 鸿海加快iPhone 15在印度量产:与中国大陆时间差将缩减至一个月-天天速递
- 400万播放量 救不了东北偶像
- 标压i7+32GB仅2999元 这款迷你主机能入手吗?实测来了
- 党的最大优势是党执政后的最大危险是_党执政后的最大危险是
- 全球新消息丨韩国yg公司旗下艺人_韩国yg公司
- k360次列车硬卧分布图(k360次列车)|天天时讯
- 安徽唯一盲人考生 高考成绩出来了:311分
- 因脑溢血开颅3次的少年高考445分 母亲:努力有了结果
- garage两种读音_garage怎么读有几种读法是对的
- 观焦点:女子醉酒吐车上 20元都不肯赔 司机怒骂不要脸:网友力挺
- 环球快报:再获11亿美元投资:蔚来“长期主义”的底气
- 距离今年“召回王”又进一步 本田海外召回超百万辆汽车
- 法媒:罗马准备听取对贝洛蒂的报价,意甲英超西甲多队有意
- 腾讯两大国民APP账号又打通了!QQ悄然支持微信登陆 有了微信为啥仍离不开QQ?
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
全球速讯:k8s 深入篇———— pod 深入实战[七]
前言
深入一下pod 实战。
正文
在 Kubernetes 中,有几种特殊的 Volume,它们存在的意义不是为了存放容器里的数据,也不是用来进行容器和宿主机之间的数据交换。
这些特殊 Volume 的作用,是为容器提供预先定义好的数据。
(资料图)
所以,从容器的角度来看,这些 Volume 里的信息就是仿佛是被Kubernetes“投射”(Project)进入容器当中的。这正是 Projected Volume 的含义。
到目前为止,Kubernetes 支持的 Projected Volume 一共有四种:
- Secret;
- ConfigMap;
- Downward API;
- ServiceAccountToken。
在今天这篇文章中,我首先和你分享的是 Secret。它的作用,是帮你把 Pod 想要访问的加密数据,存放到 Etcd 中。
然后,你就可以通过在 Pod 的容器里挂载 Volume 的方式,访问到这些 Secret 里保存的信息了。
Secret 最典型的使用场景,莫过于存放数据库的 Credential 信息,比如下面这个例子:
例如:
apiVersion: v1kind: Podmetadata: name: test-projected-volumespec: containers: - name: test-secret-volume image: busybox args: - sleep - "86400" volumeMounts: - name: mysql-cred mountPath: "/projected-volume" readOnly: true volumes: - name: mysql-cred projected: sources: - secret: name: user - secret: name: pass
这个启动会报错,因为现在还没有创建secret/user资源和 secret/pass 资源。
那么创建一下:
kubectl create secret generic user --from-file=./username.txtkubectl create secret generic pass --from-file=./password.txt
里面可以随便写一些东西。
那么我们看下挂载的是什么吧。
可以看到,将映射后的内容到了里面。
来看下docker的情况吧。
其实就是创建了一个volume,然后将两个文件放入进去了,然后容器再进行映射。
在这个 Pod 中,我定义了一个简单的容器。它声明挂载的 Volume,并不是常见的emptyDir 或者 hostPath 类型,
而是 projected 类型。而这个 Volume 的数据来源(sources),则是名为 user 和 pass 的 Secret 对象,分别对应的是数据库的用户名和密码。
还可以通过yaml的方式声明,一般都是这种方式哈:
可以看到,通过编写 YAML 文件创建出来的 Secret 对象只有一个。但它的 data 字段,却以 Key-Value 的格式保存了两份 Secret 数据。其中,“user”就是第一份数据的Key,“pass”是第二份数据的 Key。
需要注意的是,Secret 对象要求这些数据必须是经过 Base64 转码的,以免出现明文密码的安全隐患。这个转码操作也很简单,比如:
这里需要注意的是,像这样创建的 Secret 对象,它里面的内容仅仅是经过了转码,而并没有被加密。
在真正的生产环境中,你需要在 Kubernetes 中开启 Secret 的加密插件,增强数据的安全性。
从返回结果中,我们可以看到,保存在 Etcd 里的用户名和密码信息,已经以文件的形式出现在了容器的 Volume 目录里。而这个文件的名字,就是 kubectl create secret 指定的Key,或者说是 Secret 对象的 data 字段指定的 Key。
更重要的是,像这样通过挂载方式进入到容器里的 Secret,一旦其对应的 Etcd 里的数据被更新,这些 Volume 里的文件内容,同样也会被更新。其实,这是 kubelet 组件在定时维护这些 Volume。
需要注意的是,这个更新可能会有一定的延时。所以在编写应用程序时,在发起数据库连接的代码处写好重试和超时的逻辑,绝对是个好习惯。
与 Secret 类似的是 ConfigMap,它与 Secret 的区别在于,ConfigMap 保存的是不需要加密的、应用所需的配置信息。
而 ConfigMap 的用法几乎与 Secret 完全相同:你可以使用 kubectl create configmap 从文件或者目录创建 ConfigMap,也可以直接编写ConfigMap 对象的 YAML 文件。
备注:kubectl get -o yaml 这样的参数,会将指定的 Pod API 对象以YAML 的方式展示出来。
接下来是 Downward API,它的作用是:让 Pod 里的容器能够直接获取到这个 Pod API对象本身的信息。
下面是downward api:
apiVersion: v1kind: Podmetadata: name: test-downwardapi-volume labels: zone: us-est-coast cluster: test-cluster1 rack: rack-22spec: containers: - name: client-container image: busybox imagePullPolicy: IfNotPresent command: ["sh", "-c"] args: - while true; do if [[ -e /etc/podinfo/labels ]]; then echo -en "\n\n"; cat /etc/podinfo/labels; fi; sleep 500; done; volumeMounts: - name: podinfo mountPath: /etc/podinfo readOnly: false volumes: - name: podinfo projected: sources: - downwardAPI: items: - path: "labels" fieldRef: fieldPath: metadata.labels
在这个 Pod 的 YAML 文件中,我定义了一个简单的容器,声明了一个 projected 类型的Volume。只不过这次 Volume 的数据来源,变成了 Downward API。而这个 DownwardAPI Volume,则声明了要暴露 Pod 的 metadata.labels 信息给容器。通过这样的声明方式,当前 Pod 的 Labels 字段的值,就会被 Kubernetes 自动挂载成为容器里的 /etc/podinfo/labels 文件。而这个容器的启动命令,则是不断打印出 /etc/podinfo/labels 里的内容。所以,当我创建了这个 Pod 之后,就可以通过 kubectl logs 指令,查看到这些 Labels 字段被打印出来,如下所示:
其实就是把label的信息挂载到了labels文件下面。
具体可查看官方文档。
其实,Secret、ConfigMap,以及 Downward API 这三种 Projected Volume 定义的信息,大多还可以通过环境变量的方式出现在容器里。
但是,通过环境变量获取这些信息的方式,不具备自动更新的能力。所以,一般情况下,我都建议你使用 Volume 文件的方式获取这些信息。
相信你一定有过这样的想法:我现在有了一个 Pod,我能不能在这个 Pod 里安装一个Kubernetes 的 Client,这样就可以从容器里直接访问并且操作这个 Kubernetes 的 API 了呢?这当然是可以的。不过,你首先要解决 API Server 的授权问题。Service Account 对象的作用,就是 Kubernetes 系统内置的一种“服务账户”,它是Kubernetes 进行权限分配的对象。比如,Service Account A,可以只被允许对Kubernetes API 进行 GET 操作,而 Service Account B,则可以有 Kubernetes API 的所有操作的权限。像这样的 Service Account 的授权信息和文件,实际上保存在它所绑定的一个特殊的Secret 对象里的。这个特殊的 Secret 对象,就叫作ServiceAccountToken。任何运行在Kubernetes 集群上的应用,都必须使用这个 ServiceAccountToken 里保存的授权信息,也就是 Token,才可以合法地访问 API Server。所以说,Kubernetes 项目的 Projected Volume 其实只有三种,因为第四种ServiceAccountToken,只是一种特殊的 Secret 而已。
另外,为了方便使用,Kubernetes 已经为你提供了一个的默认“服务账户”(defaultService Account)。并且,任何一个运行在 Kubernetes 里的 Pod,都可以直接使用这个默认的 Service Account,而无需显示地声明挂载它。
这是如何做到的呢?当然还是靠 Projected Volume 机制。如果你查看一下任意一个运行在 Kubernetes 集群里的 Pod,就会发现,每一个 Pod,都已经自动声明一个类型是 Secret、名为 default-token-xxxx 的 Volume,然后 自动挂载在每个容器的一个固定目录上。比如:
默认挂载了这两个。
这个 Secret 类型的 Volume,正是默认 Service Account 对应的ServiceAccountToken。所以说,Kubernetes 其实在每个 Pod 创建的时候,自动在它的spec.volumes 部分添加上了默认 ServiceAccountToken 的定义,然后自动给每个容器加上了对应的 volumeMounts 字段。这个过程对于用户来说是完全透明的。这样,一旦 Pod 创建完成,容器里的应用就可以直接从这个默认 ServiceAccountToken的挂载目录里访问到授权信息和文件。这个容器内的路径在 Kubernetes 里是固定的,即:/var/run/secrets/kubernetes.io/serviceaccount ,而这个 Secret 类型的 Volume里面的内容如下所示:
所以,你的应用程序只要直接加载这些授权文件,就可以访问并操作 Kubernetes API 了。而且,如果你使用的是 Kubernetes 官方的 Client 包(k8s.io/client-go)的话,它还可以自动加载这个目录下的文件,你不需要做任何配置或者编码操作。
这种把 Kubernetes 客户端以容器的方式运行在集群里,然后使用 default ServiceAccount 自动授权的方式,被称作“InClusterConfig”。
当然,考虑到自动挂载默认 ServiceAccountToken 的潜在风险,Kubernetes 允许你设置默认不为 Pod 里的容器自动挂载这个 Volume。
除了这个默认的 Service Account 外,我们很多时候还需要创建一些我们自己定义的Service Account,来对应不同的权限设置。这样,我们的 Pod 里的容器就可以通过挂载这些 Service Account 对应的 ServiceAccountToken,来使用这些自定义的授权信息。
在 Kubernetes 中,你可以为 Pod 里的容器定义一个健康检查“探针”(Probe)。这样,kubelet 就会根据这个 Probe 的返回值决定这个容器的状态,而不是直接以容器进行是否运行(来自 Docker 返回的信息)作为依据。
这种机制,是生产环境中保证应用健康存活的重要手段。
apiVersion: v1kind: Podmetadata: labels: test: liveness name: test-liveness-execspec: containers: - name: liveness image: daocloud.io/library/nginx args: - /bin/sh - -c - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 50 livenessProbe: #探针,健康检查 exec: #类型 command: #命令 - cat - /tmp/healthy initialDelaySeconds: 5 #健康检查,在容器启动 5 s 后开始执行 periodSeconds: 5 #每 5 s 执行一次
然后这个监控检查不通过之后,那么就会出现一个东西,叫做pod的恢复机制,也叫restartPolicy。
。它是 Pod 的 Spec 部分的一个标准字段(pod.spec.restartPolicy),默认值是 Always,即:任何时候这个容器发生了异常,它一定会被重新创建。但一定要强调的是,Pod 的恢复过程,永远都是发生在当前节点上,而不会跑到别的节点上去。事实上,一旦一个 Pod 与一个节点(Node)绑定,除非这个绑定发生了变化(pod.spec.node 字段被修改),否则它永远都不会离开这个节点。这也就意味着,如果这个宿主机宕机了,这个 Pod 也不会主动迁移到其他节点上去。
而如果你想让 Pod 出现在其他的可用节点上,就必须使用 Deployment 这样的“控制器”来管理 Pod,哪怕你只需要一个 Pod 副本。
而作为用户,你还可以通过设置 restartPolicy,改变 Pod 的恢复策略。除了 Always,它还有 OnFailure 和 Never 两种情况:Always:在任何情况下,只要容器不在运行状态,就自动重启容器;OnFailure: 只在容器 异常时才自动重启容器;Never: 从来不重启容器。
- 只要 Pod 的 restartPolicy 指定的策略允许重启异常的容器(比如:Always),那么这个 Pod 就会保持 Running 状态,并进行容器重启。否则,Pod 就会进入 Failed 状态 。
- 对于包含多个容器的 Pod,只有它里面所有的容器都进入异常状态后,Pod 才会进入Failed 状态。在此之前,Pod 都是 Running 状态。此时,Pod 的 READY 字段会显示正常容器的个数,
所以,假如一个 Pod 里只有一个容器,然后这个容器异常退出了。那么,只有当restartPolicy=Never 时,这个 Pod 才会进入 Failed 状态。而其他情况下,由于Kubernetes 都可以重启这个容器,所以 Pod 的状态保持 Running 不变。而如果这个 Pod 有多个容器,仅有一个容器异常退出,它就始终保持 Running 状态,哪怕即使 restartPolicy=Never。只有当所有容器也异常退出之后,这个 Pod 才会进入Failed 状态
在 Kubernetes 的 Pod 中,还有一个叫 readinessProbe 的字段。虽然它的用法与livenessProbe 类似,但作用却大不一样。readinessProbe 检查结果的成功与否,决定的这个 Pod 是不是能被通过 Service 的方式访问到,而并不影响 Pod 的生命周期。
下面是Pod Preset例子:
kind: PodPresetapiVersion: settings.k8s.io/v1alpha1metadata: name: allow-database namespace: mynsspec: selector: matchLabels: role: frontend env: - name: DB_PORT value: "6379" volumeMounts: - mountPath: /cache name: cache-volume volumes: - name: cache-volume emptyDir: {}
然后编写pod.yaml:
apiVersion: v1kind: Podmetadata: name: website labels: app: website role: frontendspec: containers: - name: website image: ecorp/website ports: - containerPort: 80
然后最终生成的yaml为:
apiVersion: v1kind: Podmetadata: name: website labels: app: website role: frontend annotations: podpreset.admission.kubernetes.io/allow-database: "resource version"spec: containers: - name: website image: ecorp/website volumeMounts: - mountPath: /cache name: cache-volume ports: - containerPort: 80 env: - name: DB_PORT value: "6379" volumes: - name: cache-volume emptyDir: {}
比如,我们现在提交的是一个 nginx-deployment,那么这个 Deployment 对象本身是永远不会被 PodPreset 改变的,被修改的只是这个 Deployment 创建出来的所有 Pod。这一点请务必区分清楚。这里有一个问题:如果你定义了同时作用于一个 Pod 对象的多个 PodPreset,会发生什么呢?实际上,Kubernetes 项目会帮你合并(Merge)这两个 PodPreset 要做的修改。而如果它们要做的修改有冲突的话,这些冲突字段就不会被修改。
PodPreset 这个被弃用了。
结
下一节,编排。
关键词:
-
【环球速看料】强化学习从基础到进阶-常见问题和面试必知必答[4]::深度Q网络-DQN、double DQN、经验回放、rainbow、分布式DQN
强化学习从基础到进阶-常见问题和面试必知必答[4]::深度Q网络-DQN、d
来源: 全球速讯:k8s 深入篇———— pod 深入实战[七]
CAP定理
【环球速看料】强化学习从基础到进阶-常见问题和面试必知必答[4]::深度Q网络-DQN、double DQN、经验回放、rainbow、分布式DQN
《消失的她》票房破5亿:打破44项影史纪录 端午档最强国产悬疑电影诞生 全球最新
五年来最火端午假期正式结束!这些城市最热门 你去了吗?
鸿海加快iPhone 15在印度量产:与中国大陆时间差将缩减至一个月-天天速递
400万播放量 救不了东北偶像
标压i7+32GB仅2999元 这款迷你主机能入手吗?实测来了
党的最大优势是党执政后的最大危险是_党执政后的最大危险是
全球新消息丨韩国yg公司旗下艺人_韩国yg公司
每日动态!使用libavcodec将mp3音频文件解码为pcm音频采样数据【[mp3float @ 0x561c1ec49940] Header missing
小试Blazor——实现Ant Design Blazor动态表单
焦点快看:【解决方法】按键精灵 实现 狂野飙车9 自动领取每日广告卡牌包 (1)
k360次列车硬卧分布图(k360次列车)|天天时讯
安徽唯一盲人考生 高考成绩出来了:311分
因脑溢血开颅3次的少年高考445分 母亲:努力有了结果
k8s 深入篇———— pod 实战[六]
garage两种读音_garage怎么读有几种读法是对的
观焦点:女子醉酒吐车上 20元都不肯赔 司机怒骂不要脸:网友力挺
环球快报:再获11亿美元投资:蔚来“长期主义”的底气
距离今年“召回王”又进一步 本田海外召回超百万辆汽车
法媒:罗马准备听取对贝洛蒂的报价,意甲英超西甲多队有意
腾讯两大国民APP账号又打通了!QQ悄然支持微信登陆 有了微信为啥仍离不开QQ?
2023年端午小长假收官:1.06亿人次出游 满血超越2019-当前热讯
【世界独家】word安装(ppt、excel),以及word的常用设置
【当前独家】Blazor开发小游戏?趁热打铁上!!!
当前热门:火狐主页diy设置以及常用的扩展
DZY Loves Math|全球即时看
女生发烧考出618分:一蹦三尺高 挨个房间报喜
每日消息!ChatGPT漏洞 讲故事送Window11激活Key!
世界快播:刘慈欣谈ChatGPT:人类的无能反而是人类最后的屏障
今日热议:关于高考志愿填报,这些热点问题需要关注
缓存一致性如何保障
推出长达7年:任天堂股东质疑Switch已逼近极限
实时焦点:苹果前总监炮轰App Store存在灰色地带 标准随心所欲
三乙醇胺油酸皂商品报价动态(2023-06-24)
救命一声吼!山洪暴发女子大喊提醒救下多名游客 世界讯息
索尼PS5串流掌机价格曝光:最高2100元能接受么?
全球视点!泰坦号观光潜艇“打破常规留名后世”,老板一语成谶片受热议
DLang 与 C 语言交互
Apollo2.1.0+Springboot使用OpenApI
邮箱:微信企业域名邮箱给gmail或hotmail等域外邮箱发邮件被退回问题如何解决? 环球观焦点
今日热门!Stable Diffusion模型发布新版本:生成图像以假乱真
钻石价格,突发“跳水”!未来还会更便宜?
使用python发送sip协议的OPTIONS 热门
k8s 深入篇———— k8s 的pod[五]-全球播资讯
8. Java-AOP 面向切面编程
文心一言 VS 讯飞星火 VS chatgpt (46)-- 算法导论6.1 4题|全球热点评
泰坦号事故后:加拿大将展开事故调查
车主自曝差点被闷死在特斯拉Model X里 车门锁死 原因揭晓
蔡徐坤巡演新加坡站开票 《Hug me(remix版)》同日上线
来一打自建IP Proxy玩玩之Majora
kafka学习之五_多个磁盘的性能验证 世界快看点
Go——常用函数
每日速递:卷福的十年同学会
每日简讯:4亿票房端午黑马:《消失的她》官宣海外定档
冲入球场拥抱梅西小伙获释后道歉:我真不是没素质的人
世界观天下!新会绿美生态园票价(新会绿美生态园票价多少钱)
腾讯两大国民APP账号又打通了?QQ悄然支持微信登陆 环球精选
环球快报:调查称安卓更易上手:iPhone用户遇到问题概率高出58%
java 异常处理,事务管理,事务共用,事务传递 天天微头条
Go-闭包和defer|最新资讯
环球热资讯!Zen3清库存?突然冒出个很特别的锐龙5 5700
虚幻5打造!腾讯动漫《斗罗大陆2》今日两集首播 霍雨浩初入星斗大森林|每日观察
“空中出租车”亮相巴黎航展:可降落空间直径仅需15米-环球速递
古力娜扎曾遭换脸视频威胁勒索:不给钱就毁了你!
男生单曲循环《好运来》查出593分大哭:比平时多出50分 超常发挥
全球钻石价格较峰值暴跌18%:人造钻石市场规模不断扩大_全球视点
环球最新:甲亢遇到异食癖:法国男子一顿吃15人份 急了还吃石头木塞
全球热点评!公鸡突然从背后“偷袭”萌娃 飞起两脚踹倒在地 第二天端午节就被炖了
泰国和美国两地大量鱼类死亡 或与海洋升温有关 快看点
【技术积累】C语言中的指针【一】_世界百事通
Go-自定义数据类型(函数类型)详解
行业风险管理需求强烈
焦点信息:AMD RX 7800被逼急了!硬塞进去个“大胖子”
世界视点!一考生查分 全家一起喊出“666”:打算冲击复旦、交大
Kafka学习之四_Grafana监控相关的学习
一天吃透MySQL面试八股文 环球微速讯
什么是大模型? 每日热讯
内马尔在足球界的地位_内马尔的盘带水平在足球史上处于什么地位 全球要闻
【环球财经】伦敦金属交易所基本金属23日多数下跌_全球信息
白玉兰奖完整名单出炉 年初大热电视剧《狂飙》挂零陪跑-天天实时
中国高空开伞试验运载器发射连续成功:木星、天王星我们来了! 今日热讯
男子微信回了个“OK”表情 结果竟成被告!一点都不冤 速读
环球报道:尼康Z8新故障导致无法锁定镜头:官方承诺免费维修
【天天新要闻】读发布!设计与部署稳定的分布式系统(第2版)笔记10_自动化和缓慢的响应
无线路由器怎么连接电视(无线路由器怎么连接)
【环球新要闻】要考北大!汶川“敬礼娃娃”郎铮高考637分:15年前被埋20小时
关注:OPPO突然放弃自研芯片 真是因为没钱了?3000哲库人不信
看热讯:四川学霸女生高考712分查完分就睡觉、汶川“敬礼娃娃”郎铮637分
微软承认输掉“主机战争”:Xbox难以与竞争对手抗衡 每日头条
环球微动态丨特斯拉AI账号悄然上线:Dojo超级计算机下月开始生产
pro e
无牌产品硬刚国际大牌 就因为带货主播们买地建厂?
复兴号开进青藏铁路 提速至160公里/时 全程不到6小时
微软终于认怂!重新恢复Win11文件管理器经典功能
《人世间》赢麻!成最佳中国电视剧 雷佳音吴越分获白玉兰最佳男女主角_当前热门
“泰坦”号悲剧隐患早已埋下
2023年 年轻人被迫流行功能机了?-每日快看
全球快资讯丨【技术积累】Git中的基础知识【一】