Kubernetes的Pod进阶(十一)
一、Lifecycle
官网:https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/
通过前面的分享,关于pod是什么相信看过前面的文章的朋友已经很清楚了,有开发经验的朋友很清楚,对象的创建是具有生命周期的,对于Pod也一样,他也有它的生命周期,接下来就是分享pod的创建、销毁、以及他的状态是什么;简单的来说,就是分享pod的生命周期。

下图是官网对Pod生命周期阶段的描述

通过官网可以发现有一个Running状态,相信大家也非常喜欢Running状态,因为这玩意就表示创建成功正常运行,但有时候创建pod时也有不随人愿的时候,因为有时pod偏偏会有一些奇怪的状态,比哪下面几个状态
- 挂起(Pending):Pod 已被 Kubernetes 系统接受,但有一个或者多个容器镜像尚未创建。等待时间包括调度 Pod 的时间和通过网络下载镜像的时间,这可能需要花点时间。
- 运行中(Running):该 Pod 已经绑定到了一个节点上,Pod 中所有的容器都已被创建。至少有一个容器正在运行,或者正处于启动或重启状态。
- 成功(Succeeded):Pod 中的所有容器都被成功终止,并且不会再重启。
- 失败(Failed):Pod 中的所有容器都已终止了,并且至少有一个容器是因为失败终止。也就是说,容器以非0状态退出或者被系统终止。
- 未知(Unknown):因为某些原因无法取得 Pod 的状态,通常是因为与 Pod 所在主机通信失败。
其实对这Pod五大状态了解后有问题时就可以很好解决了,因为知道状态后就可以通过kubectl describe pod pod-name -n namespace去查看pod日志了解为什么出现这状态了。
二、重启策略
- Always:容器失效时,即重启
- OnFailure:容器终止运行且退出码不为0时重启
- Never:永远不重启

三、静态Pod
四、健康检查
官网:https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#container-probes
经过前面几个步骤,pod有生命周期了,有重启策略了,也有固定ip了,接下来pod在进行创建的时候还需要进行健康检查才能够进行正常的创建,下面是官网对健康检查的说明

健康检查是通过两个属性进行的:
- LivenessProbe探针:判断容器是否存活
- ReadinessProbe探针:判断容器是否启动完成
五、ConfifigMap
官网:https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/

官网的介绍说白了就是用来保存配置数据的键值对,也可以保存单个属性,也可以保存配置文件。所有的配置内容都存储在etcd中,创建的数据可以供Pod使用。下面来分享下三种创建的方式
5.1、命令行创建
创建一个名称为my-config的ConfigMap,key值时db.port,value值是3306
kubectl create configmap my-config --from-literal=db.port='3306'
通过命令查看,会发现在系统的默认空间下创建了一个my-config
kubectl get configmap
查看yaml文件对应的格式
kubectl get configmap myconfig -o yaml
5.2、从配置文件中创建
创建一个文件,名称为app.properties,然后在创建的文件中加入下面两句话
name=ghy
age=2
然后根据文件去创建
kubectl create configmap app --from-file=./app.properties
通过命令查看,会发现在系统的默认空间下创建了一个app
kubectl get configmap
查看yaml文件对应的格式
kubectl get configmap app -o yaml
5.3、通过yaml文件创建
新建一个configmaps.yaml,并把文件放进去
apiVersion: v1
kind: ConfigMap
metadata:
name: special-config
namespace: default
data:
special.how: very
---
apiVersion: v1
kind: ConfigMap
metadata:
name: env-config
namespace: default
data:
log_level: INFO
启动yaml文件
kubectl apply -f configmaps.yaml
通过命令查看,会发现在系统的默认空间下创建了一个env-config和special-config两个
kubectl get configmap
创建CONFIGMAP的动作完成后接下来就是去使用他了。
5.4、ConfigMap的使用
使用方式:
- 通过环境变量的方式,直接传递给pod
- 使用configmap中指定的key
- 使用configmap中所有的key
- 通过在pod的命令行下运行的方式(启动命令中)
- 作为volume的方式挂载到pod内
注意
- ConfigMap必须在Pod使用它之前创建
- 使用envFrom时,将会自动忽略无效的键
- Pod只能使用同一个命名空间的ConfigMap
5.4.1、作为volume挂载使用
将创建的ConfigMap直接挂载至Pod的/etc/config目录下,其中每一个key-value键值对都会生成一个文件,key为文件名,value为内容。
创建一个pod-configmap.yaml文件
apiVersion: v1
kind: Pod
metadata:
name: pod-configmap2
spec:
containers:
- name: test-container
image: busybox
command: [ "/bin/sh", "-c", "ls /etc/config/" ]
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: special-config
restartPolicy: Never
上面的意思很简单就是pod里面有一个busybox的containers,他会往虚拟机的/etc/config目录下把configMap的key和value以目录的形式挂载进去;
启动脚本
kubectl apply -f pod-myconfigmap.yml
可以用下面命令看是否创建成功
kubectl get pods
进入容器目录然后会找到上面说的东西
kubectl exec -it pod-configmap2 bash
六、Secret
官网:https://kubernetes.io/docs/concepts/configuration/secret/
这块内容是关于数据安全性东西,前面的ConfigMap的配置文件什么的大家也看了,但现在的文件配置都是明文的,如果有些东西不想明文展示,那怎么搞呢

