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

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

通过官网可以发现有一个Running状态,相信大家也非常喜欢Running状态,因为这玩意就表示创建成功正常运行,但有时候创建pod时也有不随人愿的时候,因为有时pod偏偏会有一些奇怪的状态,比哪下面几个状态
其实对这Pod五大状态了解后有问题时就可以很好解决了,因为知道状态后就可以通过kubectl describe pod pod-name -n namespace去查看pod日志了解为什么出现这状态了。

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

健康检查是通过两个属性进行的:
官网:https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/

官网的介绍说白了就是用来保存配置数据的键值对,也可以保存单个属性,也可以保存配置文件。所有的配置内容都存储在etcd中,创建的数据可以供Pod使用。下面来分享下三种创建的方式
创建一个名称为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创建一个文件,名称为app.properties,然后在创建的文件中加入下面两句话
name=ghyage=2
然后根据文件去创建
kubectl create configmap app --from-file=./app.properties通过命令查看,会发现在系统的默认空间下创建了一个app
kubectl get configmap查看yaml文件对应的格式
kubectl get configmap app -o yaml新建一个configmaps.yaml,并把文件放进去
apiVersion: v1kind: ConfigMapmetadata: name: special-config namespace: defaultdata: special.how: very---apiVersion: v1kind: ConfigMapmetadata: name: env-config namespace: defaultdata: log_level: INFO
启动yaml文件
kubectl apply -f configmaps.yaml
通过命令查看,会发现在系统的默认空间下创建了一个env-config和special-config两个
kubectl get configmap创建CONFIGMAP的动作完成后接下来就是去使用他了。
使用方式:
注意
将创建的ConfigMap直接挂载至Pod的/etc/config目录下,其中每一个key-value键值对都会生成一个文件,key为文件名,value为内容。
创建一个pod-configmap.yaml文件
apiVersion: v1kind: Podmetadata: name: pod-configmap2spec: 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
官网:https://kubernetes.io/docs/concepts/configuration/secret/
这块内容是关于数据安全性东西,前面的ConfigMap的配置文件什么的大家也看了,但现在的文件配置都是明文的,如果有些东西不想明文展示,那怎么搞呢

secret一共有三种类型:
Opaque类型的Secret的value为base64位编码后的值
echo -n "admin" > ./username.txtecho -n "1f2d1e2e67df" > ./password.txt
kubectl create secret generic db-user-pass --from-file=./username.txt --from-file=./password.txt
kubectl get secret(1)对数据进行64位编码
echo -n 'admin' | base64echo -n '1f2d1e2e67df' | base64
(2)定义mysecret.yaml文件
apiVersion: v1kind: Secretmetadata: name: mysecrettype: Opaquedata: username: YWRtaW4= password: MWYyZDFlMmU2N2Rm
(3)根据yaml文件创建资源并查看
kubectl create -f ./secret.yaml
kubectl get secretkubectl get secret mysecret -o yaml通过6.2.2的方式就得到了一个secret文件,接下来就这个文件使用进行说明下。他的使用有两种方式
(1)创建mypod.yaml文件
apiVersion: v1kind: Podmetadata: name: mypodspec: 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
(1)配置文件如下,重要环境变量配置我标记出来了
apiVersion: v1kind: Podmetadata: name: secret-env-podspec: 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
kubernetes.io/dockerconfigjson用于存储docker registry的认证信息,可以直接使用`kubectl create secret`命令创建
这个是用于被 serviceaccount 引用。serviceaccout 创建时 Kubernetes 会默认创建对应的 secret。Pod 如果使用了 serviceaccount,对应的 secret 会自动挂载到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目录中。
kubectl get secret # 可以看到service-account-tokenkubectl run nginx --image nginxkubectl get podskubectl exec -it nginx-pod-name bashls /run/secrets/kubernetes.io/serviceaccount
kubectl get secretkubectl get pods pod-name -o yaml # 找到volumes选项,定位到-name,secretName# 找到volumeMounts选项,定位到mountPath: /var/run/secrets/kubernetes.io/serviceaccount
总结:
无论是ConfigMap,Secret,还是DownwardAPI,都是通过ProjectedVolume实现的,可以通过APIServer将信息放到Pod中进行使用。
(1)给node打上label
kubectl get nodeskubectl label nodes worker02-kubeadm-k8s name=ghy
(2)查看node是否有上述label
kubectl describe node worker02-kubeadm-k8s
(3)部署一个mysql的pod
vi mysql-pod.yaml
apiVersion: v1kind: ReplicationControllermetadata: name: mysql-rc labels: name: mysql-rcspec: 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: v1kind: Servicemetadata: name: mysql-svc labels: name: mysql-svcspec: 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