Day03-Pod环境变量,容器重启策略,emptyDir,hostPath,nfs存储卷,资源限制及configMap,secret实战案例

Day03-Pod环境变量,容器重启策略,emptyDir,hostPath,nfs存储卷,资源限制及configMap,secret实战案例

  • 0、昨日内容回顾:
  • 1、面试题预告
    • 1.1 Q1:Pod的容器的三种重启策略:(注意, K8S所谓的容器指的是重新创建容器。)
    • 1.2 Q2:向容器传递环境变量的两种方式
    • 1.3 Q3: 同一个Pod如何实现数据持久化?如何实现数据共享?跨节点的Pod如何实现数据共享呢?
      • 1.3.1 数据持久化之emptyDir实战案例
      • 1.3.2 数据持久化之hostPath实战案例
      • 1.3.3 跨节点的Pod实现数据共享
        • 1.3.3.1 部署nfs server
        • 1.3.3.2 数据持久化之nfs实战案例
  • 2、容器的资源限制实战案例
  • 3、configMap概述
    • 3.1 定义configMap(简称"cm")资源
    • 3.2 pod基于env环境变量引入cm资源
    • 3.3 pod基于存储卷的方式引入cm资源
    • 3.4 课堂练习及prots的端口映射案例
  • 4. secret资源的增删改查实战
    • 4.1 Pod基于env引用secret资源案例
    • 4.2 Pod基于存储卷引用secret资源案例
    • 4.3 编写资源清单拉取私有项目镜像案例:(温馨提示,不要直接复制,小心你的环境跟我不一样哟~)

0、昨日内容回顾:

  • Pod资源清单
apiVersion: v1
kind: Pod
metadata:name: ...
spec:hostNetwork: truenodeName: k8s233.oldboyedu.comcontainers:- name:image:stdin:command:args:imagePullPolicy:- name:image:...
  • Pod的基础管理
创建:kubectl createkubectl apply
删除:kubectl delete
查看:kubectl get
修改:kubectl apply	
  • 故障排查相关指令:
kubectl describe
kubectl exec
kubectl logs
kubectl cp

1、面试题预告

Q1: Pod的容器重启策略有哪些?请简要说明?

Q2: 如何向Pod的指定容器传递环境变量?有哪些方式,请简要说明?

Q3: 同一个Pod如何实现数据持久化?如何实现数据共享?跨节点的Pod如何实现数据共享呢?

Q4: 多个Pod如何实现使用同一个配置文件?

Q5: 如何下载habor的私有项目镜像?

Q6: Pod如何实现健康检查?

1.1 Q1:Pod的容器的三种重启策略:(注意, K8S所谓的容器指的是重新创建容器。)

[root@k8s231.oldboyedu.com pods]# cat 07-nginx-restartPolicy.yaml 
apiVersion: v1
kind: Pod
metadata:name: linux85-web-restartpolicy-always
spec:nodeName: k8s233.oldboyedu.com# 当容器退出时,始终重启容器。restartPolicy: Alwayscontainers:- name: nginximage: harbor.oldboyedu.com/web/linux85-web:v0.1imagePullPolicy: Alwayscommand:- "sleep"- "10"---
apiVersion: v1
kind: Pod
metadata:name: linux85-web-restartpolicy-onfailure
spec:nodeName: k8s233.oldboyedu.com# 当容器正常退出时不会重启容器,异常退出时,会重启容器。restartPolicy: OnFailurecontainers:- name: nginximage: harbor.oldboyedu.com/web/linux85-web:v0.1imagePullPolicy: Alwayscommand:- "sleep"- "10"---
apiVersion: v1
kind: Pod
metadata:name: linux85-web-restartpolicy-never
spec:nodeName: k8s233.oldboyedu.com# 当容器退出时,始终不重启。restartPolicy: Nevercontainers:- name: nginximage: harbor.oldboyedu.com/web/linux85-web:v0.1imagePullPolicy: Alwayscommand:- "sleep"- "10"

1.2 Q2:向容器传递环境变量的两种方式

