k8s记录-基础配置1

1、基础yaml文件格式

1.1、namespace

apiVersion: v1
kind: Namespace
metadata:name: namelabels:name: name

kubectl apply -f namespace.yaml

1.2、Service

service示例

apiVersion: v1
kind: Service
metadata:name: ilanni-httpd-svcnamespace: ilanni-namespace
spec:type: NodePortports:- name: http-portnodePort: 30000port: 80targetPort: 80selector:app: ilanni-httpd-dm
apiVersion: v1
kind: Service
metadata:name: nginx-servicenamespace: dev
spec:selector:app: nginx-podclusterIP: Nonetype: ClusterIPports:- port: 80targetPort: 80

service示例

apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-app
spec:replicas: 2selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:latestports:- containerPort: 80---
apiVersion: v1
kind: Service
metadata:name: nginx-app-svc
spec:type: ClusterIPports:- protocol: TCPport: 80 # service 端口targetPort: 80 # pod容器端口selector:app: nginx

可通过日志中记录的http访问信息查看service负载
Service类型

  • ClusterIP:在集群内部使用、也是默认值
  • ExternalName:通过返回定义的 CNAME 别名
  • NodePort:在所有安装了 kube-proxy 的节点上打开一个端口,此端口可以代理至后端 pod

nodeport 端口范围是 30000-32767

  • LoadBalance:使用云服务器商提供的负载均衡服务(例如阿里的 SLB)

备注:用的最多的就是 ingress 配置域名和 nodePort 这两种方式—>ClusterIP–>service–>pod

1.3、Headless

https://zhuanlan.zhihu.com/p/654328148

一句话总结:Headless服务就是一组Pod组成的只供集群内访问(没有ClusterIP)的Service,一般结合StatefulSet用于部署有状态应用的场景。

语法格式如下:

apiVersion: v1
kind: Service
metadata:name: redis-servicenamespace: redislabels:app: redis
spec:ports:- name: redis-portport: 6379clusterIP: Noneselector:app: redisappCluster: redis-cluster

1.4、deployment

#apiVersion: extensions/v1beta1
apiVersion: apps/v1
kind: Deployment
metadata:name: ilanni-httpd-dmnamespace: ilanni-namespace
spec:replicas: 2selector:matchLabels:app: ilanni-httpd-dmrevisionHistoryLimit: 5	# 指定保留的历史revision数量strategy:		# 应用升级时操作,选择滚动更新,具体信息见下文注释type: RollingUpdaterollingUpdate:maxSurge: 1maxUnavailable: 0template:metadata:labels:app: ilanni-httpd-dmspec:terminationGracePeriodSeconds: 60 # terminationGracePeriodSecondsrestartPolicy: Alwayscontainers:- name: ilanni-httpd-dmimage: httpd:alpineimagePullPolicy: Always

revisionHistoryLimit: 5 # 指定保留的历史revision数量
terminationGracePeriodSeconds:为kubelet配置,从失败的容器触发终止操作 到 强制容器运行时停止该容器之前等待的宽限时长。 默认值是继承 Pod 级别的 terminationGracePeriodSeconds 值(如果不设置则为 30 秒),最小值为 1

  strategy:		# deployment时为strategy,statusfulset时为 updateStrategytype: RollingUpdaterollingUpdate:maxSurge: 1maxUnavailable: 0

字段含义

  • type:设置更新策略。有两个可选项:**recreate和RollingUpdate(默认)。**Recreate表示全部重新创建,RollingUpdate表示滚动更新。
  • maxSurge:升级过程中最多可以比原先设置多出的POD数量,可以是数字,也可以是比例。例如:maxSurage=1,replicas=5,则表示升级过程中最多会有5+1个POD。
  • 升级过程中最多允许有多少个POD处于不可用状态。maxUnavailable =1 表示升级过程中最多会有一个pod可以处于无法服务的状态,在这里就是至少要有5-1个pod正常。

说明:maxSurge和maxUnavaible在更新策略为RollingUpdate时才需要设置。

1.5、imagePullPolicy策略

  • IfNotPresent
  • Always
  • Never

默认值取决于指定的镜像标签:

  • 如果标签是 latest,默认的imagePullPolicy是Always。
  • 如果标签不是 latest,默认的imagePullPolicy是IfNotPresent。
apiVersion: v1
kind: Pod
metadata:name: mypod
spec:containers:- name: mycontainerimage: myimage:1.0.0imagePullPolicy: IfNotPresent

1.6、restartPolicy 重启策略

  • Always:这是默认的重启策略。如果容器由于任何原因停止运行,Kubernetes将始终尝试重启容器。即便容器正常退出(退出状态为0),它也会被重启。
  • OnFailure:使用这个策略,只有当容器以非零状态退出时(即检测到失败),Kubernetes才会重启该容器。如果容器成功地以状态码0退出,它不会被重启。
  • Never:此策略告诉Kubernetes不要重启容器。不论容器是成功完成任务还是因为错误而退出,Kubernetes都不会尝试重启它。
apiVersion: v1
kind: Pod
metadata:name: mypod
spec:containers:- name: mycontainerimage: myimagerestartPolicy: OnFailure

2、Ingress