6.1、Secret类型
secret一共有三种类型:
- Opaque:使用base64编码存储信息,可以通过`base64 --decode`解码获得原始数据,因此安全性弱。
- kubernetes.io/dockerconfigjson:用于存储docker registry的认证信息。
- kubernetes.io/service-account-token:用于被 serviceaccount 引用。serviceaccout 创建时 Kubernetes 会默认创建对应的 secret。Pod 如果使用了 serviceaccount,对应的 secret 会自动挂载到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目录中。
6.2、Opaque Secret
Opaque类型的Secret的value为base64位编码后的值
6.2.1、 从文件中创建
echo -n "admin" > ./username.txt
echo -n "1f2d1e2e67df" > ./password.txt
kubectl create secret generic db-user-pass --from-file=./username.txt --from-file=./password.txt
kubectl get secret
6.2.2、 使用yaml文件创建
(1)对数据进行64位编码
echo -n 'admin' | base64
echo -n '1f2d1e2e67df' | base64
(2)定义mysecret.yaml文件
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: YWRtaW4=
password: MWYyZDFlMmU2N2Rm
(3)根据yaml文件创建资源并查看
kubectl create -f ./secret.yaml
kubectl get secret
kubectl get secret mysecret -o yaml
6.3 Secret使用
通过6.2.2的方式就得到了一个secret文件,接下来就这个文件使用进行说明下。他的使用有两种方式
- 以Volume方式
- 以环境变量方式
6.3.1、 将Secret挂载到Volume中
(1)创建mypod.yaml文件
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mypod
image: redis
volumeMounts:
- name: foo
mountPath: "/etc/foo"
readOnly: true
volumes:
- name: foo
secret:
secretName: mysecret
(2)用命令启动
kubectl apply -f mypod.yaml
(3)进入容器里面
kubectl exec -it mypod bash
(4)进入在配置文件定义的目录会发现目录是创建成功的
cd /etc/foo
(5)也可以用如下命令看创建的内容
cat /etc/foo/username
cat /etc/foo/password
6.3.2、 将Secret设置为环境变量
(1)配置文件如下,重要环境变量配置我标记出来了
apiVersion: v1
kind: Pod
metadata:
name: secret-env-pod
spec:
containers:
- name: mycontainer
image: redis
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: mysecret
key: username
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
restartPolicy: Never
6.4 、kubernetes.io/dockerconfigjson
kubernetes.io/dockerconfigjson用于存储docker registry的认证信息,可以直接使用`kubectl create secret`命令创建
6.5、 kubernetes.io/service-account-token
这个是用于被 serviceaccount 引用。serviceaccout 创建时 Kubernetes 会默认创建对应的 secret。Pod 如果使用了 serviceaccount,对应的 secret 会自动挂载到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目录中。
kubectl get secret # 可以看到service-account-token
kubectl run nginx --image nginx
kubectl get pods
kubectl exec -it nginx-pod-name bash
ls /run/secrets/kubernetes.io/serviceaccount
kubectl get secret
kubectl get pods pod-name -o yaml
# 找到volumes选项,定位到-name,secretName
# 找到volumeMounts选项,定位到mountPath: /var/run/secrets/kubernetes.io/serviceaccount
总结:
无论是ConfigMap,Secret,还是DownwardAPI,都是通过ProjectedVolume实现的,可以通过APIServer将信息放到Pod中进行使用。
七、指定Pod所运行的Node
(1)给node打上label
kubectl get nodes
kubectl label nodes worker02-kubeadm-k8s name=ghy
(2)查看node是否有上述label
kubectl describe node worker02-kubeadm-k8s
(3)部署一个mysql的pod
vi mysql-pod.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: mysql-rc
labels:
name: mysql-rc
spec:
replicas: 1
selector:
name: mysql-pod
template:
metadata:
labels:
name: mysql-pod
spec:
nodeSelector:
name: ghy
containers:
- name: mysql
image: mysql
imagePullPolicy: IfNotPresent
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: "mysql" ---
apiVersion: v1
kind: Service
metadata:
name: mysql-svc
labels:
name: mysql-svc
spec:
type: NodePort
ports:
- port: 3306
protocol: TCP
targetPort: 3306
name: http
nodePort: 32306
selector:
name: mysql-pod
(4)查看pod运行详情
kubectl apply -f mysql-pod.yaml
kubectl get pods -o wide
Kubernetes的Pod进阶(十一)的更多相关文章
- Kubernetes的Controller进阶(十二)
一.Controller 既然学习了Pod进阶,对于管理Pod的Controller肯定也要进阶一下,之前我们已经学习过的Controller有RC.RS和Deployment,除此之外还有吗,如果感 ...
- JavaScript进阶(十一)JsJava2.0版本
JavaScript进阶(十一)JsJava2.0版本 2007年9月11日,JsJava团队发布了JsJava2.0版本,该版本不仅增加了许多新的类库,而且参照J2SE1.4,大量使用了类的继承和实 ...
- kubernetes调度pod运行于master节点上
应用背景: 使用kubeadm部署的kubernetes集群,其master节点默认拒绝将pod调度运行于其上的,加点官方的术语就是:master默认被赋予了一个或者多个“污点(taints)”,“污 ...
- Kubernetes探索学习004--深入Kubernetes的Pod
深入研究学习Pod 首先需要认识到Pod才是Kubernetes项目中最小的编排单位原子单位,凡是涉及到调度,网络,存储层面的,基本上都是Pod级别的!官方是用这样的语言来描述的: A Pod is ...
- Kubernetes之Pod使用
一.什么是Podkubernetes中的一切都可以理解为是一种资源对象,pod,rc,service,都可以理解是 一种资源对象.pod的组成示意图如下,由一个叫”pause“的根容器,加上一个或多个 ...
- Python进阶(十一)----包,logging模块
Python进阶(十一)----包,logging模块 一丶包的使用 什么是包: 包是通过使用 .模块名的方式组织python模块名称空间的方式. 通俗来说,含有一个__init__.py文件的文 ...
- kubernetes之pod健康检查
目录 kubernetes之pod健康检查 1.概述和分类 2.LivenessProbe探针(存活性探测) 3.ReadinessProbe探针(就绪型探测) 4.探针的实现方式 4.1.ExecA ...
- Kubernetes基石-pod容器
引用三个问题来叙述Kubernetes的pod容器 1.为什么不直接在一个Docker容器中运行所有的应用进程. 2.为什么pod这种容器中要同时运行多个Docker容器(可以只有一个) 3.为什么k ...
- kubernetes concepts -- Pod Overview
This page provides an overview of Pod, the smallest deployable object in the Kubernetes object model ...
随机推荐
- chrome/microsoft/brave等浏览器离线下载crx并安装(解决download interrupted)
重要网站 离线下载crx 问题描述 使用chrome/microsoft edge/ brave 下载chrome webstroe插件时,提示: download interrupted. 解决方案 ...
- 【Android开发】问答机器人,聊天类App的开发制作过程记录
缘起 很久没写项目了,所以单纯的想练练手,正好看到有问答机器人的接口,想到之前也做过聊天项目,为什么不实验一下呢.当然也是简单调用接口的项目,并没有真正的完成问答的算法等等.业余项目,功能不齐全,只实 ...
- 【九度OJ】题目1040:Prime Number 解题报告
[九度OJ]题目1040:Prime Number 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1040 题目描述: Ou ...
- 【九度OJ】题目1208:10进制 VS 2进制 解题报告
[九度OJ]题目1208:10进制 VS 2进制 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1208 题目描述: 对于一 ...
- 【LeetCode】392. Is Subsequence 解题报告(Python)
[LeetCode]392. Is Subsequence 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode.com/problems/is-subseq ...
- leetcode1261在受污染的二叉树中查找元素
题目 一颗二叉树,树根值为0,父节点为x,则左子值为2x+1,右子为2x+2.现在只有树的结构,所有值都变为-1被污染了.求污染前是否存在某个值. 构建一次树,查询会调用多次. 题解 这道题还是比较简 ...
- 涛思数据 TDengine集群搭建
一.准备 1.设置主机名 hostnamectl set-hostname a.com hostnamectl set-hostname b.com hostnamectl set-hostname ...
- MySql各事务隔离级别及锁问题
聊事务隔离级别和锁问题之前首先得理解事务的隔离级别和共享锁及独占锁的概念: 事务的隔离级别: 脏读 不可重复读 幻读 Read uncommitted √ √ √ Read committed × ...
- On the Optimization of Deep Networks: Implicit Acceleration by Overparameterization
目录 引 主要内容 定理1 Claim 1 Claim 2 定理2 证明 定理1的证明 Claim 1 的证明 Kronecker product (克罗内克积) Theorem 2 的证明 代码 A ...
- 昆泰CH7511B方案|EDP转LVDS资料|CS5211pin to pin 替代CH7511B电路设计
Chrontel的CH7511B是一种低成本.低功耗的半导体器件,它将嵌入式DisplayPort信号转换为LVDS(低压差分信号).这款创新的DisplayPort接收机带有集成LVDS发射机,专为 ...