[root@k8s231.oldboyedu.com pods]# cat 08-games-env.yaml 
apiVersion: v1
kind: Pod
metadata:name: linux85-game-env
spec:nodeName: k8s232.oldboyedu.comcontainers:- name: gameimage: harbor.oldboyedu.com/oldboyedu-games/jasonyin2020/oldboyedu-games:v0.7# 向容器传递环境变量env:# 指定的变量名称- name: SCHOOL# 指定变量的值value: oldboyedu- name: CLASSvalue: linux85- name: OLDBOYEDU_POD_NAME# 不使用自定义的变量值,而是引用别处的值valueFrom:# 值引用自某个字段fieldRef:# 指定字段的路径 fieldPath: "metadata.name"- name: OLDBOYEDU_NODENAMEvalueFrom:fieldRef:fieldPath: "spec.nodeName"- name: OLDBOYEDU_HOSTIPvalueFrom:fieldRef:fieldPath: "status.hostIP"- name: OLDBOYEDU_PODIPvalueFrom:fieldRef:fieldPath: "status.podIP"[root@k8s231 pods]# kubectl explain po.spec.containers.env
KIND:     Pod
VERSION:  v1RESOURCE: env <[]Object>
........[root@k8s231.oldboyedu.com pods]# kubectl apply -f 08-games-env.yaml 
pod/linux85-game-env created
[root@k8s231.oldboyedu.com pods]# kubectl get pods -o wide
NAME               READY   STATUS    RESTARTS   AGE   IP            NODE                   NOMINATED NODE   READINESS GATES
linux85-game-env   1/1     Running   0          5s    10.100.1.15   k8s232.oldboyedu.com   <none>           <none>
[root@k8s231.oldboyedu.com pods]# kubectl exec linux85-game-env -- env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=linux85-game-env
SCHOOL=oldboyedu
CLASS=linux85
OLDBOYEDU_POD_NAME=linux85-game-env
OLDBOYEDU_NODENAME=k8s232.oldboyedu.com
OLDBOYEDU_HOSTIP=10.0.0.232
OLDBOYEDU_PODIP=10.100.1.15
KUBERNETES_PORT=tcp://10.200.0.1:443
KUBERNETES_PORT_443_TCP=tcp://10.200.0.1:443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_ADDR=10.200.0.1
KUBERNETES_SERVICE_HOST=10.200.0.1
KUBERNETES_SERVICE_PORT=443
KUBERNETES_SERVICE_PORT_HTTPS=443
HOME=/root
[root@k8s231.oldboyedu.com pods]# 

1.3 Q3: 同一个Pod如何实现数据持久化?如何实现数据共享?跨节点的Pod如何实现数据共享呢?

1.3.1 数据持久化之emptyDir实战案例

[root@k8s231.oldboyedu.com pods]# cat 09-games-volumes-emptyDir.yaml 
apiVersion: v1
kind: Pod
metadata:name: linux85-volume-emptydir-001
spec:# 定义存储卷volumes:# 指定存储卷的名称- name: data01# 指定存储卷类型为emptyDir类型# 当Pod被删除时,数据会被随时删除,其有以下两个作用:#    - 对容器的数据进行持久化,当删除容器时数据不会丢失;#    - 可以实现同一个Pod内不同容器之间数据共享;emptyDir: {} containers:- name: webimage: harbor.oldboyedu.com/web/nginx:1.20.1-alpine# 指定挂载点volumeMounts:# 指定存储卷的名称- name: data01# 指定容器的挂载目录mountPath: /usr/share/nginx/html- name: linuximage: harbor.oldboyedu.com/linux/alpine:lateststdin: truevolumeMounts:- name: data01mountPath: /oldboyedu-data[root@k8s231 pods]# kubectl exec -it linux85-volume-emptydir-001 -- sh
/ # cd /usr/share/nginx/html/
/usr/share/nginx/html # ls
50x.html    index.html
/usr/share/nginx/html # echo "<h1>v0.1</h1>" > index.html
/usr/share/nginx/html # 
[root@k8s231 pods]# !curl
curl 10.100.2.13
<h1>v0.1</h1>[root@k8s231 ~]# kubectl exec -it linux85-volume-emptydir-001 -c web -- sh
/ # cd /usr/share/nginx/html/
/usr/share/nginx/html # ls
/usr/share/nginx/html # echo "<h1>test</h1>" > index.html
/usr/share/nginx/html # 
[root@k8s231 ~]# curl 10.100.1.6
<h1>test</h1>
[root@k8s231 ~]# kubectl exec -it linux85-volume-emptydir-001 -c linux -- sh
/ # ls
bin             home            mnt             proc            sbin            tmp
dev             lib             oldboyedu-data  root            srv             usr
etc             media           opt             run             sys             var
/ # cd oldboyedu-data/
/oldboyedu-data # ll
sh: ll: not found
/oldboyedu-data # ls
index.html
/oldboyedu-data # cat index.html 
<h1>test</h1>
/oldboyedu-data # echo 111111111> index.html 
sh: 3: Bad file descriptor
/oldboyedu-data # echo 111111111 > index.html 
/oldboyedu-data # cat index.html 
111111111
/oldboyedu-data # 
[root@k8s231 ~]# curl 10.100.1.6
111111111

1.3.2 数据持久化之hostPath实战案例

[root@k8s231.oldboyedu.com pods]# cat 10-games-volumes-hostPath.yaml 
apiVersion: v1
kind: Pod
metadata:name: linux85-volume-hostpath-001
spec:nodeName: k8s232.oldboyedu.comvolumes:- name: data01emptyDir: {} - name: data02# 指定类型为宿主机存储卷,该存储卷只要用于容器访问宿主机路径的需求。 hostPath:# 指定存储卷的路径path: /oldboyedu-datacontainers:- name: webimage: harbor.oldboyedu.com/web/nginx:1.20.1-alpinevolumeMounts:- name: data02mountPath: /usr/share/nginx/html---apiVersion: v1
kind: Pod
metadata:name: linux85-volume-hostpath-002
spec:nodeName: k8s232.oldboyedu.comvolumes:- name: linux85-datahostPath:path: /oldboyedu-datacontainers:- name: linuximage: harbor.oldboyedu.com/linux/alpine:lateststdin: truevolumeMounts:- name: linux85-datamountPath: /oldboyedu-data-linux85
[root@k8s231.oldboyedu.com pods]# 

1.3.3 跨节点的Pod实现数据共享