Ingress-nginx通信原理:ingress 将访问规则注入到 nginx 里面—>然后将流量打到对应的 service—>然后通过 clusterIP 访问后端的 pod
访问:客户端–>域名:/test–>service–>pod
k8s-ingress nginx(https证书,ingress nginx常用语法,ingress设置方式

2.1、apeclass

1、ingress-controller
apiVersion: v1
kind: Namespace
metadata:name: ingress-nginxlabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx---
apiVersion: v1
kind: ConfigMap
metadata:name: nginx-configurationnamespace: ingress-nginxlabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx---
apiVersion: v1
kind: ConfigMap
metadata:name: tcp-servicesnamespace: ingress-nginxlabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx---
kind: ConfigMap
apiVersion: v1
metadata:name: udp-servicesnamespace: ingress-nginxlabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx---
apiVersion: v1
kind: ServiceAccount
metadata:name: nginx-ingress-serviceaccountnamespace: ingress-nginxlabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:name: nginx-ingress-clusterrolelabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx
rules:- apiGroups:- ""resources:- configmaps- endpoints- nodes- pods- secretsverbs:- list- watch- apiGroups:- ""resources:- nodesverbs:- get- apiGroups:- ""resources:- servicesverbs:- get- list- watch- apiGroups:- "extensions"resources:- ingressesverbs:- get- list- watch- apiGroups:- ""resources:- eventsverbs:- create- patch- apiGroups:- "extensions"resources:- ingresses/statusverbs:- update---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: Role
metadata:name: nginx-ingress-rolenamespace: ingress-nginxlabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx
rules:- apiGroups:- ""resources:- configmaps- pods- secrets- namespacesverbs:- get- apiGroups:- ""resources:- configmapsresourceNames:# Defaults to "<election-id>-<ingress-class>"# Here: "<ingress-controller-leader>-<nginx>"# This has to be adapted if you change either parameter# when launching the nginx-ingress-controller.- "ingress-controller-leader-nginx"verbs:- get- update- apiGroups:- ""resources:- configmapsverbs:- create- apiGroups:- ""resources:- endpointsverbs:- get---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: RoleBinding
metadata:name: nginx-ingress-role-nisa-bindingnamespace: ingress-nginxlabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx
roleRef:apiGroup: rbac.authorization.k8s.iokind: Rolename: nginx-ingress-role
subjects:- kind: ServiceAccountname: nginx-ingress-serviceaccountnamespace: ingress-nginx---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:name: nginx-ingress-clusterrole-nisa-bindinglabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: nginx-ingress-clusterrole
subjects:- kind: ServiceAccountname: nginx-ingress-serviceaccountnamespace: ingress-nginx---
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-ingress-controllernamespace: ingress-nginxlabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx
spec:replicas: 1selector:matchLabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginxtemplate:metadata:labels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginxannotations:prometheus.io/port: "10254"prometheus.io/scrape: "true"spec:hostNetwork: true #启用宿主机网络nodeSelector:nginx: "nginx" #匹配 node 标签、生成该 podserviceAccountName: nginx-ingress-serviceaccountcontainers:- name: nginx-ingress-controllerimage: registry.cn-hangzhou.aliyuncs.com/ilanni/nginx-ingress-controller:0.21.0args:- /nginx-ingress-controller- --configmap=$(POD_NAMESPACE)/nginx-configuration- --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services - --udp-services-configmap=$(POD_NAMESPACE)/udp-services- --publish-service=$(POD_NAMESPACE)/ingress-nginx - --annotations-prefix=nginx.ingress.kubernetes.iosecurityContext:allowPrivilegeEscalation: truecapabilities:drop:- ALLadd:- NET_BIND_SERVICE# www-data -> 33runAsUser: 33env:- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespaceports:- name: httpcontainerPort: 80- name: httpscontainerPort: 443livenessProbe:failureThreshold: 3httpGet:path: /healthzport: 10254 scheme: HTTPinitialDelaySeconds: 10periodSeconds: 10successThreshold: 1timeoutSeconds: 1readinessProbe:failureThreshold: 3httpGet:path: /healthzport: 10254scheme: HTTPperiodSeconds: 10successThreshold: 1timeoutSeconds: 1---
apiVersion: v1
kind: Service
metadata:name: ingress-nginxnamespace: ingress-nginx
spec:#type: NodePortports:- name: httpport: 80targetPort: 80protocol: TCP- name: httpsport: 443targetPort: 443protocol: TCPselector:# app.kubernetes.io/name: ingress-nginx# app.kubernetes.io/part-of: ingress-nginxapp: ingress-nginx

kubectl label node node02 nginx=nginx #给 node02 打标签、让 ingress-controller 在 node02 这个节点上生成

apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-ingress-controller
spec:template:spec:hostNetwork: true #启用宿主机网络nodeSelector:nginx: "nginx" #匹配 node 标签、生成该 podserviceAccountName: nginx-ingress-serviceaccountcontainers:- name: nginx-ingress-controller

kubectl apply -f ingress-controller.yaml
kubectl get pod -A -owide #查看 ingress-controller 这个 pod

2、ingress-nginx-rule
apiVersion: v1
kind: List
items:- apiVersion: extensions/v1beta1 # - apiVersion: apps/v1kind: Ingressmetadata:name: ilanni-ingressnamespace: ilanni-namespaceannotations:nginx.ingress.kubernetes.io/rewrite-target: /spec:rules:- host: ingress.ilanni.com # 定义的域名http:paths:- path: /backend:serviceName: ilanni-httpd-svcservicePort: 80# - path: /tomcat# backend:# serviceName: ilanni-tomcat-svc# servicePort: 8080

kubectl apply -f ingress-rule.yaml
提示 warning 警告的时候不必理会,只要没有 error 错误就行、不影响实验测试结果、但是 生成环境中一定要改好。
kubectl get ingress -n ilanni-namespace #查看创建的 ingress 规则


NAME             CLASS    HOSTS                ADDRESS   PORTS   AGE
ilanni-ingress   <none>   ingress.ilanni.com             80      50m

image.png

备注:waring 警告提示 yaml 配置的 apiversion 在 k8s 1.14 以后已经废除掉,此处不必理会、 不影响测试效果。
将进入到 ingress-nginx-controller 这个 pod、查看到 ingress 规则已经注入到 ingress-controller 里面
执行命令:kubectl exec -it nginx-ingress-controller-* -n ingress-nginx bash
cat nginx.conf

NAME                                            READY   STATUS    RESTARTS   AGE
pod/nginx-ingress-controller-85c4fcc56b-j2zdt   1/1     Running   0          82mNAME                    TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
service/ingress-nginx   NodePort   10.244.128.20   <none>        80:31761/TCP,443:30122/TCP   82mNAME                                       READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-ingress-controller   1/1     1            1           82mNAME                                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-ingress-controller-85c4fcc56b   1         1         1       82m

image.png

本地笔记本添加hosts解析

# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting.  Do not change this entry.
##
127.0.0.1	localhost
255.255.255.255	broadcasthost
::1             localhost192.168.10.159 ingress.ilanni.com

浏览器访问

image.png

浏览器访问域名成功
Ingress-nginx 通过 ingress 规则到达 http–svc—>http-pod

Ingress Controller 的工作原理(上)

盗用别人图

image.png

2.2、官方版本

参考:
https://blog.csdn.net/qq_40208428/article/details/133947090

1、ingress解释

k8s服务对外暴露有三种方式

  • NodePort
  • LoadBalancer
  • Ingress
Nodeport

服务暴露需要在集群每个节点都开放一个同样的端口,通过nodtIp:nodePort来访问,如果服务数量多了,开放的端口就难以管理,通常会使用节点标签选择器nodeselector

LoadBalancer

大部分情况下只适用于支持外部负载均衡器的云提供商(AWS,阿里云,华为云等)使用。每个服务都会由云服务提供一个IP作为入口,转发相应的流量,但每个LoadBlancer Service都会产生费用,成本比较高。如果想要在内网环境中使用就需要部署网络负载均衡器,比如MetalLB等组件,它主要提供两个功能:地址分配和外部通知。
如果是本地搭建LoadBalancer,一般采用metallb方案,官网地址:https://metallb.universe.tf/.

ingress

Ingress可以把进入到集群内部的请求转发到集群中的一些服务上,从而可以把服务映射到集群外部。Ingress 能把集群内Service 配置成外网能够访问的 URL,流量负载均衡,提供基于域名访问的虚拟主机等

2、ingress相关地址
k8s提供的ingress,github地址:https://github.com/kubernetes/ingress-nginx
nginx提供的ingress,github地址:https://github.com/nginxinc/kubernetes-ingress
3、配置nginx-controller
  • 下载nginx-controller配置文件
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.2/deploy/static/provider/cloud/deploy.yaml
  • 替换镜像源
registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v1.1.0registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.1.1

替换后状态如下
image.png
启用宿主机网络:hostNetwork: true
设置node标签:nodeSelector(可选)

---
apiVersion: apps/v1
kind: Deployment
metadata:...name: ingress-nginx-controllernamespace: ingress-nginx
spec:strategy:rollingUpdate:maxUnavailable: 1type: RollingUpdatetemplate:metadata:spec:hostNetwork: true		# 启用宿主机网络nodeSelector:nginx: "nginx"		# 启用node标签containers:

image.png
运行deploy.yaml后状态如下
添加对应的DNS解析,解析A地址为 192.168.10.18
image.png
image.png

3、配置2个 deployment+service
  • 第一个deployment+servie
apiVersion: apps/v1
kind: Deployment
metadata:name: httpd-dmnamespace: dev
spec:replicas: 2selector:matchLabels:app: httpd-dmrevisionHistoryLimit: 5strategy:type: RollingUpdaterollingUpdate:maxSurge: 1maxUnavailable: 0template:metadata:labels:app: httpd-dmspec:terminationGracePeriodSeconds: 60restartPolicy: Alwayscontainers:- name: httpd-dmimage: httpd:alpineimagePullPolicy: Always---
apiVersion: v1
kind: Service
metadata:name: httpd-svcnamespace: dev
spec:type: NodePortports:- name: http-portnodePort: 30000port: 80targetPort: 80selector:app: httpd-dm
  • 第二个deployment+servie
apiVersion: apps/v1
kind: Deployment
metadata:name: httpd-dm2namespace: dev
spec:replicas: 2selector:matchLabels:app: httpd-dm2revisionHistoryLimit: 5strategy:type: RollingUpdaterollingUpdate:maxSurge: 1maxUnavailable: 0template:metadata:labels:app: httpd-dm2spec:terminationGracePeriodSeconds: 60restartPolicy: Alwayscontainers:- name: httpd-dm2image: demo:latestimagePullPolicy: IfNotPresent---
apiVersion: v1
kind: Service
metadata:name: httpd-svc2namespace: dev
spec:type: NodePortports:- name: http-portnodePort: 30001port: 8181targetPort: 8181selector:app: httpd-dm2
  • 第二个deployment的docker镜像制作

dockerfile内容如下

FROM python:3.7-alpine
ADD TestController.py /opt
RUN pip3 install flask
RUN pip3 install requests
WORKDIR /opt
EXPOSE 8181
ENTRYPOINT python TestController.py

代码内容如下

import requests
from flask import Flask
import os,time
app = Flask(__name__)@app.route("/test")
def index():pid = str(os.getpid())msg = time.strftime("%Y-%m-%d %H:%M:%S") + "\tMyPid: "+pid+"\n"return msg@app.route("/pid")
def pid():pid = str(os.getpid())return piddef a():pid = str(os.getpid())+"\n"print(pid)if __name__ == "__main__":app.run(host='0.0.0.0',port=8181)

生成镜像

docker build -t demo:latest .
4、ingress转发规则rule配置

访问:客户端–>域名:/test–>service–>pod

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:namespace: devname: demo-ingress
spec:ingressClassName: nginx		# 此处不要改动,改动后ingress-controller识别不了这个ingressrules:- host: ingress.rocky.comhttp:paths:- path: /pathType: Prefixbackend:service:name: httpd-svc		# service 名称port:number: 80		# nginx中server_name中指定的端口- host: ingress2.rocky.comhttp:paths:- path: /testpathType: Prefixbackend:service:name: httpd-svc2port:number: 80

运行ingress-rule-demo后查看
image.png
登陆到ingress-nginx-controller pod中查看
image.png
image.png
验证,访问ingress.rocky.com,ingress2.rocky.com
image.png
查看ingress-nginx-controller pod 日志
image.png

3、pod健康检查

三种pod探针:

  • livenessProbe 存活性探针
  • readinessProbe 就绪性探针
  • startupProbe 启动探针

K8S 三种探针 ReadinessProbe、LivenessProbe和StartupProbe 之探索
Kubernetes 集群 Pod资源容器健康检查探针配置(十)_弓长三虎的博客-CSDN博客

3.1、LivenessProbe:存活性探针

用于判断容器是不是健康,存活探针用于确定容器是否处于运行状态。如果存活探针失败(返回失败状态码或超时),Kubernetes会认为容器不健康,并会重启容器。这可以用于检测应用程序内部错误或死锁情况。

如果不满足健康条件,那么 Kubelet 将根据 Pod 中设置的 restartPolicy (重启策略)来判断,Pod 是否要进行重启操作。LivenessProbe 按照配置去探测 ( 进程、或者端口、或者命令执行后是否成功等等),来判断容器是不是正常。如果探测不到,代表容器不健康(可以配置连续多少次失败才记为不健康),则 kubelet 会杀掉该容器,并根据容器的重启策略做相应的处理。如果未配置存活探针,则默认容器启动为通过(Success)状态。即探针返回的值永远是 Success。即 Success 后 pod 状态是RUNING

3.2、ReadinessProbe:就绪性探针

用于判断容器内的程序是否存活(或者说是否健康),就绪探针用于确定容器是否准备好接受流量。如果就绪探针失败,Kubernetes 会将容器从服务的负载均衡中剔除,直到探针成功。这可以用于确保应用程序在启动后完成必要的初始化或数据加载。

容器启动后按照 ReadinessProbe 配置进行探测,无问题后结果为成功即状态为Success,pod 的 READY 状态为 true,从 0/1 变为 1/1。如果失败继续为 0/1,状态为 false。若未配置就绪探针,则默认状态容器启动后为 Success。对于此 pod、此 pod 关联的 Service 资源、EndPoint 的关系也将基于 Pod 的 Ready 状态进行设置,如果 Pod 运行过程中 Ready 状态变为 false,则系统自动从 Service 资源 关联的 EndPoint 列表中去除此 pod,届时 service 资源接收到 GET 请求后,kube-proxy 将不会把流量引入此 pod 中,通过这种机制就能防止将流量转发到不可用的 Pod 上。如果 Pod 恢复为 Ready 状态。将再会被加回 Endpoint 列表。kube-proxy 也将有概率通过负载机制会引入流量到此 pod 中。

3.3、StartupProbe:启动探针

启动探针用于确定容器是否已经启动并且准备好接受流量。与存活探针和就绪探针不同,启动探针在容器的初始启动阶段使用,并且仅会运行一次。启动探针成功后,就绪探针和存活探针才会启动。

聊聊k8s中的启动探针startupProbe

3.4、三种探针区别

1、ReadinessProbe 与 LivenessProbe 的区别
  • ReadinessProbe 当检测失败后,将 Pod 的 IP:Port 从对应的 EndPoint 列表中删除,service将不再把流量转发给该pod
  • LivenessProbe 当检测失败后,将杀死容器并根据 Pod 的重启策略来决定作出对应的措施。
2、StartupProbe 与 ReadinessProbe、LivenessProbe 的区别

如果三个探针同时存在,先执行 StartupProbe 探针,其他两个探针将会被暂时禁用,直到 pod 满足 StartupProbe 探针配置的条件,其他 2 个探针启动,如果不满足按照规则重启容器。
另外两种探针在容器启动后,会按照配置,直到容器消亡才停止探测,而 StartupProbe 探针只是在容器启动后按照配置满足一次后,不在进行后续的探测。

3、LivenessProbe 和 ReadinessProbe 两种探针都支持下面三种探测方法:
  • exec: 在容器内执行一个命令、如果返回值为 0、则代表容器健康。
  • tcpSocket: 通过 TCP 连接检查容器内的端口是否是通的、如果是通的则认为容器健康。
  • httpGet: 通过应用程序暴露的 API 地址来检查程序是否是正常的,如果状态码是 200-400,则认为容器健康。(在生产环境中用的最多)

3.5、探针检查参数配置

:::success
initialDelaySeconds: 60 # 初始化时间。
periodSeconds: 5 # 检测的频率(以秒为单位)默认为10秒,最小值为1
timeoutSeconds: 2 # 检测超时秒数,默认为1秒,最小值为1
successThreshold: 1 # 检测成功为1次表示就绪
failureThreshold: 2 # 检测失败2次表示未就绪,当pod成功启动且检查失败时,kubernetes将在放弃之前尝试 failureThreshold 次。放弃生存检查意味着重新启动 Pod。而放弃就绪检查, Pod 将被标记为未就绪。默认为 3.最小值为 1。
:::

1、验证测试

在创建pod的时候指定健康检查方式
kubectl apply -f pod_healthcheck.yaml

apiVersion: v1
kind: Pod
metadata:name: nginx-podlabels:app: nginx
spec:containers:- name: nginximage: nginx:latestports:- containerPort: 80livenessProbe:httpGet:path: /index.htmlport: 80

这里是采用了 httpGet 方式,判断服务 80 端口的 http 返回结果
首先创建容器,检查探测返回200
然后进入容器删除index.html,使探测返回404,探测失败后重新部署pod

shell> kubectl get pod
NAME        READY   STATUS    RESTARTS   AGE
nginx-pod   1/1     Running   0          72sshell> kubectl exec -it nginx-pod bash
root@nginx-pod:/# cd /usr/share/nginx/html/
root@nginx-pod:/usr/share/nginx/html# ls
50x.html  index.html
root@nginx-pod:/usr/share/nginx/html# rm -rf index.html 

通过命令 **kubectl describe pod nginx-pod **可以看到健康检查配置:
image.png
通过 kubectl logs -f nginx-pod 观察pod的日志建查看检查请求
检查返回 404 错误状态
通过 pod 的事件可以看到整个过程:检测到 404 后删除 pod 并重建:
image.png

2、查探针的各项参数说明
kubectl explain pods.spec.containers
kubectl explain pods.spec.containers.livenessProbe
3、示例> 探测端口
apiVersion: v1
kind: Pod
metadata:name: pod-livereadinessnamespace: default
spec:containers:- name: nginximage: nginx:latestports:- name: nginx-portcontainerPort: 80livenessProbe:tcpSocket:port: 80initialDelaySeconds: 30		# 容器启动后30s以后开始探测timeoutSeconds: 5					# 探测超时时间readinessProbe:httpGet:scheme: HTTPport: 80path: /
4、示例> exec
1.编写使用exec探测的yaml文件
#exec配置时,执行一个退出状态码为1的命令,观察pod的状态
[root@k8s-master ~]# vim pod-liveness-exec.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-liveness-execnamespace: dev
spec:containers:- name: nginximage: nginx:1.18ports:- name: nginx-portcontainerPort: 80livenessProbe:										# 定义存活性探测exec:														# 使用exec命令方式command: ["/bin/cat","/tmp/hello.txt"]					#执行具体命令:查看下/tmp/hello.txt文件,这个文件一定是不存在的,返回的状态码一定是1
#在最后的输出里可以看到说找不到/tmp/hello.txt这个文件,命令执行失败  
#根据输出的信息可以看到nginx容器在启动之后就进行了健康检查,健康检查失败之后,容器就会被kill掉,然后尝试重启pod,然而健康检查一直失败,容器就会一直重启
5、deployment实例
apiVersion: v1
kind: Namespace
metadata:name: deployment---
apiVersion: apps/v1
kind: Deployment
metadata:name: httpdnamespace: deployment
spec:replicas: 8strategy:       # rollingUpdate 滚动更新rollingUpdate:maxSurge: 1maxUnavailable: 1type: RollingUpdateselector:matchLabels:app: httpd-testtemplate:metadata:labels:app: httpd-testspec:containers:- name: httpd-testimage: nginx:alpineimagePullPolicy: AlwayslivenessProbe:tcpSocket:port: 80initialDelaySeconds: 5   # 容器启动后30s以后开始探timeoutSeconds: 5         # 探测超时时间readinessProbe:httpGet:scheme: HTTPport: 80path: /

4、deployment

4.1、Kubectl常用命令详解

https://www.xjx100.cn/news/590213.html?action=onClick

4.2、更新策略

支持两种更新,Recreate和RollingUpdate

  • Recreate 重建式更新,删除一个更新一个
  • RollingUpdate 滚动更新,定义滚动更新的更新方式的,也就是pod能多几个,少几个,控制更新力度的

官方文档解释

kubectl explain deploy.spec.strategy
kubectl explain deploy.spec.strategy.rollingUpdate
[root@master ~]# kubectl explain deploy.spec.strategy
KIND:     Deployment
VERSION:  apps/v1RESOURCE: strategy <Object>DESCRIPTION:The deployment strategy to use to replace existing pods with new ones.DeploymentStrategy describes how to replace existing pods with new ones.FIELDS:rollingUpdate	<Object>Rolling update config params. Present only if DeploymentStrategyType =RollingUpdate.type	<string>Type of deployment. Can be "Recreate" or "RollingUpdate". Default isRollingUpdate.
  strategy:rollingUpdate:  ##由于replicas为3,则整个升级,pod个数在2-4个之间maxSurge: 1      #滚动升级时会先启动1个pod,值可数字可百分比maxUnavailable: 1 #滚动升级时允许的最大Unavailable的pod个数,值可数字可百分比maxUnavailable: [0%, 100%] 向下取整,比如10个副本,5%的话==0.5个,但计算按照0个
maxSurge: [0%, 100%] 向上取整,比如10个副本,5%的话==0.5个,但计算按照1个

4.3、资源更新

示例代码

apiVersion: v1
kind: Namespace
metadata:name: deployment---
apiVersion: apps/v1
kind: Deployment
metadata:name: httpdnamespace: deployment
spec:replicas: 8strategy:       # rollingUpdate 滚动更新rollingUpdate:maxSurge: 1maxUnavailable: 1type: RollingUpdateselector:matchLabels:app: httpd-testtemplate:metadata:labels:app: httpd-testspec:containers:- name: httpd-testimage: nginx:alpineimagePullPolicy: AlwayslivenessProbe:tcpSocket:port: 80initialDelaySeconds: 5   # 容器启动后30s以后开始探timeoutSeconds: 5         # 探测超时时间readinessProbe:httpGet:scheme: HTTPport: 80path: /
> 修改yaml文件后,更新资源
kubectl apply -f nginx-test.yaml
kubectl replace -f nginx-test.yaml
> 扩缩容,增加副本为4个
kubectl scale --replicas=4 deployment.app nginx-test
> 升级镜像
kubectl set image deployments nginx-test nginx-test=nginx:alpine --record
nginx-test: deployment名称
nginx-test=nginx:alpine 需要更新的镜像
record 记录更新> 查看deployment滚动更新状态
kubectl rollout status deployment nginx-test 
Waiting for deployment "nginx-test" rollout to finish: 3 out of 4 new replicas have been updated...Waiting for deployment "nginx-test" rollout to finish: 3 out of 4 new replicas have been updated...
Waiting for deployment "nginx-test" rollout to finish: 3 out of 4 new replicas have been updated...
Waiting for deployment "nginx-test" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "nginx-test" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "nginx-test" rollout to finish: 3 of 4 updated replicas are available...
deployment "nginx-test" successfully rolled out
> 查看滚动升级记录
kubectl rollout history deployment nginx-test deployment.apps/nginx-test 
REVISION  CHANGE-CAUSE
2         kubectl set image deployments nginx-test nginx=nginx:alpine --record=true
3         kubectl set image deployments nginx-test nginx-test=nginx:alpine --record=true
4         kubectl set image deployments nginx-test nginx-test=nginx:v1.9.1 --record=true
> 查看升级后的版本
kubectl get deployments.apps -o wide
NAME         READY   UP-TO-DATE   AVAILABLE   AGE    CONTAINERS   IMAGES         SELECTOR
nginx-test   2/2     1            2           9m2s   nginx-test   nginx:v1.9.1   app=nginx-test
> 查看更新记录
kubectl rollout history deployment nginx-test 
deployment.apps/nginx-test 
REVISION  CHANGE-CAUSE
2         kubectl set image deployments nginx-test nginx=nginx:alpine --record=true
3         kubectl set image deployments nginx-test nginx-test=nginx:alpine --record=true
4         kubectl set image deployments nginx-test nginx-test=nginx:v1.9.1 --record=true
> 回滚到上一个版本
kubectl rollout undo deployment nginx-test 
deployment.apps/nginx-test rolled back> 回滚到指定版本
kubectl rollout undo deployment nginx-test --to-revision=4 # 4为上边查到的REVISION
deployment.apps/nginx-test rolled back
> deployment 暂停和恢复pod
> deployment暂停功能
> kubectl set -h # 查看帮助命令
> kubectl rollout pause deployment nginx-test # 暂停
> kubectl set resources deployment nginx-test --limits=cpu=200m,memory=512Mi --requests=cpu=100m,memory=256Mi # 配置
> kubectl rollout resume deployment nginx-test # 恢复
> kubectl get pod nginx-test-d7c948bd7-ctllc  -o yaml # 查看cpu 内存大小

5、StatefulSet

5.1、StatefulSet介绍

注意:Statefulset 创建无头服务(headless service),即创建 service 的时候不创建 cluster ip、
通过 ip 地址访问 pod。
StatefulSet:用于管理有状态应用,比如Redis, MySQL

(三)k8s实战-资源调度_青衫落拓客的博客-CSDN博客
k8s之StatefulSet详解-CSDN博客

apiVersion: v1
kind: Namespace
metadata:name: statefulset---
apiVersion: v1
kind: Service
metadata:name: nginx-svc-stsnamespace: statefulsetlabels:app: nginx-svc-sts
spec:ports:- port: 80name: web-portclusterIP: Noneselector:app: nginx-svc-sts---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: webnamespace: statefulset
spec:selector:matchLabels:app: nginx_stsserviceName: "nginx-svc-sts" #声明它属于哪个 Headless Service.replicas: 5 #副本数updateStrategy: # 升级策略rollingUpdate:partition: 2type: RollingUpdatetemplate:metadata:labels:app: nginx_sts # 必须配置 .spec.selector.matchLabelsspec:terminationGracePeriodSeconds: 10 # 删除操作最多宽限多长时间containers:- name: nginximage: nginx:alpineports:- containerPort: 80name: web-port # 暴露端口的名字

应用文件、会发现 statefulset 先创建好 web-0、然后在创建 web-1、在创建 web-2、这就是有序的

5.2、StatefulSet灰度发布

1、灰度发布简介

利用滚动更新中的 partition 属性,可以实现简易的灰度发布的效果 例如我们有 5 个 pod,如果当前
partition 设置为 3,那么此时滚动更新时,只会更新那些 序号 >= 3 的 pod 利用该机制,我们可以通过控制partition 的值,来决定只更新其中一部分 pod,确认没有问题后再主键增大更新的 pod 数量,最终实现全部 pod 更新

2、两种更新策略
  • RollingUpdate 滚动更新
  • OnDelete 删除更新

kubectl -n dev edit statefulsets.apps web

  updateStrategy:rollingUpdate:partition: 2type: RollingUpdate# 例如这里修改成2,更新 >=2的,所以更新web-2,web-3,web-4,默认是0全部更新
  updateStrategy:type: OnDelete# 删除pod时才更新
# 1)级联删除:删除 statefulset 时会同时删除 pods
kubectl delete statefulset web# 或 非级联删除:删除 statefulset 时不会删除 pods,删除 sts 后,pods 就没人管了,此时再删除 pod 不会重建的
kubectl delete sts web --cascade=false# 2)删除 service
kubectl delete service nginx# 3)StatefulSet删除后PVC还会保留着,数据不再使用的话也需要删除
kubectl delete pvc www-web-0 www-web-1

5.3、级联删除与非级联删除

  • 级联删除(默认),删除sts和pod
  • 非级联删除,删除sts时不删除pod,需要加参数–cascade=false

非级联删除sts后,pod变为孤儿pod,删除pod时不会被重建

kubectl delete sts name --cascade=false

6、Daemonset

6.1、daemonset简介

特点: 每个 node 节点上只运行一个容器。比如 flannel 插件、calicao、日志收集程序这些。

  • 首先能保证集群内的每一个节点都运行一组相同的 pod;
  • 同时还能根据节点的状态保证新加入的节点自动创建对应的 pod;
  • 在移除节点的时候,能删除对应的 pod;
  • 而且它会跟踪每个 pod 的状态,当这个pod出现异常、Crash 掉了,会及时地去 recovery 这个状态。
kubectl label node node01 ds=true
kubectl label node node02 ds=true
apiVersion: apps/v1
kind: DaemonSet
metadata:name: web-dsnamespace: ds
spec:selector:matchLabels:app: nginx-ds #必须匹配 .spec.template.metadata.labelstemplate:metadata:labels:app: nginx-ds # 必须配置 .spec.selector.matchLabelsspec:nodeSelector: #pod 调度策略--node 节点调度ds: "true" #调度到标签的 key=ds、value=true 的节点上terminationGracePeriodSeconds: 10containers:- name: nginximage: nginx:latestports:- containerPort: 80name: web-ds

6.2、daemonset的更新与回滚

> 以下时默认的ds策略
kubectl -n ds edit daemonsets.apps web-ds updateStrategy:rollingUpdate:maxSurge: 0maxUnavailable: 1type: RollingUpdate # 滚动更新

**Daemonset **更新注意事项:
ds 的策略我们通常使用 Ondelete 集合 nodeSelector 标签的的方式、只更新部分节点做测试, 没问题了在更新其他的节点

kubectl -n ds edit daemonsets.apps web-ds updateStrategy:rollingUpdate:maxSurge: 0maxUnavailable: 1type: OnDelete	# 删除更新

7、pod生命周期管理

参考:https://www.cnblogs.com/zhanglianghhh/p/13526153.html

  • postStart
  • preStop

Kubernetes 支持 postStart 和 preStop 事件。
当一个主容器启动后,Kubernetes 将立即发送 postStart 事件;
在主容器被终结之前,Kubernetes 将发送一个 preStop 事件。

7.1、pod创建过程

Pod是Kubernetes的基础单元,了解其创建的过程,更有助于理解系统的运作。

1、用户通过kubectl或其他API客户端提交Pod Spec给API Server。
2、API Server尝试将Pod对象的相关信息存储到etcd中,等待写入操作完成,API Server返回确认信息到客户端。
3、API Server开始反映etcd中的状态变化。
4、所有的Kubernetes组件通过"watch"机制跟踪检查API Server上的相关信息变动。
5、kube-scheduler(调度器)通过其"watcher"检测到API Server创建了新的Pod对象但是没有绑定到任何工作节点。
6、kube-scheduler为Pod对象挑选一个工作节点并将结果信息更新到API Server。
7、调度结果新消息由API Server更新到etcd,并且API Server也开始反馈该Pod对象的调度结果。
8、Pod被调度到目标工作节点上的kubelet尝试在当前节点上调用docker engine进行启动容器,并将容器的状态结果返回到API Server。
9、API Server将Pod信息存储到etcd系统中。
10、在etcd确认写入操作完成,API Server将确认信息发送到相关的kubelet。

7.2、postStart和preStop

pod删除时先进入 Terminating 状态,同时新pod处于ContainerCreating
Terminating状态持续时间取决于参数:terminationGracePeriodSeconds: 30,默认为30秒,也可通过如下yaml文件中的prestop中的配置观察
poststart和prestop都支持如下三个参数

  • exec
  • httpGet
  • tcpSocket
[root@master ~]# kubectl explain deployment.spec.template.spec.containers.lifecycle.postStart
[root@master ~]# kubectl explain deployment.spec.template.spec.containers.lifecycle.preStopKIND:     Deployment
VERSION:  apps/v1
FIELDS:exec	<Object>One and only one of the following should be specified. Exec specifies theaction to take.httpGet	<Object>HTTPGet specifies the http request to perform.tcpSocket	<Object>TCPSocket specifies an action involving a TCP port. TCP hooks not yetsupported

7.3、yaml文件实例

apiVersion: v1
kind: Namespace
metadata:name: lifecycle---
apiVersion: apps/v1
kind: Deployment
metadata:name: httpdnamespace: lifecycle
spec:replicas: 8strategy:       # rollingUpdate 滚动更新rollingUpdate:maxSurge: 1maxUnavailable: 1type: RollingUpdateselector:matchLabels:app: httpd-testtemplate:metadata:labels:app: httpd-testspec:containers:- name: httpd-testimage: nginx:alpineimagePullPolicy: AlwayslivenessProbe:tcpSocket:port: 80initialDelaySeconds: 5   # 容器启动后30s以后开始探timeoutSeconds: 5         # 探测超时时间readinessProbe:httpGet:scheme: HTTPport: 80path: /lifecycle:		# 启动前/删除前执行的操作postStart:exec:command: ["/bin/sh","-c","echo 'hello world' > /opt/message"]preStop:exec:command: ["/bin/sh","-c","while true;do if [ -z num ];then num = 0;fi;let num=num+1;echo sleep ${num}s >> /opt/message;sleep 1;done"]

验证一个pod创建时和删除时的操作

kubectl -n lifecycle exec httpd-6f4fcd66fb-4bnbf -- tail -f -n 20 /opt/message
hello worldsleep 1s
sleep 2s
...

8、初始化容器-initcontainer

参考:https://www.cnblogs.com/zhanglianghhh/p/13526153.html
初始化容器、在容器启动之前做一些预处理、预判断等初始化操作,比生命周期Prestart好用一些。
Prestart:在容器启动之前做的一些操作,不能保证你容器在EntryPoint (ep) 之前运行。
备注:通过 kubectl get ep 可以查看EntryPoint信息(Pod的ip和端口)

apiVersion: apps/v1
kind: Deployment
metadata:name: sidecarnginx
spec:selector:matchLabels:app: sidecarnginxtemplate:metadata:labels:app: sidecarnginxspec:initContainers: #初始化容器执行完,会下载一个demo4shl.war文件映射到emptyDir{},而主容器也是和spec.volumes里的emptyDir{}进行映射,所以nginx容器的/usr/local/nginx/webapps`目录下会映射demo4shl.war文件- name: getwarimage: nginx:latest #用shell的if语法判断,检测指定资源是否存在,以防重复拉取command: ['sh', '-c', 'if [ ! -f "/app/demo4shl.war" ]; then echo "" >> /app/demo4shl.war; fi']  volumeMounts:- mountPath: /appname: app-volumecontainers:- name: sidecarnginximage: nginx:latestvolumeMounts: #将指定的卷mount到容器指定的位置- mountPath: /opt/name: app-volumeresources:limits:memory: "128Mi"cpu: "500m"ports:- containerPort: 8080volumes: #指的是Pod中的卷- name: app-volumeemptyDir: {} #容器目录是emptyDir{},这个就相当于一个共享卷,是一个临时的目录,生命周期等同于Pod的生命周期

会看到只要initContainer不成功、状态就一直为 init
image.png

8、HPA

官方文档:https://kubernetes.io/zh-cn/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough
HorizontalPodAutoscaler(简称HPA)自动更新工作负载资源(例如Deployment和StatefulSet),目的是自动扩缩工作负载以满足需求。

  • 水平扩缩:增进/减少pod
  • 垂直扩缩:分配更多资源(CPU,内存)给已经负载运行的pod

8.1、实例,运行php-apache服务器并暴露服务

为了演示 HorizontalPodAutoscaler,你将首先启动一个 Deployment 用 hpa-example 镜像运行一个容器, 然后使用以下清单文件将其暴露为一个 服务(Service)

apiVersion: v1
kind: Namespace
metadata:name: hpa---
apiVersion: apps/v1
kind: Deployment
metadata:name: php-apachenamespace: hpa
spec:selector:matchLabels:run: php-apachetemplate:metadata:labels:run: php-apachespec:containers:- name: php-apacheimage: registry.k8s.io/hpa-exampleimagePullPolicy: IfNotPresentports:- containerPort: 80resources:limits:cpu: 500mrequests:cpu: 200m
---
apiVersion: v1
kind: Service
metadata:name: php-apachenamespace: hpalabels:run: php-apache
spec:ports:- port: 80selector:run: php-apache

执行文件

kubectl apply -f php-apache.yaml

8.2、创建HorizontalPodAutoscaler

  • –cpu-percent=50
  • –min=1
  • –max=10

pod的CPU利用率超过50%,增加pod,最小1个,最多10个pod

kubectl -n pha autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10kubectl -n hpa get hpa
NAME         REFERENCE               TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
php-apache   Deployment/php-apache   0%/50%    1         10        1          24m

8.3、增加负载

接下来,看看自动扩缩器如何对增加的负载做出反应。 为此,你将启动一个不同的 Pod 作为客户端。 客户端 Pod 中的容器在无限循环中运行,向 php-apache 服务发送查询。

# 在单独的终端中运行它
# 以便负载生成继续,你可以继续执行其余步骤
kubectl -n hpa run -i --tty load-generator --rm --image=busybox:1.28 --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://php-apache; done"

观察

kubectl -n hpa get horizontalpodautoscalers.autoscaling
或者执行
kubectl -n hpa get hpa
NAME         REFERENCE               TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
php-apache   Deployment/php-apache   36%/50%   1         10        5          30mkubectl -n hpa get deployments.apps --watch
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
php-apache   1/1     1            1           34m
php-apache   1/4     1            1           34m
php-apache   1/4     1            1           34m
php-apache   1/4     1            1           34m
php-apache   1/4     4            1           34m
php-apache   2/4     4            2           34m
php-apache   3/4     4            3           35m
php-apache   4/4     4            4           35m
php-apache   4/5     4            4           35m
php-apache   4/5     4            4           35m
php-apache   4/5     4            4           35m
php-apache   4/5     5            4           35m
php-apache   5/5     5            5           35mkubectl -n hpa get deployments.apps php-apache
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
php-apache   5/5     5            5           40m

8.4、其他指标

9、ConfigMap

太简单,没啥好写的
作用:把配置文件和镜像分离、便于修改配置、保持容器的可移植性。
官网:https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-pod-configmap/

  • 基于目录创建 --from-file
  • 基于文件 --from-file,–from-env-file
  • 根据字面值创建 --from-literal

9.1、示例1,基于文件创建configmap

文件内容

user  nginx;
worker_processes  1;error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;events {worker_connections  1024;
}http {include       /etc/nginx/mime.types;default_type  application/octet-stream;log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log  /var/log/nginx/access.log  main;sendfile        on;#tcp_nopush     on;keepalive_timeout  65;#gzip  on;#include /etc/nginx/conf.d/*.conf;server {listen                    80;server_name               localhost;root                      /home/wwwroot/test;index                     index.html;
}
}