1.3.3.1 部署nfs server
(1)所有节点安装nfs相关软件包
yum -y install nfs-utils(2)k8s231节点设置共享目录
mkdir -pv /oldboyedu/data/kubernetes
cat > /etc/exports <<'EOF'
/oldboyedu/data/kubernetes *(rw,no_root_squash)
EOF(3)配置nfs服务开机自启动
systemctl enable --now nfs(4)服务端检查NFS挂载信息
exportfs(5)客户端节点手动挂载测试
mount -t nfs k8s231.oldboyedu.com:/oldboyedu/data/kubernetes /mnt/
umount /mnt 
1.3.3.2 数据持久化之nfs实战案例
[root@k8s231.oldboyedu.com pods]# cat 11-nginx-alpine-volumes-nfs.yaml 
apiVersion: v1
kind: Pod
metadata:name: linux85-volume-nfs-web
spec:nodeName: k8s232.oldboyedu.comvolumes:- name: data# 指定存储卷类型是nfsnfs:# 指定nfs服务器的地址server: 10.0.0.231# 指定nfs对外暴露的挂载路径path: /oldboyedu/data/kubernetes/volume-nfscontainers:- name: webimage: harbor.oldboyedu.com/web/nginx:1.20.1-alpinevolumeMounts:- name: datamountPath: /usr/share/nginx/html---apiVersion: v1
kind: Pod
metadata:name: linux85-volume-nfs-linux
spec:nodeName: k8s233.oldboyedu.comvolumes:- name: datanfs:server: 10.0.0.231path: /oldboyedu/data/kubernetes/volume-nfscontainers:- name: linuximage: harbor.oldboyedu.com/linux/alpine:lateststdin: truevolumeMounts:- name: datamountPath: /oldboyedu-data-linux85
[root@k8s231 pods]# kubectl apply -f 11-nginx-alpine-volumes-nfs.yaml 
pod/linux85-volume-nfs-web created
pod/linux85-volume-nfs-linux created
[root@k8s231 pods]# kubectl get pods -o wide
NAME                       READY   STATUS    RESTARTS   AGE   IP            NODE                   NOMINATED NODE   READINESS GATES
linux85-volume-nfs-linux   1/1     Running   0          21s   10.100.2.15   k8s233.oldboyedu.com   <none>           <none>
linux85-volume-nfs-web     1/1     Running   0          21s   10.100.1.9    k8s232.oldboyedu.com   <none>           <none>
[root@k8s231 pods]# curl 10.100.1.9
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.20.1</center>
</body>
</html>
[root@k8s231 pods]# echo "<h1>www.oldboyedu.com</h1>" > /oldboyedu/data/kubernetes/volume-nfs/index.html
[root@k8s231 pods]# curl 10.100.1.9
<h1>www.oldboyedu.com</h1>
[root@k8s231 pods]# 

2、容器的资源限制实战案例

[root@k8s231 pods]# kubectl explain po.spec.containers.resources
KIND:     Pod
VERSION:  v1RESOURCE: resources <Object>DESCRIPTION:Compute Resources required by this container. Cannot be updated. More info:https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ResourceRequirements describes the compute resource requirements.FIELDS:limits	<map[string]string>Limits describes the maximum amount of compute resources allowed. Moreinfo:https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/requests	<map[string]string>Requests describes the minimum amount of compute resources required. IfRequests is omitted for a container, it defaults to Limits if that isexplicitly specified, otherwise to an implementation-defined value. Moreinfo:https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/[root@k8s231.oldboyedu.com pods]# cat 12-stress.yaml 
apiVersion: v1
kind: Pod
metadata:name: linux85-stress-003
spec:nodeName: k8s233.oldboyedu.comcontainers:- name: stressimage: jasonyin2020/oldboyedu-linux-tools:v0.1args:- "tail"- "-f"- "/etc/hosts"# 对容器进行资源限制resources:# 期望目标节点有的资源大小,若不满足,则无法调度,Pod处于Pedding状态。# 若满足调度需求,调度到节点后也不会立刻使用requests字段的定义的资源。requests:# 要求目标节点有10G的可用内存.# memory: 10Gmemory: 256M# 指定CPU的核心数,固定单位: 1core=1000mcpu: 500m# 配置资源的使用上限limits:memory: 500Mcpu: 1.5[root@k8s231.oldboyedu.com pods]# 
[root@k8s231 pods]# kubectl apply -f 12-stress.yaml # 对容器进行压测
[root@k8s231 pods]# kubectl exec -it linux85-stress-001 -- sh
(1).CPU压力测试 ----> 产生4个cpu进程1分钟后停止运行(注意观察CPU的使用率,尽管我指定了4颗CPU,但应该不会超过200%)
/usr/local/stress # stress -c 4 --verbose --timeout 1m(2).Memory压力测试 ---> 产生5个work工作经常,并且每个工作经常占用200000000 Bytes(即200MB),且不释放内存,但不会超过1G的使用空间。
/usr/local/stress # stress  -m 5 --vm-bytes 200000000 --vm-keep --verbose# 查看容器压测结果
[root@k8s233 ~]# docker stats d94975678c05
CONTAINER ID   NAME                                                                           CPU %     MEM USAGE / LIMIT   MEM %     NET I/O   BLOCK I/O    PIDS
d94975678c05   k8s_stress_linux85-stress-001_default_81fbd533-9440-4c34-8f66-7d1357985182_0   0.00%     56KiB / 3.839GiB    0.00%     0B / 0B   156kB / 0B   1