创建configmap

kubectl create configmap confnginx --from-file=nginx.yaml

添加本地文件映射

> mkdir -p /home/wwwroot/hello
> cd /home/wwwroot/
> cat index.html 
hello world
This is 192.168.10.17
> mkdir -p /home/wwwroot/hello
> cd /home/wwwroot/
> cat index.html 
hello world
This is 192.168.10.18

创建pod

apiVersion: v1
kind: ReplicationController
metadata:name: nginx-controller
spec:replicas: 2selector:name: nginxtemplate:metadata:labels:name: nginxspec:containers:- name: nginximage: nginx:alpineports:- containerPort: 80volumeMounts:- mountPath: /etc/nginx/nginx.conf	# 容器内路径name: nginx-config	# 上边创建的cmsubPath: nginx.conf- mountPath: /home/wwwroot/testname: nginx-datavolumes:- name: nginx-configconfigMap:name: confnginx- name: nginx-datahostPath:path: /home/wwwroot/hello	# 本地路径

9.2、示例2,定义从文件创建ConfigMap时要用到的键值对

格式如下

kubectl create configmap game-config-3 --from-file=<我的键名>=<文件路径>
game-config-3为configmap名称
例如:
kubectl create configmap game-config-3 --from-file=game-special-key=configure-pod-container/configmap/game.properties

9.3、示例3、根据字面值创建 ConfigMap

你可以将 kubectl create configmap 与 --from-literal 参数一起使用, 通过命令行定义文字值:

kubectl create configmap special-config \--from-literal=special.how=very \--from-literal=special.type=charm

你可以传入多个键值对。命令行中提供的每对键值在 ConfigMap 的 data 部分中均表示为单独的条目。

kubectl get configmaps special-config -o yamlapiVersion: v1
kind: ConfigMap
metadata:creationTimestamp: 2022-02-18T19:14:38Zname: special-confignamespace: defaultresourceVersion: "651"uid: dadce046-d673-11e5-8cd0-68f728db1985
data:special.how: veryspecial.type: charm

9.4、基于文件生成ConfigMap

例如,要基于 configure-pod-container/configmap/game.properties 文件生成一个 ConfigMap:

# 创建包含 ConfigMapGenerator 的 kustomization.yaml 文件
cat <<EOF >./kustomization.yaml
configMapGenerator:
- name: game-config-4		# configmap名称options:labels:game-config: config-4files:- configure-pod-container/configmap/game.properties	# 文件路径
EOF

应用(Apply)kustomization 目录创建 ConfigMap 对象:

kubectl apply -k .

查看

kubectl get configmap
NAME                                DATA   AGE
game-config-4-tbg7c4gc77            1      97skubectl describe configmaps game-config-4-tbg7c4gc77 
Name:         game-config-4-tbg7c4gc77
Namespace:    default
Labels:       game-config=config-4
Annotations:  <none>Data
====
game.properties:	# 默认键名为文件名
----
enemies=aliens
lives=3
enemies.cheat=true
enemies.cheat.level=noGoodRotten
secret.code.passphrase=UUDDLRLRBABAS
secret.code.allowed=true
secret.code.lives=30
Events:  <none>