3、configMap概述

configmap数据会存储在etcd数据库,其应用场景主要在于应用程序配置。

configMap支持的数据类型:

(1)键值对;

(2)多行数据;

Pod使用configmap资源有两种常见的方式:
(1)变量注入;
(2)数据卷挂载

推荐阅读:
https://kubernetes.io/docs/concepts/storage/volumes/#configmap
https://kubernetes.io/docs/concepts/configuration/configmap/

3.1 定义configMap(简称"cm")资源

[root@k8s231.oldboyedu.com configMap]# cat 01-config-demo.yaml 
apiVersion: v1
kind: ConfigMap
metadata:name: linux85-config
# 定义cm资源的数据
data:# 定义单行数据school: oldboyeduclass: linux85# 定义多行数据my.cfg: |datadir: "/var/lib/mysql"basedir: "/usr/share/mysql"socket: "/tmp/mysql.sock"student.info: |pengbing: "大长腿,熬夜,六味地黄丸"wumingkun: "彭斌,Linux"qinhongbin: "欧美,日韩,国产"liwenxuan: "拍小电影,小皮鞭"wanglei: "演小电影,大皮鞭"[root@k8s231.oldboyedu.com configMap]# kubectl apply -f 01-config-demo.yaml 
configmap/linux85-config created

3.2 pod基于env环境变量引入cm资源

[root@k8s231.oldboyedu.com configMap]# cat 02-cm-env.yaml 
apiVersion: v1
kind: Pod
metadata:name: linux85-game-cm-env
spec:nodeName: k8s232.oldboyedu.comcontainers:- name: gameimage: harbor.oldboyedu.com/oldboyedu-games/jasonyin2020/oldboyedu-games:v0.7env:- name: OLDBOYEDU_LINUX85_SCHOOLvalueFrom:# 指定引用的configMap资源configMapKeyRef:# 指定configMap的名称name: linux85-config# 指定configMap的KEYkey: school- name: OLDBOYEDU_LINUX85_CLASSvalueFrom:configMapKeyRef:name: linux85-configkey: class- name: OLDBOYEDU_LINUX85_mycfgvalueFrom:configMapKeyRef:name: linux85-configkey: my.cfg- name: OLDBOYEDU_LINUX85_studentinfovalueFrom:configMapKeyRef:name: linux85-configkey: student.info
[root@k8s231.oldboyedu.com configMap]# 
[root@k8s231.oldboyedu.com configMap]# kubectl apply -f 02-cm-env.yaml 
[root@k8s231.oldboyedu.com configMap]# 
[root@k8s231.oldboyedu.com configMap]# kubectl exec linux85-game-cm-env -- env

3.3 pod基于存储卷的方式引入cm资源

[root@k8s231.oldboyedu.com configMap]# cat 03-cm-volumes.yaml 
apiVersion: v1
kind: Pod
metadata:name: linux85-volume-cm-008
spec:nodeName: k8s232.oldboyedu.comvolumes:- name: data# 指定存储卷的类型为configMapconfigMap:# 指定configMap的名称name: linux85-config# 引用configMap的keyitems:# 指定key的名称- key: student.info# 可以暂时理解为指定文件的名称path: oldboyedu-linux85-student.infocontainers:- name: webimage: harbor.oldboyedu.com/web/nginx:1.20.1-alpinecommand: ["tail","-f","/etc/hosts"]volumeMounts:- name: datamountPath: /etc/nginx/nginx.conf# 当subPath的值和configMap.items.path相同时,mountPath的挂载点是一个文件而非目录!subPath: oldboyedu-linux85-student.info
[root@k8s231.oldboyedu.com configMap]# 
[root@k8s231.oldboyedu.com configMap]# kubectl apply -f 03-cm-volumes.yaml 

课堂练习:

请将"harbor.oldboyedu.com/oldboyedu-games/jasonyin2020/oldboyedu-games:v0.1"的nginx的配置文件使用cm资源创建并挂载!

3.4 课堂练习及prots的端口映射案例