定义从文件生成configmap时要使用的键

# 创建包含 ConfigMapGenerator 的 kustomization.yaml 文件
cat <<EOF >./kustomization2.yaml
configMapGenerator:
- name: game-config-5options:labels:game-config: config-5files:- game-special-key=./game.properties	# 指定键名
EOF
ubectl describe configmaps game-config-5-tfhf8f4fkf 
Name:         game-config-5-tfhf8f4fkf
Namespace:    default
Labels:       game-config=config-5
Annotations:  <none>Data
====
game-special-key:
----
enemies=aliens
lives=3
enemies.cheat=true
enemies.cheat.level=noGoodRotten
secret.code.passphrase=UUDDLRLRBABAS
secret.code.allowed=true
secret.code.lives=30
Events:  <none>

9.5、基于字面值生成ConfigMap

---
# 基于字面创建 ConfigMap 的 kustomization.yaml 内容
cat <<EOF >./kustomization2.yaml
configMapGenerator:
- name: special-config-2literals:		# 基于文件,此处为files- special.how=very- special.type=charm
EOF

9.4、其他示例,挂载使用

用 busybox 镜像创建一个 pod 容器通过 volume 挂载的方式引用 cm
基于字面值创建configmap的另一种形式

apiVersion: v1
kind: ConfigMap
metadata:name: special-confignamespace: default
data:SPECIAL_LEVEL: verySPECIAL_TYPE: charm

kubectl apply -f cm.yaml

方式1、通过volume挂载的方式引用cm
apiVersion: v1
kind: Pod
metadata:name: dapi-test-pod
spec:containers:- name: test-containersimage: busybox:latestcommand: ["/bin/sh","-c","sleep 3600"]volumeMounts:- name: config-volumemountPath: /etc/configvolumes:- name: config-volumeconfigMap:name: special-configrestartPolicy: Never

kubectl apply -f busybox.yaml

进入容器内查看引入的configmap变量
image.png

方式2、使用 envFrom 将 ConfigMap 的所有数据定义为容器环境变量
apiVersion: v1
kind: Pod
metadata:name: envfrom-busybox
spec:containers:- name: test-containerimage: busybox:latestcommand: ["/bin/sh","-c","env"]envFrom:- configMapRef:name: special-configrestartPolicy: Never

kubectl apply -f envFrom.yaml
kubectl logs -f envfrom-busybox

现在,Pod 的输出包含环境变量 SPECIAL_LEVEL=very 和 SPECIAL_TYPE=charm。
image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/286873.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【代驾+顺风车+货运】全开源双端APP代驾+顺风车+货运代驾小程序源码

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 一、详细介绍 系统是基于Thinkphpuniapp开发的&#xff0c;全开源未加密&#xff0c;这套源码可以拿回去自己做二开 后台用户端司机端 功能详情介绍&#xff1a; 车主实名认证&#xff0c;驾驶证认证&#xff0c;车…