[root@k8s231.oldboyedu.com configMap]# cat 04-cm-ketanglianxi.yaml 
apiVersion: v1
kind: Pod
metadata:name: linux85-games-ketanglianxi-002
spec:# hostNetwork: truenodeName: k8s232.oldboyedu.comvolumes:- name: dataconfigMap:name: oldboyedu-linux85-gamesitems:- key: nginx.confpath: nginx.confcontainers:- name: gameimage: harbor.oldboyedu.com/oldboyedu-games/jasonyin2020/oldboyedu-games:v0.1volumeMounts:- name: datamountPath: /usr/local/nginx/conf/nginx.confsubPath: nginx.conf# 指定容器的端口映射相关字段ports:# 指定容器的端口号- containerPort: 80# 绑定主机的IP地址hostIP: "0.0.0.0"# 指定绑定的端口号hostPort: 88# 给该端口起一个别名,要求唯一name: game# 指定容器的协议protocol: TCP---apiVersion: v1
kind: ConfigMap
metadata:name: oldboyedu-linux85-games
data:nginx.conf: |worker_processes  1;events {worker_connections  1024;}http {include       mime.types;default_type  application/octet-stream;sendfile        on;keepalive_timeout  65;server {listen       80;root        /usr/local/nginx/html/bird/;server_name   game01.oldboyedu.com;}server {listen       80;root        /usr/local/nginx/html/pinshu/;server_name   game03.oldboyedu.com;}server {listen       80;root        /usr/local/nginx/html/tanke/;server_name   game05.oldboyedu.com;}server {listen       80;root        /usr/local/nginx/html/pingtai/;server_name   game02.oldboyedu.com;}server {listen       80;root        /usr/local/nginx/html/chengbao/;server_name   game04.oldboyedu.com;}}[root@k8s231 configMap]# kubectl get pods -o wide 
NAME                             READY   STATUS    RESTARTS      AGE     IP            NODE                   NOMINATED NODE   READINESS GATES
linux85-game-cm-env              1/1     Running   1 (14m ago)   3d      10.100.1.14   k8s232.oldboyedu.com   <none>           <none>
linux85-games-ketanglianxi-002   1/1     Running   0             11s     10.100.1.15   k8s232.oldboyedu.com   <none>           <none>
linux85-volume-cm-008            1/1     Running   1 (14m ago)   2d23h   10.100.1.13   k8s232.oldboyedu.com   <none>           <none>
[root@k8s232 ~]# iptables-save |grep 88
-A CNI-DN-d3271470de13d7612fb59 -s 10.100.1.0/24 -p tcp -m tcp --dport 88 -j CNI-HOSTPORT-SETMARK
-A CNI-DN-d3271470de13d7612fb59 -s 127.0.0.1/32 -p tcp -m tcp --dport 88 -j CNI-HOSTPORT-SETMARK
-A CNI-DN-d3271470de13d7612fb59 -p tcp -m tcp --dport 88 -j DNAT --to-destination 10.100.1.15:80
-A CNI-HOSTPORT-DNAT -p tcp -m comment --comment "dnat name: \"cbr0\" id: \"13446eea55742ce95f7e3228c024946a01a5d3d54ccd4bc0a9fd91a2a824f01c\"" -m multiport --dports 88 -j CNI-DN-d3271470de13d7612fb59

4. secret资源的增删改查实战

[root@k8s231 ~]# echo elastic | base64
ZWxhc3RpYwo=
[root@k8s231 ~]# echo oldboyedu | base64
b2xkYm95ZWR1Cg==
[root@k8s231 ~]# echo oldboyedu | base64 |base64 -d
oldboyedu[root@k8s231.oldboyedu.com secret]# kubectl get secrets  es-https 
NAME       TYPE     DATA   AGE
es-https   Opaque   2      44s
[root@k8s231.oldboyedu.com secret]# kubectl apply -f 01-secret-demo.yaml 
secret/es-https configured
[root@k8s231.oldboyedu.com secret]# kubectl get secrets  es-https 
NAME       TYPE     DATA   AGE
es-https   Opaque   3      49s
[root@k8s231.oldboyedu.com secret]# cat 01-secret-demo.yaml 
apiVersion: v1
kind: Secret
metadata:name: es-https
data:username: ZWxhc3RpYwo=password: b2xkYm95ZWR1Cg==hostip: MTAuMC4wLjI1MAo=[root@k8s231 secret]# kubectl get secrets es-https -o yaml 
apiVersion: v1
data:password: b2xkYm95ZWR1Cg==username: ZWxhc3RpYwo=
kind: Secret
metadata:annotations:kubectl.kubernetes.io/last-applied-configuration: |{"apiVersion":"v1","data":{"password":"b2xkYm95ZWR1Cg==","username":"ZWxhc3RpYwo="},"kind":"Secret","metadata":{"annotations":{},"name":"es-https","namespace":"default"}}creationTimestamp: "2024-06-17T07:25:27Z"name: es-httpsnamespace: defaultresourceVersion: "127717"uid: 0c1619a6-2511-46d2-9f17-a709483ea16f
type: Opaque[root@k8s231.oldboyedu.com secret]# kubectl delete -f 01-secret-demo.yaml 
secret "es-https" deleted
[root@k8s231.oldboyedu.com secret]# 与ConfigMap类似,区别在于secret存储敏感数据,所有的数据都需要经过base64进行编码。
使用secret主要存储的是凭据信息。参考链接:
https://kubernetes.io/zh/docs/concepts/configuration/secret/#secret-types

4.1 Pod基于env引用secret资源案例

[root@k8s231.oldboyedu.com secret]# cat 02-secret-env.yaml 
apiVersion: v1
kind: Pod
metadata:name: linux85-game-secret-001
spec:nodeName: k8s232.oldboyedu.comcontainers:- name: gameimage: harbor.oldboyedu.com/oldboyedu-games/jasonyin2020/oldboyedu-games:v0.7env:- name: OLDBOYEDU_LINUX85_USERNAMEvalueFrom:# 指定引用的secret资源secretKeyRef:# 指定secret的名称name: es-https# 指定secret的KEYkey: username- name: OLDBOYEDU_LINUX85_PASSWORDvalueFrom:secretKeyRef:name: es-httpskey: password- name: OLDBOYEDU_LINUX85_HOSTIPvalueFrom:secretKeyRef:name: es-httpskey: hostip[root@k8s231.oldboyedu.com secret]# kubectl apply -f 02-secret-env.yaml 
pod/linux85-game-secret-001 created
[root@k8s231.oldboyedu.com secret]# kubectl get pods
NAME                                 READY   STATUS                       RESTARTS         AGE
linux85-game-secret-001              1/1     Running                      0                2s
[root@k8s231.oldboyedu.com secret]# kubectl exec linux85-game-secret-001 -- env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=linux85-game-secret-001
OLDBOYEDU_LINUX85_HOSTIP=10.0.0.250OLDBOYEDU_LINUX85_USERNAME=elasticOLDBOYEDU_LINUX85_PASSWORD=oldboyeduKUBERNETES_SERVICE_PORT=443
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT=tcp://10.200.0.1:443
KUBERNETES_PORT_443_TCP=tcp://10.200.0.1:443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_ADDR=10.200.0.1
KUBERNETES_SERVICE_HOST=10.200.0.1
HOME=/root

4.2 Pod基于存储卷引用secret资源案例

[root@k8s231.oldboyedu.com secret]# cat 03-secret-volumes.yaml 
apiVersion: v1
kind: Pod
metadata:name: linux85-volume-secret-003
spec:nodeName: k8s232.oldboyedu.comvolumes:- name: data# 指定存储卷的类型为secretsecret:# 指定secret的名称secretName: es-httpsitems:- key: usernamepath: username.info- key: passwordpath: password.info- key: hostippath: hostip.infocontainers:- name: webimage: harbor.oldboyedu.com/web/nginx:1.20.1-alpinecommand: ["tail","-f","/etc/hosts"]volumeMounts:- name: data# mountPath: /oldboyedu-datamountPath: /etc/nginx/nginx.confsubPath: username.info- name: datamountPath: /etc/nginx/password.confsubPath: password.info- name: datamountPath: /etc/nginx/hostip.confsubPath: hostip.info
[root@k8s231.oldboyedu.com secret]# 
[root@k8s231.oldboyedu.com secret]# kubectl apply -f 03-secret-volumes.yaml 
pod/linux85-volume-secret-003 configured
[root@k8s231 secret]# kubectl exec -it linux85-volume-secret-003 -- sh
/ # ls
bin                   home                  proc                  sys
dev                   lib                   root                  tmp
docker-entrypoint.d   media                 run                   usr
docker-entrypoint.sh  mnt                   sbin                  var
etc                   opt                   srv
/ # cd /etc/nginx/
/etc/nginx # ll
sh: ll: not found
/etc/nginx # ls
conf.d          fastcgi_params  mime.types      nginx.conf      scgi_params
fastcgi.conf    hostip.conf     modules         password.conf   uwsgi_params
/etc/nginx # cat nginx.conf 
elastic
/etc/nginx # cat password.conf 
oldboyedu
/etc/nginx # cat hostip.conf 
10.0.0.250
/etc/nginx # 

harbor用户信息:

username: linux85
password: Linux85@2023	

基于命令行的方式创建harbor认证信息:

kubectl create secret docker-registry  linux85 --docker-username=linux85 --docker-password=Linux85@2023 --docker-email=linux85@oldboyedu.com --docker-server=harbor.oldboyedu.com
[root@k8s231 ~]# kubectl get secrets 
NAME                  TYPE                                  DATA   AGE
default-token-2m5sn   kubernetes.io/service-account-token   3      5d6h
es-https              Opaque                                3      47m
linux85               kubernetes.io/dockerconfigjson        1      16s

获取habor认证信息的资源清单

kubectl get secrets linux85 -o yaml
[root@k8s231 ~]# kubectl get secrets linux85 -o yaml 
apiVersion: v1
data:.dockerconfigjson: eyJhdXRocyI6eyJoYXJib3Iub2xkYm95ZWR1LmNvbSI6eyJ1c2VybmFtZSI6ImxpbnV4ODUiLCJwYXNzd29yZCI6IkxpbnV4ODVAMjAyMyIsImVtYWlsIjoibGludXg4NUBvbGRib3llZHUuY29tIiwiYXV0aCI6ImJHbHVkWGc0TlRwTWFXNTFlRGcxUURJd01qTT0ifX19
kind: Secret
metadata:creationTimestamp: "2024-06-17T08:18:32Z"name: linux85namespace: defaultresourceVersion: "132322"uid: e685a3df-2439-4ffc-85af-5def618d46bd
type: kubernetes.io/dockerconfigjson
[root@k8s231 secret]# kubectl get secrets linux85 -o yaml >> 04-imagePullSecret.yaml

4.3 编写资源清单拉取私有项目镜像案例:(温馨提示,不要直接复制,小心你的环境跟我不一样哟~)