大学生实习被企业坑了,教训比较深刻

帮实习生解决一些疑惑&#xff0c;所以出了一个视频&#xff0c;大家多多支持 实习途径 1 靠自己&#xff08;招聘平台投简历&#xff0c;大专及普通大学的选择&#xff09; 2 靠关系&#xff08;亲人、老师、朋友帮推荐&#xff0c;有关系就是好&#xff09; 3 靠校招&#xf…

ROS机器人入门第四课:话题通信

文章目录 ROS机器人入门第四课&#xff1a;话题通信一、话题通信概述&#xff08;一&#xff09;概念&#xff08;二&#xff09;作用 二、话题通信基本操作需求:分析:流程:&#xff08;一&#xff09;发布方解释一些关键的ROS函数和概念&#xff1a; &#xff08;二&#xff0…

力扣刷题44-46(力扣0062/0152/0198)

62. 不同路径 题目描述&#xff1a; 一个机器人位于一个 m x n 网格的左上角 &#xff0c;机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角。问总共有多少条不同的路径&#xff1f; 思路&#xff1a; 其实就是问(0,0)->(m-1,n-1)一共有几条路。 第一个…

office办公技能|word中的常见使用问题解决方案2.0

一、设置多级列表将表注从0开始&#xff0c;设置为从1开始 问题描述&#xff1a;word中插入题注&#xff0c;出来的是表0-1&#xff0c;不是1-1&#xff0c;怎么办&#xff1f; 写论文时&#xff0c;虽然我设置了“第一章”为一级标题&#xff0c;但是这三个字并不是自动插入的…