[root@k8s231.oldboyedu.com secret]# cat 04-imagePullSecret.yaml 
apiVersion: v1
kind: Pod
metadata:name: linux85-imagepullsecret-002
spec:nodeName: k8s232.oldboyedu.com# 指定拉取镜像的secret验证信息imagePullSecrets:- name: linux85containers:- name: linuximage: harbor.oldboyedu.com/linux85/jasonyin2020/oldboyedu-linux-tools:v0.1stdin: true---apiVersion: v1
data:.dockerconfigjson: eyJhdXRocyI6eyJoYXJib3Iub2xkYm95ZWR1LmNvbSI6eyJ1c2VybmFtZSI6ImxpbnV4ODUiLCJwYXNzd29yZCI6IkxpbnV4ODVAMjAyMyIsImVtYWlsIjoibGludXg4NUBvbGRib3llZHUuY29tIiwiYXV0aCI6ImJHbHVkWGc0TlRwTWFXNTFlRGcxUURJd01qTT0ifX19
kind: Secret
metadata:name: linux85
type: kubernetes.io/dockerconfigjson

周末作业:

(1)完成课堂的所有练习并完善思维导图;

(2)将"harbor.oldboyedu.com/oldboyedu-games/jasonyin2020/oldboyedu-games:v0.1"镜像拆分成5个游戏镜像,要求如下:

  • 创建habor私有仓库:
    仓库名称: homework
    用户名: linux85-homework
    密码: Linux85@2023
  • 镜像名称:
    harbor.oldboyedu.com/homework/oldboyedu-games:bird
    harbor.oldboyedu.com/homework/oldboyedu-games:pinshu
    harbor.oldboyedu.com/homework/oldboyedu-games:tanke
    harbor.oldboyedu.com/homework/oldboyedu-games:pingtai
    harbor.oldboyedu.com/homework/oldboyedu-games:chengbao
  • 将镜像批量推送到harbor仓库,如果可以的话请使用docker-compose实现批量编译并批量推送。
  • 将上述5个镜像使用同一个文件实现5个Pod的部署,要求对每个容器的内存资源限制为200M,CPU为0.5核心。
    作业提示: 本案例会使用到Pod,secret,configMap等资源。

扩展作业:
​(1)各组用以下方式部署K8S集群;
​ kind:
​ 一组。
​ minikube:
​ 二组。
​ KubeSphere:
​ 三组。
​ rancher:
​ 四组。
​ kuboard:
​ 五组。
​ kubeasz:
​ 六组。

(2)将上面的基础作业使用各组自己搭建的K8S环境在实现一次。

(3)使用kubeadm部署K8S 1.27版本。在将上面的基础作业使用各组自己搭建的K8S环境在实现一次。

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

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

相关文章

数学建模--灰色关联分析法

目录 简介 基本原理 应用场景 优缺点 优点&#xff1a; 缺点&#xff1a; 延伸 灰色关联分析法在水质评价中的具体应用案例是什么&#xff1f; 如何克服灰色关联分析法在主观性强时的数据处理和改进方法&#xff1f; 灰色关联分析法与其他系统分析方法&#xff08;如A…

记录些MySQL题集(17)

一、MySQL索引为何使用B树结构&#xff1f; MySQL的索引机制中&#xff0c;默认使用BTree作为底层的数据结构&#xff0c;但为什么要选择B树呢&#xff1f;有人会说树结构是以二分法查找数据&#xff0c;所以会在很大程度上提升检索性能&#xff0c;这点确实没错&#xff0c;但…

C++初学者指南-5.标准库(第一部分)--标准库查询存在算法

C初学者指南-5.标准库(第一部分)–标准库查询存在算法 文章目录 C初学者指南-5.标准库(第一部分)--标准库查询存在算法any_of / all_of / none_ofcountcount_if相关内容 不熟悉 C 的标准库算法&#xff1f; ⇒ 简介 any_of / all_of / none_of 如果在输入范围(所有元素…

解决django与sqlite3不兼容报SQLite 3.9.0 or later is required错的问题

今天在尝试用pytest进行django的单元测试&#xff0c;pytest用的数据库是sqlite3&#xff0c;在window环境下测试得好好的&#xff0c;但是放到linux环境下就报错&#xff0c;具体是报django.core.exceptions.ImproperlyConfigured: SQLite 3.9.0 or later is required (found …

GPT-LLM

本心、输入输出、结果 文章目录 GPT-LLM前言国际公司AI发展概览国内公司AI发展概览GPT-LLM 编辑 | 简简单单 Online zuozuo 地址 | https://blog.csdn.net/qq_15071263 如果觉得本文对你有帮助,欢迎点赞、收藏、评论 前言 国际公司AI发展概览 公司主要AI贡献与产品特点OpenAI…

【LeetCode】day17:654 - 最大二叉树, 617 - 合并二叉树, 700 - 二叉树搜索树中的搜索, 98 - 验证二叉搜索树

LeetCode 代码随想录跟练 Day17 654.最大二叉树617.合并二叉树700.二叉搜索树中的搜索98.验证二叉搜索树 654.最大二叉树 题目描述&#xff1a; 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的…

SpringBoot整合SSE,实现后端主动推送DEMO

前言 说起服务端主动推送&#xff0c;大家第一个想到的一定是WEBSOCKET 。 作为软件工程师&#xff0c;不能无脑使用一种技术&#xff0c;要结合实际情况&#xff0c;择优选取。 SSE&#xff08;Server-Sent Events&#xff09;相比于WEBSOCKET 1、轻量化、兼容性 基于传统…

用 AI 解决电脑问题、推荐电影、游戏攻略

担任电脑专家 prompt&#xff1a; 作为一名电脑专家&#xff0c;我拥有广泛的技能和知识来解决各种电脑问题。你的身份是围绕着为 用户提供电脑相关支持和解决疑难问题的专业人士。 你擅长于以下领域&#xff1a; 1. 硬件故障排除&#xff1a;你能够检测和修复与电脑硬件相关…

学懂C语言(十一): C语言哪些数据类型适合位运算操作?

目录 1. 整型数据类型 1.1 int 1.2 unsigned int 1.3 short 1.4 unsigned short 2. 字符型数据 2.1 char 2.2 unsigned char 3. 长整型数据 3.1 long 和 unsigned long 3.2 long long 和 unsigned long long 总结 位运算主要用于整型数据类型&#xff0c;因为这些类…

pytorch学习(十二)c++调用minist训练的onnx模型

在实际使用过程中&#xff0c;使用python速度不够快&#xff0c;并且不太好嵌入到c程序中&#xff0c;因此可以把pytorch训练的模型转成onnx模型&#xff0c;然后使用opencv进行调用。 所需要用到的库有&#xff1a; opencv 1.完整的程序如下 import torch from torch impo…

零基础STM32单片机编程入门(十七)SPI总线详解及RC522-NFC刷卡模块实战含源码

文章目录 一.概要二.SPI总线基本概念1.SPI总线内部框图2.总体特征3.通讯时序 三.RC522介绍1.NFC基本介绍2.RC522模块基本特点3.RC522模块原理图4.RC522模块SPI通讯时序 四.RC522模块读卡实验五.CubeMX工程源代码下载六.小结 一.概要 SPI总线是由Motorola公司提出&#xff0c;是…

05_解封装和解码

1. 基本概念 容器就是一种文件格式&#xff0c;比如flv、mkv、mp4等。包含下面5种流以及文件头信息。 流是一种视频数据信息的传输方式&#xff0c;5种流&#xff1a;音频&#xff0c;视频&#xff0c;字幕&#xff0c;附件&#xff0c;数据。 包在ffmpeg中代表已经编码好的一…

FPGA实验3:D触发器设计

一、实验目的及要求 熟悉Quartus II 的 VHDL 文本设计简单时序电路的方法&#xff1b; 掌握时序电路的描述方法、波形仿真和测试&#xff0c;特别是时钟信号的特性。 二、实验原理 运用Quartus II 集成环境下的VHDL文本设计方法设计简单时序电路——D触发器&#xff0c;依据…

ABC363 题解

ABC363 题解 A - Piling Up (模拟) 题意&#xff1a; 输入一个数字&#xff0c;数字介于 1 1 1- 99 99 99显示了一次^, 100 100 100- 199 199 199显示了^两次…增加显示的所需的最小的评分增幅 分析&#xff1a; 算比次数字大且为 100 100 100的倍数的最小值减此数字 代码…

三相PWM整流器滞环电流控制仿真matlab simulink

1、内容简介 略 88-可以交流、咨询、答疑 2、内容说明 略 三相&#xff30;&#xff37;&#xff2d;整流器已广泛应用工业与电气控制领域电流控制技术决定着三相&#xff30;&#xff37;&#xff2d;整流器系统的控制性能。综合比 较了各种电流控制方法应用较多的滞环比较…

C++ 类和对象 构造函数(下)

一 初始化列表&#xff1a; 1.1 构造函数体赋值&#xff1a; 在C中&#xff0c;构造函数用于创建对象并赋予其初始值。通常&#xff0c;我们可以在构造函数体内对成员变量进行赋值&#xff1a; class Date { public:Date(int year, int month, int day) {_year year;_mont…

golang 解压带密码的zip包

目录 Zip文件详解ZIP 文件格式主要特性常用算法Zip格式结构图总览Zip文件结构详解数据区本地文件头文件数据文件描述 中央目录记录区&#xff08;核心目录记录区 &#xff09;中央目录记录尾部区 压缩包解压过程方式1 通过解析中央目录区来解压方式2 通过读取本地文件头来解压两…

Java 环境配置——Java 语言的安装、配置、编译与运行

引言 Java 作为全球最广泛使用的编程语言之一&#xff0c;其强大的跨平台特性和丰富的生态系统&#xff0c;使其在企业级应用、移动开发、大数据处理等领域具有重要地位。正确配置 Java 开发环境是每一个 Java 开发者的必备技能。本文将详细介绍如何在不同操作系统上安装、配置…

CentOS7中的yum命令不可用,网络不可达

前言 我也搜了大量的文章&#xff0c;基本上都是 输入 vi /etc/sysconfig/network-scripts/ifcfg-ens33 (这个ens33 是上面图片对应的以太网卡的名称&#xff0c;有的可能是ifcfg-eth0) 将 ONBOOTno 改为 ONBOOTyes以及其他方法&#xff0c;但是都没用。 解决 具体原因我也…

Wpf和Winform使用devpress控件库导出Excel并调整报表样式

Wpf和Winform使用devpress控件库导出Excel并调整报表样式 背景 客户需求经常需要出各种报表&#xff0c;部分客户对报表的样式有要求。包括颜色、字体、分页等等。 代码 使用Datagridview导出excel调整样式 DevExpress.XtraGrid.Views.Grid.GridView gdv #region GridView…