QMT量化交易上手

文章目录 QMT介绍基本使用代码初始化股票和行情交易量化策略示例相关链接QMT介绍 QMT是迅投公司出品量化交易客户端软件,目前只能运行在windows机器上,分为QMT 和 miniQMT两种模式,后者可以采用python API做程序化交易,极大方便了广大散户。这点上比同花顺/通信达好很多。…

软件推荐 篇三十七:安卓软件推荐IP Tools「IP工具」:全面解析网络状态与管理的必备神器

引言&#xff1a; 随着互联网的普及&#xff0c;网络已经成为我们日常生活中不可或缺的一部分。无论是工作、学习还是娱乐&#xff0c;我们都需要通过网络来进行各种操作。然而&#xff0c;网络问题的出现往往会给我们带来诸多困扰。为了更好地管理和优化网络&#xff0c;我们…

tomcat配置静态资源后无法正常访问

目录 一、场景二、配置三、访问异常四、排查五、原因六、解决 一、场景 1、将前端文件存在到指定目录 2、在tomcat配置静态资源 3、配置后无法正常访问到前端文件 二、配置 1、tomcat配置 2、静态资源 三、访问异常 四、排查 可以ping通&#xff0c;但是访问不了3080端口 …

rabbitmq 3.9.29 docker mac 管理员页面无法打开

SyntaxError: Unexpected token ‘catch’ SyntaxError: Unexpected token ‘catch’ at EJS.Compiler.compile (http://127.0.0.1:15672/js/ejs-1.0.min.js:1:6659) at new EJS (http://127.0.0.1:15672/js/ejs-1.0.min.js:1:1625) at format (http://127.0.0.1:15672/js/main…

程序员35岁会失业吗?【来自主流AI的回答】

程序员35岁会失业吗&#xff1f; 35岁被认为是程序员职业生涯的分水岭&#xff0c;许多程序员开始担忧自己的职业发展是否会受到年龄的限制。有人担心随着年龄的增长&#xff0c;技术更新换代的速度会使得资深程序员难以跟上&#xff1b;而另一些人则认为&#xff0c;丰富的经…

用BSP优化3D渲染

3D渲染引擎设计者面临的最大问题之一是可见性计算&#xff1a;只必须绘制可见的墙壁和物体&#xff0c;并且必须以正确的顺序绘制它们&#xff08;应该在远处的墙壁前面绘制近墙&#xff09; 。 更重要的是&#xff0c;对于游戏等应用程序来说&#xff0c;开发能够快速渲染场景…

【python】Jupyter Notebook 修改默认路径

文章目录 一、修改前&#xff08;一&#xff09;问题&#xff08;二&#xff09;修改前的默认路径 二、修改配置文件、更改路径&#xff08;一&#xff09;找到配置文件并打开&#xff08;二&#xff09;创建目标文件夹、得到新的路径&#xff08;三&#xff09;修改配置文件 三…

Android15功能和 API 概览

Android 15 面向开发者引入了一些出色的新功能和 API。以下部分总结了这些功能&#xff0c;以帮助您开始使用相关 API。 如需查看新增、修改和移除的 API 的详细列表&#xff0c;请参阅 API 差异报告。如需详细了解新的 API&#xff0c;请访问 Android API 参考文档&#xff0…

【Redis】数据类型、事务执行、内存淘汰策略

目录 数据类型 Redis事务执行步骤 步骤&#xff1a; redis内存淘汰策略 设置内存淘汰策略 1.设置配置文件 2.通过命令设置 数据类型 官网解释 Understand Redis data types | Redis 首先&#xff0c;Redis 的所有键都是字符串,常用的数据类型有 5 种&#xff1a;Strin…

蓝牙信标覆盖范围

蓝牙信标覆盖范围是一个重要的考虑因素&#xff0c;对于蓝牙技术的应用和部署至关重要。了解蓝牙信标的覆盖范围可以帮助我们更好地规划蓝牙设备的布局和位置&#xff0c;从而实现最佳的信号覆盖和传输效果。 首先&#xff0c;我们需要明确蓝牙信标的覆盖范围受到多种因素的影…

python--递归

1.递归 object--对象 递归&#xff08;recursion&#xff09;&#xff1a; 函数自身调用自身 2.求1~100的和 def count(num):# n (n-1) ... 1if num 1:return 1return num (count(num - 1))print(count(100))3.求Fibonacci 0 1 1 2 3 5 …

外包干了1年....字节跳动面试高频考点,懒加载

一、文章内容 什么是懒加载懒加载的优点什么时候使用懒加载学习懒加载前置内容实战懒加载图片 二、什么是懒加载? 从语法角度分析懒加载,懒是adj形容词,加载是名词;或者懒看为副词,加载作为动词,这样就能理解懒加载了就是懒懒的/地加载,更通俗的讲就是通过一种手段来加载.就…

Linux内核err.h文件分析

在阅读和编写内核相关的代码时&#xff0c;经常会看到IS_ERR、ERR_PTR等函数。这些函数在内核头文件的err.h中。以我服务器的代码为例&#xff0c;内核版本为5.15。 这个文件的代码如下&#xff1a; /* SPDX-License-Identifier: GPL-2.0 */ #ifndef _LINUX_ERR_H #define _L…

Nacos介绍和统一配置管理

Nacos&#xff08;全称为 Alibaba Cloud Nacos&#xff0c;或简称为 Nacos&#xff09;是一个开源的分布式服务发现和配置管理系统。它由阿里巴巴集团开发并开源&#xff0c;旨在帮助开发人员简化微服务架构下的服务注册、发现和配置管理。 一、Nacos 提供了以下主要功能&…

论文阅读之PeriodicLoRA: Breaking the Low-Rank Bottleneck in LoRA Optimization(2024)

文章目录 论文地址主要内容主要贡献模型图技术细节实验结果 论文地址 PeriodicLoRA: Breaking the Low-Rank Bottleneck in LoRA Optimization 主要内容 这篇文章的主要内容是介绍了一种名为PeriodicLoRA&#xff08;PLoRA&#xff09;的参数高效微调&#xff08;Parameter-…